Bug 1340637 - Vendor geckodriver dependencies; r=ted draft
authorAndreas Tolfsen <ato@mozilla.com>
Tue, 23 May 2017 18:03:07 +0100
changeset 584514 b66a2458872b3b46221ea068277448ea833eda3f
parent 584513 61920363fdbae57e70bc414c14b5a67018c1fc54
child 584515 3f5d815b9d334a36d8f1ce3ddd514df7b6ee818f
push id60773
push userbmo:ato@mozilla.com
push dateThu, 25 May 2017 16:41:40 +0000
reviewersted
bugs1340637
milestone55.0a1
Bug 1340637 - Vendor geckodriver dependencies; r=ted MozReview-Commit-ID: 1muL5Jc7ulI
third_party/rust/advapi32-sys/.cargo-checksum.json
third_party/rust/advapi32-sys/.cargo-ok
third_party/rust/advapi32-sys/Cargo.toml
third_party/rust/advapi32-sys/README.md
third_party/rust/advapi32-sys/build.rs
third_party/rust/advapi32-sys/src/lib.rs
third_party/rust/backtrace-sys/.cargo-checksum.json
third_party/rust/backtrace-sys/.cargo-ok
third_party/rust/backtrace-sys/Cargo.toml
third_party/rust/backtrace-sys/build.rs
third_party/rust/backtrace-sys/src/lib.rs
third_party/rust/backtrace-sys/src/libbacktrace/ChangeLog
third_party/rust/backtrace-sys/src/libbacktrace/ChangeLog.jit
third_party/rust/backtrace-sys/src/libbacktrace/Makefile.am
third_party/rust/backtrace-sys/src/libbacktrace/Makefile.in
third_party/rust/backtrace-sys/src/libbacktrace/README
third_party/rust/backtrace-sys/src/libbacktrace/aclocal.m4
third_party/rust/backtrace-sys/src/libbacktrace/alloc.c
third_party/rust/backtrace-sys/src/libbacktrace/ansidecl.h
third_party/rust/backtrace-sys/src/libbacktrace/atomic.c
third_party/rust/backtrace-sys/src/libbacktrace/backtrace-supported.h.in
third_party/rust/backtrace-sys/src/libbacktrace/backtrace.c
third_party/rust/backtrace-sys/src/libbacktrace/backtrace.h
third_party/rust/backtrace-sys/src/libbacktrace/btest.c
third_party/rust/backtrace-sys/src/libbacktrace/config.guess
third_party/rust/backtrace-sys/src/libbacktrace/config.h.in
third_party/rust/backtrace-sys/src/libbacktrace/config.sub
third_party/rust/backtrace-sys/src/libbacktrace/configure
third_party/rust/backtrace-sys/src/libbacktrace/configure.ac
third_party/rust/backtrace-sys/src/libbacktrace/dwarf.c
third_party/rust/backtrace-sys/src/libbacktrace/dwarf2.def
third_party/rust/backtrace-sys/src/libbacktrace/dwarf2.h
third_party/rust/backtrace-sys/src/libbacktrace/elf.c
third_party/rust/backtrace-sys/src/libbacktrace/fileline.c
third_party/rust/backtrace-sys/src/libbacktrace/filenames.h
third_party/rust/backtrace-sys/src/libbacktrace/filetype.awk
third_party/rust/backtrace-sys/src/libbacktrace/hashtab.h
third_party/rust/backtrace-sys/src/libbacktrace/install-sh
third_party/rust/backtrace-sys/src/libbacktrace/internal.h
third_party/rust/backtrace-sys/src/libbacktrace/ltmain.sh
third_party/rust/backtrace-sys/src/libbacktrace/missing
third_party/rust/backtrace-sys/src/libbacktrace/mmap.c
third_party/rust/backtrace-sys/src/libbacktrace/mmapio.c
third_party/rust/backtrace-sys/src/libbacktrace/nounwind.c
third_party/rust/backtrace-sys/src/libbacktrace/pecoff.c
third_party/rust/backtrace-sys/src/libbacktrace/posix.c
third_party/rust/backtrace-sys/src/libbacktrace/print.c
third_party/rust/backtrace-sys/src/libbacktrace/read.c
third_party/rust/backtrace-sys/src/libbacktrace/simple.c
third_party/rust/backtrace-sys/src/libbacktrace/sort.c
third_party/rust/backtrace-sys/src/libbacktrace/state.c
third_party/rust/backtrace-sys/src/libbacktrace/stest.c
third_party/rust/backtrace-sys/src/libbacktrace/unknown.c
third_party/rust/backtrace-sys/symbol-map
third_party/rust/backtrace/.cargo-checksum.json
third_party/rust/backtrace/.cargo-ok
third_party/rust/backtrace/.gitignore
third_party/rust/backtrace/.travis.yml
third_party/rust/backtrace/Cargo.toml
third_party/rust/backtrace/LICENSE-APACHE
third_party/rust/backtrace/LICENSE-MIT
third_party/rust/backtrace/README.md
third_party/rust/backtrace/appveyor.yml
third_party/rust/backtrace/examples/backtrace.rs
third_party/rust/backtrace/examples/raw.rs
third_party/rust/backtrace/src/backtrace/dbghelp.rs
third_party/rust/backtrace/src/backtrace/libunwind.rs
third_party/rust/backtrace/src/backtrace/mod.rs
third_party/rust/backtrace/src/backtrace/noop.rs
third_party/rust/backtrace/src/backtrace/unix_backtrace.rs
third_party/rust/backtrace/src/capture.rs
third_party/rust/backtrace/src/dylib.rs
third_party/rust/backtrace/src/lib.rs
third_party/rust/backtrace/src/symbolize/coresymbolication.rs
third_party/rust/backtrace/src/symbolize/dbghelp.rs
third_party/rust/backtrace/src/symbolize/dladdr.rs
third_party/rust/backtrace/src/symbolize/libbacktrace.rs
third_party/rust/backtrace/src/symbolize/mod.rs
third_party/rust/backtrace/src/symbolize/noop.rs
third_party/rust/backtrace/tests/smoke.rs
third_party/rust/base64/.cargo-checksum.json
third_party/rust/base64/.cargo-ok
third_party/rust/base64/.gitignore
third_party/rust/base64/Cargo.toml
third_party/rust/base64/LICENSE-APACHE
third_party/rust/base64/LICENSE-MIT
third_party/rust/base64/README.md
third_party/rust/base64/benches/benchmarks.rs
third_party/rust/base64/examples/make_tables.rs
third_party/rust/base64/src/lib.rs
third_party/rust/base64/src/tables.rs
third_party/rust/base64/tests/tests.rs
third_party/rust/bzip2-sys/.cargo-checksum.json
third_party/rust/bzip2-sys/.cargo-ok
third_party/rust/bzip2-sys/Cargo.toml
third_party/rust/bzip2-sys/build.rs
third_party/rust/bzip2-sys/bzip2-1.0.6/CHANGES
third_party/rust/bzip2-sys/bzip2-1.0.6/LICENSE
third_party/rust/bzip2-sys/bzip2-1.0.6/Makefile
third_party/rust/bzip2-sys/bzip2-1.0.6/Makefile-libbz2_so
third_party/rust/bzip2-sys/bzip2-1.0.6/README
third_party/rust/bzip2-sys/bzip2-1.0.6/README.COMPILATION.PROBLEMS
third_party/rust/bzip2-sys/bzip2-1.0.6/README.XML.STUFF
third_party/rust/bzip2-sys/bzip2-1.0.6/blocksort.c
third_party/rust/bzip2-sys/bzip2-1.0.6/bz-common.xsl
third_party/rust/bzip2-sys/bzip2-1.0.6/bz-fo.xsl
third_party/rust/bzip2-sys/bzip2-1.0.6/bz-html.xsl
third_party/rust/bzip2-sys/bzip2-1.0.6/bzdiff
third_party/rust/bzip2-sys/bzip2-1.0.6/bzdiff.1
third_party/rust/bzip2-sys/bzip2-1.0.6/bzgrep
third_party/rust/bzip2-sys/bzip2-1.0.6/bzgrep.1
third_party/rust/bzip2-sys/bzip2-1.0.6/bzip.css
third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.1
third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.1.preformatted
third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.c
third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.txt
third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2recover.c
third_party/rust/bzip2-sys/bzip2-1.0.6/bzlib.c
third_party/rust/bzip2-sys/bzip2-1.0.6/bzlib.h
third_party/rust/bzip2-sys/bzip2-1.0.6/bzlib_private.h
third_party/rust/bzip2-sys/bzip2-1.0.6/bzmore
third_party/rust/bzip2-sys/bzip2-1.0.6/bzmore.1
third_party/rust/bzip2-sys/bzip2-1.0.6/compress.c
third_party/rust/bzip2-sys/bzip2-1.0.6/crctable.c
third_party/rust/bzip2-sys/bzip2-1.0.6/decompress.c
third_party/rust/bzip2-sys/bzip2-1.0.6/dlltest.c
third_party/rust/bzip2-sys/bzip2-1.0.6/dlltest.dsp
third_party/rust/bzip2-sys/bzip2-1.0.6/entities.xml
third_party/rust/bzip2-sys/bzip2-1.0.6/format.pl
third_party/rust/bzip2-sys/bzip2-1.0.6/huffman.c
third_party/rust/bzip2-sys/bzip2-1.0.6/libbz2.def
third_party/rust/bzip2-sys/bzip2-1.0.6/libbz2.dsp
third_party/rust/bzip2-sys/bzip2-1.0.6/makefile.msc
third_party/rust/bzip2-sys/bzip2-1.0.6/manual.html
third_party/rust/bzip2-sys/bzip2-1.0.6/manual.ps
third_party/rust/bzip2-sys/bzip2-1.0.6/manual.xml
third_party/rust/bzip2-sys/bzip2-1.0.6/mk251.c
third_party/rust/bzip2-sys/bzip2-1.0.6/randtable.c
third_party/rust/bzip2-sys/bzip2-1.0.6/sample1.bz2
third_party/rust/bzip2-sys/bzip2-1.0.6/sample1.ref
third_party/rust/bzip2-sys/bzip2-1.0.6/sample2.bz2
third_party/rust/bzip2-sys/bzip2-1.0.6/sample2.ref
third_party/rust/bzip2-sys/bzip2-1.0.6/sample3.bz2
third_party/rust/bzip2-sys/bzip2-1.0.6/sample3.ref
third_party/rust/bzip2-sys/bzip2-1.0.6/spewG.c
third_party/rust/bzip2-sys/bzip2-1.0.6/unzcrash.c
third_party/rust/bzip2-sys/bzip2-1.0.6/words0
third_party/rust/bzip2-sys/bzip2-1.0.6/words1
third_party/rust/bzip2-sys/bzip2-1.0.6/words2
third_party/rust/bzip2-sys/bzip2-1.0.6/words3
third_party/rust/bzip2-sys/bzip2-1.0.6/xmlproc.sh
third_party/rust/bzip2-sys/lib.rs
third_party/rust/bzip2/.cargo-checksum.json
third_party/rust/bzip2/.cargo-ok
third_party/rust/bzip2/.gitignore
third_party/rust/bzip2/.travis.yml
third_party/rust/bzip2/Cargo.toml
third_party/rust/bzip2/LICENSE-APACHE
third_party/rust/bzip2/LICENSE-MIT
third_party/rust/bzip2/README.md
third_party/rust/bzip2/appveyor.yml
third_party/rust/bzip2/src/bufread.rs
third_party/rust/bzip2/src/lib.rs
third_party/rust/bzip2/src/mem.rs
third_party/rust/bzip2/src/read.rs
third_party/rust/bzip2/src/write.rs
third_party/rust/bzip2/tests/tokio.rs
third_party/rust/chrono/.cargo-checksum.json
third_party/rust/chrono/.cargo-ok
third_party/rust/chrono/.gitignore
third_party/rust/chrono/.travis.yml
third_party/rust/chrono/AUTHORS.txt
third_party/rust/chrono/CHANGELOG.md
third_party/rust/chrono/Cargo.toml
third_party/rust/chrono/LICENSE.txt
third_party/rust/chrono/Makefile
third_party/rust/chrono/README.md
third_party/rust/chrono/src/date.rs
third_party/rust/chrono/src/datetime.rs
third_party/rust/chrono/src/div.rs
third_party/rust/chrono/src/format/mod.rs
third_party/rust/chrono/src/format/parse.rs
third_party/rust/chrono/src/format/parsed.rs
third_party/rust/chrono/src/format/scan.rs
third_party/rust/chrono/src/format/strftime.rs
third_party/rust/chrono/src/lib.rs
third_party/rust/chrono/src/naive/date.rs
third_party/rust/chrono/src/naive/datetime.rs
third_party/rust/chrono/src/naive/time.rs
third_party/rust/chrono/src/offset/fixed.rs
third_party/rust/chrono/src/offset/local.rs
third_party/rust/chrono/src/offset/mod.rs
third_party/rust/chrono/src/offset/utc.rs
third_party/rust/cookie/.cargo-checksum.json
third_party/rust/cookie/.cargo-ok
third_party/rust/cookie/.gitignore
third_party/rust/cookie/.travis.yml
third_party/rust/cookie/Cargo.toml
third_party/rust/cookie/LICENSE-APACHE
third_party/rust/cookie/LICENSE-MIT
third_party/rust/cookie/README.md
third_party/rust/cookie/src/builder.rs
third_party/rust/cookie/src/jar.rs
third_party/rust/cookie/src/lib.rs
third_party/rust/cookie/src/parse.rs
third_party/rust/crossbeam/.cargo-checksum.json
third_party/rust/crossbeam/.cargo-ok
third_party/rust/crossbeam/.gitignore
third_party/rust/crossbeam/.travis.yml
third_party/rust/crossbeam/CHANGELOG.md
third_party/rust/crossbeam/Cargo.toml
third_party/rust/crossbeam/LICENSE-APACHE
third_party/rust/crossbeam/LICENSE-MIT
third_party/rust/crossbeam/README.md
third_party/rust/crossbeam/scala-bench/bench.scala
third_party/rust/crossbeam/src/bin/bench.rs
third_party/rust/crossbeam/src/bin/extra_impls/mod.rs
third_party/rust/crossbeam/src/bin/extra_impls/mpsc_queue.rs
third_party/rust/crossbeam/src/bin/stress-msq.rs
third_party/rust/crossbeam/src/lib.rs
third_party/rust/crossbeam/src/mem/cache_padded.rs
third_party/rust/crossbeam/src/mem/epoch/atomic.rs
third_party/rust/crossbeam/src/mem/epoch/garbage.rs
third_party/rust/crossbeam/src/mem/epoch/global.rs
third_party/rust/crossbeam/src/mem/epoch/guard.rs
third_party/rust/crossbeam/src/mem/epoch/local.rs
third_party/rust/crossbeam/src/mem/epoch/mod.rs
third_party/rust/crossbeam/src/mem/epoch/participant.rs
third_party/rust/crossbeam/src/mem/epoch/participants.rs
third_party/rust/crossbeam/src/mem/mod.rs
third_party/rust/crossbeam/src/scoped.rs
third_party/rust/crossbeam/src/sync/arc_cell.rs
third_party/rust/crossbeam/src/sync/atomic_option.rs
third_party/rust/crossbeam/src/sync/chase_lev.rs
third_party/rust/crossbeam/src/sync/mod.rs
third_party/rust/crossbeam/src/sync/ms_queue.rs
third_party/rust/crossbeam/src/sync/seg_queue.rs
third_party/rust/crossbeam/src/sync/treiber_stack.rs
third_party/rust/dbghelp-sys/.cargo-checksum.json
third_party/rust/dbghelp-sys/.cargo-ok
third_party/rust/dbghelp-sys/Cargo.toml
third_party/rust/dbghelp-sys/README.md
third_party/rust/dbghelp-sys/build.rs
third_party/rust/dbghelp-sys/i686/libdbghelp.a
third_party/rust/dbghelp-sys/src/lib.rs
third_party/rust/dbghelp-sys/x86_64/libdbghelp.a
third_party/rust/flate2/.cargo-checksum.json
third_party/rust/flate2/.cargo-ok
third_party/rust/flate2/.gitignore
third_party/rust/flate2/.travis.yml
third_party/rust/flate2/Cargo.toml
third_party/rust/flate2/LICENSE-APACHE
third_party/rust/flate2/LICENSE-MIT
third_party/rust/flate2/README.md
third_party/rust/flate2/appveyor.yml
third_party/rust/flate2/src/bufreader.rs
third_party/rust/flate2/src/crc.rs
third_party/rust/flate2/src/deflate.rs
third_party/rust/flate2/src/ffi.rs
third_party/rust/flate2/src/gz.rs
third_party/rust/flate2/src/lib.rs
third_party/rust/flate2/src/mem.rs
third_party/rust/flate2/src/zio.rs
third_party/rust/flate2/src/zlib.rs
third_party/rust/flate2/tests/corrupt-file.gz
third_party/rust/flate2/tests/good-file.gz
third_party/rust/flate2/tests/good-file.txt
third_party/rust/flate2/tests/gunzip.rs
third_party/rust/flate2/tests/multi.gz
third_party/rust/flate2/tests/multi.txt
third_party/rust/flate2/tests/tokio.rs
third_party/rust/httparse/.cargo-checksum.json
third_party/rust/httparse/.cargo-ok
third_party/rust/httparse/.gitignore
third_party/rust/httparse/.travis.yml
third_party/rust/httparse/.travis_after.sh
third_party/rust/httparse/Cargo.toml
third_party/rust/httparse/LICENSE-APACHE
third_party/rust/httparse/LICENSE-MIT
third_party/rust/httparse/README.md
third_party/rust/httparse/benches/parse.rs
third_party/rust/httparse/src/iter.rs
third_party/rust/httparse/src/lib.rs
third_party/rust/hyper/.cargo-checksum.json
third_party/rust/hyper/.cargo-ok
third_party/rust/hyper/Cargo.toml
third_party/rust/hyper/LICENSE
third_party/rust/hyper/build.rs
third_party/rust/hyper/src/buffer.rs
third_party/rust/hyper/src/client/mod.rs
third_party/rust/hyper/src/client/pool.rs
third_party/rust/hyper/src/client/proxy.rs
third_party/rust/hyper/src/client/request.rs
third_party/rust/hyper/src/client/response.rs
third_party/rust/hyper/src/error.rs
third_party/rust/hyper/src/header/common/accept.rs
third_party/rust/hyper/src/header/common/accept_charset.rs
third_party/rust/hyper/src/header/common/accept_encoding.rs
third_party/rust/hyper/src/header/common/accept_language.rs
third_party/rust/hyper/src/header/common/accept_ranges.rs
third_party/rust/hyper/src/header/common/access_control_allow_credentials.rs
third_party/rust/hyper/src/header/common/access_control_allow_headers.rs
third_party/rust/hyper/src/header/common/access_control_allow_methods.rs
third_party/rust/hyper/src/header/common/access_control_allow_origin.rs
third_party/rust/hyper/src/header/common/access_control_expose_headers.rs
third_party/rust/hyper/src/header/common/access_control_max_age.rs
third_party/rust/hyper/src/header/common/access_control_request_headers.rs
third_party/rust/hyper/src/header/common/access_control_request_method.rs
third_party/rust/hyper/src/header/common/allow.rs
third_party/rust/hyper/src/header/common/authorization.rs
third_party/rust/hyper/src/header/common/cache_control.rs
third_party/rust/hyper/src/header/common/connection.rs
third_party/rust/hyper/src/header/common/content_disposition.rs
third_party/rust/hyper/src/header/common/content_encoding.rs
third_party/rust/hyper/src/header/common/content_language.rs
third_party/rust/hyper/src/header/common/content_length.rs
third_party/rust/hyper/src/header/common/content_range.rs
third_party/rust/hyper/src/header/common/content_type.rs
third_party/rust/hyper/src/header/common/cookie.rs
third_party/rust/hyper/src/header/common/date.rs
third_party/rust/hyper/src/header/common/etag.rs
third_party/rust/hyper/src/header/common/expect.rs
third_party/rust/hyper/src/header/common/expires.rs
third_party/rust/hyper/src/header/common/from.rs
third_party/rust/hyper/src/header/common/host.rs
third_party/rust/hyper/src/header/common/if_match.rs
third_party/rust/hyper/src/header/common/if_modified_since.rs
third_party/rust/hyper/src/header/common/if_none_match.rs
third_party/rust/hyper/src/header/common/if_range.rs
third_party/rust/hyper/src/header/common/if_unmodified_since.rs
third_party/rust/hyper/src/header/common/last-event-id.rs
third_party/rust/hyper/src/header/common/last_modified.rs
third_party/rust/hyper/src/header/common/location.rs
third_party/rust/hyper/src/header/common/mod.rs
third_party/rust/hyper/src/header/common/origin.rs
third_party/rust/hyper/src/header/common/pragma.rs
third_party/rust/hyper/src/header/common/prefer.rs
third_party/rust/hyper/src/header/common/preference_applied.rs
third_party/rust/hyper/src/header/common/range.rs
third_party/rust/hyper/src/header/common/referer.rs
third_party/rust/hyper/src/header/common/referrer_policy.rs
third_party/rust/hyper/src/header/common/server.rs
third_party/rust/hyper/src/header/common/set_cookie.rs
third_party/rust/hyper/src/header/common/strict_transport_security.rs
third_party/rust/hyper/src/header/common/transfer_encoding.rs
third_party/rust/hyper/src/header/common/upgrade.rs
third_party/rust/hyper/src/header/common/user_agent.rs
third_party/rust/hyper/src/header/common/vary.rs
third_party/rust/hyper/src/header/internals/cell.rs
third_party/rust/hyper/src/header/internals/item.rs
third_party/rust/hyper/src/header/internals/mod.rs
third_party/rust/hyper/src/header/internals/vec_map.rs
third_party/rust/hyper/src/header/mod.rs
third_party/rust/hyper/src/header/parsing.rs
third_party/rust/hyper/src/header/shared/charset.rs
third_party/rust/hyper/src/header/shared/encoding.rs
third_party/rust/hyper/src/header/shared/entity.rs
third_party/rust/hyper/src/header/shared/httpdate.rs
third_party/rust/hyper/src/header/shared/mod.rs
third_party/rust/hyper/src/header/shared/quality_item.rs
third_party/rust/hyper/src/http/h1.rs
third_party/rust/hyper/src/http/message.rs
third_party/rust/hyper/src/http/mod.rs
third_party/rust/hyper/src/lib.rs
third_party/rust/hyper/src/method.rs
third_party/rust/hyper/src/mock.rs
third_party/rust/hyper/src/net.rs
third_party/rust/hyper/src/server/listener.rs
third_party/rust/hyper/src/server/mod.rs
third_party/rust/hyper/src/server/request.rs
third_party/rust/hyper/src/server/response.rs
third_party/rust/hyper/src/status.rs
third_party/rust/hyper/src/uri.rs
third_party/rust/hyper/src/version.rs
third_party/rust/isatty/.cargo-checksum.json
third_party/rust/isatty/.cargo-ok
third_party/rust/isatty/.gitignore
third_party/rust/isatty/.travis.yml
third_party/rust/isatty/Cargo.toml
third_party/rust/isatty/LICENSE-APACHE
third_party/rust/isatty/LICENSE-MIT
third_party/rust/isatty/README.md
third_party/rust/isatty/src/lib.rs
third_party/rust/kernel32-sys-0.1.4/.cargo-checksum.json
third_party/rust/kernel32-sys-0.1.4/.cargo-ok
third_party/rust/kernel32-sys-0.1.4/Cargo.toml
third_party/rust/kernel32-sys-0.1.4/README.md
third_party/rust/kernel32-sys-0.1.4/build.rs
third_party/rust/kernel32-sys-0.1.4/src/lib.rs
third_party/rust/ktmw32-sys/.cargo-checksum.json
third_party/rust/ktmw32-sys/.cargo-ok
third_party/rust/ktmw32-sys/Cargo.toml
third_party/rust/ktmw32-sys/README.md
third_party/rust/ktmw32-sys/build.rs
third_party/rust/ktmw32-sys/i686/libktmw32.a
third_party/rust/ktmw32-sys/src/lib.rs
third_party/rust/ktmw32-sys/x86_64/libktmw32.a
third_party/rust/language-tags/.cargo-checksum.json
third_party/rust/language-tags/.cargo-ok
third_party/rust/language-tags/Cargo.toml
third_party/rust/language-tags/LICENSE
third_party/rust/language-tags/src/lib.rs
third_party/rust/language-tags/tests/tests.rs
third_party/rust/lazy_static-0.1.16/.cargo-checksum.json
third_party/rust/lazy_static-0.1.16/.cargo-ok
third_party/rust/lazy_static-0.1.16/.gitignore
third_party/rust/lazy_static-0.1.16/.travis.yml
third_party/rust/lazy_static-0.1.16/Cargo.toml
third_party/rust/lazy_static-0.1.16/LICENSE
third_party/rust/lazy_static-0.1.16/README.md
third_party/rust/lazy_static-0.1.16/src/lib.rs
third_party/rust/lazy_static-0.1.16/src/liblib.so
third_party/rust/lazy_static-0.1.16/tests/test.rs
third_party/rust/mime/.cargo-checksum.json
third_party/rust/mime/.cargo-ok
third_party/rust/mime/.gitignore
third_party/rust/mime/.travis.yml
third_party/rust/mime/Cargo.toml
third_party/rust/mime/LICENSE
third_party/rust/mime/README.md
third_party/rust/mime/src/lib.rs
third_party/rust/miniz-sys/.cargo-checksum.json
third_party/rust/miniz-sys/.cargo-ok
third_party/rust/miniz-sys/Cargo.toml
third_party/rust/miniz-sys/build.rs
third_party/rust/miniz-sys/lib.rs
third_party/rust/miniz-sys/miniz.c
third_party/rust/mozprofile/.cargo-checksum.json
third_party/rust/mozprofile/.cargo-ok
third_party/rust/mozprofile/.gitignore
third_party/rust/mozprofile/Cargo.toml
third_party/rust/mozprofile/LICENSE
third_party/rust/mozprofile/src/lib.rs
third_party/rust/mozprofile/src/prefdata.rs
third_party/rust/mozprofile/src/preferences.rs
third_party/rust/mozprofile/src/prefreader.rs
third_party/rust/mozprofile/src/profile.rs
third_party/rust/mozrunner/.cargo-checksum.json
third_party/rust/mozrunner/.cargo-ok
third_party/rust/mozrunner/.gitignore
third_party/rust/mozrunner/Cargo.toml
third_party/rust/mozrunner/LICENSE
third_party/rust/mozrunner/src/bin/firefox-default-path.rs
third_party/rust/mozrunner/src/lib.rs
third_party/rust/mozrunner/src/runner.rs
third_party/rust/mozversion/.cargo-checksum.json
third_party/rust/mozversion/.cargo-ok
third_party/rust/mozversion/.gitignore
third_party/rust/mozversion/Cargo.toml
third_party/rust/mozversion/src/lib.rs
third_party/rust/msdos_time/.cargo-checksum.json
third_party/rust/msdos_time/.cargo-ok
third_party/rust/msdos_time/.gitignore
third_party/rust/msdos_time/.travis.yml
third_party/rust/msdos_time/Cargo.toml
third_party/rust/msdos_time/LICENSE-APACHE
third_party/rust/msdos_time/LICENSE-MIT
third_party/rust/msdos_time/README.md
third_party/rust/msdos_time/appveyor.yml
third_party/rust/msdos_time/script/doc-upload.cfg
third_party/rust/msdos_time/src/lib.rs
third_party/rust/num-iter/.cargo-checksum.json
third_party/rust/num-iter/.cargo-ok
third_party/rust/num-iter/Cargo.toml
third_party/rust/num-iter/LICENSE-APACHE
third_party/rust/num-iter/LICENSE-MIT
third_party/rust/num-iter/src/lib.rs
third_party/rust/num/.cargo-checksum.json
third_party/rust/num/.cargo-ok
third_party/rust/num/.gitignore
third_party/rust/num/.travis.yml
third_party/rust/num/Cargo.toml
third_party/rust/num/LICENSE-APACHE
third_party/rust/num/LICENSE-MIT
third_party/rust/num/README.md
third_party/rust/num/benches/bigint.rs
third_party/rust/num/benches/shootout-pidigits.rs
third_party/rust/num/ci/.gitignore
third_party/rust/num/ci/deploy.enc
third_party/rust/num/ci/deploy.sh
third_party/rust/num/ci/rustup.sh
third_party/rust/num/ci/test_full.sh
third_party/rust/num/doc/favicon.ico
third_party/rust/num/doc/index.html
third_party/rust/num/doc/rust-logo-128x128-blk-v2.png
third_party/rust/num/src/lib.rs
third_party/rust/podio/.cargo-checksum.json
third_party/rust/podio/.cargo-ok
third_party/rust/podio/.gitignore
third_party/rust/podio/.travis.yml
third_party/rust/podio/Cargo.toml
third_party/rust/podio/LICENSE-APACHE
third_party/rust/podio/LICENSE-MIT
third_party/rust/podio/README.md
third_party/rust/podio/appveyor.yml
third_party/rust/podio/benches/benchmark.rs
third_party/rust/podio/script/doc-upload.cfg
third_party/rust/podio/src/lib.rs
third_party/rust/podio/tests/bytes.rs
third_party/rust/podio/tests/io.rs
third_party/rust/rust-ini/.cargo-checksum.json
third_party/rust/rust-ini/.cargo-ok
third_party/rust/rust-ini/.gitignore
third_party/rust/rust-ini/.travis.yml
third_party/rust/rust-ini/Cargo.toml
third_party/rust/rust-ini/README.rst
third_party/rust/rust-ini/examples/test.rs
third_party/rust/rust-ini/src/ini.rs
third_party/rust/rust-ini/src/lib.rs
third_party/rust/rustc-demangle/.cargo-checksum.json
third_party/rust/rustc-demangle/.cargo-ok
third_party/rust/rustc-demangle/.gitignore
third_party/rust/rustc-demangle/.travis.yml
third_party/rust/rustc-demangle/Cargo.toml
third_party/rust/rustc-demangle/LICENSE-APACHE
third_party/rust/rustc-demangle/LICENSE-MIT
third_party/rust/rustc-demangle/README.md
third_party/rust/rustc-demangle/src/lib.rs
third_party/rust/rustc_version/.cargo-checksum.json
third_party/rust/rustc_version/.cargo-ok
third_party/rust/rustc_version/.gitignore
third_party/rust/rustc_version/.travis.yml
third_party/rust/rustc_version/Cargo.toml
third_party/rust/rustc_version/LICENSE-APACHE
third_party/rust/rustc_version/LICENSE-MIT
third_party/rust/rustc_version/README.md
third_party/rust/rustc_version/src/lib.rs
third_party/rust/semver-0.1.20/.cargo-checksum.json
third_party/rust/semver-0.1.20/.cargo-ok
third_party/rust/semver-0.1.20/.gitignore
third_party/rust/semver-0.1.20/.travis.yml
third_party/rust/semver-0.1.20/Cargo.toml
third_party/rust/semver-0.1.20/LICENSE-APACHE
third_party/rust/semver-0.1.20/LICENSE-MIT
third_party/rust/semver-0.1.20/README.md
third_party/rust/semver-0.1.20/src/lib.rs
third_party/rust/semver-0.1.20/src/version.rs
third_party/rust/semver-0.1.20/src/version_req.rs
third_party/rust/slog-atomic/.cargo-checksum.json
third_party/rust/slog-atomic/.cargo-ok
third_party/rust/slog-atomic/.gitignore
third_party/rust/slog-atomic/.travis.yml
third_party/rust/slog-atomic/CHANGELOG.md
third_party/rust/slog-atomic/Cargo.toml
third_party/rust/slog-atomic/LICENSE-MPL2
third_party/rust/slog-atomic/Makefile
third_party/rust/slog-atomic/README.md
third_party/rust/slog-atomic/examples/signal.rs
third_party/rust/slog-atomic/lib.rs
third_party/rust/slog-extra/.cargo-checksum.json
third_party/rust/slog-extra/.cargo-ok
third_party/rust/slog-extra/.gitignore
third_party/rust/slog-extra/.travis.yml
third_party/rust/slog-extra/CHANGELOG.md
third_party/rust/slog-extra/Cargo.toml
third_party/rust/slog-extra/LICENSE-MPL2
third_party/rust/slog-extra/Makefile
third_party/rust/slog-extra/README.md
third_party/rust/slog-extra/lib.rs
third_party/rust/slog-stdlog/.cargo-checksum.json
third_party/rust/slog-stdlog/.cargo-ok
third_party/rust/slog-stdlog/CHANGELOG.md
third_party/rust/slog-stdlog/Cargo.toml
third_party/rust/slog-stdlog/lib.rs
third_party/rust/slog-stream/.cargo-checksum.json
third_party/rust/slog-stream/.cargo-ok
third_party/rust/slog-stream/.gitignore
third_party/rust/slog-stream/.travis.yml
third_party/rust/slog-stream/CHANGELOG.md
third_party/rust/slog-stream/Cargo.toml
third_party/rust/slog-stream/LICENSE-MPL2
third_party/rust/slog-stream/Makefile
third_party/rust/slog-stream/README.md
third_party/rust/slog-stream/format.rs
third_party/rust/slog-stream/lib.rs
third_party/rust/slog-stream/rusty-tags.vi
third_party/rust/slog-term/.cargo-checksum.json
third_party/rust/slog-term/.cargo-ok
third_party/rust/slog-term/.gitignore
third_party/rust/slog-term/.travis.yml
third_party/rust/slog-term/CHANGELOG.md
third_party/rust/slog-term/Cargo.toml
third_party/rust/slog-term/LICENSE-MPL2
third_party/rust/slog-term/Makefile
third_party/rust/slog-term/README.md
third_party/rust/slog-term/lib.rs
third_party/rust/slog/.cargo-checksum.json
third_party/rust/slog/.cargo-ok
third_party/rust/slog/.cargo/config
third_party/rust/slog/.gitignore
third_party/rust/slog/.travis.yml
third_party/rust/slog/CHANGELOG.md
third_party/rust/slog/Cargo.toml
third_party/rust/slog/LICENSE-MPL2
third_party/rust/slog/Makefile
third_party/rust/slog/README.md
third_party/rust/slog/benches.txt
third_party/rust/slog/examples.txt
third_party/rust/slog/src/_drain.rs
third_party/rust/slog/src/_level.rs
third_party/rust/slog/src/_logger.rs
third_party/rust/slog/src/lib.rs
third_party/rust/slog/src/ser.rs
third_party/rust/slog/src/tests.rs
third_party/rust/tempdir/.cargo-checksum.json
third_party/rust/tempdir/.cargo-ok
third_party/rust/tempdir/.gitignore
third_party/rust/tempdir/.travis.yml
third_party/rust/tempdir/Cargo.toml
third_party/rust/tempdir/LICENSE-APACHE
third_party/rust/tempdir/LICENSE-MIT
third_party/rust/tempdir/README.md
third_party/rust/tempdir/src/lib.rs
third_party/rust/tempdir/tests/smoke.rs
third_party/rust/traitobject/.cargo-checksum.json
third_party/rust/traitobject/.cargo-ok
third_party/rust/traitobject/.gitignore
third_party/rust/traitobject/.travis.yml
third_party/rust/traitobject/Cargo.toml
third_party/rust/traitobject/README.md
third_party/rust/traitobject/src/impls.rs
third_party/rust/traitobject/src/lib.rs
third_party/rust/typeable/.cargo-checksum.json
third_party/rust/typeable/.cargo-ok
third_party/rust/typeable/.gitignore
third_party/rust/typeable/.travis.yml
third_party/rust/typeable/Cargo.toml
third_party/rust/typeable/src/lib.rs
third_party/rust/unicase/.cargo-checksum.json
third_party/rust/unicase/.cargo-ok
third_party/rust/unicase/.gitignore
third_party/rust/unicase/.travis.yml
third_party/rust/unicase/Cargo.toml
third_party/rust/unicase/LICENSE
third_party/rust/unicase/README.md
third_party/rust/unicase/build.rs
third_party/rust/unicase/src/lib.rs
third_party/rust/uuid/.cargo-checksum.json
third_party/rust/uuid/.cargo-ok
third_party/rust/uuid/.gitignore
third_party/rust/uuid/.travis.yml
third_party/rust/uuid/Cargo.toml
third_party/rust/uuid/LICENSE-APACHE
third_party/rust/uuid/LICENSE-MIT
third_party/rust/uuid/README.md
third_party/rust/uuid/benches/parse_str.rs
third_party/rust/uuid/src/lib.rs
third_party/rust/webdriver/.cargo-checksum.json
third_party/rust/webdriver/.cargo-ok
third_party/rust/webdriver/.gitignore
third_party/rust/webdriver/.travis.yml
third_party/rust/webdriver/Cargo.toml
third_party/rust/webdriver/LICENSE
third_party/rust/webdriver/README.md
third_party/rust/webdriver/src/capabilities.rs
third_party/rust/webdriver/src/command.rs
third_party/rust/webdriver/src/common.rs
third_party/rust/webdriver/src/error.rs
third_party/rust/webdriver/src/httpapi.rs
third_party/rust/webdriver/src/lib.rs
third_party/rust/webdriver/src/macros.rs
third_party/rust/webdriver/src/response.rs
third_party/rust/webdriver/src/server.rs
third_party/rust/winreg/.cargo-checksum.json
third_party/rust/winreg/.cargo-ok
third_party/rust/winreg/.gitignore
third_party/rust/winreg/Cargo.toml
third_party/rust/winreg/LICENSE
third_party/rust/winreg/README.md
third_party/rust/winreg/examples/basic_usage.rs
third_party/rust/winreg/examples/enum.rs
third_party/rust/winreg/examples/serialization.rs
third_party/rust/winreg/examples/transaction.rs
third_party/rust/winreg/src/enums.rs
third_party/rust/winreg/src/lib.rs
third_party/rust/winreg/src/serialization.rs
third_party/rust/winreg/src/transaction.rs
third_party/rust/winreg/src/types.rs
third_party/rust/zip/.cargo-checksum.json
third_party/rust/zip/.cargo-ok
third_party/rust/zip/.gitignore
third_party/rust/zip/.travis.yml
third_party/rust/zip/Cargo.toml
third_party/rust/zip/LICENSE
third_party/rust/zip/README.md
third_party/rust/zip/appveyor.yml
third_party/rust/zip/examples/extract.rs
third_party/rust/zip/examples/extract_lorem.rs
third_party/rust/zip/examples/write_sample.rs
third_party/rust/zip/script/doc-upload.cfg
third_party/rust/zip/src/compression.rs
third_party/rust/zip/src/cp437.rs
third_party/rust/zip/src/crc32.rs
third_party/rust/zip/src/lib.rs
third_party/rust/zip/src/read.rs
third_party/rust/zip/src/result.rs
third_party/rust/zip/src/spec.rs
third_party/rust/zip/src/types.rs
third_party/rust/zip/src/write.rs
new file mode 100644
--- /dev/null
+++ b/third_party/rust/advapi32-sys/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"323ff5358cf140e4d815e6f7563efdeffce840fa3394ead82839fdd8b02a6689","README.md":"cf602fdefd59881da22ea4f7a8db2cfa94e6e03cd9afb4fbf838143e1ca2c194","build.rs":"e063024318a8d117756b5a58dfb3a21d872ab9ba3c8762906f773ddc53eae45a","src/lib.rs":"6de786f2f5b1a1fcb0123086845bfeab7b012a600920862ff98dbacf67f3947a"},"package":"307c92332867e586720c0222ee9d890bbe8431711efed8a1b06bc5b40fc66bd7"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/advapi32-sys/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "advapi32-sys"
+version = "0.1.2"
+authors = ["Peter Atashian <retep998@gmail.com>"]
+description = "FFI bindings to advapi32."
+documentation = "https://retep998.github.io/doc/advapi32/"
+repository = "https://github.com/retep998/winapi-rs"
+readme = "README.md"
+keywords = ["Windows", "FFI", "WinSDK"]
+license = "MIT"
+build = "build.rs"
+links = "advapi32"
+
+[lib]
+name = "advapi32"
+
+[dependencies]
+winapi = { version = "*", path = "../.." }
+[build-dependencies]
+winapi-build = { version = "*", path = "../../build" }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/advapi32-sys/README.md
@@ -0,0 +1,4 @@
+# advapi32-sys #
+FFI bindings to advapi32.
+
+[Documentation](https://retep998.github.io/doc/advapi32/)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/advapi32-sys/build.rs
@@ -0,0 +1,6 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+extern crate build;
+fn main() {
+    build::link("advapi32", false)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/advapi32-sys/src/lib.rs
@@ -0,0 +1,1001 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+//! FFI bindings to advapi32.
+#![cfg(windows)]
+extern crate winapi;
+use winapi::*;
+extern "system" {
+    // pub fn AbortSystemShutdownA();
+    // pub fn AbortSystemShutdownW();
+    // pub fn AccessCheck();
+    // pub fn AccessCheckAndAuditAlarmA();
+    // pub fn AccessCheckAndAuditAlarmW();
+    // pub fn AccessCheckByType();
+    // pub fn AccessCheckByTypeAndAuditAlarmA();
+    // pub fn AccessCheckByTypeAndAuditAlarmW();
+    // pub fn AccessCheckByTypeResultList();
+    // pub fn AccessCheckByTypeResultListAndAuditAlarmA();
+    // pub fn AccessCheckByTypeResultListAndAuditAlarmByHandleA();
+    // pub fn AccessCheckByTypeResultListAndAuditAlarmByHandleW();
+    // pub fn AccessCheckByTypeResultListAndAuditAlarmW();
+    // pub fn AddAccessAllowedAce();
+    // pub fn AddAccessAllowedAceEx();
+    // pub fn AddAccessAllowedObjectAce();
+    // pub fn AddAccessDeniedAce();
+    // pub fn AddAccessDeniedAceEx();
+    // pub fn AddAccessDeniedObjectAce();
+    // pub fn AddAce();
+    // pub fn AddAuditAccessAce();
+    // pub fn AddAuditAccessAceEx();
+    // pub fn AddAuditAccessObjectAce();
+    // pub fn AddConditionalAce();
+    // pub fn AddMandatoryAce();
+    // pub fn AddUsersToEncryptedFile();
+    // pub fn AddUsersToEncryptedFileEx();
+    // pub fn AdjustTokenGroups();
+    pub fn AdjustTokenPrivileges(
+        TokenHandle: HANDLE, DisableAllPrivileges: BOOL, NewState: PTOKEN_PRIVILEGES,
+        BufferLength: DWORD, PreviousState: PTOKEN_PRIVILEGES, ReturnLength: PDWORD,
+    ) -> BOOL;
+    // pub fn AllocateAndInitializeSid();
+    // pub fn AllocateLocallyUniqueId();
+    // pub fn AreAllAccessesGranted();
+    // pub fn AreAnyAccessesGranted();
+    // pub fn AuditComputeEffectivePolicyBySid();
+    // pub fn AuditComputeEffectivePolicyByToken();
+    // pub fn AuditEnumerateCategories();
+    // pub fn AuditEnumeratePerUserPolicy();
+    // pub fn AuditEnumerateSubCategories();
+    // pub fn AuditFree();
+    // pub fn AuditLookupCategoryGuidFromCategoryId();
+    // pub fn AuditLookupCategoryIdFromCategoryGuid();
+    // pub fn AuditLookupCategoryNameA();
+    // pub fn AuditLookupCategoryNameW();
+    // pub fn AuditLookupSubCategoryNameA();
+    // pub fn AuditLookupSubCategoryNameW();
+    // pub fn AuditQueryGlobalSaclA();
+    // pub fn AuditQueryGlobalSaclW();
+    // pub fn AuditQueryPerUserPolicy();
+    // pub fn AuditQuerySecurity();
+    // pub fn AuditQuerySystemPolicy();
+    // pub fn AuditSetGlobalSaclA();
+    // pub fn AuditSetGlobalSaclW();
+    // pub fn AuditSetPerUserPolicy();
+    // pub fn AuditSetSecurity();
+    // pub fn AuditSetSystemPolicy();
+    // pub fn BackupEventLogA();
+    // pub fn BackupEventLogW();
+    // pub fn BaseRegCloseKey();
+    // pub fn BaseRegCreateKey();
+    // pub fn BaseRegDeleteKeyEx();
+    // pub fn BaseRegDeleteValue();
+    // pub fn BaseRegFlushKey();
+    // pub fn BaseRegGetVersion();
+    // pub fn BaseRegLoadKey();
+    // pub fn BaseRegOpenKey();
+    // pub fn BaseRegRestoreKey();
+    // pub fn BaseRegSaveKeyEx();
+    // pub fn BaseRegSetKeySecurity();
+    // pub fn BaseRegSetValue();
+    // pub fn BaseRegUnLoadKey();
+    // pub fn BuildExplicitAccessWithNameA();
+    // pub fn BuildExplicitAccessWithNameW();
+    // pub fn BuildImpersonateExplicitAccessWithNameA();
+    // pub fn BuildImpersonateExplicitAccessWithNameW();
+    // pub fn BuildImpersonateTrusteeA();
+    // pub fn BuildImpersonateTrusteeW();
+    // pub fn BuildSecurityDescriptorA();
+    // pub fn BuildSecurityDescriptorW();
+    // pub fn BuildTrusteeWithNameA();
+    // pub fn BuildTrusteeWithNameW();
+    // pub fn BuildTrusteeWithObjectsAndNameA();
+    // pub fn BuildTrusteeWithObjectsAndNameW();
+    // pub fn BuildTrusteeWithObjectsAndSidA();
+    // pub fn BuildTrusteeWithObjectsAndSidW();
+    // pub fn BuildTrusteeWithSidA();
+    // pub fn BuildTrusteeWithSidW();
+    // pub fn CancelOverlappedAccess();
+    // pub fn ChangeServiceConfig2A();
+    // pub fn ChangeServiceConfig2W();
+    // pub fn ChangeServiceConfigA();
+    // pub fn ChangeServiceConfigW();
+    // pub fn CheckForHiberboot();
+    // pub fn CheckTokenMembership();
+    // pub fn ClearEventLogA();
+    // pub fn ClearEventLogW();
+    // pub fn CloseCodeAuthzLevel();
+    // pub fn CloseEncryptedFileRaw();
+    // pub fn CloseEventLog();
+    pub fn CloseServiceHandle(hSCObject: SC_HANDLE) -> BOOL;
+    // pub fn CloseThreadWaitChainSession();
+    // pub fn CloseTrace();
+    // pub fn CommandLineFromMsiDescriptor();
+    // pub fn ComputeAccessTokenFromCodeAuthzLevel();
+    pub fn ControlService(
+        hService: SC_HANDLE, dwControl: DWORD, lpServiceStatus: LPSERVICE_STATUS,
+    ) -> BOOL;
+    // pub fn ControlServiceExA();
+    // pub fn ControlServiceExW();
+    // pub fn ControlTraceA();
+    // pub fn ControlTraceW();
+    // pub fn ConvertAccessToSecurityDescriptorA();
+    // pub fn ConvertAccessToSecurityDescriptorW();
+    // pub fn ConvertSDToStringSDDomainW();
+    // pub fn ConvertSDToStringSDRootDomainA();
+    // pub fn ConvertSDToStringSDRootDomainW();
+    // pub fn ConvertSecurityDescriptorToAccessA();
+    // pub fn ConvertSecurityDescriptorToAccessNamedA();
+    // pub fn ConvertSecurityDescriptorToAccessNamedW();
+    // pub fn ConvertSecurityDescriptorToAccessW();
+    // pub fn ConvertSecurityDescriptorToStringSecurityDescriptorA();
+    // pub fn ConvertSecurityDescriptorToStringSecurityDescriptorW();
+    // pub fn ConvertSidToStringSidA();
+    // pub fn ConvertSidToStringSidW();
+    // pub fn ConvertStringSDToSDDomainA();
+    // pub fn ConvertStringSDToSDDomainW();
+    // pub fn ConvertStringSDToSDRootDomainA();
+    // pub fn ConvertStringSDToSDRootDomainW();
+    // pub fn ConvertStringSecurityDescriptorToSecurityDescriptorA();
+    // pub fn ConvertStringSecurityDescriptorToSecurityDescriptorW();
+    // pub fn ConvertStringSidToSidA();
+    // pub fn ConvertStringSidToSidW();
+    // pub fn ConvertToAutoInheritPrivateObjectSecurity();
+    // pub fn CopySid();
+    // pub fn CreateCodeAuthzLevel();
+    // pub fn CreatePrivateObjectSecurity();
+    // pub fn CreatePrivateObjectSecurityEx();
+    // pub fn CreatePrivateObjectSecurityWithMultipleInheritance();
+    // pub fn CreateProcessAsUserA();
+    // pub fn CreateProcessAsUserW();
+    // pub fn CreateProcessWithLogonW();
+    // pub fn CreateProcessWithTokenW();
+    // pub fn CreateRestrictedToken();
+    pub fn CreateServiceA(
+        hSCManager: SC_HANDLE, lpServiceName: LPCSTR, lpDisplayName: LPCSTR,
+        dwDesiredAccess: DWORD, dwServiceType: DWORD, dwStartType: DWORD, dwErrorControl: DWORD,
+        lpBinaryPathName: LPCSTR, lpLoadOrderGroup: LPCSTR, lpdwTagId: LPDWORD,
+        lpDependencies: LPCSTR, lpServiceStartName: LPCSTR, lpPassword: LPCSTR,
+    ) -> SC_HANDLE;
+    pub fn CreateServiceW(
+        hSCManager: SC_HANDLE, lpServiceName: LPCWSTR, lpDisplayName: LPCWSTR,
+        dwDesiredAccess: DWORD, dwServiceType: DWORD, dwStartType: DWORD, dwErrorControl: DWORD,
+        lpBinaryPathName: LPCWSTR, lpLoadOrderGroup: LPCWSTR, lpdwTagId: LPDWORD,
+        lpDependencies: LPCWSTR, lpServiceStartName: LPCWSTR, lpPassword: LPCWSTR,
+    ) -> SC_HANDLE;
+    // pub fn CreateTraceInstanceId();
+    // pub fn CreateWellKnownSid();
+    pub fn CredDeleteA(TargetName: LPCSTR, Type: DWORD, Flags: DWORD) -> BOOL;
+    pub fn CredDeleteW(TargetName: LPCWSTR, Type: DWORD, Flags: DWORD) -> BOOL;
+    // pub fn CredEnumerateA();
+    // pub fn CredEnumerateW();
+    // pub fn CredFindBestCredentialA();
+    // pub fn CredFindBestCredentialW();
+    pub fn CredFree(Buffer: PVOID);
+    // pub fn CredGetSessionTypes();
+    // pub fn CredGetTargetInfoA();
+    // pub fn CredGetTargetInfoW();
+    // pub fn CredIsMarshaledCredentialA();
+    // pub fn CredIsMarshaledCredentialW();
+    // pub fn CredIsProtectedA();
+    // pub fn CredIsProtectedW();
+    // pub fn CredMarshalCredentialA();
+    // pub fn CredMarshalCredentialW();
+    // pub fn CredProtectA();
+    // pub fn CredProtectW();
+    pub fn CredReadA(
+        TargetName: LPCSTR, Type: DWORD, Flags: DWORD, Credential: *mut PCREDENTIALA,
+    ) -> BOOL;
+    // pub fn CredReadDomainCredentialsA();
+    // pub fn CredReadDomainCredentialsW();
+    pub fn CredReadW(
+        TargetName: LPCWSTR, Type: DWORD, Flags: DWORD, Credential: *mut PCREDENTIALW,
+    ) -> BOOL;
+    // pub fn CredRenameA();
+    // pub fn CredRenameW();
+    // pub fn CredUnmarshalCredentialA();
+    // pub fn CredUnmarshalCredentialW();
+    // pub fn CredUnprotectA();
+    // pub fn CredUnprotectW();
+    pub fn CredWriteA(Credential: PCREDENTIALA, Flags: DWORD) -> BOOL;
+    // pub fn CredWriteDomainCredentialsA();
+    // pub fn CredWriteDomainCredentialsW();
+    pub fn CredWriteW(Credential: PCREDENTIALW, Flags: DWORD) -> BOOL;
+    pub fn CryptAcquireContextA(
+        phProv: *mut HCRYPTPROV, szContainer: LPCSTR, szProvider: LPCSTR, dwProvType: DWORD,
+        dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptAcquireContextW(
+        phProv: *mut HCRYPTPROV, szContainer: LPCWSTR, szProvider: LPCWSTR, dwProvType: DWORD,
+        dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptContextAddRef(hProv: HCRYPTPROV, pdwReserved: *mut DWORD, dwFlags: DWORD) -> BOOL;
+    pub fn CryptCreateHash(
+        hProv: HCRYPTPROV, Algid: ALG_ID, hKey: HCRYPTKEY, dwFlags: DWORD, phHash: *mut HCRYPTHASH,
+    ) -> BOOL;
+    pub fn CryptDecrypt(
+        hKey: HCRYPTKEY, hHash: HCRYPTHASH, Final: BOOL, dwFlags: DWORD, pbData: *mut BYTE, 
+        pdwDataLen: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptDeriveKey(
+        hProv: HCRYPTPROV, Algid: ALG_ID, hBaseData: HCRYPTHASH, dwFlags: DWORD,
+        phKey: *mut HCRYPTKEY,
+    ) -> BOOL;
+    pub fn CryptDestroyHash(hHash: HCRYPTHASH) -> BOOL;
+    pub fn CryptDestroyKey(hKey: HCRYPTKEY) -> BOOL;
+    pub fn CryptDuplicateHash(
+        hHash: HCRYPTHASH, pdwReserved: *mut DWORD, dwFlags: DWORD, phHash: *mut HCRYPTHASH,
+    ) -> BOOL;
+    pub fn CryptDuplicateKey(
+        hKey: HCRYPTKEY, pdwReserved: *mut DWORD, dwFlags: DWORD, phKey: *mut HCRYPTKEY,
+    ) -> BOOL;
+    pub fn CryptEncrypt(
+        hKey: HCRYPTKEY, hHash: HCRYPTHASH, Final: BOOL, dwFlags: DWORD, pbData: *mut BYTE, 
+        pdwDataLen: *mut DWORD, dwBufLen: DWORD,
+    ) -> BOOL;
+    pub fn CryptEnumProviderTypesA(
+        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD, 
+        szTypeName: LPSTR, pcbTypeName: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptEnumProviderTypesW(
+        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD, 
+        szTypeName: LPWSTR, pcbTypeName: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptEnumProvidersA(
+        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD, 
+        szProvName: LPSTR, pcbProvName: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptEnumProvidersW(
+        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD, 
+        szProvName: LPWSTR, pcbProvName: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptExportKey(
+        hKey: HCRYPTKEY, hExpKey: HCRYPTKEY, dwBlobType: DWORD, dwFlags: DWORD, pbData: *mut BYTE,
+        pdwDataLen: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptGenKey(
+        hProv: HCRYPTPROV, Algid: ALG_ID, dwFlags: DWORD, phKey: *mut HCRYPTKEY,
+    ) -> BOOL;
+    pub fn CryptGenRandom(hProv: HCRYPTPROV, dwLen: DWORD, pbBuffer: *mut BYTE) -> BOOL;
+    pub fn CryptGetDefaultProviderA(
+        dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pszProvName: LPSTR,
+        pcbProvName: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptGetDefaultProviderW(
+        dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pszProvName: LPWSTR,
+        pcbProvName: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptGetHashParam(
+        hHash: HCRYPTHASH, dwParam: DWORD, pbData: *mut BYTE, pdwDataLen: *mut DWORD,
+        dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptGetKeyParam(
+        hKey: HCRYPTKEY, dwParam: DWORD, pbData: *mut BYTE, pdwDataLen: *mut DWORD, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptGetProvParam(
+        hProv: HCRYPTPROV, dwParam: DWORD, pbData: *mut BYTE, pdwDataLen: *mut DWORD,
+        dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptGetUserKey(hProv: HCRYPTPROV, dwKeySpec: DWORD, phUserKey: *mut HCRYPTKEY) -> BOOL;
+    pub fn CryptHashData(
+        hHash: HCRYPTHASH, pbData: *const BYTE, dwDataLen: DWORD, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptHashSessionKey(hHash: HCRYPTHASH, hKey: HCRYPTKEY, dwFlags: DWORD) -> BOOL;
+    pub fn CryptImportKey(
+        hProv: HCRYPTPROV, pbData: *const BYTE, dwDataLen: DWORD, hPubKey: HCRYPTKEY,
+        dwFlags: DWORD, phKey: *mut HCRYPTKEY,
+    ) -> BOOL;
+    pub fn CryptReleaseContext(hProv: HCRYPTPROV, dwFlags: DWORD) -> BOOL;
+    pub fn CryptSetHashParam(
+        hHash: HCRYPTHASH, dwParam: DWORD, pbData: *const BYTE, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptSetKeyParam(
+        hKey: HCRYPTKEY, dwParam: DWORD, pbData: *const BYTE, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptSetProvParam(
+        hProv: HCRYPTPROV, dwParam: DWORD, pbData: *const BYTE, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptSetProviderA(pszProvName: LPCSTR, dwProvType: DWORD) -> BOOL;
+    pub fn CryptSetProviderExA(
+        pszProvName: LPCSTR, dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptSetProviderExW(
+        pszProvName: LPCWSTR, dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptSetProviderW(pszProvName: LPCWSTR, dwProvType: DWORD) -> BOOL;
+    pub fn CryptSignHashA(
+        hHash: HCRYPTHASH, dwKeySpec: DWORD, szDescription: LPCSTR, dwFlags: DWORD,
+        pbSignature: *mut BYTE, pdwSigLen: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptSignHashW(
+        hHash: HCRYPTHASH, dwKeySpec: DWORD, szDescription: LPCWSTR, dwFlags: DWORD,
+        pbSignature: *mut BYTE, pdwSigLen: *mut DWORD,
+    ) -> BOOL;
+    pub fn CryptVerifySignatureA(
+        hHash: HCRYPTHASH, pbSignature: *const BYTE, dwSigLen: DWORD, hPubKey: HCRYPTKEY, 
+        szDescription: LPCSTR, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn CryptVerifySignatureW(
+        hHash: HCRYPTHASH, pbSignature: *const BYTE, dwSigLen: DWORD, hPubKey: HCRYPTKEY, 
+        szDescription: LPCWSTR, dwFlags: DWORD,
+    ) -> BOOL;
+    // pub fn DecryptFileA();
+    // pub fn DecryptFileW();
+    // pub fn DeleteAce();
+    pub fn DeleteService(hService: SC_HANDLE) -> BOOL;
+    // pub fn DeregisterEventSource();
+    // pub fn DestroyPrivateObjectSecurity();
+    // pub fn DuplicateEncryptionInfoFile();
+    // pub fn DuplicateToken();
+    // pub fn DuplicateTokenEx();
+    // pub fn ElfBackupEventLogFileA();
+    // pub fn ElfBackupEventLogFileW();
+    // pub fn ElfChangeNotify();
+    // pub fn ElfClearEventLogFileA();
+    // pub fn ElfClearEventLogFileW();
+    // pub fn ElfCloseEventLog();
+    // pub fn ElfDeregisterEventSource();
+    // pub fn ElfFlushEventLog();
+    // pub fn ElfNumberOfRecords();
+    // pub fn ElfOldestRecord();
+    // pub fn ElfOpenBackupEventLogA();
+    // pub fn ElfOpenBackupEventLogW();
+    // pub fn ElfOpenEventLogA();
+    // pub fn ElfOpenEventLogW();
+    // pub fn ElfReadEventLogA();
+    // pub fn ElfReadEventLogW();
+    // pub fn ElfRegisterEventSourceA();
+    // pub fn ElfRegisterEventSourceW();
+    // pub fn ElfReportEventA();
+    // pub fn ElfReportEventAndSourceW();
+    // pub fn ElfReportEventW();
+    // pub fn EnableTrace();
+    // pub fn EnableTraceEx();
+    // pub fn EnableTraceEx2();
+    // pub fn EncryptFileA();
+    // pub fn EncryptFileW();
+    // pub fn EncryptedFileKeyInfo();
+    // pub fn EncryptionDisable();
+    // pub fn EnumDependentServicesA();
+    // pub fn EnumDependentServicesW();
+    // pub fn EnumDynamicTimeZoneInformation();
+    // pub fn EnumServiceGroupW();
+    // pub fn EnumServicesStatusA();
+    // pub fn EnumServicesStatusExA();
+    // pub fn EnumServicesStatusExW();
+    // pub fn EnumServicesStatusW();
+    // pub fn EnumerateTraceGuids();
+    // pub fn EnumerateTraceGuidsEx();
+    // pub fn EqualDomainSid();
+    // pub fn EqualPrefixSid();
+    // pub fn EqualSid();
+    // pub fn EtwLogSysConfigExtension();
+    // pub fn EventAccessControl();
+    // pub fn EventAccessQuery();
+    // pub fn EventAccessRemove();
+    // pub fn EventActivityIdControl();
+    // pub fn EventEnabled();
+    // pub fn EventProviderEnabled();
+    // pub fn EventRegister();
+    // pub fn EventSetInformation();
+    // pub fn EventUnregister();
+    // pub fn EventWrite();
+    // pub fn EventWriteEndScenario();
+    // pub fn EventWriteEx();
+    // pub fn EventWriteStartScenario();
+    // pub fn EventWriteString();
+    // pub fn EventWriteTransfer();
+    // pub fn FileEncryptionStatusA();
+    // pub fn FileEncryptionStatusW();
+    // pub fn FindFirstFreeAce();
+    // pub fn FlushEfsCache();
+    // pub fn FlushTraceA();
+    // pub fn FlushTraceW();
+    // pub fn FreeEncryptedFileKeyInfo();
+    // pub fn FreeEncryptedFileMetadata();
+    // pub fn FreeEncryptionCertificateHashList();
+    // pub fn FreeInheritedFromArray();
+    // pub fn FreeSid();
+    // pub fn GetAccessPermissionsForObjectA();
+    // pub fn GetAccessPermissionsForObjectW();
+    // pub fn GetAce();
+    // pub fn GetAclInformation();
+    // pub fn GetAuditedPermissionsFromAclA();
+    // pub fn GetAuditedPermissionsFromAclW();
+    // pub fn GetCurrentHwProfileA();
+    // pub fn GetCurrentHwProfileW();
+    // pub fn GetDynamicTimeZoneInformationEffectiveYears();
+    // pub fn GetEffectiveRightsFromAclA();
+    // pub fn GetEffectiveRightsFromAclW();
+    // pub fn GetEncryptedFileMetadata();
+    // pub fn GetEventLogInformation();
+    // pub fn GetExplicitEntriesFromAclA();
+    // pub fn GetExplicitEntriesFromAclW();
+    // pub fn GetFileSecurityA();
+    // pub fn GetFileSecurityW();
+    // pub fn GetInformationCodeAuthzLevelW();
+    // pub fn GetInformationCodeAuthzPolicyW();
+    // pub fn GetInheritanceSourceA();
+    // pub fn GetInheritanceSourceW();
+    // pub fn GetKernelObjectSecurity();
+    // pub fn GetLengthSid();
+    // pub fn GetLocalManagedApplicationData();
+    // pub fn GetLocalManagedApplications();
+    // pub fn GetManagedApplicationCategories();
+    // pub fn GetManagedApplications();
+    // pub fn GetMultipleTrusteeA();
+    // pub fn GetMultipleTrusteeOperationA();
+    // pub fn GetMultipleTrusteeOperationW();
+    // pub fn GetMultipleTrusteeW();
+    // pub fn GetNamedSecurityInfoA();
+    // pub fn GetNamedSecurityInfoExA();
+    // pub fn GetNamedSecurityInfoExW();
+    // pub fn GetNamedSecurityInfoW();
+    // pub fn GetNumberOfEventLogRecords();
+    // pub fn GetOldestEventLogRecord();
+    // pub fn GetOverlappedAccessResults();
+    // pub fn GetPrivateObjectSecurity();
+    // pub fn GetSecurityDescriptorControl();
+    // pub fn GetSecurityDescriptorDacl();
+    // pub fn GetSecurityDescriptorGroup();
+    // pub fn GetSecurityDescriptorLength();
+    // pub fn GetSecurityDescriptorOwner();
+    // pub fn GetSecurityDescriptorRMControl();
+    // pub fn GetSecurityDescriptorSacl();
+    // pub fn GetSecurityInfo();
+    // pub fn GetSecurityInfoExA();
+    // pub fn GetSecurityInfoExW();
+    // pub fn GetServiceDisplayNameA();
+    // pub fn GetServiceDisplayNameW();
+    // pub fn GetServiceKeyNameA();
+    // pub fn GetServiceKeyNameW();
+    // pub fn GetSidIdentifierAuthority();
+    // pub fn GetSidLengthRequired();
+    // pub fn GetSidSubAuthority();
+    // pub fn GetSidSubAuthorityCount();
+    // pub fn GetStringConditionFromBinary();
+    // pub fn GetThreadWaitChain();
+    // pub fn GetTokenInformation();
+    // pub fn GetTraceEnableFlags();
+    // pub fn GetTraceEnableLevel();
+    // pub fn GetTraceLoggerHandle();
+    // pub fn GetTrusteeFormA();
+    // pub fn GetTrusteeFormW();
+    // pub fn GetTrusteeNameA();
+    // pub fn GetTrusteeNameW();
+    // pub fn GetTrusteeTypeA();
+    // pub fn GetTrusteeTypeW();
+    pub fn GetUserNameA(lpBuffer: LPSTR, pcbBuffer: LPDWORD) -> BOOL;
+    pub fn GetUserNameW(lpBuffer: LPWSTR, pcbBuffer: LPDWORD) -> BOOL;
+    // pub fn GetWindowsAccountDomainSid();
+    // pub fn I_ScSetServiceBitsA();
+    // pub fn I_ScSetServiceBitsW();
+    // pub fn IdentifyCodeAuthzLevelW();
+    // pub fn ImpersonateAnonymousToken();
+    // pub fn ImpersonateLoggedOnUser();
+    // pub fn ImpersonateNamedPipeClient();
+    // pub fn ImpersonateSelf();
+    // pub fn InitializeAcl();
+    // pub fn InitializeSecurityDescriptor();
+    // pub fn InitializeSid();
+    // pub fn InitiateShutdownA();
+    // pub fn InitiateShutdownW();
+    // pub fn InitiateSystemShutdownA();
+    // pub fn InitiateSystemShutdownExA();
+    // pub fn InitiateSystemShutdownExW();
+    // pub fn InitiateSystemShutdownW();
+    // pub fn InstallApplication();
+    // pub fn IsTextUnicode();
+    // pub fn IsTokenRestricted();
+    // pub fn IsTokenUntrusted();
+    // pub fn IsValidAcl();
+    // pub fn IsValidRelativeSecurityDescriptor();
+    // pub fn IsValidSecurityDescriptor();
+    // pub fn IsValidSid();
+    // pub fn IsWellKnownSid();
+    // pub fn LockServiceDatabase();
+    // pub fn LogonUserA();
+    // pub fn LogonUserExA();
+    // pub fn LogonUserExExW();
+    // pub fn LogonUserExW();
+    // pub fn LogonUserW();
+    // pub fn LookupAccountNameA();
+    // pub fn LookupAccountNameW();
+    // pub fn LookupAccountSidA();
+    // pub fn LookupAccountSidW();
+    // pub fn LookupPrivilegeDisplayNameA();
+    // pub fn LookupPrivilegeDisplayNameW();
+    // pub fn LookupPrivilegeNameA();
+    // pub fn LookupPrivilegeNameW();
+    pub fn LookupPrivilegeValueA(
+        lpSystemName: LPCSTR, lpName: LPCSTR, lpLuid: PLUID,
+    ) -> BOOL;
+    pub fn LookupPrivilegeValueW(
+        lpSystemName: LPCWSTR, lpName: LPCWSTR, lpLuid: PLUID,
+    ) -> BOOL;
+    // pub fn LookupSecurityDescriptorPartsA();
+    // pub fn LookupSecurityDescriptorPartsW();
+    // pub fn LsaAddAccountRights();
+    // pub fn LsaAddPrivilegesToAccount();
+    // pub fn LsaClearAuditLog();
+    // pub fn LsaClose();
+    // pub fn LsaCreateAccount();
+    // pub fn LsaCreateSecret();
+    // pub fn LsaCreateTrustedDomain();
+    // pub fn LsaCreateTrustedDomainEx();
+    // pub fn LsaDelete();
+    // pub fn LsaDeleteTrustedDomain();
+    // pub fn LsaEnumerateAccountRights();
+    // pub fn LsaEnumerateAccounts();
+    // pub fn LsaEnumerateAccountsWithUserRight();
+    // pub fn LsaEnumeratePrivileges();
+    // pub fn LsaEnumeratePrivilegesOfAccount();
+    // pub fn LsaEnumerateTrustedDomains();
+    // pub fn LsaEnumerateTrustedDomainsEx();
+    // pub fn LsaFreeMemory();
+    // pub fn LsaGetAppliedCAPIDs();
+    // pub fn LsaGetQuotasForAccount();
+    // pub fn LsaGetRemoteUserName();
+    // pub fn LsaGetSystemAccessAccount();
+    // pub fn LsaGetUserName();
+    // pub fn LsaICLookupNames();
+    // pub fn LsaICLookupNamesWithCreds();
+    // pub fn LsaICLookupSids();
+    // pub fn LsaICLookupSidsWithCreds();
+    // pub fn LsaLookupNames();
+    // pub fn LsaLookupNames2();
+    // pub fn LsaLookupPrivilegeDisplayName();
+    // pub fn LsaLookupPrivilegeName();
+    // pub fn LsaLookupPrivilegeValue();
+    // pub fn LsaLookupSids();
+    // pub fn LsaLookupSids2();
+    // pub fn LsaManageSidNameMapping();
+    // pub fn LsaNtStatusToWinError();
+    // pub fn LsaOpenAccount();
+    // pub fn LsaOpenPolicy();
+    // pub fn LsaOpenPolicySce();
+    // pub fn LsaOpenSecret();
+    // pub fn LsaOpenTrustedDomain();
+    // pub fn LsaOpenTrustedDomainByName();
+    // pub fn LsaQueryCAPs();
+    // pub fn LsaQueryDomainInformationPolicy();
+    // pub fn LsaQueryForestTrustInformation();
+    // pub fn LsaQueryInfoTrustedDomain();
+    // pub fn LsaQueryInformationPolicy();
+    // pub fn LsaQuerySecret();
+    // pub fn LsaQuerySecurityObject();
+    // pub fn LsaQueryTrustedDomainInfo();
+    // pub fn LsaQueryTrustedDomainInfoByName();
+    // pub fn LsaRemoveAccountRights();
+    // pub fn LsaRemovePrivilegesFromAccount();
+    // pub fn LsaRetrievePrivateData();
+    // pub fn LsaSetCAPs();
+    // pub fn LsaSetDomainInformationPolicy();
+    // pub fn LsaSetForestTrustInformation();
+    // pub fn LsaSetInformationPolicy();
+    // pub fn LsaSetInformationTrustedDomain();
+    // pub fn LsaSetQuotasForAccount();
+    // pub fn LsaSetSecret();
+    // pub fn LsaSetSecurityObject();
+    // pub fn LsaSetSystemAccessAccount();
+    // pub fn LsaSetTrustedDomainInfoByName();
+    // pub fn LsaSetTrustedDomainInformation();
+    // pub fn LsaStorePrivateData();
+    // pub fn MIDL_user_free_Ext();
+    // pub fn MSChapSrvChangePassword();
+    // pub fn MSChapSrvChangePassword2();
+    // pub fn MakeAbsoluteSD();
+    // pub fn MakeAbsoluteSD2();
+    // pub fn MakeSelfRelativeSD();
+    // pub fn MapGenericMask();
+    // pub fn NotifyBootConfigStatus();
+    // pub fn NotifyChangeEventLog();
+    // pub fn NotifyServiceStatusChange();
+    // pub fn NotifyServiceStatusChangeA();
+    // pub fn NotifyServiceStatusChangeW();
+    // pub fn ObjectCloseAuditAlarmA();
+    // pub fn ObjectCloseAuditAlarmW();
+    // pub fn ObjectDeleteAuditAlarmA();
+    // pub fn ObjectDeleteAuditAlarmW();
+    // pub fn ObjectOpenAuditAlarmA();
+    // pub fn ObjectOpenAuditAlarmW();
+    // pub fn ObjectPrivilegeAuditAlarmA();
+    // pub fn ObjectPrivilegeAuditAlarmW();
+    // pub fn OpenBackupEventLogA();
+    // pub fn OpenBackupEventLogW();
+    // pub fn OpenEncryptedFileRawA();
+    // pub fn OpenEncryptedFileRawW();
+    // pub fn OpenEventLogA();
+    // pub fn OpenEventLogW();
+    pub fn OpenProcessToken(
+        ProcessHandle: HANDLE, DesiredAccess: DWORD, TokenHandle: PHANDLE,
+    ) -> BOOL;
+    pub fn OpenSCManagerA(
+        lpMachineName: LPCSTR, lpDatabaseName: LPCSTR, dwDesiredAccess: DWORD,
+    ) -> SC_HANDLE;
+    pub fn OpenSCManagerW(
+        lpMachineName: LPCWSTR, lpDatabaseName: LPCWSTR, dwDesiredAccess: DWORD,
+    ) -> SC_HANDLE;
+    pub fn OpenServiceA(
+        hSCManager: SC_HANDLE, lpServiceName: LPCSTR, dwDesiredAccess: DWORD,
+    ) -> SC_HANDLE;
+    pub fn OpenServiceW(
+        hSCManager: SC_HANDLE, lpServiceName: LPCWSTR, dwDesiredAccess: DWORD,
+    ) -> SC_HANDLE;
+    // pub fn OpenThreadToken();
+    // pub fn OpenThreadWaitChainSession();
+    // pub fn OpenTraceA();
+    // pub fn OpenTraceW();
+    // pub fn OperationEnd();
+    // pub fn OperationStart();
+    // pub fn PerfAddCounters();
+    // pub fn PerfCloseQueryHandle();
+    // pub fn PerfCreateInstance();
+    // pub fn PerfDecrementULongCounterValue();
+    // pub fn PerfDecrementULongLongCounterValue();
+    // pub fn PerfDeleteCounters();
+    // pub fn PerfDeleteInstance();
+    // pub fn PerfEnumerateCounterSet();
+    // pub fn PerfEnumerateCounterSetInstances();
+    // pub fn PerfIncrementULongCounterValue();
+    // pub fn PerfIncrementULongLongCounterValue();
+    // pub fn PerfOpenQueryHandle();
+    // pub fn PerfQueryCounterData();
+    // pub fn PerfQueryCounterInfo();
+    // pub fn PerfQueryCounterSetRegistrationInfo();
+    // pub fn PerfQueryInstance();
+    // pub fn PerfRegCloseKey();
+    // pub fn PerfRegEnumKey();
+    // pub fn PerfRegEnumValue();
+    // pub fn PerfRegQueryInfoKey();
+    // pub fn PerfRegQueryValue();
+    // pub fn PerfRegSetValue();
+    // pub fn PerfSetCounterRefValue();
+    // pub fn PerfSetCounterSetInfo();
+    // pub fn PerfSetULongCounterValue();
+    // pub fn PerfSetULongLongCounterValue();
+    // pub fn PerfStartProvider();
+    // pub fn PerfStartProviderEx();
+    // pub fn PerfStopProvider();
+    // pub fn PrivilegeCheck();
+    // pub fn PrivilegedServiceAuditAlarmA();
+    // pub fn PrivilegedServiceAuditAlarmW();
+    // pub fn ProcessTrace();
+    // pub fn QueryAllTracesA();
+    // pub fn QueryAllTracesW();
+    // pub fn QueryRecoveryAgentsOnEncryptedFile();
+    // pub fn QuerySecurityAccessMask();
+    // pub fn QueryServiceConfig2A();
+    // pub fn QueryServiceConfig2W();
+    // pub fn QueryServiceConfigA();
+    // pub fn QueryServiceConfigW();
+    // pub fn QueryServiceDynamicInformation();
+    // pub fn QueryServiceLockStatusA();
+    // pub fn QueryServiceLockStatusW();
+    // pub fn QueryServiceObjectSecurity();
+    pub fn QueryServiceStatus(hService: SC_HANDLE, lpServiceStatus: LPSERVICE_STATUS) -> BOOL;
+    pub fn QueryServiceStatusEx(
+        hService: SC_HANDLE, InfoLevel: SC_STATUS_TYPE, lpBuffer: LPBYTE, cbBufSize: DWORD,
+        pcbBytesNeeded: LPDWORD,
+    ) -> BOOL;
+    // pub fn QueryTraceA();
+    // pub fn QueryTraceW();
+    // pub fn QueryUsersOnEncryptedFile();
+    // pub fn ReadEncryptedFileRaw();
+    // pub fn ReadEventLogA();
+    // pub fn ReadEventLogW();
+    pub fn RegCloseKey(hKey: HKEY) -> LONG;
+    pub fn RegConnectRegistryA(lpMachineName: LPCSTR, hKey: HKEY, phkResult: PHKEY) -> LONG;
+    // pub fn RegConnectRegistryExA();
+    // pub fn RegConnectRegistryExW();
+    pub fn RegConnectRegistryW(lpMachineName: LPCWSTR, hKey: HKEY, phkResult: PHKEY) -> LONG;
+    pub fn RegCopyTreeA(hKeySrc: HKEY, lpSubKey: LPCSTR, hKeyDest: HKEY) -> LONG;
+    pub fn RegCopyTreeW(hKeySrc: HKEY, lpSubKey: LPCWSTR, hKeyDest: HKEY) -> LONG;
+    // pub fn RegCreateKeyA();
+    pub fn RegCreateKeyExA(
+        hKey: HKEY, lpSubKey: LPCSTR, Reserved: DWORD, lpClass: LPSTR, dwOptions: DWORD,
+        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
+        lpdwDisposition: LPDWORD,
+    ) -> LONG;
+    pub fn RegCreateKeyExW(
+        hKey: HKEY, lpSubKey: LPCWSTR, Reserved: DWORD, lpClass: LPWSTR, dwOptions: DWORD,
+        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
+        lpdwDisposition: LPDWORD,
+    ) -> LONG;
+    pub fn RegCreateKeyTransactedA(
+        hKey: HKEY, lpSubKey: LPCSTR, Reserved: DWORD, lpClass: LPSTR, dwOptions: DWORD,
+        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
+        lpdwDisposition: LPDWORD, hTransaction: HANDLE, pExtendedParemeter: PVOID,
+    ) -> LONG;
+    pub fn RegCreateKeyTransactedW(
+        hKey: HKEY, lpSubKey: LPCWSTR, Reserved: DWORD, lpClass: LPWSTR, dwOptions: DWORD,
+        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
+        lpdwDisposition: LPDWORD, hTransaction: HANDLE, pExtendedParemeter: PVOID,
+    ) -> LONG;
+    // pub fn RegCreateKeyW();
+    pub fn RegDeleteKeyA(hKey: HKEY, lpSubKey: LPCSTR) -> LONG;
+    pub fn RegDeleteKeyExA(
+        hKey: HKEY, lpSubKey: LPCSTR, samDesired: REGSAM, Reserved: DWORD,
+    ) -> LONG;
+    pub fn RegDeleteKeyExW(
+        hKey: HKEY, lpSubKey: LPCWSTR, samDesired: REGSAM, Reserved: DWORD,
+    ) -> LONG;
+    pub fn RegDeleteKeyTransactedA(
+        hKey: HKEY, lpSubKey: LPCSTR, samDesired: REGSAM, Reserved: DWORD,
+        hTransaction: HANDLE, pExtendedParemeter: PVOID,
+    ) -> LONG;
+    pub fn RegDeleteKeyTransactedW(
+        hKey: HKEY, lpSubKey: LPCWSTR, samDesired: REGSAM, Reserved: DWORD,
+        hTransaction: HANDLE, pExtendedParemeter: PVOID,
+    ) -> LONG;
+    pub fn RegDeleteKeyValueA(hKey: HKEY, lpSubKey: LPCSTR, lpValueName: LPCSTR) -> LONG;
+    pub fn RegDeleteKeyValueW(hKey: HKEY, lpSubKey: LPCWSTR, lpValueName: LPCWSTR) -> LONG;
+    pub fn RegDeleteKeyW(hKey: HKEY, lpSubKey: LPCWSTR) -> LONG;
+    pub fn RegDeleteTreeA(hKey: HKEY, lpSubKey: LPCSTR) -> LONG;
+    pub fn RegDeleteTreeW(hKey: HKEY, lpSubKey: LPCWSTR) -> LONG;
+    pub fn RegDeleteValueA(hKey: HKEY, lpValueName: LPCSTR) -> LONG;
+    pub fn RegDeleteValueW(hKey: HKEY, lpValueName: LPCWSTR) -> LONG;
+    pub fn RegDisablePredefinedCache() -> LONG;
+    pub fn RegDisablePredefinedCacheEx() -> LONG;
+    pub fn RegDisableReflectionKey(hBase: HKEY) -> LONG;
+    pub fn RegEnableReflectionKey(hBase: HKEY) -> LONG;
+    // pub fn RegEnumKeyA();
+    pub fn RegEnumKeyExA(
+        hKey: HKEY, dwIndex: DWORD, lpName: LPSTR, lpcName: LPDWORD, lpReserved: LPDWORD,
+        lpClass: LPSTR, lpcClass: LPDWORD, lpftLastWriteTime: PFILETIME,
+    ) -> LONG;
+    pub fn RegEnumKeyExW(
+        hKey: HKEY, dwIndex: DWORD, lpName: LPWSTR, lpcName: LPDWORD, lpReserved: LPDWORD,
+        lpClass: LPWSTR, lpcClass: LPDWORD, lpftLastWriteTime: PFILETIME,
+    ) -> LONG;
+    // pub fn RegEnumKeyW();
+    pub fn RegEnumValueA(
+        hKey: HKEY, dwIndex: DWORD, lpValueName: LPSTR, lpcchValueName: LPDWORD,
+        lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE, lpcbData: LPDWORD,
+    ) -> LONG;
+    pub fn RegEnumValueW(
+        hKey: HKEY, dwIndex: DWORD, lpValueName: LPWSTR, lpcchValueName: LPDWORD,
+        lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE, lpcbData: LPDWORD,
+    ) -> LONG;
+    pub fn RegFlushKey(hKey: HKEY) -> LONG;
+    // pub fn RegGetKeySecurity();
+    pub fn RegGetValueA(
+        hkey: HKEY, lpSubKey: LPCSTR, lpValue: LPCSTR, dwFlags: DWORD, pdwType: LPDWORD,
+        pvData: PVOID, pcbData: LPDWORD,
+    ) -> LONG;
+    pub fn RegGetValueW(
+        hkey: HKEY, lpSubKey: LPCWSTR, lpValue: LPCWSTR, dwFlags: DWORD, pdwType: LPDWORD,
+        pvData: PVOID, pcbData: LPDWORD,
+    ) -> LONG;
+    // pub fn RegLoadAppKeyA();
+    // pub fn RegLoadAppKeyW();
+    // pub fn RegLoadKeyA();
+    // pub fn RegLoadKeyW();
+    // pub fn RegLoadMUIStringA();
+    pub fn RegLoadMUIStringW(
+        hKey: HKEY, pszValue: LPCWSTR, pszOutBuf: LPWSTR, cbOutBuf: DWORD, pcbData: LPDWORD,
+        Flags: DWORD, pszDirectory: LPCWSTR,
+    ) -> LONG;
+    pub fn RegNotifyChangeKeyValue(
+        hKey: HKEY, bWatchSubtree: BOOL, dwNotifyFilter: DWORD, hEvent: HANDLE,
+        fAsynchronous: BOOL,
+    ) -> LONG;
+    pub fn RegOpenCurrentUser(samDesired: REGSAM, phkResult: PHKEY) -> LONG;
+    // pub fn RegOpenKeyA();
+    pub fn RegOpenKeyExA(
+        hKey: HKEY, lpSubKey: LPCSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
+    ) -> LONG;
+    pub fn RegOpenKeyExW(
+        hKey: HKEY, lpSubKey: LPCWSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
+    ) -> LONG;
+    pub fn RegOpenKeyTransactedA(
+        hKey: HKEY, lpSubKey: LPCSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
+        hTransaction: HANDLE, pExtendedParemeter: PVOID,
+    ) -> LONG;
+    pub fn RegOpenKeyTransactedW(
+        hKey: HKEY, lpSubKey: LPCWSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
+        hTransaction: HANDLE, pExtendedParemeter: PVOID,
+    ) -> LONG;
+    // pub fn RegOpenKeyW();
+    pub fn RegOpenUserClassesRoot(
+        hToken: HANDLE, dwOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
+    ) -> LONG;
+    pub fn RegOverridePredefKey(hKey: HKEY, hNewHKey: HKEY) -> LONG;
+    pub fn RegQueryInfoKeyA(
+        hKey: HKEY, lpClass: LPSTR, lpcClass: LPDWORD, lpReserved: LPDWORD, lpcSubKeys: LPDWORD,
+        lpcMaxSubKeyLen: LPDWORD, lpcMaxClassLen: LPDWORD, lpcValues: LPDWORD,
+        lpcMaxValueNameLen: LPDWORD, lpcMaxValueLen: LPDWORD, lpcbSecurityDescriptor: LPDWORD,
+        lpftLastWriteTime: PFILETIME,
+    ) -> LONG;
+    pub fn RegQueryInfoKeyW(
+        hKey: HKEY, lpClass: LPWSTR, lpcClass: LPDWORD, lpReserved: LPDWORD, lpcSubKeys: LPDWORD,
+        lpcMaxSubKeyLen: LPDWORD, lpcMaxClassLen: LPDWORD, lpcValues: LPDWORD,
+        lpcMaxValueNameLen: LPDWORD, lpcMaxValueLen: LPDWORD, lpcbSecurityDescriptor: LPDWORD,
+        lpftLastWriteTime: PFILETIME,
+    ) -> LONG;
+    pub fn RegQueryMultipleValuesA(
+        hKey: HKEY, val_list: PVALENTA, num_vals: DWORD, lpValueBuf: LPSTR, ldwTotsize: LPDWORD,
+    ) -> LONG;
+    pub fn RegQueryMultipleValuesW(
+        hKey: HKEY, val_list: PVALENTW, num_vals: DWORD, lpValueBuf: LPWSTR, ldwTotsize: LPDWORD,
+    ) -> LONG;
+    pub fn RegQueryReflectionKey(hBase: HKEY, bIsReflectionDisabled: PBOOL) -> LONG;
+    pub fn RegQueryValueExA(
+        hKey: HKEY, lpValueName: LPCSTR, lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE,
+        lpcbData: LPDWORD,
+    ) -> LONG;
+    pub fn RegQueryValueExW(
+        hKey: HKEY, lpValueName: LPCWSTR, lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE,
+        lpcbData: LPDWORD,
+    ) -> LONG;
+    // pub fn RegQueryValueW();
+    // pub fn RegRenameKey();
+    // pub fn RegReplaceKeyA();
+    // pub fn RegReplaceKeyW();
+    // pub fn RegRestoreKeyA();
+    // pub fn RegRestoreKeyW();
+    // pub fn RegSaveKeyA();
+    // pub fn RegSaveKeyExA();
+    // pub fn RegSaveKeyExW();
+    // pub fn RegSaveKeyW();
+    // pub fn RegSetKeySecurity();
+    pub fn RegSetKeyValueA(
+        hKey: HKEY, lpSubKey: LPCSTR, lpValueName: LPCSTR, dwType: DWORD, lpData: LPCVOID,
+        cbData: DWORD,
+    ) -> LONG;
+    pub fn RegSetValueExA(
+        hKey: HKEY, lpValueName: LPCSTR, Reserved: DWORD, dwType: DWORD, lpData: *const BYTE,
+        cbData: DWORD,
+    ) -> LONG;
+    pub fn RegSetValueExW(
+        hKey: HKEY, lpValueName: LPCWSTR, Reserved: DWORD, dwType: DWORD, lpData: *const BYTE,
+        cbData: DWORD,
+    ) -> LONG;
+    pub fn RegSetKeyValueW(
+        hKey: HKEY, lpSubKey: LPCWSTR, lpValueName: LPCWSTR, dwType: DWORD, lpData: LPCVOID,
+        cbData: DWORD,
+    ) -> LONG;
+    // pub fn RegUnLoadKeyA();
+    // pub fn RegUnLoadKeyW();
+    // pub fn RegisterEventSourceA();
+    // pub fn RegisterEventSourceW();
+    pub fn RegisterServiceCtrlHandlerA(
+        lpServiceName: LPCSTR, lpHandlerProc: LPHANDLER_FUNCTION,
+    ) -> SERVICE_STATUS_HANDLE;
+    pub fn RegisterServiceCtrlHandlerExA(
+        lpServiceName: LPCSTR, lpHandlerProc: LPHANDLER_FUNCTION_EX, lpContext: LPVOID,
+    ) -> SERVICE_STATUS_HANDLE;
+    pub fn RegisterServiceCtrlHandlerExW(
+        lpServiceName: LPCWSTR, lpHandlerProc: LPHANDLER_FUNCTION_EX, lpContext: LPVOID,
+    ) -> SERVICE_STATUS_HANDLE;
+    pub fn RegisterServiceCtrlHandlerW(
+        lpServiceName: LPCWSTR, lpHandlerProc: LPHANDLER_FUNCTION,
+    ) -> SERVICE_STATUS_HANDLE;
+    // pub fn RegisterTraceGuidsA();
+    // pub fn RegisterTraceGuidsW();
+    // pub fn RegisterWaitChainCOMCallback();
+    // pub fn RemoteRegEnumKeyWrapper();
+    // pub fn RemoteRegEnumValueWrapper();
+    // pub fn RemoteRegQueryInfoKeyWrapper();
+    // pub fn RemoteRegQueryValueWrapper();
+    // pub fn RemoveTraceCallback();
+    // pub fn RemoveUsersFromEncryptedFile();
+    // pub fn ReportEventA();
+    // pub fn ReportEventW();
+    // pub fn RevertToSelf();
+    // pub fn SafeBaseRegGetKeySecurity();
+    // pub fn SaferCloseLevel();
+    // pub fn SaferComputeTokenFromLevel();
+    // pub fn SaferCreateLevel();
+    // pub fn SaferGetLevelInformation();
+    // pub fn SaferGetPolicyInformation();
+    // pub fn SaferIdentifyLevel();
+    // pub fn SaferRecordEventLogEntry();
+    // pub fn SaferSetLevelInformation();
+    // pub fn SaferSetPolicyInformation();
+    // pub fn SaferiIsExecutableFileType();
+    // pub fn SetAclInformation();
+    // pub fn SetEncryptedFileMetadata();
+    // pub fn SetEntriesInAccessListA();
+    // pub fn SetEntriesInAccessListW();
+    // pub fn SetEntriesInAclA();
+    // pub fn SetEntriesInAclW();
+    // pub fn SetEntriesInAuditListA();
+    // pub fn SetEntriesInAuditListW();
+    // pub fn SetFileSecurityA();
+    // pub fn SetFileSecurityW();
+    // pub fn SetInformationCodeAuthzLevelW();
+    // pub fn SetInformationCodeAuthzPolicyW();
+    // pub fn SetKernelObjectSecurity();
+    // pub fn SetNamedSecurityInfoA();
+    // pub fn SetNamedSecurityInfoExA();
+    // pub fn SetNamedSecurityInfoExW();
+    // pub fn SetNamedSecurityInfoW();
+    // pub fn SetPrivateObjectSecurity();
+    // pub fn SetPrivateObjectSecurityEx();
+    // pub fn SetSecurityAccessMask();
+    // pub fn SetSecurityDescriptorControl();
+    // pub fn SetSecurityDescriptorDacl();
+    // pub fn SetSecurityDescriptorGroup();
+    // pub fn SetSecurityDescriptorOwner();
+    // pub fn SetSecurityDescriptorRMControl();
+    // pub fn SetSecurityDescriptorSacl();
+    // pub fn SetSecurityInfo();
+    // pub fn SetSecurityInfoExA();
+    // pub fn SetSecurityInfoExW();
+    // pub fn SetServiceBits();
+    // pub fn SetServiceObjectSecurity();
+    pub fn SetServiceStatus(
+        hServiceStatus: SERVICE_STATUS_HANDLE, lpServiceStatus: LPSERVICE_STATUS,
+    ) -> BOOL;
+    // pub fn SetThreadToken();
+    // pub fn SetTokenInformation();
+    // pub fn SetTraceCallback();
+    // pub fn SetUserFileEncryptionKey();
+    // pub fn SetUserFileEncryptionKeyEx();
+    // pub fn StartServiceA();
+    pub fn StartServiceCtrlDispatcherA(lpServiceStartTable: *const SERVICE_TABLE_ENTRYA) -> BOOL;
+    pub fn StartServiceCtrlDispatcherW(lpServiceStartTable: *const SERVICE_TABLE_ENTRYW) -> BOOL;
+    // pub fn StartServiceW();
+    // pub fn StartTraceA();
+    // pub fn StartTraceW();
+    // pub fn StopTraceA();
+    // pub fn StopTraceW();
+    // pub fn SystemFunction001();
+    // pub fn SystemFunction002();
+    // pub fn SystemFunction003();
+    // pub fn SystemFunction004();
+    // pub fn SystemFunction005();
+    // pub fn SystemFunction006();
+    // pub fn SystemFunction007();
+    // pub fn SystemFunction008();
+    // pub fn SystemFunction009();
+    // pub fn SystemFunction010();
+    // pub fn SystemFunction011();
+    // pub fn SystemFunction012();
+    // pub fn SystemFunction013();
+    // pub fn SystemFunction014();
+    // pub fn SystemFunction015();
+    // pub fn SystemFunction016();
+    // pub fn SystemFunction017();
+    // pub fn SystemFunction018();
+    // pub fn SystemFunction019();
+    // pub fn SystemFunction020();
+    // pub fn SystemFunction021();
+    // pub fn SystemFunction022();
+    // pub fn SystemFunction023();
+    // pub fn SystemFunction024();
+    // pub fn SystemFunction025();
+    // pub fn SystemFunction026();
+    // pub fn SystemFunction027();
+    // pub fn SystemFunction028();
+    // pub fn SystemFunction029();
+    // pub fn SystemFunction030();
+    // pub fn SystemFunction031();
+    // pub fn SystemFunction032();
+    // pub fn SystemFunction033();
+    // pub fn SystemFunction034();
+    // pub fn SystemFunction036();
+    // pub fn SystemFunction040();
+    // pub fn SystemFunction041();
+    // pub fn TraceEvent();
+    // pub fn TraceEventInstance();
+    // pub fn TraceMessage();
+    // pub fn TraceMessageVa();
+    // pub fn TraceQueryInformation();
+    // pub fn TraceSetInformation();
+    // pub fn TreeResetNamedSecurityInfoA();
+    // pub fn TreeResetNamedSecurityInfoW();
+    // pub fn TreeSetNamedSecurityInfoA();
+    // pub fn TreeSetNamedSecurityInfoW();
+    // pub fn TrusteeAccessToObjectA();
+    // pub fn TrusteeAccessToObjectW();
+    // pub fn UninstallApplication();
+    // pub fn UnlockServiceDatabase();
+    // pub fn UnregisterTraceGuids();
+    // pub fn UpdateTraceA();
+    // pub fn UpdateTraceW();
+    // pub fn UsePinForEncryptedFilesA();
+    // pub fn UsePinForEncryptedFilesW();
+    // pub fn WaitServiceState();
+    // pub fn WriteEncryptedFileRaw();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"749f043da5cdbd988e2068e94feb3e75ed326945a99cf288c94ae444f5328680","build.rs":"2cf7c28f03f85c8e68969bcb5b076c8effa8543d39a12fe651ff332ac6a394c7","src/lib.rs":"cb45ba047240bceac6ea74da50c2f48ae81a965b578c833a766a3ea0db1075f3","src/libbacktrace/ChangeLog":"ad6f9058524b950aed734db83419e0624df55a48af8091c8bcad7a125aeeffdd","src/libbacktrace/ChangeLog.jit":"ee143b5c9dc571d9aca006be246a83b1f019c39a3fd7b0025eb37463e30200ce","src/libbacktrace/Makefile.am":"74d0036c9715cb7fa6c749cead794ba96283f47d243cf2b25bc6fac8f04667d5","src/libbacktrace/Makefile.in":"9ca92df95c8d62b8a0e106357a796ef4d2c5ec7fd02ab133fd0a65de1984e096","src/libbacktrace/README":"3d1a15714583197945df8db054da6f30613316ec311c5ec2d68b92fab12364a2","src/libbacktrace/aclocal.m4":"e3a6dfa4ce929624ac289b260987a7fa9b512cfbf3ff6f39c5d1e38cbad1a0ea","src/libbacktrace/alloc.c":"829ceab369210fc60758f339807fe0bf55832c77adb3a4450fae586a90a9673d","src/libbacktrace/ansidecl.h":"14acfcd6c044bc73de85b120cbc3e626771a01712911ee1f6137585fd710fb1e","src/libbacktrace/atomic.c":"3e1882a520e0e1115107e194fbd97daa8d3feef15a70047969f4976e7542c263","src/libbacktrace/backtrace-supported.h.in":"42277f3c383386b6cfa3d3d889336e92303fac0ae1a9fb8a6a56737245dfb8f3","src/libbacktrace/backtrace.c":"76bdabddc4eb8a46a7eec98ce610c86909c89c629eb850a0cde98f5a78c9b99d","src/libbacktrace/backtrace.h":"cd2db6474556b655e42c0a973b871c1b6cb4796809490bf59cc8d3d0e8c083f5","src/libbacktrace/btest.c":"fff55e4acf6ad02a6f719046fc4e3f8bf795166ed9956122a79e17c6be266738","src/libbacktrace/config.guess":"8131853dbc8c3be5171fa96353de7a884a79d3f1d6b3fbf48f99037f5f95fe27","src/libbacktrace/config.h.in":"9b0d30416c93906e5c0ce36c95a7426bfd41228114f381949e89d263305b5b65","src/libbacktrace/config.sub":"3b739084e4b409aacf8531f87b57efa602eccdd17b5cddbc4ae1313a2c866f34","src/libbacktrace/configure":"2b45c89d06809c6ed49d70bfdf51a93e44370fc81f689169a073f47b14b366e5","src/libbacktrace/configure.ac":"360b1a033e33d2c58d2f36aaa6644a2aac0dd8960417df6d64202cc099a1c3f3","src/libbacktrace/dwarf.c":"b969c3abb07a09aa4ac5094dba5777d2c23fee77ade4ec0934142d6b81049785","src/libbacktrace/dwarf2.def":"d947302d8b259f0abdd9dd2f50a0713f4e7395c05ce88ddfdb37a7145b045d82","src/libbacktrace/dwarf2.h":"b3b13fa412a1573e3ee8dcb1d603ec33de7140f00b3bbbaa5292724f0087ace3","src/libbacktrace/elf.c":"728d7e47bf077de4dad6eecc76c134b4b4898dc5866572587692848f29aaec5c","src/libbacktrace/fileline.c":"bae25b6662bfd01a43bccc645206e00aeea27f18a51f6303f00f4fa1d9f2e861","src/libbacktrace/filenames.h":"bce400200dbc7452ca2a7f27dd36516949c4c94a135a6a322f011f3ce7817377","src/libbacktrace/filetype.awk":"9dd5352f288c3737fccd24a2c7583f4d0dbca2b95b2735a90a26b644478018af","src/libbacktrace/hashtab.h":"4cb7f68db5c2e8ff1190ecf859e7feb58447ea20bd9818bb1f447b46e2813c58","src/libbacktrace/install-sh":"d7c113e5484fce8b48f9a34a7a91e385ec279247d415b0b7d749bd56ad8ee8a2","src/libbacktrace/internal.h":"ed657e14aa33b4b5217919435e69019c5a677a00a9c134bf0297f000f146b093","src/libbacktrace/ltmain.sh":"ee4019f80b993cdb1bd13bf39434ad4f1ef15ae57a97594c53fb7b1d76d776a4","src/libbacktrace/missing":"b1a337b731bbb58846d31ca2f5143c293a455fa41b481e236e89a9016d96b034","src/libbacktrace/mmap.c":"fec72286a2d8a0c53fd56ea61b3766b87031f6f803f6de6c3c656e39bc85cdc2","src/libbacktrace/mmapio.c":"32a672fd2b8b3395c8a16ef11d839437ca35570fbc235bb0e2e70ef8097a12fc","src/libbacktrace/nounwind.c":"7694636af38ef488c814ab9b71854d6a259c1f3f635bd4c3ed99a88ca2beb5f1","src/libbacktrace/pecoff.c":"00cf6976cfc1e018f5e5473d4fbef4ae86de825dd2749897c45dfcebcefc6abf","src/libbacktrace/posix.c":"73754fcfa0a5b0342e8fe32166e7228b61e022699a8a3c9a2ef8e46260736704","src/libbacktrace/print.c":"ec1e80e17e27130bf9412470e8dc9155a0dc9ca3a78125081f5073b438b54157","src/libbacktrace/read.c":"399458fb06389aa4bd5ce376c4620cf733b5555d1dabe7ef19f185da1e37e614","src/libbacktrace/simple.c":"686d976c2bdb1a074f9be05af026d4b4c7a4978c2602268747d492563f18e0dc","src/libbacktrace/sort.c":"1a1e44af4e4d02fc568b318aa1517792edd6972a27029ba78e938856ef8ba1a0","src/libbacktrace/state.c":"49d547f5622b0ea0c39bc873b09a7dce276fdc6469118f5ab2e72c55bd0457fb","src/libbacktrace/stest.c":"aa1b90fe2d6dc8ac65ac0168776c2d242efc6460ac596deb14ac1e72bf764871","src/libbacktrace/unknown.c":"914aa113cd17ed678d40927391b35f6027e87b3a02e36e9f1822ec1efe9c0e20","symbol-map":"b941b2516efbb9e46521eeb166c60b31d52b2a4aaaf35d7f9af24946bbe1328a"},"package":"d192fd129132fbc97497c1f2ec2c2c5174e376b95f535199ef4fe0a293d33842"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "backtrace-sys"
+version = "0.1.10"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+build = "build.rs"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/alexcrichton/backtrace-rs"
+homepage = "https://github.com/alexcrichton/backtrace-rs"
+documentation = "http://alexcrichton.com/backtrace-rs"
+description = """
+Bindings to the libbacktrace gcc library
+"""
+
+[dependencies]
+libc = "0.2"
+
+[build-dependencies]
+gcc = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/build.rs
@@ -0,0 +1,136 @@
+extern crate gcc;
+
+use std::env;
+use std::ffi::OsString;
+use std::fs;
+use std::io;
+use std::path::PathBuf;
+use std::process::Command;
+
+macro_rules! t {
+    ($e:expr) => (match $e {
+        Ok(e) => e,
+        Err(e) => panic!("{} failed with {}", stringify!($e), e),
+    })
+}
+
+fn try_tool(compiler: &gcc::Tool, cc: &str, compiler_suffix: &str, tool_suffix: &str)
+            -> Option<PathBuf> {
+    if !cc.ends_with(compiler_suffix) {
+        return None
+    }
+    let cc = cc.replace(compiler_suffix, tool_suffix);
+    let candidate = compiler.path().parent().unwrap().join(cc);
+    if Command::new(&candidate).output().is_ok() {
+        Some(candidate)
+    } else {
+        None
+    }
+}
+
+fn find_tool(compiler: &gcc::Tool, cc: &str, tool: &str) -> PathBuf {
+    // Allow overrides via env var
+    if let Some(s) = env::var_os(tool.to_uppercase()) {
+        return s.into()
+    }
+    let tool_suffix = format!("-{}", tool);
+    try_tool(compiler, cc, "-gcc", &tool_suffix)
+        .or_else(|| try_tool(compiler, cc, "-cc", &tool_suffix))
+        .unwrap_or_else(|| PathBuf::from(tool))
+}
+
+fn main() {
+    let src = env::current_dir().unwrap();
+    let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap());
+    let target = env::var("TARGET").unwrap();
+    let host = env::var("HOST").unwrap();
+
+    // libbacktrace doesn't currently support Mach-O files
+    if target.contains("darwin") {
+        return
+    }
+
+    // libbacktrace isn't used on windows
+    if target.contains("windows") {
+        return
+    }
+
+    // no way this will ever compile for emscripten
+    if target.contains("emscripten") {
+        return
+    }
+
+    let cfg = gcc::Config::new();
+    let compiler = cfg.get_compiler();
+    let cc = compiler.path().file_name().unwrap().to_str().unwrap();
+    let mut flags = OsString::new();
+    for (i, flag) in compiler.args().iter().enumerate() {
+        if i > 0 {
+            flags.push(" ");
+        }
+        flags.push(flag);
+    }
+    let ar = find_tool(&compiler, cc, "ar");
+    run(Command::new(src.join("src/libbacktrace/configure"))
+                .current_dir(&dst)
+                .env("CC", compiler.path())
+                .env("CFLAGS", flags)
+                .arg("--with-pic")
+                .arg("--disable-multilib")
+                .arg("--disable-shared")
+                .arg("--disable-host-shared")
+                .arg(format!("--target={}", target))
+                .arg(format!("--host={}", host)),
+        "sh");
+    run(Command::new("make")
+                .current_dir(&dst)
+                .arg(format!("INCDIR={}",
+                             src.join("src/libbacktrace").display())),
+        "make");
+    println!("cargo:rustc-link-search=native={}/.libs", dst.display());
+    println!("cargo:rustc-link-lib=static=backtrace");
+
+    // The standard library currently bundles in libbacktrace, but it's
+    // compiled with hidden visibility (naturally) so we can't use it.
+    //
+    // To prevent conflicts with a second statically linked copy we rename all
+    // symbols with a '__rbt_' prefix manually here through `objcopy`.
+    let lib = dst.join(".libs/libbacktrace.a");
+    let tmpdir = dst.join("__tmp");
+    drop(fs::remove_dir_all(&tmpdir));
+    t!(fs::create_dir_all(&tmpdir));
+    run(Command::new(&ar).arg("x").arg(&lib).current_dir(&tmpdir),
+        ar.to_str().unwrap());
+
+    t!(fs::remove_file(&lib));
+    let mut objs = Vec::new();
+    let objcopy = find_tool(&compiler, cc, "objcopy");
+    for obj in t!(tmpdir.read_dir()) {
+        let obj = t!(obj);
+        run(Command::new(&objcopy)
+                    .arg("--redefine-syms=symbol-map")
+                    .arg(obj.path()),
+            objcopy.to_str().unwrap());
+        objs.push(obj.path());
+    }
+
+    run(Command::new(&ar).arg("crus").arg(&lib).args(&objs),
+        ar.to_str().unwrap());
+}
+
+fn run(cmd: &mut Command, program: &str) {
+    println!("running: {:?}", cmd);
+    let status = match cmd.status() {
+        Ok(s) => s,
+        Err(ref e) if e.kind() == io::ErrorKind::NotFound => {
+            panic!("\n\nfailed to execute command: {}\nIs `{}` \
+                    not installed?\n\n",
+                   e,
+                   program);
+        }
+        Err(e) => panic!("failed to get status: {}", e),
+    };
+    if !status.success() {
+        panic!("failed with: {}", status);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/lib.rs
@@ -0,0 +1,44 @@
+#![allow(bad_style)]
+
+extern crate libc;
+
+use libc::uintptr_t;
+use std::os::raw::{c_void, c_char, c_int};
+
+pub type backtrace_syminfo_callback =
+    extern fn(data: *mut c_void,
+              pc: uintptr_t,
+              symname: *const c_char,
+              symval: uintptr_t,
+              symsize: uintptr_t);
+pub type backtrace_full_callback =
+    extern fn(data: *mut c_void,
+              pc: uintptr_t,
+              filename: *const c_char,
+              lineno: c_int,
+              function: *const c_char) -> c_int;
+pub type backtrace_error_callback =
+    extern fn(data: *mut c_void,
+              msg: *const c_char,
+              errnum: c_int);
+pub enum backtrace_state {}
+
+extern {
+    #[link_name = "__rbt_backtrace_create_state"]
+    pub fn backtrace_create_state(filename: *const c_char,
+                                  threaded: c_int,
+                                  error: backtrace_error_callback,
+                                  data: *mut c_void) -> *mut backtrace_state;
+    #[link_name = "__rbt_backtrace_syminfo"]
+    pub fn backtrace_syminfo(state: *mut backtrace_state,
+                             addr: uintptr_t,
+                             cb: backtrace_syminfo_callback,
+                             error: backtrace_error_callback,
+                             data: *mut c_void) -> c_int;
+    #[link_name = "__rbt_backtrace_pcinfo"]
+    pub fn backtrace_pcinfo(state: *mut backtrace_state,
+                            addr: uintptr_t,
+                            cb: backtrace_full_callback,
+                            error: backtrace_error_callback,
+                            data: *mut c_void) -> c_int;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/ChangeLog
@@ -0,0 +1,598 @@
+2016-11-15  Matthias Klose  <doko@ubuntu.com>
+
+	* configure: Regenerate.
+
+2016-09-11  Carlos Liam  <carlos@aarzee.me>
+
+	* all: Remove meaningless trailing whitespace.
+
+2016-05-18  Uros Bizjak  <ubizjak@gmail.com>
+
+	PR target/71161
+	* elf.c (phdr_callback) [__i386__]: Add
+	__attribute__((__force_align_arg_pointer__)).
+
+2016-03-02  Maxim Ostapenko  <m.ostapenko@partner.samsung.com>
+
+	* elf.c (backtrace_initialize): Properly initialize elf_fileline_fn to
+	avoid possible crash.
+	(elf_add): Don't set *fileline_fn to elf_nodebug value in case of
+	missing debug info anymore.
+
+2016-02-06  John David Anglin  <danglin@gcc.gnu.org>
+
+	* mmap.c (MAP_FAILED): Define if not defined.
+
+2016-01-04  Jakub Jelinek  <jakub@redhat.com>
+
+	Update copyright years.
+
+2015-12-18  Andris Pavenis  <andris.pavenis@iki.fi>
+
+	* configure.ac: Specify that DJGPP do not have mmap
+	even when sys/mman.h exists.
+	* configure: Regenerate
+
+2015-12-09  John David Anglin  <danglin@gcc.gnu.org>
+
+	PR libgfortran/68115
+	* configure.ac: Set libbacktrace_cv_sys_sync to no on hppa*-*-hpux*.
+	* configure: Regenerate.
+	* elf.c (backtrace_initialize): Cast __sync_bool_compare_and_swap call
+	to void.
+
+2015-09-17  Ian Lance Taylor  <iant@google.com>
+
+	* posix.c (backtrace_open): Cast second argument of open() to int.
+
+2015-09-11  Ian Lance Taylor  <iant@google.com>
+
+	* Makefile.am (backtrace.lo): Depend on internal.h.
+	(sort.lo, stest.lo): Add explicit dependencies.
+	* Makefile.in: Rebuild.
+
+2015-09-09  Hans-Peter Nilsson  <hp@axis.com>
+
+	* backtrace.c: #include <sys/types.h>.
+
+2015-09-08  Ian Lance Taylor  <iant@google.com>
+
+	PR other/67457
+	* backtrace.c: #include "internal.h".
+	(struct backtrace_data): Add can_alloc field.
+	(unwind): If can_alloc is false, don't try to get file/line
+	information.
+	(backtrace_full): Set can_alloc field in bdata.
+	* alloc.c (backtrace_alloc): Don't call error_callback if it is
+	NULL.
+	* mmap.c (backtrace_alloc): Likewise.
+	* internal.h: Update comments for backtrace_alloc and
+	backtrace_free.
+
+2015-09-08  Ian Lance Taylor  <iant@google.com>
+
+	PR other/67457
+	* mmap.c (backtrace_alloc): Correct test for mmap failure.
+
+2015-08-31  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+	* configure.ac: For spu-*-* targets, set have_fcntl to no.
+	* configure: Regenerate.
+
+2015-08-27  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+	* configure.ac: Remove [disable-shared] argument to LT_INIT.
+	Remove setting PIC_FLAG when building as target library.
+	* configure: Regenerate.
+
+2015-08-26  Hans-Peter Nilsson  <hp@axis.com>
+
+	* configure.ac: Only compile with -fPIC if the target
+	supports it.
+	* configure: Regenerate.
+
+2015-08-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+	* configure.ac: Set have_mmap to no on spu-*-* targets.
+	* configure: Regenerate.
+
+2015-08-13  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (read_function_entry): Add vec_inlined parameter.
+	Change all callers.
+
+2015-06-11  Martin Sebor  <msebor@redhat.com>
+
+	PR sanitizer/65479
+	* dwarf.c (struct line): Add new field idx.
+	(line_compare): Use it.
+	(add_line): Set it.
+	(read_line_info): Reset it.
+
+2015-05-29  Tristan Gingold  <gingold@adacore.com>
+
+	* pecoff.c: New file.
+	* Makefile.am (FORMAT_FILES): Add pecoff.c and dependencies.
+	* Makefile.in: Regenerate.
+	* filetype.awk: Detect pecoff.
+	* configure.ac: Define BACKTRACE_SUPPORTS_DATA on elf platforms.
+	Add pecoff.
+	* btest.c (test5): Test enabled only if BACKTRACE_SUPPORTS_DATA is
+	true.
+	* backtrace-supported.h.in (BACKTRACE_SUPPORTS_DATA): Define.
+	* configure: Regenerate.
+	* pecoff.c: New file.
+
+2015-05-13  Michael Haubenwallner  <michael.haubenwallner@ssi-schaefer.com>
+
+	* Makefile.in: Regenerated with automake-1.11.6.
+	* aclocal.m4: Likewise.
+	* configure: Likewise.
+
+2015-01-24  Matthias Klose  <doko@ubuntu.com>
+
+	* configure.ac: Move AM_ENABLE_MULTILIB before AC_PROG_CC.
+	* configure: Regenerate.
+
+2015-01-05  Jakub Jelinek  <jakub@redhat.com>
+
+	Update copyright years.
+
+2014-11-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR bootstrap/63784
+	* configure: Regenerated.
+
+2014-11-11  David Malcolm  <dmalcolm@redhat.com>
+
+	* ChangeLog.jit: New.
+
+2014-11-11  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+	PR target/63610
+	* configure: Regenerate.
+
+2014-10-23  Ian Lance Taylor  <iant@google.com>
+
+	* internal.h (backtrace_atomic_load_pointer) [no atomic or sync]:
+	Fix to return void *.
+
+2014-05-08  Ian Lance Taylor  <iant@google.com>
+
+	* mmap.c (backtrace_free): If freeing a large aligned block of
+	memory, call munmap rather than holding onto it.
+	(backtrace_vector_grow): When growing a vector, double the number
+	of pages requested.  When releasing the old version of a grown
+	vector, pass the correct size to backtrace_free.
+
+2014-03-07  Ian Lance Taylor  <iant@google.com>
+
+	* sort.c (backtrace_qsort): Use middle element as pivot.
+
+2014-03-06  Ian Lance Taylor  <iant@google.com>
+
+	* sort.c: New file.
+	* stest.c: New file.
+	* internal.h (backtrace_qsort): Declare.
+	* dwarf.c (read_abbrevs): Call backtrace_qsort instead of qsort.
+	(read_line_info, read_function_entry): Likewise.
+	(read_function_info, build_dwarf_data): Likewise.
+	* elf.c (elf_initialize_syminfo): Likewise.
+	* Makefile.am (libbacktrace_la_SOURCES): Add sort.c.
+	(stest_SOURCES, stest_LDADD): Define.
+	(check_PROGRAMS): Add stest.
+
+2014-02-07  Misty De Meo  <misty@brew.sh>
+
+	PR target/58710
+	* configure.ac: Use AC_LINK_IFELSE in check for
+	_Unwind_GetIPInfo.
+	* configure: Regenerate.
+
+2014-01-02  Richard Sandiford  <rdsandiford@googlemail.com>
+
+	Update copyright years
+
+2013-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+	* elf.c (ET_DYN): Undefine and define again.
+	(elf_add): Add exe argument, if true and ehdr.e_type is ET_DYN,
+	return early -1 without closing the descriptor.
+	(struct phdr_data): Add exe_descriptor.
+	(phdr_callback): If pd->exe_descriptor is not -1, for very first
+	call if dlpi_name is NULL just call elf_add with the exe_descriptor,
+	otherwise backtrace_close the exe_descriptor if not -1.  Adjust
+	call to elf_add.
+	(backtrace_initialize): Adjust call to elf_add.  If it returns
+	-1, set pd.exe_descriptor to descriptor, otherwise set it to -1.
+
+2013-12-05  Ian Lance Taylor  <iant@google.com>
+
+	* alloc.c (backtrace_vector_finish): Add error_callback and data
+	parameters.  Call backtrace_vector_release.  Return address base.
+	* mmap.c (backtrace_vector_finish): Add error_callback and data
+	parameters.  Return address base.
+	* dwarf.c (read_function_info): Get new address base from
+	backtrace_vector_finish.
+	* internal.h (backtrace_vector_finish): Update declaration.
+
+2013-11-27  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (find_address_ranges): New static function, broken out
+	of build_address_map.
+	(build_address_map): Call it.
+	* btest.c (check): Check for missing filename or function, rather
+	than crashing.
+	(f3): Check that enough frames were returned.
+
+2013-11-19  Jakub Jelinek  <jakub@redhat.com>
+
+	* backtrace.h (backtrace_syminfo_callback): Add symsize argument.
+	* elf.c (elf_syminfo): Pass 0 or sym->size to the callback as
+	last argument.
+	* btest.c (struct symdata): Add size field.
+	(callback_three): Add symsize argument.  Copy it to the data->size
+	field.
+	(f23): Set symdata.size to 0.
+	(test5): Likewise.  If sizeof (int) > 1, lookup address of
+	((uintptr_t) &global) + 1.  Verify symdata.val and symdata.size
+	values.
+
+	* atomic.c: Include sys/types.h.
+
+2013-11-18  Ian Lance Taylor  <iant@google.com>
+
+	* configure.ac: Check for support of __atomic extensions.
+	* internal.h: Declare or #define atomic functions for use in
+	backtrace code.
+	* atomic.c: New file.
+	* dwarf.c (dwarf_lookup_pc): Use atomic functions.
+	(dwarf_fileline, backtrace_dwarf_add): Likewise.
+	* elf.c (elf_add_syminfo_data, elf_syminfo): Likewise.
+	(backtrace_initialize): Likewise.
+	* fileline.c (fileline_initialize): Likewise.
+	* Makefile.am (libbacktrace_la_SOURCES): Add atomic.c.
+	* configure, config.h.in, Makefile.in: Rebuild.
+
+2013-11-18  Jakub Jelinek  <jakub@redhat.com>
+
+	* elf.c (SHN_UNDEF): Define.
+	(elf_initialize_syminfo): Add base_address argument.  Ignore symbols
+	with st_shndx == SHN_UNDEF.  Add base_address to address fields.
+	(elf_add): Adjust caller.
+
+	* elf.c (phdr_callback): Process info->dlpi_addr == 0 normally.
+
+2013-11-16  Ian Lance Taylor  <iant@google.com>
+
+	* backtrace.h (backtrace_create_state): Correct comment about
+	threading.
+
+2013-11-15  Ian Lance Taylor  <iant@google.com>
+
+	* backtrace.h (backtrace_syminfo): Update comment and parameter
+	name to take any address, not just a PC value.
+	* elf.c (STT_OBJECT): Define.
+	(elf_nosyms): Rename parameter pc to addr.
+	(elf_symbol_search): Rename local variable pc to addr.
+	(elf_initialize_syminfo): Add STT_OBJECT symbols to elf_symbols.
+	(elf_syminfo): Rename parameter pc to addr.
+	* btest.c (global): New global variable.
+	(test5): New test.
+	(main): Call test5.
+
+2013-10-17  Ian Lance Taylor  <iant@google.com>
+
+	* elf.c (elf_add): Don't get the wrong offsets if a debug section
+	is missing.
+
+2013-10-15  David Malcolm  <dmalcolm@redhat.com>
+
+	* configure.ac: Add --enable-host-shared, setting up
+	pre-existing PIC_FLAG variable within Makefile.am et al.
+	* configure: Regenerate.
+
+2013-09-20  Alan Modra  <amodra@gmail.com>
+
+	* configure: Regenerate.
+
+2013-07-23  Alexander Monakov  <amonakov@ispras.ru>
+
+	* elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.
+
+2013-07-23  Alexander Monakov  <amonakov@ispras.ru>
+
+	* elf.c (backtrace_initialize): Pass elf_fileline_fn to
+	dl_iterate_phdr callbacks.
+
+2013-03-25  Ian Lance Taylor  <iant@google.com>
+
+	* alloc.c: #include <sys/types.h>.
+	* mmap.c: Likewise.
+
+2013-01-31  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (read_function_info): Permit fvec parameter to be NULL.
+	(dwarf_lookup_pc): Don't use ddata->fvec if threaded.
+
+2013-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+	PR other/56076
+	* dwarf.c (read_line_header): Don't crash if DW_AT_comp_dir
+	attribute was not seen.
+
+2013-01-16  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (struct unit): Add filename and abs_filename fields.
+	(build_address_map): Set new fields when reading unit.
+	(dwarf_lookup_pc): If we don't find an entry in the line table,
+	just return the main file name.
+
+2013-01-14  Richard Sandiford  <rdsandiford@googlemail.com>
+
+	Update copyright years.
+
+2013-01-01  Ian Lance Taylor  <iant@google.com>
+
+	PR bootstrap/54834
+	* Makefile.am (AM_CPPFLAGS): Remove -I ../gcc/include and -I
+	$(MULTIBUILDTOP)/../../gcc/include.
+	* Makefile.in: Rebuild.
+
+2013-01-01  Ian Lance Taylor  <iant@google.com>
+
+	PR other/55536
+	* mmap.c (backtrace_alloc): Don't call sync functions if not
+	threaded.
+	(backtrace_free): Likewise.
+
+2012-12-12  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+	* mmapio.c: Define MAP_FAILED if not defined.
+
+2012-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+	PR bootstrap/54926
+	* Makefile.am (AM_CFLAGS): Remove -frandom-seed=$@.
+	* configure.ac: If --with-target-subdir, add -frandom-seed=$@
+	to EXTRA_FLAGS unconditionally, otherwise check whether the compiler
+	accepts it.
+	* Makefile.in: Regenerated.
+	* configure: Regenerated.
+
+2012-12-07  Jakub Jelinek  <jakub@redhat.com>
+
+	PR bootstrap/54926
+	* Makefile.am (AM_CFLAGS): Add -frandom-seed=$@.
+	* Makefile.in: Regenerated.
+
+2012-11-20  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (read_attribute): Always clear val.
+
+2012-11-13  Ian Lance Taylor  <iant@google.com>
+
+	PR other/55312
+	* configure.ac: Only add -Werror if building a target library.
+	* configure: Rebuild.
+
+2012-11-12  Ian Lance Taylor  <iant@google.com>
+	    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+	    Gerald Pfeifer  <gerald@pfeifer.com>
+
+	* configure.ac: Check for getexecname.
+	* fileline.c: #include <errno.h>.  Define getexecname if not
+	available.
+	(fileline_initialize): Try to find the executable in a few
+	different ways.
+	* print.c (error_callback): Only print the filename if it came
+	from the backtrace state.
+	* configure, config.h.in: Rebuild.
+
+2012-10-29  Ian Lance Taylor  <iant@google.com>
+
+	* mmap.c (backtrace_vector_release): Correct last patch: add
+	aligned, not size.
+
+2012-10-29  Ian Lance Taylor  <iant@google.com>
+
+	* mmap.c (backtrace_vector_release): Make sure freed block is
+	aligned on 8-byte boundary.
+
+2012-10-26  Ian Lance Taylor  <iant@google.com>
+
+	PR other/55087
+	* posix.c (backtrace_open): Add does_not_exist parameter.
+	* elf.c (phdr_callback): Do not warn if shared library could not
+	be opened.
+	* fileline.c (fileline_initialize): Update calls to
+	backtrace_open.
+	* internal.h (backtrace_open): Update declaration.
+
+2012-10-26  Jack Howarth  <howarth@bromo.med.uc.edu>
+
+	PR target/55061
+	* configure.ac: Check for _Unwind_GetIPInfo function declaration.
+	* configure: Regenerate.
+
+2012-10-24  Ian Lance Taylor  <iant@google.com>
+
+	PR target/55061
+	* configure.ac: Check whether -funwind-tables option works.
+	* configure: Rebuild.
+
+2012-10-11  Ian Lance Taylor  <iant@google.com>
+
+	* configure.ac: Do not use dl_iterate_phdr on Solaris 10.
+	* configure: Rebuild.
+
+2012-10-10  Ian Lance Taylor  <iant@google.com>
+
+	* elf.c: Rename all Elf typedefs to start with b_elf, and be all
+	lower case.
+
+2012-10-10  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	* elf.c (elf_add_syminfo_data): Add casts to avoid warning.
+
+2012-10-09  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (dwarf_fileline): Add cast to avoid warning.
+	(backtrace_dwarf_add): Likewise.
+
+2012-10-09  Ian Lance Taylor  <iant@google.com>
+
+	Add support for tracing through shared libraries.
+	* configure.ac: Check for link.h and dl_iterate_phdr.
+	* elf.c: #include <link.h> if system has dl_iterate_phdr.  #undef
+	ELF macros before #defining them.
+	(dl_phdr_info, dl_iterate_phdr): Define if system does not have
+	dl_iterate_phdr.
+	(struct elf_syminfo_data): Add next field.
+	(elf_initialize_syminfo): Initialize next field.
+	(elf_add_syminfo_data): New static function.
+	(elf_add): New static function, broken out of
+	backtrace_initialize.  Call backtrace_dwarf_add instead of
+	backtrace_dwarf_initialize.
+	(struct phdr_data): Define.
+	(phdr_callback): New static function.
+	(backtrace_initialize): Call elf_add.
+	* dwarf.c (struct dwarf_data): Add next and base_address fields.
+	(add_unit_addr): Add base_address parameter.  Change all callers.
+	(add_unit_ranges, build_address_map): Likewise.
+	(add_line): Add ddata parameter.  Change all callers.
+	(read_line_program, add_function_range): Likewise.
+	(dwarf_lookup_pc): New static function, broken out of
+	dwarf_fileline.
+	(dwarf_fileline): Call dwarf_lookup_pc.
+	(build_dwarf_data): New static function.
+	(backtrace_dwarf_add): New function.
+	(backtrace_dwarf_initialize): Remove.
+	* internal.h (backtrace_dwarf_initialize): Don't declare.
+	(backtrace_dwarf_add): Declare.
+	* configure, config.h.in: Rebuild.
+
+2012-10-04  Gerald Pfeifer  <gerald@pfeifer.com>
+
+	* btest.c (f23): Avoid uninitialized variable warning.
+
+2012-10-04  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c: If the system header files do not declare strnlen,
+	provide our own version.
+
+2012-10-03  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c (read_uleb128): Fix overflow test.
+	(read_sleb128): Likewise.
+	(build_address_map): Don't change unit_buf.start.
+
+2012-10-02  Uros Bizjak  <ubizjak@gmail.com>
+
+	PR other/54761
+	* configure.ac (EXTRA_FLAGS): New.
+	* Makefile.am (AM_FLAGS): Add $(EXTRA_FLAGS).
+	* configure, Makefile.in: Regenerate.
+
+2012-09-29  Ian Lance Taylor  <iant@google.com>
+
+	PR other/54749
+	* fileline.c (fileline_initialize): Pass errnum as -1 when
+	reporting that we could not read executable information after a
+	previous failure.
+
+2012-09-27  Ian Lance Taylor  <iant@google.com>
+
+	PR bootstrap/54732
+	* configure.ac: Add no-dependencies to AM_INIT_AUTOMAKE.
+	* Makefile.am: Add dependencies for all objects.
+	* configure, aclocal.m4, Makefile.in: Rebuild.
+
+2012-09-27  Ian Lance Taylor  <iant@google.com>
+
+	PR other/54726
+	* elf.c (backtrace_initialize): Set *fileln_fn, not
+	state->fileln_fn.
+
+2012-09-19  Ian Lance Taylor  <iant@google.com>
+
+	* configure.ac: Only use GCC_CHECK_UNWIND_GETIPINFO when compiled
+	as a target library.
+	* configure: Rebuild.
+
+2012-09-19  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+	    Ian Lance Taylor  <iant@google.com>
+
+        * configure.ac (GCC_HEADER_STDINT): Invoke.
+        * backtrace.h: If we can't find <stdint.h>, use "gstdint.h".
+        * btest.c: Don't include <stdint.h>.
+        * dwarf.c: Likewise.
+        * configure, aclocal.m4, Makefile.in, config.h.in: Rebuild.
+
+2012-09-18  Ian Lance Taylor  <iant@google.com>
+
+	PR bootstrap/54623
+	* Makefile.am (AM_CPPFLAGS): Define.
+	(AM_CFLAGS): Remove -I options.
+	* Makefile.in: Rebuild.
+
+2012-09-18  Ian Lance Taylor  <iant@google.com>
+
+	* posix.c (O_BINARY): Define if not defined.
+	(backtrace_open): Pass O_BINARY to open.  Only call fcntl if
+	HAVE_FCNTL is defined.
+	* configure.ac: Test for the fcntl function.
+	* configure, config.h.in: Rebuild.
+
+2012-09-18  Ian Lance Taylor  <iant@google.com>
+
+	* btest.c (test1, test2, test3, test4): Add the unused attribute.
+
+2012-09-18  Ian Lance Taylor  <iant@google.com>
+
+	* dwarf.c: Correct test of HAVE_DECL_STRNLEN.
+
+2012-09-18  Ian Lance Taylor  <iant@google.com>
+
+	* configure.ac: Add AC_USE_SYSTEM_EXTENSIONS.
+	* mmapio.c: Don't define _GNU_SOURCE.
+	* configure, config.h.in: Rebuild.
+
+2012-09-18  Ian Lance Taylor  <iant@google.com>
+
+	* configure.ac: Check whether strnlen is declared.
+	* dwarf.c: Declare strnlen if not declared.
+	* configure, config.h.in: Rebuild.
+
+2012-09-18  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* fileline.c: Include <stdlib.h>.
+	* mmap.c: Likewise.
+
+2012-09-17  Ian Lance Taylor  <iant@google.com>
+
+	PR bootstrap/54611
+	* nounwind.c (backtrace_full): Rename from backtrace.  Add state
+	parameter.
+
+2012-09-17  Gerald Pfeifer  <gerald@pfeifer.com>
+
+	PR bootstrap/54611
+	* nounwind.c (backtrace_simple): Add state parameter.
+
+2012-09-17  Ian Lance Taylor  <iant@google.com>
+
+	PR bootstrap/54609
+	* unknown.c (unknown_fileline): Add state parameter, remove
+	fileline_data parameter, name error_callback parameter.
+	(backtrace_initialize): Add state parameter.
+
+2012-09-17  Ian Lance Taylor  <iant@google.com>
+
+	* Initial implementation.
+
+Copyright (C) 2012-2016 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/ChangeLog.jit
@@ -0,0 +1,14 @@
+2014-09-24  David Malcolm  <dmalcolm@redhat.com>
+
+	* ChangeLog.jit: Add copyright footer.
+
+2013-10-03  David Malcolm  <dmalcolm@redhat.com>
+
+	* configure.ac: Add --enable-host-shared.
+	* configure: Regenerate.
+
+Copyright (C) 2013-2014 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/Makefile.am
@@ -0,0 +1,136 @@
+# Makefile.am -- Backtrace Makefile.
+# Copyright (C) 2012-2016 Free Software Foundation, Inc.
+
+# 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.
+
+#     (3) The name of the author may not be used to
+#     endorse or promote products derived from this software without
+#     specific prior written permission.
+
+# 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.
+
+ACLOCAL_AMFLAGS = -I .. -I ../config
+
+AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
+	-I ../libgcc
+
+AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
+
+noinst_LTLIBRARIES = libbacktrace.la
+
+libbacktrace_la_SOURCES = \
+	backtrace.h \
+	atomic.c \
+	dwarf.c \
+	fileline.c \
+	internal.h \
+	posix.c \
+	print.c \
+	sort.c \
+	state.c
+
+BACKTRACE_FILES = \
+	backtrace.c \
+	simple.c \
+	nounwind.c
+
+FORMAT_FILES = \
+	elf.c \
+	pecoff.c \
+	unknown.c
+
+VIEW_FILES = \
+	read.c \
+	mmapio.c
+
+ALLOC_FILES = \
+	alloc.c \
+	mmap.c
+
+EXTRA_libbacktrace_la_SOURCES = \
+	$(BACKTRACE_FILES) \
+	$(FORMAT_FILES) \
+	$(VIEW_FILES) \
+	$(ALLOC_FILES)
+
+libbacktrace_la_LIBADD = \
+	$(BACKTRACE_FILE) \
+	$(FORMAT_FILE) \
+	$(VIEW_FILE) \
+	$(ALLOC_FILE)
+
+libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
+
+# Testsuite.
+
+check_PROGRAMS =
+
+TESTS = $(check_PROGRAMS)
+
+if NATIVE
+
+btest_SOURCES = btest.c
+btest_CFLAGS = $(AM_CFLAGS) -g -O
+btest_LDADD = libbacktrace.la
+
+check_PROGRAMS += btest
+
+stest_SOURCES = stest.c
+stest_LDADD = libbacktrace.la
+
+check_PROGRAMS += stest
+
+endif NATIVE
+
+# We can't use automake's automatic dependency tracking, because it
+# breaks when using bootstrap-lean.  Automatic dependency tracking
+# with GCC bootstrap will cause some of the objects to depend on
+# header files in prev-gcc/include, e.g., stddef.h and stdarg.h.  When
+# using bootstrap-lean, prev-gcc is removed after each stage.  When
+# running "make install", those header files will be gone, causing the
+# library to be rebuilt at install time.  That may not succeed.
+
+# These manual dependencies do not include dependencies on unwind.h,
+# even though that is part of GCC, because where to find it depends on
+# whether we are being built as a host library or a target library.
+
+INCDIR = $(top_srcdir)/../include
+alloc.lo: config.h backtrace.h internal.h
+backtrace.lo: config.h backtrace.h internal.h
+btest.lo: (INCDIR)/filenames.h backtrace.h backtrace-supported.h
+dwarf.lo: config.h $(INCDIR)/dwarf2.h $(INCDIR)/dwarf2.def \
+	$(INCDIR)/filenames.h backtrace.h internal.h
+elf.lo: config.h backtrace.h internal.h
+fileline.lo: config.h backtrace.h internal.h
+mmap.lo: config.h backtrace.h internal.h
+mmapio.lo: config.h backtrace.h internal.h
+nounwind.lo: config.h internal.h
+pecoff.lo: config.h backtrace.h internal.h
+posix.lo: config.h backtrace.h internal.h
+print.lo: config.h backtrace.h internal.h
+read.lo: config.h backtrace.h internal.h
+simple.lo: config.h backtrace.h internal.h
+sort.lo: config.h backtrace.h internal.h
+stest.lo: config.h backtrace.h internal.h
+state.lo: config.h backtrace.h backtrace-supported.h internal.h
+unknown.lo: config.h backtrace.h internal.h
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/Makefile.in
@@ -0,0 +1,770 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile.am -- Backtrace Makefile.
+# Copyright (C) 2012-2016 Free Software Foundation, Inc.
+
+# 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.
+
+#     (3) The name of the author may not be used to
+#     endorse or promote products derived from this software without
+#     specific prior written permission.
+
+# 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.
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+check_PROGRAMS = $(am__EXEEXT_1)
+@NATIVE_TRUE@am__append_1 = btest stest
+subdir = .
+DIST_COMMON = README ChangeLog $(srcdir)/Makefile.in \
+	$(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(srcdir)/config.h.in \
+	$(srcdir)/../mkinstalldirs $(srcdir)/backtrace-supported.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/multi.m4 \
+	$(top_srcdir)/../config/override.m4 \
+	$(top_srcdir)/../config/stdint.m4 \
+	$(top_srcdir)/../config/unwind_ipinfo.m4 \
+	$(top_srcdir)/../config/warnings.m4 \
+	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
+	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
+	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = backtrace-supported.h
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libbacktrace_la_OBJECTS = atomic.lo dwarf.lo fileline.lo posix.lo \
+	print.lo sort.lo state.lo
+libbacktrace_la_OBJECTS = $(am_libbacktrace_la_OBJECTS)
+@NATIVE_TRUE@am__EXEEXT_1 = btest$(EXEEXT) stest$(EXEEXT)
+@NATIVE_TRUE@am_btest_OBJECTS = btest-btest.$(OBJEXT)
+btest_OBJECTS = $(am_btest_OBJECTS)
+@NATIVE_TRUE@btest_DEPENDENCIES = libbacktrace.la
+btest_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(btest_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@NATIVE_TRUE@am_stest_OBJECTS = stest.$(OBJEXT)
+stest_OBJECTS = $(am_stest_OBJECTS)
+@NATIVE_TRUE@stest_DEPENDENCIES = libbacktrace.la
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libbacktrace_la_SOURCES) $(EXTRA_libbacktrace_la_SOURCES) \
+	$(btest_SOURCES) $(stest_SOURCES)
+MULTISRCTOP = 
+MULTIBUILDTOP = 
+MULTIDIRS = 
+MULTISUBDIR = 
+MULTIDO = true
+MULTICLEAN = true
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
+ACLOCAL = @ACLOCAL@
+ALLOC_FILE = @ALLOC_FILE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKTRACE_FILE = @BACKTRACE_FILE@
+BACKTRACE_SUPPORTED = @BACKTRACE_SUPPORTED@
+BACKTRACE_SUPPORTS_DATA = @BACKTRACE_SUPPORTS_DATA@
+BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@
+BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTRA_FLAGS = @EXTRA_FLAGS@
+FGREP = @FGREP@
+FORMAT_FILE = @FORMAT_FILE@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PIC_FLAG = @PIC_FLAG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+VIEW_FILE = @VIEW_FILE@
+WARN_FLAGS = @WARN_FLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+libtool_VERSION = @libtool_VERSION@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+multi_basedir = @multi_basedir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ACLOCAL_AMFLAGS = -I .. -I ../config
+AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
+	-I ../libgcc
+
+AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
+noinst_LTLIBRARIES = libbacktrace.la
+libbacktrace_la_SOURCES = \
+	backtrace.h \
+	atomic.c \
+	dwarf.c \
+	fileline.c \
+	internal.h \
+	posix.c \
+	print.c \
+	sort.c \
+	state.c
+
+BACKTRACE_FILES = \
+	backtrace.c \
+	simple.c \
+	nounwind.c
+
+FORMAT_FILES = \
+	elf.c \
+	pecoff.c \
+	unknown.c
+
+VIEW_FILES = \
+	read.c \
+	mmapio.c
+
+ALLOC_FILES = \
+	alloc.c \
+	mmap.c
+
+EXTRA_libbacktrace_la_SOURCES = \
+	$(BACKTRACE_FILES) \
+	$(FORMAT_FILES) \
+	$(VIEW_FILES) \
+	$(ALLOC_FILES)
+
+libbacktrace_la_LIBADD = \
+	$(BACKTRACE_FILE) \
+	$(FORMAT_FILE) \
+	$(VIEW_FILE) \
+	$(ALLOC_FILE)
+
+libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
+TESTS = $(check_PROGRAMS)
+@NATIVE_TRUE@btest_SOURCES = btest.c
+@NATIVE_TRUE@btest_CFLAGS = $(AM_CFLAGS) -g -O
+@NATIVE_TRUE@btest_LDADD = libbacktrace.la
+@NATIVE_TRUE@stest_SOURCES = stest.c
+@NATIVE_TRUE@stest_LDADD = libbacktrace.la
+
+# We can't use automake's automatic dependency tracking, because it
+# breaks when using bootstrap-lean.  Automatic dependency tracking
+# with GCC bootstrap will cause some of the objects to depend on
+# header files in prev-gcc/include, e.g., stddef.h and stdarg.h.  When
+# using bootstrap-lean, prev-gcc is removed after each stage.  When
+# running "make install", those header files will be gone, causing the
+# library to be rebuilt at install time.  That may not succeed.
+
+# These manual dependencies do not include dependencies on unwind.h,
+# even though that is part of GCC, because where to find it depends on
+# whether we are being built as a host library or a target library.
+INCDIR = $(top_srcdir)/../include
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign --ignore-deps'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign --ignore-deps \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign --ignore-deps Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign --ignore-deps Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@if test ! -f $@; then rm -f stamp-h1; else :; fi
+	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+backtrace-supported.h: $(top_builddir)/config.status $(srcdir)/backtrace-supported.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libbacktrace.la: $(libbacktrace_la_OBJECTS) $(libbacktrace_la_DEPENDENCIES) $(EXTRA_libbacktrace_la_DEPENDENCIES) 
+	$(LINK)  $(libbacktrace_la_OBJECTS) $(libbacktrace_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+btest$(EXEEXT): $(btest_OBJECTS) $(btest_DEPENDENCIES) $(EXTRA_btest_DEPENDENCIES) 
+	@rm -f btest$(EXEEXT)
+	$(btest_LINK) $(btest_OBJECTS) $(btest_LDADD) $(LIBS)
+stest$(EXEEXT): $(stest_OBJECTS) $(stest_DEPENDENCIES) $(EXTRA_stest_DEPENDENCIES) 
+	@rm -f stest$(EXEEXT)
+	$(LINK) $(stest_OBJECTS) $(stest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.c.o:
+	$(COMPILE) -c $<
+
+.c.obj:
+	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(LTCOMPILE) -c -o $@ $<
+
+btest-btest.o: btest.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(btest_CFLAGS) $(CFLAGS) -c -o btest-btest.o `test -f 'btest.c' || echo '$(srcdir)/'`btest.c
+
+btest-btest.obj: btest.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(btest_CFLAGS) $(CFLAGS) -c -o btest-btest.obj `if test -f 'btest.c'; then $(CYGPATH_W) 'btest.c'; else $(CYGPATH_W) '$(srcdir)/btest.c'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+
+# GNU Make needs to see an explicit $(MAKE) variable in the command it
+# runs to enable its job server during parallel builds.  Hence the
+# comments below.
+all-multi:
+	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)
+install-multi:
+	$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE)
+
+mostlyclean-multi:
+	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean # $(MAKE)
+clean-multi:
+	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean # $(MAKE)
+distclean-multi:
+	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE)
+maintainer-clean-multi:
+	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean # $(MAKE)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) all-multi config.h
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am clean-multi
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am distclean-multi
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-multi
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am maintainer-clean-multi
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am mostlyclean-multi
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: all all-multi check-am clean-multi distclean-multi install-am \
+	install-multi install-strip maintainer-clean-multi \
+	mostlyclean-multi
+
+.PHONY: CTAGS GTAGS all all-am all-multi am--refresh check check-TESTS \
+	check-am clean clean-checkPROGRAMS clean-generic clean-libtool \
+	clean-multi clean-noinstLTLIBRARIES ctags distclean \
+	distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-multi distclean-tags dvi dvi-am \
+	html html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-multi install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic maintainer-clean-multi mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-multi pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am
+
+alloc.lo: config.h backtrace.h internal.h
+backtrace.lo: config.h backtrace.h internal.h
+btest.lo: (INCDIR)/filenames.h backtrace.h backtrace-supported.h
+dwarf.lo: config.h $(INCDIR)/dwarf2.h $(INCDIR)/dwarf2.def \
+	$(INCDIR)/filenames.h backtrace.h internal.h
+elf.lo: config.h backtrace.h internal.h
+fileline.lo: config.h backtrace.h internal.h
+mmap.lo: config.h backtrace.h internal.h
+mmapio.lo: config.h backtrace.h internal.h
+nounwind.lo: config.h internal.h
+pecoff.lo: config.h backtrace.h internal.h
+posix.lo: config.h backtrace.h internal.h
+print.lo: config.h backtrace.h internal.h
+read.lo: config.h backtrace.h internal.h
+simple.lo: config.h backtrace.h internal.h
+sort.lo: config.h backtrace.h internal.h
+stest.lo: config.h backtrace.h internal.h
+state.lo: config.h backtrace.h backtrace-supported.h internal.h
+unknown.lo: config.h backtrace.h internal.h
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/README
@@ -0,0 +1,23 @@
+The libbacktrace library
+Initially written by Ian Lance Taylor <iant@google.com>
+
+The libbacktrace library may be linked into a program or library and
+used to produce symbolic backtraces.  Sample uses would be to print a
+detailed backtrace when an error occurs or to gather detailed
+profiling information.
+
+The libbacktrace library is provided under a BSD license.  See the
+source files for the exact license text.
+
+The public functions are declared and documented in the header file
+backtrace.h, which should be #include'd by a user of the library.
+
+Building libbacktrace will generate a file backtrace-supported.h,
+which a user of the library may use to determine whether backtraces
+will work.  See the source file backtrace-supported.h.in for the
+macros that it defines.
+
+As of September 2012, libbacktrace only supports ELF executables with
+DWARF debugging information.  The library is written to make it
+straightforward to add support for other object file and debugging
+formats.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/aclocal.m4
@@ -0,0 +1,683 @@
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],,
+[m4_warning([this file was generated for autoconf 2.64.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.6], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([../config/lead-dot.m4])
+m4_include([../config/multi.m4])
+m4_include([../config/override.m4])
+m4_include([../config/stdint.m4])
+m4_include([../config/unwind_ipinfo.m4])
+m4_include([../config/warnings.m4])
+m4_include([../libtool.m4])
+m4_include([../ltoptions.m4])
+m4_include([../ltsugar.m4])
+m4_include([../ltversion.m4])
+m4_include([../lt~obsolete.m4])
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/alloc.c
@@ -0,0 +1,156 @@
+/* alloc.c -- Memory allocation without mmap.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* Allocation routines to use on systems that do not support anonymous
+   mmap.  This implementation just uses malloc, which means that the
+   backtrace functions may not be safely invoked from a signal
+   handler.  */
+
+/* Allocate memory like malloc.  If ERROR_CALLBACK is NULL, don't
+   report an error.  */
+
+void *
+backtrace_alloc (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		 size_t size, backtrace_error_callback error_callback,
+		 void *data)
+{
+  void *ret;
+
+  ret = malloc (size);
+  if (ret == NULL)
+    {
+      if (error_callback)
+	error_callback (data, "malloc", errno);
+    }
+  return ret;
+}
+
+/* Free memory.  */
+
+void
+backtrace_free (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		void *p, size_t size ATTRIBUTE_UNUSED,
+		backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+		void *data ATTRIBUTE_UNUSED)
+{
+  free (p);
+}
+
+/* Grow VEC by SIZE bytes.  */
+
+void *
+backtrace_vector_grow (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		       size_t size, backtrace_error_callback error_callback,
+		       void *data, struct backtrace_vector *vec)
+{
+  void *ret;
+
+  if (size > vec->alc)
+    {
+      size_t alc;
+      void *base;
+
+      if (vec->size == 0)
+	alc = 32 * size;
+      else if (vec->size >= 4096)
+	alc = vec->size + 4096;
+      else
+	alc = 2 * vec->size;
+
+      if (alc < vec->size + size)
+	alc = vec->size + size;
+
+      base = realloc (vec->base, alc);
+      if (base == NULL)
+	{
+	  error_callback (data, "realloc", errno);
+	  return NULL;
+	}
+
+      vec->base = base;
+      vec->alc = alc - vec->size;
+    }
+
+  ret = (char *) vec->base + vec->size;
+  vec->size += size;
+  vec->alc -= size;
+  return ret;
+}
+
+/* Finish the current allocation on VEC.  */
+
+void *
+backtrace_vector_finish (struct backtrace_state *state,
+			 struct backtrace_vector *vec,
+			 backtrace_error_callback error_callback,
+			 void *data)
+{
+  void *ret;
+
+  /* With this allocator we call realloc in backtrace_vector_grow,
+     which means we can't easily reuse the memory here.  So just
+     release it.  */
+  if (!backtrace_vector_release (state, vec, error_callback, data))
+    return NULL;
+  ret = vec->base;
+  vec->base = NULL;
+  vec->size = 0;
+  vec->alc = 0;
+  return ret;
+}
+
+/* Release any extra space allocated for VEC.  */
+
+int
+backtrace_vector_release (struct backtrace_state *state ATTRIBUTE_UNUSED,
+			  struct backtrace_vector *vec,
+			  backtrace_error_callback error_callback,
+			  void *data)
+{
+  vec->base = realloc (vec->base, vec->size);
+  if (vec->base == NULL)
+    {
+      error_callback (data, "realloc", errno);
+      return 0;
+    }
+  vec->alc = 0;
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/ansidecl.h
@@ -0,0 +1,355 @@
+/* ANSI and traditional C compatability macros
+   Copyright (C) 1991-2015 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/* ANSI and traditional C compatibility macros
+
+   ANSI C is assumed if __STDC__ is #defined.
+
+   Macro		ANSI C definition	Traditional C definition
+   -----		---- - ----------	----------- - ----------
+   PTR			`void *'		`char *'
+   const		not defined		`'
+   volatile		not defined		`'
+   signed		not defined		`'
+
+   For ease of writing code which uses GCC extensions but needs to be
+   portable to other compilers, we provide the GCC_VERSION macro that
+   simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various
+   wrappers around __attribute__.  Also, __extension__ will be #defined
+   to nothing if it doesn't work.  See below.  */
+
+#ifndef	_ANSIDECL_H
+#define _ANSIDECL_H	1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Every source file includes this file,
+   so they will all get the switch for lint.  */
+/* LINTLIBRARY */
+
+/* Using MACRO(x,y) in cpp #if conditionals does not work with some
+   older preprocessors.  Thus we can't define something like this:
+
+#define HAVE_GCC_VERSION(MAJOR, MINOR) \
+  (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR)))
+
+and then test "#if HAVE_GCC_VERSION(2,7)".
+
+So instead we use the macro below and test it against specific values.  */
+
+/* This macro simplifies testing whether we are using gcc, and if it
+   is of a particular minimum version. (Both major & minor numbers are
+   significant.)  This macro will evaluate to 0 if we are not using
+   gcc at all.  */
+#ifndef GCC_VERSION
+#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
+#endif /* GCC_VERSION */
+
+#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32)
+/* All known AIX compilers implement these things (but don't always
+   define __STDC__).  The RISC/OS MIPS compiler defines these things
+   in SVR4 mode, but does not define __STDC__.  */
+/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other
+   C++ compilers, does not define __STDC__, though it acts as if this
+   was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */
+
+#define PTR		void *
+
+#undef const
+#undef volatile
+#undef signed
+
+/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
+   it too, but it's not in C89.  */
+#undef inline
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__))
+/* it's a keyword */
+#else
+# if GCC_VERSION >= 2007
+#  define inline __inline__   /* __inline__ prevents -pedantic warnings */
+# else
+#  define inline  /* nothing */
+# endif
+#endif
+
+#else	/* Not ANSI C.  */
+
+#define PTR		char *
+
+/* some systems define these in header files for non-ansi mode */
+#undef const
+#undef volatile
+#undef signed
+#undef inline
+#define const
+#define volatile
+#define signed
+#define inline
+
+#endif	/* ANSI C.  */
+
+/* Define macros for some gcc attributes.  This permits us to use the
+   macros freely, and know that they will come into play for the
+   version of gcc in which they are supported.  */
+
+#if (GCC_VERSION < 2007)
+# define __attribute__(x)
+#endif
+
+/* Attribute __malloc__ on functions was valid as of gcc 2.96. */
+#ifndef ATTRIBUTE_MALLOC
+# if (GCC_VERSION >= 2096)
+#  define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define ATTRIBUTE_MALLOC
+# endif /* GNUC >= 2.96 */
+#endif /* ATTRIBUTE_MALLOC */
+
+/* Attributes on labels were valid as of gcc 2.93 and g++ 4.5.  For
+   g++ an attribute on a label must be followed by a semicolon.  */
+#ifndef ATTRIBUTE_UNUSED_LABEL
+# ifndef __cplusplus
+#  if GCC_VERSION >= 2093
+#   define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED
+#  else
+#   define ATTRIBUTE_UNUSED_LABEL
+#  endif
+# else
+#  if GCC_VERSION >= 4005
+#   define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED ;
+#  else
+#   define ATTRIBUTE_UNUSED_LABEL
+#  endif
+# endif
+#endif
+
+/* Similarly to ARG_UNUSED below.  Prior to GCC 3.4, the C++ frontend
+   couldn't parse attributes placed after the identifier name, and now
+   the entire compiler is built with C++.  */
+#ifndef ATTRIBUTE_UNUSED
+#if GCC_VERSION >= 3004
+#  define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+#define ATTRIBUTE_UNUSED
+#endif
+#endif /* ATTRIBUTE_UNUSED */
+
+/* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the
+   identifier name.  */
+#if ! defined(__cplusplus) || (GCC_VERSION >= 3004)
+# define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED
+#else /* !__cplusplus || GNUC >= 3.4 */
+# define ARG_UNUSED(NAME) NAME
+#endif /* !__cplusplus || GNUC >= 3.4 */
+
+#ifndef ATTRIBUTE_NORETURN
+#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#endif /* ATTRIBUTE_NORETURN */
+
+/* Attribute `nonnull' was valid as of gcc 3.3.  */
+#ifndef ATTRIBUTE_NONNULL
+# if (GCC_VERSION >= 3003)
+#  define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m)))
+# else
+#  define ATTRIBUTE_NONNULL(m)
+# endif /* GNUC >= 3.3 */
+#endif /* ATTRIBUTE_NONNULL */
+
+/* Attribute `returns_nonnull' was valid as of gcc 4.9.  */
+#ifndef ATTRIBUTE_RETURNS_NONNULL
+# if (GCC_VERSION >= 4009)
+#  define ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+# else
+#  define ATTRIBUTE_RETURNS_NONNULL
+# endif /* GNUC >= 4.9 */
+#endif /* ATTRIBUTE_RETURNS_NONNULL */
+
+/* Attribute `pure' was valid as of gcc 3.0.  */
+#ifndef ATTRIBUTE_PURE
+# if (GCC_VERSION >= 3000)
+#  define ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define ATTRIBUTE_PURE
+# endif /* GNUC >= 3.0 */
+#endif /* ATTRIBUTE_PURE */
+
+/* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL.
+   This was the case for the `printf' format attribute by itself
+   before GCC 3.3, but as of 3.3 we need to add the `nonnull'
+   attribute to retain this behavior.  */
+#ifndef ATTRIBUTE_PRINTF
+#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) ATTRIBUTE_NONNULL(m)
+#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2)
+#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3)
+#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4)
+#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5)
+#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6)
+#endif /* ATTRIBUTE_PRINTF */
+
+/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on
+   a function pointer.  Format attributes were allowed on function
+   pointers as of gcc 3.1.  */
+#ifndef ATTRIBUTE_FPTR_PRINTF
+# if (GCC_VERSION >= 3001)
+#  define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n)
+# else
+#  define ATTRIBUTE_FPTR_PRINTF(m, n)
+# endif /* GNUC >= 3.1 */
+# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2)
+# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3)
+# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4)
+# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5)
+# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6)
+#endif /* ATTRIBUTE_FPTR_PRINTF */
+
+/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL.  A
+   NULL format specifier was allowed as of gcc 3.3.  */
+#ifndef ATTRIBUTE_NULL_PRINTF
+# if (GCC_VERSION >= 3003)
+#  define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
+# else
+#  define ATTRIBUTE_NULL_PRINTF(m, n)
+# endif /* GNUC >= 3.3 */
+# define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2)
+# define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3)
+# define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4)
+# define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5)
+# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6)
+#endif /* ATTRIBUTE_NULL_PRINTF */
+
+/* Attribute `sentinel' was valid as of gcc 3.5.  */
+#ifndef ATTRIBUTE_SENTINEL
+# if (GCC_VERSION >= 3005)
+#  define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__))
+# else
+#  define ATTRIBUTE_SENTINEL
+# endif /* GNUC >= 3.5 */
+#endif /* ATTRIBUTE_SENTINEL */
+
+
+#ifndef ATTRIBUTE_ALIGNED_ALIGNOF
+# if (GCC_VERSION >= 3000)
+#  define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m))))
+# else
+#  define ATTRIBUTE_ALIGNED_ALIGNOF(m)
+# endif /* GNUC >= 3.0 */
+#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */
+
+/* Useful for structures whose layout must much some binary specification
+   regardless of the alignment and padding qualities of the compiler.  */
+#ifndef ATTRIBUTE_PACKED
+# define ATTRIBUTE_PACKED __attribute__ ((packed))
+#endif
+
+/* Attribute `hot' and `cold' was valid as of gcc 4.3.  */
+#ifndef ATTRIBUTE_COLD
+# if (GCC_VERSION >= 4003)
+#  define ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+#  define ATTRIBUTE_COLD
+# endif /* GNUC >= 4.3 */
+#endif /* ATTRIBUTE_COLD */
+#ifndef ATTRIBUTE_HOT
+# if (GCC_VERSION >= 4003)
+#  define ATTRIBUTE_HOT __attribute__ ((__hot__))
+# else
+#  define ATTRIBUTE_HOT
+# endif /* GNUC >= 4.3 */
+#endif /* ATTRIBUTE_HOT */
+
+/* Attribute 'no_sanitize_undefined' was valid as of gcc 4.9.  */
+#ifndef ATTRIBUTE_NO_SANITIZE_UNDEFINED
+# if (GCC_VERSION >= 4009)
+#  define ATTRIBUTE_NO_SANITIZE_UNDEFINED __attribute__ ((no_sanitize_undefined))
+# else
+#  define ATTRIBUTE_NO_SANITIZE_UNDEFINED
+# endif /* GNUC >= 4.9 */
+#endif /* ATTRIBUTE_NO_SANITIZE_UNDEFINED */
+
+/* We use __extension__ in some places to suppress -pedantic warnings
+   about GCC extensions.  This feature didn't work properly before
+   gcc 2.8.  */
+#if GCC_VERSION < 2008
+#define __extension__
+#endif
+
+/* This is used to declare a const variable which should be visible
+   outside of the current compilation unit.  Use it as
+     EXPORTED_CONST int i = 1;
+   This is because the semantics of const are different in C and C++.
+   "extern const" is permitted in C but it looks strange, and gcc
+   warns about it when -Wc++-compat is not used.  */
+#ifdef __cplusplus
+#define EXPORTED_CONST extern const
+#else
+#define EXPORTED_CONST const
+#endif
+
+/* Be conservative and only use enum bitfields with C++ or GCC.
+   FIXME: provide a complete autoconf test for buggy enum bitfields.  */
+
+#ifdef __cplusplus
+#define ENUM_BITFIELD(TYPE) enum TYPE
+#elif (GCC_VERSION > 2000)
+#define ENUM_BITFIELD(TYPE) __extension__ enum TYPE
+#else
+#define ENUM_BITFIELD(TYPE) unsigned int
+#endif
+
+/* C++11 adds the ability to add "override" after an implementation of a
+   virtual function in a subclass, to:
+     (A) document that this is an override of a virtual function
+     (B) allow the compiler to issue a warning if it isn't (e.g. a mismatch
+         of the type signature).
+
+   Similarly, it allows us to add a "final" to indicate that no subclass
+   may subsequently override the vfunc.
+
+   Provide OVERRIDE and FINAL as macros, allowing us to get these benefits
+   when compiling with C++11 support, but without requiring C++11.
+
+   For gcc, use "-std=c++11" to enable C++11 support; gcc 6 onwards enables
+   this by default (actually GNU++14).  */
+
+#if __cplusplus >= 201103
+/* C++11 claims to be available: use it.  final/override were only
+   implemented in 4.7, though.  */
+# if GCC_VERSION < 4007
+#  define OVERRIDE
+#  define FINAL
+# else
+#  define OVERRIDE override
+#  define FINAL final
+# endif
+#elif GCC_VERSION >= 4007
+/* G++ 4.7 supports __final in C++98.  */
+# define OVERRIDE
+# define FINAL __final
+#else
+/* No C++11 support; leave the macros empty: */
+# define OVERRIDE
+# define FINAL
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ansidecl.h	*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/atomic.c
@@ -0,0 +1,113 @@
+/* atomic.c -- Support for atomic functions if not present.
+   Copyright (C) 2013-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "backtrace-supported.h"
+#include "internal.h"
+
+/* This file holds implementations of the atomic functions that are
+   used if the host compiler has the sync functions but not the atomic
+   functions, as is true of versions of GCC before 4.7.  */
+
+#if !defined (HAVE_ATOMIC_FUNCTIONS) && defined (HAVE_SYNC_FUNCTIONS)
+
+/* Do an atomic load of a pointer.  */
+
+void *
+backtrace_atomic_load_pointer (void *arg)
+{
+  void **pp;
+  void *p;
+
+  pp = (void **) arg;
+  p = *pp;
+  while (!__sync_bool_compare_and_swap (pp, p, p))
+    p = *pp;
+  return p;
+}
+
+/* Do an atomic load of an int.  */
+
+int
+backtrace_atomic_load_int (int *p)
+{
+  int i;
+
+  i = *p;
+  while (!__sync_bool_compare_and_swap (p, i, i))
+    i = *p;
+  return i;
+}
+
+/* Do an atomic store of a pointer.  */
+
+void
+backtrace_atomic_store_pointer (void *arg, void *p)
+{
+  void **pp;
+  void *old;
+
+  pp = (void **) arg;
+  old = *pp;
+  while (!__sync_bool_compare_and_swap (pp, old, p))
+    old = *pp;
+}
+
+/* Do an atomic store of a size_t value.  */
+
+void
+backtrace_atomic_store_size_t (size_t *p, size_t v)
+{
+  size_t old;
+
+  old = *p;
+  while (!__sync_bool_compare_and_swap (p, old, v))
+    old = *p;
+}
+
+/* Do an atomic store of a int value.  */
+
+void
+backtrace_atomic_store_int (int *p, int v)
+{
+  size_t old;
+
+  old = *p;
+  while (!__sync_bool_compare_and_swap (p, old, v))
+    old = *p;
+}
+
+#endif
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/backtrace-supported.h.in
@@ -0,0 +1,66 @@
+/* backtrace-supported.h.in -- Whether stack backtrace is supported.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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.  */
+
+/* The file backtrace-supported.h.in is used by configure to generate
+   the file backtrace-supported.h.  The file backtrace-supported.h may
+   be #include'd to see whether the backtrace library will be able to
+   get a backtrace and produce symbolic information.  */
+
+
+/* BACKTRACE_SUPPORTED will be #define'd as 1 if the backtrace library
+   should work, 0 if it will not.  Libraries may #include this to make
+   other arrangements.  */
+
+#define BACKTRACE_SUPPORTED @BACKTRACE_SUPPORTED@
+
+/* BACKTRACE_USES_MALLOC will be #define'd as 1 if the backtrace
+   library will call malloc as it works, 0 if it will call mmap
+   instead.  This may be used to determine whether it is safe to call
+   the backtrace functions from a signal handler.  In general this
+   only applies to calls like backtrace and backtrace_pcinfo.  It does
+   not apply to backtrace_simple, which never calls malloc.  It does
+   not apply to backtrace_print, which always calls fprintf and
+   therefore malloc.  */
+
+#define BACKTRACE_USES_MALLOC @BACKTRACE_USES_MALLOC@
+
+/* BACKTRACE_SUPPORTS_THREADS will be #define'd as 1 if the backtrace
+   library is configured with threading support, 0 if not.  If this is
+   0, the threaded parameter to backtrace_create_state must be passed
+   as 0.  */
+
+#define BACKTRACE_SUPPORTS_THREADS @BACKTRACE_SUPPORTS_THREADS@
+
+/* BACKTRACE_SUPPORTS_DATA will be #defined'd as 1 if the backtrace_syminfo
+   will work for variables.  It will always work for functions.  */
+
+#define BACKTRACE_SUPPORTS_DATA @BACKTRACE_SUPPORTS_DATA@
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/backtrace.c
@@ -0,0 +1,129 @@
+/* backtrace.c -- Entry point for stack backtrace library.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <sys/types.h>
+
+#include "unwind.h"
+#include "backtrace.h"
+#include "internal.h"
+
+/* The main backtrace_full routine.  */
+
+/* Data passed through _Unwind_Backtrace.  */
+
+struct backtrace_data
+{
+  /* Number of frames to skip.  */
+  int skip;
+  /* Library state.  */
+  struct backtrace_state *state;
+  /* Callback routine.  */
+  backtrace_full_callback callback;
+  /* Error callback routine.  */
+  backtrace_error_callback error_callback;
+  /* Data to pass to callback routines.  */
+  void *data;
+  /* Value to return from backtrace_full.  */
+  int ret;
+  /* Whether there is any memory available.  */
+  int can_alloc;
+};
+
+/* Unwind library callback routine.  This is passed to
+   _Unwind_Backtrace.  */
+
+static _Unwind_Reason_Code
+unwind (struct _Unwind_Context *context, void *vdata)
+{
+  struct backtrace_data *bdata = (struct backtrace_data *) vdata;
+  uintptr_t pc;
+  int ip_before_insn = 0;
+
+#ifdef HAVE_GETIPINFO
+  pc = _Unwind_GetIPInfo (context, &ip_before_insn);
+#else
+  pc = _Unwind_GetIP (context);
+#endif
+
+  if (bdata->skip > 0)
+    {
+      --bdata->skip;
+      return _URC_NO_REASON;
+    }
+
+  if (!ip_before_insn)
+    --pc;
+
+  if (!bdata->can_alloc)
+    bdata->ret = bdata->callback (bdata->data, pc, NULL, 0, NULL);
+  else
+    bdata->ret = backtrace_pcinfo (bdata->state, pc, bdata->callback,
+				   bdata->error_callback, bdata->data);
+  if (bdata->ret != 0)
+    return _URC_END_OF_STACK;
+
+  return _URC_NO_REASON;
+}
+
+/* Get a stack backtrace.  */
+
+int
+backtrace_full (struct backtrace_state *state, int skip,
+		backtrace_full_callback callback,
+		backtrace_error_callback error_callback, void *data)
+{
+  struct backtrace_data bdata;
+  void *p;
+
+  bdata.skip = skip + 1;
+  bdata.state = state;
+  bdata.callback = callback;
+  bdata.error_callback = error_callback;
+  bdata.data = data;
+  bdata.ret = 0;
+
+  /* If we can't allocate any memory at all, don't try to produce
+     file/line information.  */
+  p = backtrace_alloc (state, 4096, NULL, NULL);
+  if (p == NULL)
+    bdata.can_alloc = 0;
+  else
+    {
+      backtrace_free (state, p, 4096, NULL, NULL);
+      bdata.can_alloc = 1;
+    }
+
+  _Unwind_Backtrace (unwind, &bdata);
+  return bdata.ret;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/backtrace.h
@@ -0,0 +1,199 @@
+/* backtrace.h -- Public header file for stack backtrace library.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 BACKTRACE_H
+#define BACKTRACE_H
+
+#include <stddef.h>
+#include <stdio.h>
+
+/* We want to get a definition for uintptr_t, but we still care about
+   systems that don't have <stdint.h>.  */
+#if defined(__GLIBC__) && __GLIBC__ >= 2
+
+#include <stdint.h>
+
+#elif defined(HAVE_STDINT_H)
+
+#include <stdint.h>
+
+#else
+
+/* Systems that don't have <stdint.h> must provide gstdint.h, e.g.,
+   from GCC_HEADER_STDINT in configure.ac.  */
+#include "gstdint.h"
+
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The backtrace state.  This struct is intentionally not defined in
+   the public interface.  */
+
+struct backtrace_state;
+
+/* The type of the error callback argument to backtrace functions.
+   This function, if not NULL, will be called for certain error cases.
+   The DATA argument is passed to the function that calls this one.
+   The MSG argument is an error message.  The ERRNUM argument, if
+   greater than 0, holds an errno value.  The MSG buffer may become
+   invalid after this function returns.
+
+   As a special case, the ERRNUM argument will be passed as -1 if no
+   debug info can be found for the executable, but the function
+   requires debug info (e.g., backtrace_full, backtrace_pcinfo).  The
+   MSG in this case will be something along the lines of "no debug
+   info".  Similarly, ERRNUM will be passed as -1 if there is no
+   symbol table, but the function requires a symbol table (e.g.,
+   backtrace_syminfo).  This may be used as a signal that some other
+   approach should be tried.  */
+
+typedef void (*backtrace_error_callback) (void *data, const char *msg,
+					  int errnum);
+
+/* Create state information for the backtrace routines.  This must be
+   called before any of the other routines, and its return value must
+   be passed to all of the other routines.  FILENAME is the path name
+   of the executable file; if it is NULL the library will try
+   system-specific path names.  If not NULL, FILENAME must point to a
+   permanent buffer.  If THREADED is non-zero the state may be
+   accessed by multiple threads simultaneously, and the library will
+   use appropriate atomic operations.  If THREADED is zero the state
+   may only be accessed by one thread at a time.  This returns a state
+   pointer on success, NULL on error.  If an error occurs, this will
+   call the ERROR_CALLBACK routine.  */
+
+extern struct backtrace_state *backtrace_create_state (
+    const char *filename, int threaded,
+    backtrace_error_callback error_callback, void *data);
+
+/* The type of the callback argument to the backtrace_full function.
+   DATA is the argument passed to backtrace_full.  PC is the program
+   counter.  FILENAME is the name of the file containing PC, or NULL
+   if not available.  LINENO is the line number in FILENAME containing
+   PC, or 0 if not available.  FUNCTION is the name of the function
+   containing PC, or NULL if not available.  This should return 0 to
+   continuing tracing.  The FILENAME and FUNCTION buffers may become
+   invalid after this function returns.  */
+
+typedef int (*backtrace_full_callback) (void *data, uintptr_t pc,
+					const char *filename, int lineno,
+					const char *function);
+
+/* Get a full stack backtrace.  SKIP is the number of frames to skip;
+   passing 0 will start the trace with the function calling
+   backtrace_full.  DATA is passed to the callback routine.  If any
+   call to CALLBACK returns a non-zero value, the stack backtrace
+   stops, and backtrace returns that value; this may be used to limit
+   the number of stack frames desired.  If all calls to CALLBACK
+   return 0, backtrace returns 0.  The backtrace_full function will
+   make at least one call to either CALLBACK or ERROR_CALLBACK.  This
+   function requires debug info for the executable.  */
+
+extern int backtrace_full (struct backtrace_state *state, int skip,
+			   backtrace_full_callback callback,
+			   backtrace_error_callback error_callback,
+			   void *data);
+
+/* The type of the callback argument to the backtrace_simple function.
+   DATA is the argument passed to simple_backtrace.  PC is the program
+   counter.  This should return 0 to continue tracing.  */
+
+typedef int (*backtrace_simple_callback) (void *data, uintptr_t pc);
+
+/* Get a simple backtrace.  SKIP is the number of frames to skip, as
+   in backtrace.  DATA is passed to the callback routine.  If any call
+   to CALLBACK returns a non-zero value, the stack backtrace stops,
+   and backtrace_simple returns that value.  Otherwise
+   backtrace_simple returns 0.  The backtrace_simple function will
+   make at least one call to either CALLBACK or ERROR_CALLBACK.  This
+   function does not require any debug info for the executable.  */
+
+extern int backtrace_simple (struct backtrace_state *state, int skip,
+			     backtrace_simple_callback callback,
+			     backtrace_error_callback error_callback,
+			     void *data);
+
+/* Print the current backtrace in a user readable format to a FILE.
+   SKIP is the number of frames to skip, as in backtrace_full.  Any
+   error messages are printed to stderr.  This function requires debug
+   info for the executable.  */
+
+extern void backtrace_print (struct backtrace_state *state, int skip, FILE *);
+
+/* Given PC, a program counter in the current program, call the
+   callback function with filename, line number, and function name
+   information.  This will normally call the callback function exactly
+   once.  However, if the PC happens to describe an inlined call, and
+   the debugging information contains the necessary information, then
+   this may call the callback function multiple times.  This will make
+   at least one call to either CALLBACK or ERROR_CALLBACK.  This
+   returns the first non-zero value returned by CALLBACK, or 0.  */
+
+extern int backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
+			     backtrace_full_callback callback,
+			     backtrace_error_callback error_callback,
+			     void *data);
+
+/* The type of the callback argument to backtrace_syminfo.  DATA and
+   PC are the arguments passed to backtrace_syminfo.  SYMNAME is the
+   name of the symbol for the corresponding code.  SYMVAL is the
+   value and SYMSIZE is the size of the symbol.  SYMNAME will be NULL
+   if no error occurred but the symbol could not be found.  */
+
+typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc,
+					    const char *symname,
+					    uintptr_t symval,
+					    uintptr_t symsize);
+
+/* Given ADDR, an address or program counter in the current program,
+   call the callback information with the symbol name and value
+   describing the function or variable in which ADDR may be found.
+   This will call either CALLBACK or ERROR_CALLBACK exactly once.
+   This returns 1 on success, 0 on failure.  This function requires
+   the symbol table but does not require the debug info.  Note that if
+   the symbol table is present but ADDR could not be found in the
+   table, CALLBACK will be called with a NULL SYMNAME argument.
+   Returns 1 on success, 0 on error.  */
+
+extern int backtrace_syminfo (struct backtrace_state *state, uintptr_t addr,
+			      backtrace_syminfo_callback callback,
+			      backtrace_error_callback error_callback,
+			      void *data);
+
+#ifdef __cplusplus
+} /* End extern "C".  */
+#endif
+
+#endif
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/btest.c
@@ -0,0 +1,721 @@
+/* btest.c -- Test for libbacktrace library
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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.  */
+
+/* This program tests the externally visible interfaces of the
+   libbacktrace library.  */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "filenames.h"
+
+#include "backtrace.h"
+#include "backtrace-supported.h"
+
+/* Portable attribute syntax.  Actually some of these tests probably
+   won't work if the attributes are not recognized.  */
+
+#ifndef GCC_VERSION
+# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
+#endif
+
+#if (GCC_VERSION < 2007)
+# define __attribute__(x)
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* Used to collect backtrace info.  */
+
+struct info
+{
+  char *filename;
+  int lineno;
+  char *function;
+};
+
+/* Passed to backtrace callback function.  */
+
+struct bdata
+{
+  struct info *all;
+  size_t index;
+  size_t max;
+  int failed;
+};
+
+/* Passed to backtrace_simple callback function.  */
+
+struct sdata
+{
+  uintptr_t *addrs;
+  size_t index;
+  size_t max;
+  int failed;
+};
+
+/* Passed to backtrace_syminfo callback function.  */
+
+struct symdata
+{
+  const char *name;
+  uintptr_t val, size;
+  int failed;
+};
+
+/* The backtrace state.  */
+
+static void *state;
+
+/* The number of failures.  */
+
+static int failures;
+
+/* Return the base name in a path.  */
+
+static const char *
+base (const char *p)
+{
+  const char *last;
+  const char *s;
+
+  last = NULL;
+  for (s = p; *s != '\0'; ++s)
+    {
+      if (IS_DIR_SEPARATOR (*s))
+	last = s + 1;
+    }
+  return last != NULL ? last : p;
+}
+
+/* Check an entry in a struct info array.  */
+
+static void
+check (const char *name, int index, const struct info *all, int want_lineno,
+       const char *want_function, int *failed)
+{
+  if (*failed)
+    return;
+  if (all[index].filename == NULL || all[index].function == NULL)
+    {
+      fprintf (stderr, "%s: [%d]: missing file name or function name\n",
+	       name, index);
+      *failed = 1;
+      return;
+    }
+  if (strcmp (base (all[index].filename), "btest.c") != 0)
+    {
+      fprintf (stderr, "%s: [%d]: got %s expected test.c\n", name, index,
+	       all[index].filename);
+      *failed = 1;
+    }
+  if (all[index].lineno != want_lineno)
+    {
+      fprintf (stderr, "%s: [%d]: got %d expected %d\n", name, index,
+	       all[index].lineno, want_lineno);
+      *failed = 1;
+    }
+  if (strcmp (all[index].function, want_function) != 0)
+    {
+      fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
+	       all[index].function, want_function);
+      *failed = 1;
+    }
+}
+
+/* The backtrace callback function.  */
+
+static int
+callback_one (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
+	      const char *filename, int lineno, const char *function)
+{
+  struct bdata *data = (struct bdata *) vdata;
+  struct info *p;
+
+  if (data->index >= data->max)
+    {
+      fprintf (stderr, "callback_one: callback called too many times\n");
+      data->failed = 1;
+      return 1;
+    }
+
+  p = &data->all[data->index];
+  if (filename == NULL)
+    p->filename = NULL;
+  else
+    {
+      p->filename = strdup (filename);
+      assert (p->filename != NULL);
+    }
+  p->lineno = lineno;
+  if (function == NULL)
+    p->function = NULL;
+  else
+    {
+      p->function = strdup (function);
+      assert (p->function != NULL);
+    }
+  ++data->index;
+
+  return 0;
+}
+
+/* An error callback passed to backtrace.  */
+
+static void
+error_callback_one (void *vdata, const char *msg, int errnum)
+{
+  struct bdata *data = (struct bdata *) vdata;
+
+  fprintf (stderr, "%s", msg);
+  if (errnum > 0)
+    fprintf (stderr, ": %s", strerror (errnum));
+  fprintf (stderr, "\n");
+  data->failed = 1;
+}
+
+/* The backtrace_simple callback function.  */
+
+static int
+callback_two (void *vdata, uintptr_t pc)
+{
+  struct sdata *data = (struct sdata *) vdata;
+
+  if (data->index >= data->max)
+    {
+      fprintf (stderr, "callback_two: callback called too many times\n");
+      data->failed = 1;
+      return 1;
+    }
+
+  data->addrs[data->index] = pc;
+  ++data->index;
+
+  return 0;
+}
+
+/* An error callback passed to backtrace_simple.  */
+
+static void
+error_callback_two (void *vdata, const char *msg, int errnum)
+{
+  struct sdata *data = (struct sdata *) vdata;
+
+  fprintf (stderr, "%s", msg);
+  if (errnum > 0)
+    fprintf (stderr, ": %s", strerror (errnum));
+  fprintf (stderr, "\n");
+  data->failed = 1;
+}
+
+/* The backtrace_syminfo callback function.  */
+
+static void
+callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
+		const char *symname, uintptr_t symval,
+		uintptr_t symsize)
+{
+  struct symdata *data = (struct symdata *) vdata;
+
+  if (symname == NULL)
+    data->name = NULL;
+  else
+    {
+      data->name = strdup (symname);
+      assert (data->name != NULL);
+    }
+  data->val = symval;
+  data->size = symsize;
+}
+
+/* The backtrace_syminfo error callback function.  */
+
+static void
+error_callback_three (void *vdata, const char *msg, int errnum)
+{
+  struct symdata *data = (struct symdata *) vdata;
+
+  fprintf (stderr, "%s", msg);
+  if (errnum > 0)
+    fprintf (stderr, ": %s", strerror (errnum));
+  fprintf (stderr, "\n");
+  data->failed = 1;
+}
+
+/* Test the backtrace function with non-inlined functions.  */
+
+static int test1 (void) __attribute__ ((noinline, unused));
+static int f2 (int) __attribute__ ((noinline));
+static int f3 (int, int) __attribute__ ((noinline));
+
+static int
+test1 (void)
+{
+  /* Returning a value here and elsewhere avoids a tailcall which
+     would mess up the backtrace.  */
+  return f2 (__LINE__) + 1;
+}
+
+static int
+f2 (int f1line)
+{
+  return f3 (f1line, __LINE__) + 2;
+}
+
+static int
+f3 (int f1line, int f2line)
+{
+  struct info all[20];
+  struct bdata data;
+  int f3line;
+  int i;
+
+  data.all = &all[0];
+  data.index = 0;
+  data.max = 20;
+  data.failed = 0;
+
+  f3line = __LINE__ + 1;
+  i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
+
+  if (i != 0)
+    {
+      fprintf (stderr, "test1: unexpected return value %d\n", i);
+      data.failed = 1;
+    }
+
+  if (data.index < 3)
+    {
+      fprintf (stderr,
+	       "test1: not enough frames; got %zu, expected at least 3\n",
+	       data.index);
+      data.failed = 1;
+    }
+
+  check ("test1", 0, all, f3line, "f3", &data.failed);
+  check ("test1", 1, all, f2line, "f2", &data.failed);
+  check ("test1", 2, all, f1line, "test1", &data.failed);
+
+  printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
+
+  if (data.failed)
+    ++failures;
+
+  return failures;
+}
+
+/* Test the backtrace function with inlined functions.  */
+
+static inline int test2 (void) __attribute__ ((always_inline, unused));
+static inline int f12 (int) __attribute__ ((always_inline));
+static inline int f13 (int, int) __attribute__ ((always_inline));
+
+static inline int
+test2 (void)
+{
+  return f12 (__LINE__) + 1;
+}
+
+static inline int
+f12 (int f1line)
+{
+  return f13 (f1line, __LINE__) + 2;
+}
+
+static inline int
+f13 (int f1line, int f2line)
+{
+  struct info all[20];
+  struct bdata data;
+  int f3line;
+  int i;
+
+  data.all = &all[0];
+  data.index = 0;
+  data.max = 20;
+  data.failed = 0;
+
+  f3line = __LINE__ + 1;
+  i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
+
+  if (i != 0)
+    {
+      fprintf (stderr, "test2: unexpected return value %d\n", i);
+      data.failed = 1;
+    }
+
+  check ("test2", 0, all, f3line, "f13", &data.failed);
+  check ("test2", 1, all, f2line, "f12", &data.failed);
+  check ("test2", 2, all, f1line, "test2", &data.failed);
+
+  printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
+
+  if (data.failed)
+    ++failures;
+
+  return failures;
+}
+
+/* Test the backtrace_simple function with non-inlined functions.  */
+
+static int test3 (void) __attribute__ ((noinline, unused));
+static int f22 (int) __attribute__ ((noinline));
+static int f23 (int, int) __attribute__ ((noinline));
+
+static int
+test3 (void)
+{
+  return f22 (__LINE__) + 1;
+}
+
+static int
+f22 (int f1line)
+{
+  return f23 (f1line, __LINE__) + 2;
+}
+
+static int
+f23 (int f1line, int f2line)
+{
+  uintptr_t addrs[20];
+  struct sdata data;
+  int f3line;
+  int i;
+
+  data.addrs = &addrs[0];
+  data.index = 0;
+  data.max = 20;
+  data.failed = 0;
+
+  f3line = __LINE__ + 1;
+  i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
+
+  if (i != 0)
+    {
+      fprintf (stderr, "test3: unexpected return value %d\n", i);
+      data.failed = 1;
+    }
+
+  if (!data.failed)
+    {
+      struct info all[20];
+      struct bdata bdata;
+      int j;
+
+      bdata.all = &all[0];
+      bdata.index = 0;
+      bdata.max = 20;
+      bdata.failed = 0;
+
+      for (j = 0; j < 3; ++j)
+	{
+	  i = backtrace_pcinfo (state, addrs[j], callback_one,
+				error_callback_one, &bdata);
+	  if (i != 0)
+	    {
+	      fprintf (stderr,
+		       ("test3: unexpected return value "
+			"from backtrace_pcinfo %d\n"),
+		       i);
+	      bdata.failed = 1;
+	    }
+	  if (!bdata.failed && bdata.index != (size_t) (j + 1))
+	    {
+	      fprintf (stderr,
+		       ("wrong number of calls from backtrace_pcinfo "
+			"got %u expected %d\n"),
+		       (unsigned int) bdata.index, j + 1);
+	      bdata.failed = 1;
+	    }
+	}
+
+      check ("test3", 0, all, f3line, "f23", &bdata.failed);
+      check ("test3", 1, all, f2line, "f22", &bdata.failed);
+      check ("test3", 2, all, f1line, "test3", &bdata.failed);
+
+      if (bdata.failed)
+	data.failed = 1;
+
+      for (j = 0; j < 3; ++j)
+	{
+	  struct symdata symdata;
+
+	  symdata.name = NULL;
+	  symdata.val = 0;
+	  symdata.size = 0;
+	  symdata.failed = 0;
+
+	  i = backtrace_syminfo (state, addrs[j], callback_three,
+				 error_callback_three, &symdata);
+	  if (i == 0)
+	    {
+	      fprintf (stderr,
+		       ("test3: [%d]: unexpected return value "
+			"from backtrace_syminfo %d\n"),
+		       j, i);
+	      symdata.failed = 1;
+	    }
+
+	  if (!symdata.failed)
+	    {
+	      const char *expected;
+
+	      switch (j)
+		{
+		case 0:
+		  expected = "f23";
+		  break;
+		case 1:
+		  expected = "f22";
+		  break;
+		case 2:
+		  expected = "test3";
+		  break;
+		default:
+		  assert (0);
+		}
+
+	      if (symdata.name == NULL)
+		{
+		  fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
+		  symdata.failed = 1;
+		}
+	      /* Use strncmp, not strcmp, because GCC might create a
+		 clone.  */
+	      else if (strncmp (symdata.name, expected, strlen (expected))
+		       != 0)
+		{
+		  fprintf (stderr,
+			   ("test3: [%d]: unexpected syminfo name "
+			    "got %s expected %s\n"),
+			   j, symdata.name, expected);
+		  symdata.failed = 1;
+		}
+	    }
+
+	  if (symdata.failed)
+	    data.failed = 1;
+	}
+    }
+
+  printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
+
+  if (data.failed)
+    ++failures;
+
+  return failures;
+}
+
+/* Test the backtrace_simple function with inlined functions.  */
+
+static inline int test4 (void) __attribute__ ((always_inline, unused));
+static inline int f32 (int) __attribute__ ((always_inline));
+static inline int f33 (int, int) __attribute__ ((always_inline));
+
+static inline int
+test4 (void)
+{
+  return f32 (__LINE__) + 1;
+}
+
+static inline int
+f32 (int f1line)
+{
+  return f33 (f1line, __LINE__) + 2;
+}
+
+static inline int
+f33 (int f1line, int f2line)
+{
+  uintptr_t addrs[20];
+  struct sdata data;
+  int f3line;
+  int i;
+
+  data.addrs = &addrs[0];
+  data.index = 0;
+  data.max = 20;
+  data.failed = 0;
+
+  f3line = __LINE__ + 1;
+  i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
+
+  if (i != 0)
+    {
+      fprintf (stderr, "test3: unexpected return value %d\n", i);
+      data.failed = 1;
+    }
+
+  if (!data.failed)
+    {
+      struct info all[20];
+      struct bdata bdata;
+
+      bdata.all = &all[0];
+      bdata.index = 0;
+      bdata.max = 20;
+      bdata.failed = 0;
+
+      i = backtrace_pcinfo (state, addrs[0], callback_one, error_callback_one,
+			    &bdata);
+      if (i != 0)
+	{
+	  fprintf (stderr,
+		   ("test4: unexpected return value "
+		    "from backtrace_pcinfo %d\n"),
+		   i);
+	  bdata.failed = 1;
+	}
+
+      check ("test4", 0, all, f3line, "f33", &bdata.failed);
+      check ("test4", 1, all, f2line, "f32", &bdata.failed);
+      check ("test4", 2, all, f1line, "test4", &bdata.failed);
+
+      if (bdata.failed)
+	data.failed = 1;
+    }
+
+  printf ("%s: backtrace_simple inline\n", data.failed ? "FAIL" : "PASS");
+
+  if (data.failed)
+    ++failures;
+
+  return failures;
+}
+
+#if BACKTRACE_SUPPORTS_DATA
+
+int global = 1;
+
+static int
+test5 (void)
+{
+  struct symdata symdata;
+  int i;
+  uintptr_t addr = (uintptr_t) &global;
+
+  if (sizeof (global) > 1)
+    addr += 1;
+
+  symdata.name = NULL;
+  symdata.val = 0;
+  symdata.size = 0;
+  symdata.failed = 0;
+
+  i = backtrace_syminfo (state, addr, callback_three,
+			 error_callback_three, &symdata);
+  if (i == 0)
+    {
+      fprintf (stderr,
+	       "test5: unexpected return value from backtrace_syminfo %d\n",
+	       i);
+      symdata.failed = 1;
+    }
+
+  if (!symdata.failed)
+    {
+      if (symdata.name == NULL)
+	{
+	  fprintf (stderr, "test5: NULL syminfo name\n");
+	  symdata.failed = 1;
+	}
+      else if (strcmp (symdata.name, "global") != 0)
+	{
+	  fprintf (stderr,
+		   "test5: unexpected syminfo name got %s expected %s\n",
+		   symdata.name, "global");
+	  symdata.failed = 1;
+	}
+      else if (symdata.val != (uintptr_t) &global)
+	{
+	  fprintf (stderr,
+		   "test5: unexpected syminfo value got %lx expected %lx\n",
+		   (unsigned long) symdata.val,
+		   (unsigned long) (uintptr_t) &global);
+	  symdata.failed = 1;
+	}
+      else if (symdata.size != sizeof (global))
+	{
+	  fprintf (stderr,
+		   "test5: unexpected syminfo size got %lx expected %lx\n",
+		   (unsigned long) symdata.size,
+		   (unsigned long) sizeof (global));
+	  symdata.failed = 1;
+	}
+    }
+
+  printf ("%s: backtrace_syminfo variable\n",
+	  symdata.failed ? "FAIL" : "PASS");
+
+  if (symdata.failed)
+    ++failures;
+
+  return failures;
+}
+
+#endif /* BACKTRACE_SUPPORTS_DATA  */
+
+static void
+error_callback_create (void *data ATTRIBUTE_UNUSED, const char *msg,
+		       int errnum)
+{
+  fprintf (stderr, "%s", msg);
+  if (errnum > 0)
+    fprintf (stderr, ": %s", strerror (errnum));
+  fprintf (stderr, "\n");
+  exit (EXIT_FAILURE);
+}
+
+/* Run all the tests.  */
+
+int
+main (int argc ATTRIBUTE_UNUSED, char **argv)
+{
+  state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
+				  error_callback_create, NULL);
+
+#if BACKTRACE_SUPPORTED
+  test1 ();
+  test2 ();
+  test3 ();
+  test4 ();
+#if BACKTRACE_SUPPORTS_DATA
+  test5 ();
+#endif
+#endif
+
+  exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
+}
new file mode 100755
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/config.guess
@@ -0,0 +1,1462 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
+
+timestamp='2016-10-02'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2016 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently (or will in the future) and ABI.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}${abi}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE=alpha ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE=alphaev5 ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE=alphaev56 ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE=alphapca56 ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE=alphapca57 ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE=alphaev6 ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE=alphaev67 ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE=alphaev69 ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE=alphaev7 ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE=alphaev79 ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH=i386
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH=x86_64
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = hppa2.0w ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH=hppa2.0w
+	    else
+		HP_ARCH=hppa64
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configure will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = x86; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = 386; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
+esac
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite
+config.guess and config.sub with the latest versions from:
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/config.h.in
@@ -0,0 +1,134 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* ELF size: 32 or 64 */
+#undef BACKTRACE_ELF_SIZE
+
+/* Define to 1 if you have the __atomic functions */
+#undef HAVE_ATOMIC_FUNCTIONS
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRNLEN
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define if dl_iterate_phdr is available. */
+#undef HAVE_DL_ITERATE_PHDR
+
+/* Define to 1 if you have the fcntl function */
+#undef HAVE_FCNTL
+
+/* Define if getexecname is available. */
+#undef HAVE_GETEXECNAME
+
+/* Define if _Unwind_GetIPInfo is available. */
+#undef HAVE_GETIPINFO
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <link.h> header file. */
+#undef HAVE_LINK_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the __sync functions */
+#undef HAVE_SYNC_FUNCTIONS
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
new file mode 100755
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/config.sub
@@ -0,0 +1,1825 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
+
+timestamp='2016-11-19'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2016 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
+	| bfin \
+	| c4x | c8051 | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 | or1k | or1knd | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pru \
+	| pyramid \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| ba-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| e2k-* | elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pru-* \
+	| pyramid-* \
+	| riscv32-* | riscv64-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| visium-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	e500v[12])
+		basic_machine=powerpc-unknown
+		os=$os"spe"
+		;;
+	e500v[12]-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=$os"spe"
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos* | -phoenix* | -fuchsia*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-ios)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
new file mode 100755
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/configure
@@ -0,0 +1,15189 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.64 for package-unused version-unused.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
+# Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='package-unused'
+PACKAGE_TARNAME='libbacktrace'
+PACKAGE_VERSION='version-unused'
+PACKAGE_STRING='package-unused version-unused'
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+ac_unique_file="backtrace.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+NATIVE_FALSE
+NATIVE_TRUE
+BACKTRACE_USES_MALLOC
+ALLOC_FILE
+VIEW_FILE
+BACKTRACE_SUPPORTS_DATA
+BACKTRACE_SUPPORTED
+FORMAT_FILE
+BACKTRACE_SUPPORTS_THREADS
+PIC_FLAG
+WARN_FLAGS
+EXTRA_FLAGS
+BACKTRACE_FILE
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+AR
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+SED
+LIBTOOL
+RANLIB
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+libtool_VERSION
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+multi_basedir
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_multilib
+enable_maintainer_mode
+with_target_subdir
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+enable_libtool_lock
+with_system_libunwind
+enable_host_shared
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information."
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures package-unused version-unused to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/libbacktrace]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of package-unused version-unused:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-multilib       build many library versions (default)
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-host-shared    build host code as shared libraries
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-target-subdir=SUBDIR      Configuring in a subdirectory for target
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-system-libunwind use installed libunwind
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+package-unused configure version-unused
+generated by GNU Autoconf 2.64
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR
+# ------------------------------------
+# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by package-unused $as_me version-unused, which was
+generated by GNU Autoconf 2.64.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+if test -n "${with_target_subdir}"; then
+  # Default to --enable-multilib
+# Check whether --enable-multilib was given.
+if test "${enable_multilib+set}" = set; then :
+  enableval=$enable_multilib; case "$enableval" in
+  yes) multilib=yes ;;
+  no)  multilib=no ;;
+  *)   as_fn_error "bad value $enableval for multilib option" "$LINENO" 5 ;;
+ esac
+else
+  multilib=yes
+fi
+
+
+# We may get other options which we leave undocumented:
+# --with-target-subdir, --with-multisrctop, --with-multisubdir
+# See config-ml.in if you want the gory details.
+
+if test "$srcdir" = "."; then
+  if test "$with_target_subdir" != "."; then
+    multi_basedir="$srcdir/$with_multisrctop../.."
+  else
+    multi_basedir="$srcdir/$with_multisrctop.."
+  fi
+else
+  multi_basedir="$srcdir/.."
+fi
+
+
+# Even if the default multilib is not a cross compilation,
+# it may be that some of the other multilibs are.
+if test $cross_compiling = no && test $multilib = yes \
+   && test "x${with_multisubdir}" != x ; then
+   cross_compiling=maybe
+fi
+
+ac_config_commands="$ac_config_commands default-1"
+
+fi
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  for ac_t in install-sh install.sh shtool; do
+    if test -f "$ac_dir/$ac_t"; then
+      ac_aux_dir=$ac_dir
+      ac_install_sh="$ac_aux_dir/$ac_t -c"
+      break 2
+    fi
+  done
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if test "${ac_cv_build+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if test "${ac_cv_host+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if test "${ac_cv_target+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+target_alias=${target_alias-$host_alias}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "no acceptable C compiler found in \$PATH
+See \`config.log' for more details." "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    rm -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+if test -z "$ac_file"; then :
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "C compiler cannot create executables
+See \`config.log' for more details." "$LINENO" 5; }; }
+fi
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
+if test "x$ac_cv_header_minix_config_h" = x""yes; then :
+  MINIX=yes
+else
+  MINIX=
+fi
+
+
+  if test "$MINIX" = yes; then
+
+$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
+
+
+$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+
+$as_echo "#define _MINIX 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if test "${ac_cv_safe_to_define___extensions__+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#	  define __EXTENSIONS__ 1
+	  $ac_includes_default
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_safe_to_define___extensions__=yes
+else
+  ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
+
+  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+
+
+libtool_VERSION=1:0:0
+
+
+# 1.11.1: Require that version of automake.
+# foreign: Don't require README, INSTALL, NEWS, etc.
+# no-define: Don't define PACKAGE and VERSION.
+# no-dependencies: Don't generate automatic dependencies.
+#    (because it breaks when using bootstrap-lean, since some of the
+#    headers are gone at "make install" time).
+# -Wall: Issue all automake warnings.
+# -Wno-portability: Don't warn about constructs supported by GNU make.
+#    (because GCC requires GNU make anyhow).
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='libbacktrace'
+ VERSION='version-unused'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+# Check whether --with-target-subdir was given.
+if test "${with_target_subdir+set}" = set; then :
+  withval=$with_target_subdir;
+fi
+
+
+# We must force CC to /not/ be precious variables; otherwise
+# the wrong, non-multilib-adjusted value will be used in multilibs.
+# As a side effect, we have to subst CFLAGS ourselves.
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "no acceptable C compiler found in \$PATH
+See \`config.log' for more details." "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    rm -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+case "$AWK" in
+"") as_fn_error "can't build without awk" "$LINENO" 5 ;;
+esac
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.2.7a'
+macro_revision='1.3134'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`print -r -- -n 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if test "${ac_cv_path_SED+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test "${lt_cv_path_NM+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if test "${lt_cv_nm_interface+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if test "${lt_cv_ld_force_load+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if test "${lt_cv_objdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      lt_prog_compiler_pic='-Xcompiler -fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ F* | *Sun*Fortran*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
+
+
+
+
+
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec=
+	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_from_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_flag_spec_ld='+b $libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if test "${lt_cv_prog_compiler__b+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo(void) {}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        LDFLAGS="$save_LDFLAGS"
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 11134 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+void fnord () __attribute__((visibility("default")));
+#endif
+
+void fnord () { int i=42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 11240 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+void fnord () __attribute__((visibility("default")));
+#endif
+
+void fnord () { int i=42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+
+backtrace_supported=yes
+
+if test -n "${with_target_subdir}"; then
+  # We are compiling a GCC library.  We can assume that the unwind
+  # library exists.
+  BACKTRACE_FILE="backtrace.lo simple.lo"
+else
+  ac_fn_c_check_header_mongrel "$LINENO" "unwind.h" "ac_cv_header_unwind_h" "$ac_includes_default"
+if test "x$ac_cv_header_unwind_h" = x""yes; then :
+  ac_fn_c_check_func "$LINENO" "_Unwind_Backtrace" "ac_cv_func__Unwind_Backtrace"
+if test "x$ac_cv_func__Unwind_Backtrace" = x""yes; then :
+  BACKTRACE_FILE="backtrace.lo simple.lo"
+else
+  BACKTRACE_FILE="nounwind.lo"
+                    backtrace_supported=no
+fi
+
+else
+  BACKTRACE_FILE="nounwind.lo"
+     backtrace_supported=no
+fi
+
+
+fi
+
+
+EXTRA_FLAGS=
+if test -n "${with_target_subdir}"; then
+  EXTRA_FLAGS="-funwind-tables -frandom-seed=\$@"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -funwind-tables option" >&5
+$as_echo_n "checking for -funwind-tables option... " >&6; }
+if test "${libbacktrace_cv_c_unwind_tables+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  CFLAGS_hold="$CFLAGS"
+     CFLAGS="$CFLAGS -funwind-tables"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+static int f() { return 0; }
+int
+main ()
+{
+return f();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libbacktrace_cv_c_unwind_tables=yes
+else
+  libbacktrace_cv_c_unwind_tables=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     CFLAGS="$CFLAGS_hold"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_c_unwind_tables" >&5
+$as_echo "$libbacktrace_cv_c_unwind_tables" >&6; }
+  if test "$libbacktrace_cv_c_unwind_tables" = "yes"; then
+    EXTRA_FLAGS=-funwind-tables
+  fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -frandom-seed=string option" >&5
+$as_echo_n "checking for -frandom-seed=string option... " >&6; }
+if test "${libbacktrace_cv_c_random_seed_string+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  CFLAGS_hold="$CFLAGS"
+     CFLAGS="$CFLAGS -frandom-seed=conftest.lo"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libbacktrace_cv_c_random_seed_string=yes
+else
+  libbacktrace_cv_c_random_seed_string=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     CFLAGS="$CFLAGS_hold"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_c_random_seed_string" >&5
+$as_echo "$libbacktrace_cv_c_random_seed_string" >&6; }
+  if test "$libbacktrace_cv_c_random_seed_string" = "yes"; then
+    EXTRA_FLAGS="$EXTRA_FLAGS -frandom-seed=\$@"
+  fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+WARN_FLAGS=
+save_CFLAGS="$CFLAGS"
+for real_option in -W -Wall -Wwrite-strings -Wstrict-prototypes \
+			  -Wmissing-prototypes -Wold-style-definition \
+			  -Wmissing-format-attribute -Wcast-qual; do
+  # Do the check with the no- prefix removed since gcc silently
+  # accepts any -Wno-* option on purpose
+  case $real_option in
+    -Wno-*) option=-W`expr x$real_option : 'x-Wno-\(.*\)'` ;;
+    *) option=$real_option ;;
+  esac
+  as_acx_Woption=`$as_echo "acx_cv_prog_cc_warning_$option" | $as_tr_sh`
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $option" >&5
+$as_echo_n "checking whether $CC supports $option... " >&6; }
+if { as_var=$as_acx_Woption; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  CFLAGS="$option"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_acx_Woption=yes"
+else
+  eval "$as_acx_Woption=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+eval ac_res=\$$as_acx_Woption
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  if test `eval 'as_val=${'$as_acx_Woption'};$as_echo "$as_val"'` = yes; then :
+  WARN_FLAGS="$WARN_FLAGS${WARN_FLAGS:+ }$real_option"
+fi
+  done
+CFLAGS="$save_CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+if test -n "${with_target_subdir}"; then
+  WARN_FLAGS="$WARN_FLAGS -Werror"
+fi
+
+
+
+if test -n "${with_target_subdir}"; then
+
+
+# Check whether --with-system-libunwind was given.
+if test "${with_system_libunwind+set}" = set; then :
+  withval=$with_system_libunwind;
+fi
+
+  # If system-libunwind was not specifically set, pick a default setting.
+  if test x$with_system_libunwind = x; then
+    case ${target} in
+      ia64-*-hpux*) with_system_libunwind=yes ;;
+      *) with_system_libunwind=no ;;
+    esac
+  fi
+  # Based on system-libunwind and target, do we have ipinfo?
+  if  test x$with_system_libunwind = xyes; then
+    case ${target} in
+      ia64-*-*) have_unwind_getipinfo=no ;;
+      *) have_unwind_getipinfo=yes ;;
+    esac
+  else
+    # Darwin before version 9 does not have _Unwind_GetIPInfo.
+
+    case ${target} in
+      *-*-darwin[3-8]|*-*-darwin[3-8].*) have_unwind_getipinfo=no ;;
+      *) have_unwind_getipinfo=yes ;;
+    esac
+
+  fi
+
+  if test x$have_unwind_getipinfo = xyes; then
+
+$as_echo "#define HAVE_GETIPINFO 1" >>confdefs.h
+
+  fi
+
+else
+  ac_save_CFFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Unwind_GetIPInfo" >&5
+$as_echo_n "checking for _Unwind_GetIPInfo... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "unwind.h"
+	struct _Unwind_Context *context;
+	int ip_before_insn = 0;
+int
+main ()
+{
+return _Unwind_GetIPInfo (context, &ip_before_insn);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  have_unwind_getipinfo=yes
+else
+  have_unwind_getipinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$ac_save_CFLAGS"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_unwind_getipinfo" >&5
+$as_echo "$have_unwind_getipinfo" >&6; }
+  if test "$have_unwind_getipinfo" = "yes"; then
+
+$as_echo "#define HAVE_GETIPINFO 1" >>confdefs.h
+
+  fi
+fi
+
+# Enable --enable-host-shared.
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; PIC_FLAG=-fPIC
+else
+  PIC_FLAG=
+fi
+
+
+
+# Test for __sync support.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __sync extensions" >&5
+$as_echo_n "checking __sync extensions... " >&6; }
+if test "${libbacktrace_cv_sys_sync+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "${with_target_subdir}"; then
+   case "${host}" in
+   hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;;
+   *) libbacktrace_cv_sys_sync=yes ;;
+   esac
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+__sync_bool_compare_and_swap (&i, i, i);
+                       __sync_lock_test_and_set (&i, 1);
+                       __sync_lock_release (&i);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  libbacktrace_cv_sys_sync=yes
+else
+  libbacktrace_cv_sys_sync=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_sync" >&5
+$as_echo "$libbacktrace_cv_sys_sync" >&6; }
+BACKTRACE_SUPPORTS_THREADS=0
+if test "$libbacktrace_cv_sys_sync" = "yes"; then
+  BACKTRACE_SUPPORTS_THREADS=1
+
+$as_echo "#define HAVE_SYNC_FUNCTIONS 1" >>confdefs.h
+
+fi
+
+
+# Test for __atomic support.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __atomic extensions" >&5
+$as_echo_n "checking __atomic extensions... " >&6; }
+if test "${libbacktrace_cv_sys_atomic+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "${with_target_subdir}"; then
+   libbacktrace_cv_sys_atomic=yes
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+__atomic_load_n (&i, __ATOMIC_ACQUIRE);
+		       __atomic_store_n (&i, 1, __ATOMIC_RELEASE);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  libbacktrace_cv_sys_atomic=yes
+else
+  libbacktrace_cv_sys_atomic=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_atomic" >&5
+$as_echo "$libbacktrace_cv_sys_atomic" >&6; }
+if test "$libbacktrace_cv_sys_atomic" = "yes"; then
+
+$as_echo "#define HAVE_ATOMIC_FUNCTIONS 1" >>confdefs.h
+
+fi
+
+# The library needs to be able to read the executable itself.  Compile
+# a file to determine the executable format.  The awk script
+# filetype.awk prints out the file type.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking output filetype" >&5
+$as_echo_n "checking output filetype... " >&6; }
+if test "${libbacktrace_cv_sys_filetype+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  filetype=
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+int j;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  filetype=`${AWK} -f $srcdir/filetype.awk conftest.$ac_objext`
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "compiler failed
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+libbacktrace_cv_sys_filetype=$filetype
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_filetype" >&5
+$as_echo "$libbacktrace_cv_sys_filetype" >&6; }
+
+# Match the file type to decide what files to compile.
+FORMAT_FILE=
+backtrace_supports_data=yes
+case "$libbacktrace_cv_sys_filetype" in
+elf*) FORMAT_FILE="elf.lo" ;;
+pecoff) FORMAT_FILE="pecoff.lo"
+        backtrace_supports_data=no
+	;;
+*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not determine output file type" >&5
+$as_echo "$as_me: WARNING: could not determine output file type" >&2;}
+   FORMAT_FILE="unknown.lo"
+   backtrace_supported=no
+   ;;
+esac
+
+
+# ELF defines.
+elfsize=
+case "$libbacktrace_cv_sys_filetype" in
+elf32) elfsize=32 ;;
+elf64) elfsize=64 ;;
+*)     elfsize=unused
+esac
+
+cat >>confdefs.h <<_ACEOF
+#define BACKTRACE_ELF_SIZE $elfsize
+_ACEOF
+
+
+BACKTRACE_SUPPORTED=0
+if test "$backtrace_supported" = "yes"; then
+  BACKTRACE_SUPPORTED=1
+fi
+
+
+BACKTRACE_SUPPORTS_DATA=0
+if test "$backtrace_supports_data" = "yes"; then
+  BACKTRACE_SUPPORTS_DATA=1
+fi
+
+
+
+
+inttype_headers=`echo inttypes.h sys/inttypes.h  | sed -e 's/,/ /g'`
+
+acx_cv_header_stdint=stddef.h
+acx_cv_header_stdint_kind="(already complete)"
+for i in stdint.h $inttype_headers; do
+  unset ac_cv_type_uintptr_t
+  unset ac_cv_type_uintmax_t
+  unset ac_cv_type_int_least32_t
+  unset ac_cv_type_int_fast32_t
+  unset ac_cv_type_uint64_t
+  $as_echo_n "looking for a compliant stdint.h in $i, " >&6
+  ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_uintmax_t" = x""yes; then :
+  acx_cv_header_stdint=$i
+else
+  continue
+fi
+
+  ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_uintptr_t" = x""yes; then :
+
+else
+  acx_cv_header_stdint_kind="(mostly complete)"
+fi
+
+  ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_int_least32_t" = x""yes; then :
+
+else
+  acx_cv_header_stdint_kind="(mostly complete)"
+fi
+
+  ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_int_fast32_t" = x""yes; then :
+
+else
+  acx_cv_header_stdint_kind="(mostly complete)"
+fi
+
+  ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_uint64_t" = x""yes; then :
+
+else
+  acx_cv_header_stdint_kind="(lacks uint64_t)"
+fi
+
+  break
+done
+if test "$acx_cv_header_stdint" = stddef.h; then
+  acx_cv_header_stdint_kind="(lacks uintmax_t)"
+  for i in stdint.h $inttype_headers; do
+    unset ac_cv_type_uintptr_t
+    unset ac_cv_type_uint32_t
+    unset ac_cv_type_uint64_t
+    $as_echo_n "looking for an incomplete stdint.h in $i, " >&6
+    ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_uint32_t" = x""yes; then :
+  acx_cv_header_stdint=$i
+else
+  continue
+fi
+
+    ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_uint64_t" = x""yes; then :
+
+fi
+
+    ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_uintptr_t" = x""yes; then :
+
+fi
+
+    break
+  done
+fi
+if test "$acx_cv_header_stdint" = stddef.h; then
+  acx_cv_header_stdint_kind="(u_intXX_t style)"
+  for i in sys/types.h $inttype_headers; do
+    unset ac_cv_type_u_int32_t
+    unset ac_cv_type_u_int64_t
+    $as_echo_n "looking for u_intXX_t types in $i, " >&6
+    ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_u_int32_t" = x""yes; then :
+  acx_cv_header_stdint=$i
+else
+  continue
+fi
+
+    ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include <sys/types.h>
+#include <$i>
+"
+if test "x$ac_cv_type_u_int64_t" = x""yes; then :
+
+fi
+
+    break
+  done
+fi
+if test "$acx_cv_header_stdint" = stddef.h; then
+  acx_cv_header_stdint_kind="(using manual detection)"
+fi
+
+test -z "$ac_cv_type_uintptr_t" && ac_cv_type_uintptr_t=no
+test -z "$ac_cv_type_uint64_t" && ac_cv_type_uint64_t=no
+test -z "$ac_cv_type_u_int64_t" && ac_cv_type_u_int64_t=no
+test -z "$ac_cv_type_int_least32_t" && ac_cv_type_int_least32_t=no
+test -z "$ac_cv_type_int_fast32_t" && ac_cv_type_int_fast32_t=no
+
+# ----------------- Summarize what we found so far
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what to include in gstdint.h" >&5
+$as_echo_n "checking what to include in gstdint.h... " >&6; }
+
+case `$as_basename -- gstdint.h ||
+$as_expr X/gstdint.h : '.*/\([^/][^/]*\)/*$' \| \
+	 Xgstdint.h : 'X\(//\)$' \| \
+	 Xgstdint.h : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/gstdint.h |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'` in
+  stdint.h) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: are you sure you want it there?" >&5
+$as_echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
+  inttypes.h) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: are you sure you want it there?" >&5
+$as_echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
+  *) ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
+$as_echo "$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6; }
+
+# ----------------- done included file, check C basic types --------
+
+# Lacking an uintptr_t?  Test size of void *
+case "$acx_cv_header_stdint:$ac_cv_type_uintptr_t" in
+  stddef.h:* | *:no) # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+$as_echo_n "checking size of void *... " >&6; }
+if test "${ac_cv_sizeof_void_p+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_void_p" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (void *)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+$as_echo "$ac_cv_sizeof_void_p" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
+_ACEOF
+
+ ;;
+esac
+
+# Lacking an uint64_t?  Test size of long
+case "$acx_cv_header_stdint:$ac_cv_type_uint64_t:$ac_cv_type_u_int64_t" in
+  stddef.h:*:* | *:no:no) # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if test "${ac_cv_sizeof_long+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (long)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+ ;;
+esac
+
+if test $acx_cv_header_stdint = stddef.h; then
+  # Lacking a good header?  Test size of everything and deduce all types.
+  # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if test "${ac_cv_sizeof_int+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (int)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+  # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+$as_echo_n "checking size of short... " >&6; }
+if test "${ac_cv_sizeof_short+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_short" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (short)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+$as_echo "$ac_cv_sizeof_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+  # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
+$as_echo_n "checking size of char... " >&6; }
+if test "${ac_cv_sizeof_char+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_char" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (char)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
+$as_echo "$ac_cv_sizeof_char" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CHAR $ac_cv_sizeof_char
+_ACEOF
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int8_t" >&5
+$as_echo_n "checking for type equivalent to int8_t... " >&6; }
+  case "$ac_cv_sizeof_char" in
+    1) acx_cv_type_int8_t=char ;;
+    *) as_fn_error "no 8-bit type, please report a bug" "$LINENO" 5
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int8_t" >&5
+$as_echo "$acx_cv_type_int8_t" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int16_t" >&5
+$as_echo_n "checking for type equivalent to int16_t... " >&6; }
+  case "$ac_cv_sizeof_int:$ac_cv_sizeof_short" in
+    2:*) acx_cv_type_int16_t=int ;;
+    *:2) acx_cv_type_int16_t=short ;;
+    *) as_fn_error "no 16-bit type, please report a bug" "$LINENO" 5
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int16_t" >&5
+$as_echo "$acx_cv_type_int16_t" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int32_t" >&5
+$as_echo_n "checking for type equivalent to int32_t... " >&6; }
+  case "$ac_cv_sizeof_int:$ac_cv_sizeof_long" in
+    4:*) acx_cv_type_int32_t=int ;;
+    *:4) acx_cv_type_int32_t=long ;;
+    *) as_fn_error "no 32-bit type, please report a bug" "$LINENO" 5
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int32_t" >&5
+$as_echo "$acx_cv_type_int32_t" >&6; }
+fi
+
+# These tests are here to make the output prettier
+
+if test "$ac_cv_type_uint64_t" != yes && test "$ac_cv_type_u_int64_t" != yes; then
+  case "$ac_cv_sizeof_long" in
+    8) acx_cv_type_int64_t=long ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int64_t" >&5
+$as_echo_n "checking for type equivalent to int64_t... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
+$as_echo "${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6; }
+fi
+
+# Now we can use the above types
+
+if test "$ac_cv_type_uintptr_t" != yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to intptr_t" >&5
+$as_echo_n "checking for type equivalent to intptr_t... " >&6; }
+  case $ac_cv_sizeof_void_p in
+    2) acx_cv_type_intptr_t=int16_t ;;
+    4) acx_cv_type_intptr_t=int32_t ;;
+    8) acx_cv_type_intptr_t=int64_t ;;
+    *) as_fn_error "no equivalent for intptr_t, please report a bug" "$LINENO" 5
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_intptr_t" >&5
+$as_echo "$acx_cv_type_intptr_t" >&6; }
+fi
+
+# ----------------- done all checks, emit header -------------
+ac_config_commands="$ac_config_commands gstdint.h"
+
+
+
+
+for ac_header in sys/mman.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_mman_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_MMAN_H 1
+_ACEOF
+
+fi
+
+done
+
+if test "$ac_cv_header_sys_mman_h" = "no"; then
+  have_mmap=no
+else
+  if test -n "${with_target_subdir}"; then
+    # When built as a GCC target library, we can't do a link test.  We
+    # simply assume that if we have mman.h, we have mmap.
+    have_mmap=yes
+    case "${host}" in
+    spu-*-*|*-*-msdosdjgpp)
+        # The SPU does not have mmap, but it has a sys/mman.h header file
+        # containing "mmap_eaddr" and the mmap flags, confusing the test.
+        # DJGPP also has sys/man.h, but no mmap
+	have_mmap=no ;;
+    esac
+  else
+    ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
+if test "x$ac_cv_func_mmap" = x""yes; then :
+  have_mmap=yes
+else
+  have_mmap=no
+fi
+
+  fi
+fi
+if test "$have_mmap" = "no"; then
+  VIEW_FILE=read.lo
+  ALLOC_FILE=alloc.lo
+else
+  VIEW_FILE=mmapio.lo
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/mman.h>
+#if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
+  #error no MAP_ANONYMOUS
+#endif
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ALLOC_FILE=mmap.lo
+else
+  ALLOC_FILE=alloc.lo
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+
+
+
+BACKTRACE_USES_MALLOC=0
+if test "$ALLOC_FILE" = "alloc.lo"; then
+  BACKTRACE_USES_MALLOC=1
+fi
+
+
+# Check for dl_iterate_phdr.
+for ac_header in link.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "link.h" "ac_cv_header_link_h" "$ac_includes_default"
+if test "x$ac_cv_header_link_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINK_H 1
+_ACEOF
+
+fi
+
+done
+
+if test "$ac_cv_header_link_h" = "no"; then
+  have_dl_iterate_phdr=no
+else
+  if test -n "${with_target_subdir}"; then
+    # When built as a GCC target library, we can't do a link test.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <link.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "dl_iterate_phdr" >/dev/null 2>&1; then :
+  have_dl_iterate_phdr=yes
+else
+  have_dl_iterate_phdr=no
+fi
+rm -f conftest*
+
+    case "${host}" in
+    *-*-solaris2.10*)
+        # Avoid dl_iterate_phdr on Solaris 10, where it is in the
+    	# header file but is only in -ldl.
+	have_dl_iterate_phdr=no ;;
+    esac
+  else
+    ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = x""yes; then :
+  have_dl_iterate_phdr=yes
+else
+  have_dl_iterate_phdr=no
+fi
+
+  fi
+fi
+if test "$have_dl_iterate_phdr" = "yes"; then
+
+$as_echo "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+
+# Check for the fcntl function.
+if test -n "${with_target_subdir}"; then
+   case "${host}" in
+   *-*-mingw*) have_fcntl=no ;;
+   spu-*-*) have_fcntl=no ;;
+   *) have_fcntl=yes ;;
+   esac
+else
+  ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl"
+if test "x$ac_cv_func_fcntl" = x""yes; then :
+  have_fcntl=yes
+else
+  have_fcntl=no
+fi
+
+fi
+if test "$have_fcntl" = "yes"; then
+
+$as_echo "#define HAVE_FCNTL 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strnlen" = x""yes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNLEN $ac_have_decl
+_ACEOF
+
+
+# Check for getexecname function.
+if test -n "${with_target_subdir}"; then
+   case "${host}" in
+   *-*-solaris2*) have_getexecname=yes ;;
+   *) have_getexecname=no ;;
+   esac
+else
+  ac_fn_c_check_func "$LINENO" "getexecname" "ac_cv_func_getexecname"
+if test "x$ac_cv_func_getexecname" = x""yes; then :
+  have_getexecname=yes
+else
+  have_getexecname=no
+fi
+
+fi
+if test "$have_getexecname" = "yes"; then
+
+$as_echo "#define HAVE_GETEXECNAME 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests can run" >&5
+$as_echo_n "checking whether tests can run... " >&6; }
+if test "${libbacktrace_cv_sys_native+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  libbacktrace_cv_sys_native=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  libbacktrace_cv_sys_native=yes
+else
+  libbacktrace_cv_sys_native=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_native" >&5
+$as_echo "$libbacktrace_cv_sys_native" >&6; }
+ if test "$libbacktrace_cv_sys_native" = "yes"; then
+  NATIVE_TRUE=
+  NATIVE_FALSE='#'
+else
+  NATIVE_TRUE='#'
+  NATIVE_FALSE=
+fi
+
+
+if test "${multilib}" = "yes"; then
+  multilib_arg="--enable-multilib"
+else
+  multilib_arg=
+fi
+
+ac_config_files="$ac_config_files Makefile backtrace-supported.h"
+
+
+# We need multilib support, but only if configuring for the target.
+ac_config_commands="$ac_config_commands default"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NATIVE_TRUE}" && test -z "${NATIVE_FALSE}"; then
+  as_fn_error "conditional \"NATIVE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by package-unused $as_me version-unused, which was
+generated by GNU Autoconf 2.64.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+package-unused config.status version-unused
+configured by $0, generated by GNU Autoconf 2.64,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+
+srcdir="$srcdir"
+host="$host"
+target="$target"
+with_multisubdir="$with_multisubdir"
+with_multisrctop="$with_multisrctop"
+with_target_subdir="$with_target_subdir"
+ac_configure_args="${multilib_arg} ${ac_configure_args}"
+multi_basedir="$multi_basedir"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+CC="$CC"
+CXX="$CXX"
+GFORTRAN="$GFORTRAN"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+GCC="$GCC"
+CC="$CC"
+acx_cv_header_stdint="$acx_cv_header_stdint"
+acx_cv_type_int8_t="$acx_cv_type_int8_t"
+acx_cv_type_int16_t="$acx_cv_type_int16_t"
+acx_cv_type_int32_t="$acx_cv_type_int32_t"
+acx_cv_type_int64_t="$acx_cv_type_int64_t"
+acx_cv_type_intptr_t="$acx_cv_type_intptr_t"
+ac_cv_type_uintmax_t="$ac_cv_type_uintmax_t"
+ac_cv_type_uintptr_t="$ac_cv_type_uintptr_t"
+ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
+ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
+ac_cv_type_u_int32_t="$ac_cv_type_u_int32_t"
+ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
+ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
+ac_cv_sizeof_void_p="$ac_cv_sizeof_void_p"
+
+
+# Variables needed in config.status (file generation) which aren't already
+# passed by autoconf.
+SUBDIRS="$SUBDIRS"
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "gstdint.h") CONFIG_COMMANDS="$CONFIG_COMMANDS gstdint.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "backtrace-supported.h") CONFIG_FILES="$CONFIG_FILES backtrace-supported.h" ;;
+    "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || as_fn_error "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+	|| as_fn_error "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "default-1":C)
+# Only add multilib support code if we just rebuilt the top-level
+# Makefile.
+case " $CONFIG_FILES " in
+ *" Makefile "*)
+   ac_file=Makefile . ${multi_basedir}/config-ml.in
+   ;;
+esac ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+}
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$@"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1=\$$1\$2"
+}
+
+_LT_EOF
+    ;;
+  esac
+
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+    "gstdint.h":C)
+if test "$GCC" = yes; then
+  echo "/* generated for " `$CC --version | sed 1q` "*/" > tmp-stdint.h
+else
+  echo "/* generated for $CC */" > tmp-stdint.h
+fi
+
+sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+  #ifndef GCC_GENERATED_STDINT_H
+  #define GCC_GENERATED_STDINT_H 1
+
+  #include <sys/types.h>
+EOF
+
+if test "$acx_cv_header_stdint" != stdint.h; then
+  echo "#include <stddef.h>" >> tmp-stdint.h
+fi
+if test "$acx_cv_header_stdint" != stddef.h; then
+  echo "#include <$acx_cv_header_stdint>" >> tmp-stdint.h
+fi
+
+sed 's/^ *//' >> tmp-stdint.h <<EOF
+  /* glibc uses these symbols as guards to prevent redefinitions.  */
+  #ifdef __int8_t_defined
+  #define _INT8_T
+  #define _INT16_T
+  #define _INT32_T
+  #endif
+  #ifdef __uint32_t_defined
+  #define _UINT32_T
+  #endif
+
+EOF
+
+# ----------------- done header, emit basic int types -------------
+if test "$acx_cv_header_stdint" = stddef.h; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    #ifndef _UINT8_T
+    #define _UINT8_T
+    #ifndef __uint8_t_defined
+    #define __uint8_t_defined
+    #ifndef uint8_t
+    typedef unsigned $acx_cv_type_int8_t uint8_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _UINT16_T
+    #define _UINT16_T
+    #ifndef __uint16_t_defined
+    #define __uint16_t_defined
+    #ifndef uint16_t
+    typedef unsigned $acx_cv_type_int16_t uint16_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _UINT32_T
+    #define _UINT32_T
+    #ifndef __uint32_t_defined
+    #define __uint32_t_defined
+    #ifndef uint32_t
+    typedef unsigned $acx_cv_type_int32_t uint32_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _INT8_T
+    #define _INT8_T
+    #ifndef __int8_t_defined
+    #define __int8_t_defined
+    #ifndef int8_t
+    typedef $acx_cv_type_int8_t int8_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _INT16_T
+    #define _INT16_T
+    #ifndef __int16_t_defined
+    #define __int16_t_defined
+    #ifndef int16_t
+    typedef $acx_cv_type_int16_t int16_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _INT32_T
+    #define _INT32_T
+    #ifndef __int32_t_defined
+    #define __int32_t_defined
+    #ifndef int32_t
+    typedef $acx_cv_type_int32_t int32_t;
+    #endif
+    #endif
+    #endif
+EOF
+elif test "$ac_cv_type_u_int32_t" = yes; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* int8_t int16_t int32_t defined by inet code, we do the u_intXX types */
+    #ifndef _INT8_T
+    #define _INT8_T
+    #endif
+    #ifndef _INT16_T
+    #define _INT16_T
+    #endif
+    #ifndef _INT32_T
+    #define _INT32_T
+    #endif
+
+    #ifndef _UINT8_T
+    #define _UINT8_T
+    #ifndef __uint8_t_defined
+    #define __uint8_t_defined
+    #ifndef uint8_t
+    typedef u_int8_t uint8_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _UINT16_T
+    #define _UINT16_T
+    #ifndef __uint16_t_defined
+    #define __uint16_t_defined
+    #ifndef uint16_t
+    typedef u_int16_t uint16_t;
+    #endif
+    #endif
+    #endif
+
+    #ifndef _UINT32_T
+    #define _UINT32_T
+    #ifndef __uint32_t_defined
+    #define __uint32_t_defined
+    #ifndef uint32_t
+    typedef u_int32_t uint32_t;
+    #endif
+    #endif
+    #endif
+EOF
+else
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* Some systems have guard macros to prevent redefinitions, define them.  */
+    #ifndef _INT8_T
+    #define _INT8_T
+    #endif
+    #ifndef _INT16_T
+    #define _INT16_T
+    #endif
+    #ifndef _INT32_T
+    #define _INT32_T
+    #endif
+    #ifndef _UINT8_T
+    #define _UINT8_T
+    #endif
+    #ifndef _UINT16_T
+    #define _UINT16_T
+    #endif
+    #ifndef _UINT32_T
+    #define _UINT32_T
+    #endif
+EOF
+fi
+
+# ------------- done basic int types, emit int64_t types ------------
+if test "$ac_cv_type_uint64_t" = yes; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* system headers have good uint64_t and int64_t */
+    #ifndef _INT64_T
+    #define _INT64_T
+    #endif
+    #ifndef _UINT64_T
+    #define _UINT64_T
+    #endif
+EOF
+elif test "$ac_cv_type_u_int64_t" = yes; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* system headers have an u_int64_t (and int64_t) */
+    #ifndef _INT64_T
+    #define _INT64_T
+    #endif
+    #ifndef _UINT64_T
+    #define _UINT64_T
+    #ifndef __uint64_t_defined
+    #define __uint64_t_defined
+    #ifndef uint64_t
+    typedef u_int64_t uint64_t;
+    #endif
+    #endif
+    #endif
+EOF
+elif test -n "$acx_cv_type_int64_t"; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* architecture has a 64-bit type, $acx_cv_type_int64_t */
+    #ifndef _INT64_T
+    #define _INT64_T
+    #ifndef int64_t
+    typedef $acx_cv_type_int64_t int64_t;
+    #endif
+    #endif
+    #ifndef _UINT64_T
+    #define _UINT64_T
+    #ifndef __uint64_t_defined
+    #define __uint64_t_defined
+    #ifndef uint64_t
+    typedef unsigned $acx_cv_type_int64_t uint64_t;
+    #endif
+    #endif
+    #endif
+EOF
+else
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* some common heuristics for int64_t, using compiler-specific tests */
+    #if defined __STDC_VERSION__ && (__STDC_VERSION__-0) >= 199901L
+    #ifndef _INT64_T
+    #define _INT64_T
+    #ifndef __int64_t_defined
+    #ifndef int64_t
+    typedef long long int64_t;
+    #endif
+    #endif
+    #endif
+    #ifndef _UINT64_T
+    #define _UINT64_T
+    #ifndef uint64_t
+    typedef unsigned long long uint64_t;
+    #endif
+    #endif
+
+    #elif defined __GNUC__ && defined (__STDC__) && __STDC__-0
+    /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
+       does not implement __extension__.  But that compiler doesn't define
+       __GNUC_MINOR__.  */
+    # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
+    # define __extension__
+    # endif
+
+    # ifndef _INT64_T
+    # define _INT64_T
+    # ifndef int64_t
+    __extension__ typedef long long int64_t;
+    # endif
+    # endif
+    # ifndef _UINT64_T
+    # define _UINT64_T
+    # ifndef uint64_t
+    __extension__ typedef unsigned long long uint64_t;
+    # endif
+    # endif
+
+    #elif !defined __STRICT_ANSI__
+    # if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
+
+    #  ifndef _INT64_T
+    #  define _INT64_T
+    #  ifndef int64_t
+    typedef __int64 int64_t;
+    #  endif
+    #  endif
+    #  ifndef _UINT64_T
+    #  define _UINT64_T
+    #  ifndef uint64_t
+    typedef unsigned __int64 uint64_t;
+    #  endif
+    #  endif
+    # endif /* compiler */
+
+    #endif /* ANSI version */
+EOF
+fi
+
+# ------------- done int64_t types, emit intptr types ------------
+if test "$ac_cv_type_uintptr_t" != yes; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* Define intptr_t based on sizeof(void*) = $ac_cv_sizeof_void_p */
+    #ifndef __uintptr_t_defined
+    #ifndef uintptr_t
+    typedef u$acx_cv_type_intptr_t uintptr_t;
+    #endif
+    #endif
+    #ifndef __intptr_t_defined
+    #ifndef intptr_t
+    typedef $acx_cv_type_intptr_t  intptr_t;
+    #endif
+    #endif
+EOF
+fi
+
+# ------------- done intptr types, emit int_least types ------------
+if test "$ac_cv_type_int_least32_t" != yes; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* Define int_least types */
+    typedef int8_t     int_least8_t;
+    typedef int16_t    int_least16_t;
+    typedef int32_t    int_least32_t;
+    #ifdef _INT64_T
+    typedef int64_t    int_least64_t;
+    #endif
+
+    typedef uint8_t    uint_least8_t;
+    typedef uint16_t   uint_least16_t;
+    typedef uint32_t   uint_least32_t;
+    #ifdef _UINT64_T
+    typedef uint64_t   uint_least64_t;
+    #endif
+EOF
+fi
+
+# ------------- done intptr types, emit int_fast types ------------
+if test "$ac_cv_type_int_fast32_t" != yes; then
+      sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* Define int_fast types.  short is often slow */
+    typedef int8_t       int_fast8_t;
+    typedef int          int_fast16_t;
+    typedef int32_t      int_fast32_t;
+    #ifdef _INT64_T
+    typedef int64_t      int_fast64_t;
+    #endif
+
+    typedef uint8_t      uint_fast8_t;
+    typedef unsigned int uint_fast16_t;
+    typedef uint32_t     uint_fast32_t;
+    #ifdef _UINT64_T
+    typedef uint64_t     uint_fast64_t;
+    #endif
+EOF
+fi
+
+if test "$ac_cv_type_uintmax_t" != yes; then
+  sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+    /* Define intmax based on what we found */
+    #ifndef intmax_t
+    #ifdef _INT64_T
+    typedef int64_t       intmax_t;
+    #else
+    typedef long          intmax_t;
+    #endif
+    #endif
+    #ifndef uintmax_t
+    #ifdef _UINT64_T
+    typedef uint64_t      uintmax_t;
+    #else
+    typedef unsigned long uintmax_t;
+    #endif
+    #endif
+EOF
+fi
+
+sed 's/^ *//' >> tmp-stdint.h <<EOF
+
+  #endif /* GCC_GENERATED_STDINT_H */
+EOF
+
+if test -r gstdint.h && cmp -s tmp-stdint.h gstdint.h; then
+  rm -f tmp-stdint.h
+else
+  mv -f tmp-stdint.h gstdint.h
+fi
+
+ ;;
+    "default":C) if test -n "$CONFIG_FILES"; then
+   if test -n "${with_target_subdir}"; then
+     # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
+     # that multilib installs will end up installed in the correct place.
+     # The testsuite needs it for multilib-aware ABI baseline files.
+     # To work around this not being passed down from config-ml.in ->
+     # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
+     # append it here.  Only modify Makefiles that have just been created.
+     #
+     # Also, get rid of this simulated-VPATH thing that automake does.
+     cat > vpsed << \_EOF
+  s!`test -f '$<' || echo '$(srcdir)/'`!!
+_EOF
+     for i in $SUBDIRS; do
+      case $CONFIG_FILES in
+       *${i}/Makefile*)
+	 #echo "Adding MULTISUBDIR to $i/Makefile"
+	 sed -f vpsed $i/Makefile > tmp
+	 grep '^MULTISUBDIR =' Makefile >> tmp
+	 mv tmp $i/Makefile
+	 ;;
+      esac
+     done
+     rm vpsed
+   fi
+ fi
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit $?
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/configure.ac
@@ -0,0 +1,409 @@
+# configure.ac -- Backtrace configure script.
+# Copyright (C) 2012-2016 Free Software Foundation, Inc.
+
+# 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.
+
+#     (3) The name of the author may not be used to
+#     endorse or promote products derived from this software without
+#     specific prior written permission.
+
+# 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.
+
+AC_PREREQ(2.64)
+AC_INIT(package-unused, version-unused,, libbacktrace)
+AC_CONFIG_SRCDIR(backtrace.h)
+AC_CONFIG_HEADER(config.h)
+
+if test -n "${with_target_subdir}"; then
+  AM_ENABLE_MULTILIB(, ..)
+fi
+
+AC_CANONICAL_SYSTEM
+target_alias=${target_alias-$host_alias}
+
+AC_USE_SYSTEM_EXTENSIONS
+
+libtool_VERSION=1:0:0
+AC_SUBST(libtool_VERSION)
+
+# 1.11.1: Require that version of automake.
+# foreign: Don't require README, INSTALL, NEWS, etc.
+# no-define: Don't define PACKAGE and VERSION.
+# no-dependencies: Don't generate automatic dependencies.
+#    (because it breaks when using bootstrap-lean, since some of the
+#    headers are gone at "make install" time).
+# -Wall: Issue all automake warnings.
+# -Wno-portability: Don't warn about constructs supported by GNU make.
+#    (because GCC requires GNU make anyhow).
+AM_INIT_AUTOMAKE([1.11.1 foreign no-dist no-define no-dependencies -Wall -Wno-portability])
+
+AM_MAINTAINER_MODE
+
+AC_ARG_WITH(target-subdir,
+[  --with-target-subdir=SUBDIR      Configuring in a subdirectory for target])
+
+# We must force CC to /not/ be precious variables; otherwise
+# the wrong, non-multilib-adjusted value will be used in multilibs.
+# As a side effect, we have to subst CFLAGS ourselves.
+m4_rename([_AC_ARG_VAR_PRECIOUS],[backtrace_PRECIOUS])
+m4_define([_AC_ARG_VAR_PRECIOUS],[])
+AC_PROG_CC
+m4_rename_force([backtrace_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
+
+AC_SUBST(CFLAGS)
+
+AC_PROG_RANLIB
+
+AC_PROG_AWK
+case "$AWK" in
+"") AC_MSG_ERROR([can't build without awk]) ;;
+esac
+
+LT_INIT
+AM_PROG_LIBTOOL
+
+backtrace_supported=yes
+
+if test -n "${with_target_subdir}"; then
+  # We are compiling a GCC library.  We can assume that the unwind
+  # library exists.
+  BACKTRACE_FILE="backtrace.lo simple.lo"
+else
+  AC_CHECK_HEADER([unwind.h],
+    [AC_CHECK_FUNC([_Unwind_Backtrace],
+	           [BACKTRACE_FILE="backtrace.lo simple.lo"],
+		   [BACKTRACE_FILE="nounwind.lo"
+                    backtrace_supported=no])],
+    [BACKTRACE_FILE="nounwind.lo"
+     backtrace_supported=no])
+fi
+AC_SUBST(BACKTRACE_FILE)
+
+EXTRA_FLAGS=
+if test -n "${with_target_subdir}"; then
+  EXTRA_FLAGS="-funwind-tables -frandom-seed=\$@"
+else
+  AC_CACHE_CHECK([for -funwind-tables option],
+    [libbacktrace_cv_c_unwind_tables],
+    [CFLAGS_hold="$CFLAGS"
+     CFLAGS="$CFLAGS -funwind-tables"
+     AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([static int f() { return 0; }], [return f();])],
+       [libbacktrace_cv_c_unwind_tables=yes],
+       [libbacktrace_cv_c_unwind_tables=no])
+     CFLAGS="$CFLAGS_hold"])
+  if test "$libbacktrace_cv_c_unwind_tables" = "yes"; then
+    EXTRA_FLAGS=-funwind-tables
+  fi
+  AC_CACHE_CHECK([for -frandom-seed=string option],
+    [libbacktrace_cv_c_random_seed_string],
+    [CFLAGS_hold="$CFLAGS"
+     CFLAGS="$CFLAGS -frandom-seed=conftest.lo"
+     AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([], [return 0;])],
+       [libbacktrace_cv_c_random_seed_string=yes],
+       [libbacktrace_cv_c_random_seed_string=no])
+     CFLAGS="$CFLAGS_hold"])
+  if test "$libbacktrace_cv_c_random_seed_string" = "yes"; then
+    EXTRA_FLAGS="$EXTRA_FLAGS -frandom-seed=\$@"
+  fi
+fi
+AC_SUBST(EXTRA_FLAGS)
+
+ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wwrite-strings -Wstrict-prototypes \
+			  -Wmissing-prototypes -Wold-style-definition \
+			  -Wmissing-format-attribute -Wcast-qual],
+			  [WARN_FLAGS])
+
+if test -n "${with_target_subdir}"; then
+  WARN_FLAGS="$WARN_FLAGS -Werror"
+fi
+
+AC_SUBST(WARN_FLAGS)
+
+if test -n "${with_target_subdir}"; then
+  GCC_CHECK_UNWIND_GETIPINFO
+else
+  ac_save_CFFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
+  AC_MSG_CHECKING([for _Unwind_GetIPInfo])
+  AC_LINK_IFELSE(
+    [AC_LANG_PROGRAM(
+       [#include "unwind.h"
+	struct _Unwind_Context *context;
+	int ip_before_insn = 0;],
+	[return _Unwind_GetIPInfo (context, &ip_before_insn);])],
+	[have_unwind_getipinfo=yes], [have_unwind_getipinfo=no])
+  CFLAGS="$ac_save_CFLAGS"
+  AC_MSG_RESULT([$have_unwind_getipinfo])
+  if test "$have_unwind_getipinfo" = "yes"; then
+    AC_DEFINE(HAVE_GETIPINFO, 1, [Define if _Unwind_GetIPInfo is available.])
+  fi
+fi
+
+# Enable --enable-host-shared.
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[PIC_FLAG=-fPIC], [PIC_FLAG=])
+AC_SUBST(PIC_FLAG)
+
+# Test for __sync support.
+AC_CACHE_CHECK([__sync extensions],
+[libbacktrace_cv_sys_sync],
+[if test -n "${with_target_subdir}"; then
+   case "${host}" in
+   hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;;
+   *) libbacktrace_cv_sys_sync=yes ;;
+   esac
+ else
+   AC_LINK_IFELSE(
+     [AC_LANG_PROGRAM([int i;],
+                      [__sync_bool_compare_and_swap (&i, i, i);
+                       __sync_lock_test_and_set (&i, 1);
+                       __sync_lock_release (&i);])],
+     [libbacktrace_cv_sys_sync=yes],
+     [libbacktrace_cv_sys_sync=no])
+ fi])
+BACKTRACE_SUPPORTS_THREADS=0
+if test "$libbacktrace_cv_sys_sync" = "yes"; then
+  BACKTRACE_SUPPORTS_THREADS=1
+  AC_DEFINE([HAVE_SYNC_FUNCTIONS], 1,
+	    [Define to 1 if you have the __sync functions])
+fi
+AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
+
+# Test for __atomic support.
+AC_CACHE_CHECK([__atomic extensions],
+[libbacktrace_cv_sys_atomic],
+[if test -n "${with_target_subdir}"; then
+   libbacktrace_cv_sys_atomic=yes
+ else
+   AC_LINK_IFELSE(
+     [AC_LANG_PROGRAM([int i;],
+     		      [__atomic_load_n (&i, __ATOMIC_ACQUIRE);
+		       __atomic_store_n (&i, 1, __ATOMIC_RELEASE);])],
+     [libbacktrace_cv_sys_atomic=yes],
+     [libbacktrace_cv_sys_atomic=no])
+ fi])
+if test "$libbacktrace_cv_sys_atomic" = "yes"; then
+  AC_DEFINE([HAVE_ATOMIC_FUNCTIONS], 1,
+	    [Define to 1 if you have the __atomic functions])
+fi
+
+# The library needs to be able to read the executable itself.  Compile
+# a file to determine the executable format.  The awk script
+# filetype.awk prints out the file type.
+AC_CACHE_CHECK([output filetype],
+[libbacktrace_cv_sys_filetype],
+[filetype=
+AC_COMPILE_IFELSE(
+  [AC_LANG_PROGRAM([int i;], [int j;])],
+  [filetype=`${AWK} -f $srcdir/filetype.awk conftest.$ac_objext`],
+  [AC_MSG_FAILURE([compiler failed])])
+libbacktrace_cv_sys_filetype=$filetype])
+
+# Match the file type to decide what files to compile.
+FORMAT_FILE=
+backtrace_supports_data=yes
+case "$libbacktrace_cv_sys_filetype" in
+elf*) FORMAT_FILE="elf.lo" ;;
+pecoff) FORMAT_FILE="pecoff.lo"
+        backtrace_supports_data=no
+	;;
+*) AC_MSG_WARN([could not determine output file type])
+   FORMAT_FILE="unknown.lo"
+   backtrace_supported=no
+   ;;
+esac
+AC_SUBST(FORMAT_FILE)
+
+# ELF defines.
+elfsize=
+case "$libbacktrace_cv_sys_filetype" in
+elf32) elfsize=32 ;;
+elf64) elfsize=64 ;;
+*)     elfsize=unused
+esac
+AC_DEFINE_UNQUOTED([BACKTRACE_ELF_SIZE], [$elfsize], [ELF size: 32 or 64])
+
+BACKTRACE_SUPPORTED=0
+if test "$backtrace_supported" = "yes"; then
+  BACKTRACE_SUPPORTED=1
+fi
+AC_SUBST(BACKTRACE_SUPPORTED)
+
+BACKTRACE_SUPPORTS_DATA=0
+if test "$backtrace_supports_data" = "yes"; then
+  BACKTRACE_SUPPORTS_DATA=1
+fi
+AC_SUBST(BACKTRACE_SUPPORTS_DATA)
+
+GCC_HEADER_STDINT(gstdint.h)
+
+AC_CHECK_HEADERS(sys/mman.h)
+if test "$ac_cv_header_sys_mman_h" = "no"; then
+  have_mmap=no
+else
+  if test -n "${with_target_subdir}"; then
+    # When built as a GCC target library, we can't do a link test.  We
+    # simply assume that if we have mman.h, we have mmap.
+    have_mmap=yes
+    case "${host}" in
+    spu-*-*|*-*-msdosdjgpp)
+        # The SPU does not have mmap, but it has a sys/mman.h header file
+        # containing "mmap_eaddr" and the mmap flags, confusing the test.
+        # DJGPP also has sys/man.h, but no mmap
+	have_mmap=no ;;
+    esac
+  else
+    AC_CHECK_FUNC(mmap, [have_mmap=yes], [have_mmap=no])
+  fi
+fi
+if test "$have_mmap" = "no"; then
+  VIEW_FILE=read.lo
+  ALLOC_FILE=alloc.lo
+else
+  VIEW_FILE=mmapio.lo
+  AC_PREPROC_IFELSE([
+#include <sys/mman.h>
+#if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
+  #error no MAP_ANONYMOUS
+#endif
+], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo])
+fi
+AC_SUBST(VIEW_FILE)
+AC_SUBST(ALLOC_FILE)
+
+BACKTRACE_USES_MALLOC=0
+if test "$ALLOC_FILE" = "alloc.lo"; then
+  BACKTRACE_USES_MALLOC=1
+fi
+AC_SUBST(BACKTRACE_USES_MALLOC)
+
+# Check for dl_iterate_phdr.
+AC_CHECK_HEADERS(link.h)
+if test "$ac_cv_header_link_h" = "no"; then
+  have_dl_iterate_phdr=no
+else
+  if test -n "${with_target_subdir}"; then
+    # When built as a GCC target library, we can't do a link test.
+    AC_EGREP_HEADER([dl_iterate_phdr], [link.h], [have_dl_iterate_phdr=yes],
+		    [have_dl_iterate_phdr=no])
+    case "${host}" in
+    *-*-solaris2.10*)
+        # Avoid dl_iterate_phdr on Solaris 10, where it is in the
+    	# header file but is only in -ldl.
+	have_dl_iterate_phdr=no ;;
+    esac
+  else
+    AC_CHECK_FUNC([dl_iterate_phdr], [have_dl_iterate_phdr=yes],
+		  [have_dl_iterate_phdr=no])
+  fi
+fi
+if test "$have_dl_iterate_phdr" = "yes"; then
+  AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.])
+fi
+
+# Check for the fcntl function.
+if test -n "${with_target_subdir}"; then
+   case "${host}" in
+   *-*-mingw*) have_fcntl=no ;;
+   spu-*-*) have_fcntl=no ;;
+   *) have_fcntl=yes ;;
+   esac
+else
+  AC_CHECK_FUNC(fcntl, [have_fcntl=yes], [have_fcntl=no])
+fi
+if test "$have_fcntl" = "yes"; then
+  AC_DEFINE([HAVE_FCNTL], 1,
+	    [Define to 1 if you have the fcntl function])
+fi
+
+AC_CHECK_DECLS(strnlen)
+
+# Check for getexecname function.
+if test -n "${with_target_subdir}"; then
+   case "${host}" in
+   *-*-solaris2*) have_getexecname=yes ;;
+   *) have_getexecname=no ;;
+   esac
+else
+  AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
+fi
+if test "$have_getexecname" = "yes"; then
+  AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
+fi
+
+AC_CACHE_CHECK([whether tests can run],
+  [libbacktrace_cv_sys_native],
+  [AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
+     [libbacktrace_cv_sys_native=yes],
+     [libbacktrace_cv_sys_native=no],
+     [libbacktrace_cv_sys_native=no])])
+AM_CONDITIONAL(NATIVE, test "$libbacktrace_cv_sys_native" = "yes")
+
+if test "${multilib}" = "yes"; then
+  multilib_arg="--enable-multilib"
+else
+  multilib_arg=
+fi
+
+AC_CONFIG_FILES(Makefile backtrace-supported.h)
+
+# We need multilib support, but only if configuring for the target.
+AC_CONFIG_COMMANDS([default],
+[if test -n "$CONFIG_FILES"; then
+   if test -n "${with_target_subdir}"; then
+     # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
+     # that multilib installs will end up installed in the correct place.
+     # The testsuite needs it for multilib-aware ABI baseline files.
+     # To work around this not being passed down from config-ml.in ->
+     # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
+     # append it here.  Only modify Makefiles that have just been created.
+     #
+     # Also, get rid of this simulated-VPATH thing that automake does.
+     cat > vpsed << \_EOF
+  s!`test -f '$<' || echo '$(srcdir)/'`!!
+_EOF
+     for i in $SUBDIRS; do
+      case $CONFIG_FILES in
+       *${i}/Makefile*)
+	 #echo "Adding MULTISUBDIR to $i/Makefile"
+	 sed -f vpsed $i/Makefile > tmp
+	 grep '^MULTISUBDIR =' Makefile >> tmp
+	 mv tmp $i/Makefile
+	 ;;
+      esac
+     done
+     rm vpsed
+   fi
+ fi
+],
+[
+# Variables needed in config.status (file generation) which aren't already
+# passed by autoconf.
+SUBDIRS="$SUBDIRS"
+])
+
+AC_OUTPUT
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/dwarf.c
@@ -0,0 +1,3038 @@
+/* dwarf.c -- Get file/line information from DWARF for backtraces.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "dwarf2.h"
+#include "filenames.h"
+
+#include "backtrace.h"
+#include "internal.h"
+
+#if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
+
+/* If strnlen is not declared, provide our own version.  */
+
+static size_t
+xstrnlen (const char *s, size_t maxlen)
+{
+  size_t i;
+
+  for (i = 0; i < maxlen; ++i)
+    if (s[i] == '\0')
+      break;
+  return i;
+}
+
+#define strnlen xstrnlen
+
+#endif
+
+/* A buffer to read DWARF info.  */
+
+struct dwarf_buf
+{
+  /* Buffer name for error messages.  */
+  const char *name;
+  /* Start of the buffer.  */
+  const unsigned char *start;
+  /* Next byte to read.  */
+  const unsigned char *buf;
+  /* The number of bytes remaining.  */
+  size_t left;
+  /* Whether the data is big-endian.  */
+  int is_bigendian;
+  /* Error callback routine.  */
+  backtrace_error_callback error_callback;
+  /* Data for error_callback.  */
+  void *data;
+  /* Non-zero if we've reported an underflow error.  */
+  int reported_underflow;
+};
+
+/* A single attribute in a DWARF abbreviation.  */
+
+struct attr
+{
+  /* The attribute name.  */
+  enum dwarf_attribute name;
+  /* The attribute form.  */
+  enum dwarf_form form;
+};
+
+/* A single DWARF abbreviation.  */
+
+struct abbrev
+{
+  /* The abbrev code--the number used to refer to the abbrev.  */
+  uint64_t code;
+  /* The entry tag.  */
+  enum dwarf_tag tag;
+  /* Non-zero if this abbrev has child entries.  */
+  int has_children;
+  /* The number of attributes.  */
+  size_t num_attrs;
+  /* The attributes.  */
+  struct attr *attrs;
+};
+
+/* The DWARF abbreviations for a compilation unit.  This structure
+   only exists while reading the compilation unit.  Most DWARF readers
+   seem to a hash table to map abbrev ID's to abbrev entries.
+   However, we primarily care about GCC, and GCC simply issues ID's in
+   numerical order starting at 1.  So we simply keep a sorted vector,
+   and try to just look up the code.  */
+
+struct abbrevs
+{
+  /* The number of abbrevs in the vector.  */
+  size_t num_abbrevs;
+  /* The abbrevs, sorted by the code field.  */
+  struct abbrev *abbrevs;
+};
+
+/* The different kinds of attribute values.  */
+
+enum attr_val_encoding
+{
+  /* An address.  */
+  ATTR_VAL_ADDRESS,
+  /* A unsigned integer.  */
+  ATTR_VAL_UINT,
+  /* A sigd integer.  */
+  ATTR_VAL_SINT,
+  /* A string.  */
+  ATTR_VAL_STRING,
+  /* An offset to other data in the containing unit.  */
+  ATTR_VAL_REF_UNIT,
+  /* An offset to other data within the .dwarf_info section.  */
+  ATTR_VAL_REF_INFO,
+  /* An offset to data in some other section.  */
+  ATTR_VAL_REF_SECTION,
+  /* A type signature.  */
+  ATTR_VAL_REF_TYPE,
+  /* A block of data (not represented).  */
+  ATTR_VAL_BLOCK,
+  /* An expression (not represented).  */
+  ATTR_VAL_EXPR,
+};
+
+/* An attribute value.  */
+
+struct attr_val
+{
+  /* How the value is stored in the field u.  */
+  enum attr_val_encoding encoding;
+  union
+  {
+    /* ATTR_VAL_ADDRESS, ATTR_VAL_UINT, ATTR_VAL_REF*.  */
+    uint64_t uint;
+    /* ATTR_VAL_SINT.  */
+    int64_t sint;
+    /* ATTR_VAL_STRING.  */
+    const char *string;
+    /* ATTR_VAL_BLOCK not stored.  */
+  } u;
+};
+
+/* The line number program header.  */
+
+struct line_header
+{
+  /* The version of the line number information.  */
+  int version;
+  /* The minimum instruction length.  */
+  unsigned int min_insn_len;
+  /* The maximum number of ops per instruction.  */
+  unsigned int max_ops_per_insn;
+  /* The line base for special opcodes.  */
+  int line_base;
+  /* The line range for special opcodes.  */
+  unsigned int line_range;
+  /* The opcode base--the first special opcode.  */
+  unsigned int opcode_base;
+  /* Opcode lengths, indexed by opcode - 1.  */
+  const unsigned char *opcode_lengths;
+  /* The number of directory entries.  */
+  size_t dirs_count;
+  /* The directory entries.  */
+  const char **dirs;
+  /* The number of filenames.  */
+  size_t filenames_count;
+  /* The filenames.  */
+  const char **filenames;
+};
+
+/* Map a single PC value to a file/line.  We will keep a vector of
+   these sorted by PC value.  Each file/line will be correct from the
+   PC up to the PC of the next entry if there is one.  We allocate one
+   extra entry at the end so that we can use bsearch.  */
+
+struct line
+{
+  /* PC.  */
+  uintptr_t pc;
+  /* File name.  Many entries in the array are expected to point to
+     the same file name.  */
+  const char *filename;
+  /* Line number.  */
+  int lineno;
+  /* Index of the object in the original array read from the DWARF
+     section, before it has been sorted.  The index makes it possible
+     to use Quicksort and maintain stability.  */
+  int idx;
+};
+
+/* A growable vector of line number information.  This is used while
+   reading the line numbers.  */
+
+struct line_vector
+{
+  /* Memory.  This is an array of struct line.  */
+  struct backtrace_vector vec;
+  /* Number of valid mappings.  */
+  size_t count;
+};
+
+/* A function described in the debug info.  */
+
+struct function
+{
+  /* The name of the function.  */
+  const char *name;
+  /* If this is an inlined function, the filename of the call
+     site.  */
+  const char *caller_filename;
+  /* If this is an inlined function, the line number of the call
+     site.  */
+  int caller_lineno;
+  /* Map PC ranges to inlined functions.  */
+  struct function_addrs *function_addrs;
+  size_t function_addrs_count;
+};
+
+/* An address range for a function.  This maps a PC value to a
+   specific function.  */
+
+struct function_addrs
+{
+  /* Range is LOW <= PC < HIGH.  */
+  uint64_t low;
+  uint64_t high;
+  /* Function for this address range.  */
+  struct function *function;
+};
+
+/* A growable vector of function address ranges.  */
+
+struct function_vector
+{
+  /* Memory.  This is an array of struct function_addrs.  */
+  struct backtrace_vector vec;
+  /* Number of address ranges present.  */
+  size_t count;
+};
+
+/* A DWARF compilation unit.  This only holds the information we need
+   to map a PC to a file and line.  */
+
+struct unit
+{
+  /* The first entry for this compilation unit.  */
+  const unsigned char *unit_data;
+  /* The length of the data for this compilation unit.  */
+  size_t unit_data_len;
+  /* The offset of UNIT_DATA from the start of the information for
+     this compilation unit.  */
+  size_t unit_data_offset;
+  /* DWARF version.  */
+  int version;
+  /* Whether unit is DWARF64.  */
+  int is_dwarf64;
+  /* Address size.  */
+  int addrsize;
+  /* Offset into line number information.  */
+  off_t lineoff;
+  /* Primary source file.  */
+  const char *filename;
+  /* Compilation command working directory.  */
+  const char *comp_dir;
+  /* Absolute file name, only set if needed.  */
+  const char *abs_filename;
+  /* The abbreviations for this unit.  */
+  struct abbrevs abbrevs;
+
+  /* The fields above this point are read in during initialization and
+     may be accessed freely.  The fields below this point are read in
+     as needed, and therefore require care, as different threads may
+     try to initialize them simultaneously.  */
+
+  /* PC to line number mapping.  This is NULL if the values have not
+     been read.  This is (struct line *) -1 if there was an error
+     reading the values.  */
+  struct line *lines;
+  /* Number of entries in lines.  */
+  size_t lines_count;
+  /* PC ranges to function.  */
+  struct function_addrs *function_addrs;
+  size_t function_addrs_count;
+};
+
+/* An address range for a compilation unit.  This maps a PC value to a
+   specific compilation unit.  Note that we invert the representation
+   in DWARF: instead of listing the units and attaching a list of
+   ranges, we list the ranges and have each one point to the unit.
+   This lets us do a binary search to find the unit.  */
+
+struct unit_addrs
+{
+  /* Range is LOW <= PC < HIGH.  */
+  uint64_t low;
+  uint64_t high;
+  /* Compilation unit for this address range.  */
+  struct unit *u;
+};
+
+/* A growable vector of compilation unit address ranges.  */
+
+struct unit_addrs_vector
+{
+  /* Memory.  This is an array of struct unit_addrs.  */
+  struct backtrace_vector vec;
+  /* Number of address ranges present.  */
+  size_t count;
+};
+
+/* The information we need to map a PC to a file and line.  */
+
+struct dwarf_data
+{
+  /* The data for the next file we know about.  */
+  struct dwarf_data *next;
+  /* The base address for this file.  */
+  uintptr_t base_address;
+  /* A sorted list of address ranges.  */
+  struct unit_addrs *addrs;
+  /* Number of address ranges in list.  */
+  size_t addrs_count;
+  /* The unparsed .debug_info section.  */
+  const unsigned char *dwarf_info;
+  size_t dwarf_info_size;
+  /* The unparsed .debug_line section.  */
+  const unsigned char *dwarf_line;
+  size_t dwarf_line_size;
+  /* The unparsed .debug_ranges section.  */
+  const unsigned char *dwarf_ranges;
+  size_t dwarf_ranges_size;
+  /* The unparsed .debug_str section.  */
+  const unsigned char *dwarf_str;
+  size_t dwarf_str_size;
+  /* Whether the data is big-endian or not.  */
+  int is_bigendian;
+  /* A vector used for function addresses.  We keep this here so that
+     we can grow the vector as we read more functions.  */
+  struct function_vector fvec;
+};
+
+/* Report an error for a DWARF buffer.  */
+
+static void
+dwarf_buf_error (struct dwarf_buf *buf, const char *msg)
+{
+  char b[200];
+
+  snprintf (b, sizeof b, "%s in %s at %d",
+	    msg, buf->name, (int) (buf->buf - buf->start));
+  buf->error_callback (buf->data, b, 0);
+}
+
+/* Require at least COUNT bytes in BUF.  Return 1 if all is well, 0 on
+   error.  */
+
+static int
+require (struct dwarf_buf *buf, size_t count)
+{
+  if (buf->left >= count)
+    return 1;
+
+  if (!buf->reported_underflow)
+    {
+      dwarf_buf_error (buf, "DWARF underflow");
+      buf->reported_underflow = 1;
+    }
+
+  return 0;
+}
+
+/* Advance COUNT bytes in BUF.  Return 1 if all is well, 0 on
+   error.  */
+
+static int
+advance (struct dwarf_buf *buf, size_t count)
+{
+  if (!require (buf, count))
+    return 0;
+  buf->buf += count;
+  buf->left -= count;
+  return 1;
+}
+
+/* Read one byte from BUF and advance 1 byte.  */
+
+static unsigned char
+read_byte (struct dwarf_buf *buf)
+{
+  const unsigned char *p = buf->buf;
+
+  if (!advance (buf, 1))
+    return 0;
+  return p[0];
+}
+
+/* Read a signed char from BUF and advance 1 byte.  */
+
+static signed char
+read_sbyte (struct dwarf_buf *buf)
+{
+  const unsigned char *p = buf->buf;
+
+  if (!advance (buf, 1))
+    return 0;
+  return (*p ^ 0x80) - 0x80;
+}
+
+/* Read a uint16 from BUF and advance 2 bytes.  */
+
+static uint16_t
+read_uint16 (struct dwarf_buf *buf)
+{
+  const unsigned char *p = buf->buf;
+
+  if (!advance (buf, 2))
+    return 0;
+  if (buf->is_bigendian)
+    return ((uint16_t) p[0] << 8) | (uint16_t) p[1];
+  else
+    return ((uint16_t) p[1] << 8) | (uint16_t) p[0];
+}
+
+/* Read a uint32 from BUF and advance 4 bytes.  */
+
+static uint32_t
+read_uint32 (struct dwarf_buf *buf)
+{
+  const unsigned char *p = buf->buf;
+
+  if (!advance (buf, 4))
+    return 0;
+  if (buf->is_bigendian)
+    return (((uint32_t) p[0] << 24) | ((uint32_t) p[1] << 16)
+	    | ((uint32_t) p[2] << 8) | (uint32_t) p[3]);
+  else
+    return (((uint32_t) p[3] << 24) | ((uint32_t) p[2] << 16)
+	    | ((uint32_t) p[1] << 8) | (uint32_t) p[0]);
+}
+
+/* Read a uint64 from BUF and advance 8 bytes.  */
+
+static uint64_t
+read_uint64 (struct dwarf_buf *buf)
+{
+  const unsigned char *p = buf->buf;
+
+  if (!advance (buf, 8))
+    return 0;
+  if (buf->is_bigendian)
+    return (((uint64_t) p[0] << 56) | ((uint64_t) p[1] << 48)
+	    | ((uint64_t) p[2] << 40) | ((uint64_t) p[3] << 32)
+	    | ((uint64_t) p[4] << 24) | ((uint64_t) p[5] << 16)
+	    | ((uint64_t) p[6] << 8) | (uint64_t) p[7]);
+  else
+    return (((uint64_t) p[7] << 56) | ((uint64_t) p[6] << 48)
+	    | ((uint64_t) p[5] << 40) | ((uint64_t) p[4] << 32)
+	    | ((uint64_t) p[3] << 24) | ((uint64_t) p[2] << 16)
+	    | ((uint64_t) p[1] << 8) | (uint64_t) p[0]);
+}
+
+/* Read an offset from BUF and advance the appropriate number of
+   bytes.  */
+
+static uint64_t
+read_offset (struct dwarf_buf *buf, int is_dwarf64)
+{
+  if (is_dwarf64)
+    return read_uint64 (buf);
+  else
+    return read_uint32 (buf);
+}
+
+/* Read an address from BUF and advance the appropriate number of
+   bytes.  */
+
+static uint64_t
+read_address (struct dwarf_buf *buf, int addrsize)
+{
+  switch (addrsize)
+    {
+    case 1:
+      return read_byte (buf);
+    case 2:
+      return read_uint16 (buf);
+    case 4:
+      return read_uint32 (buf);
+    case 8:
+      return read_uint64 (buf);
+    default:
+      dwarf_buf_error (buf, "unrecognized address size");
+      return 0;
+    }
+}
+
+/* Return whether a value is the highest possible address, given the
+   address size.  */
+
+static int
+is_highest_address (uint64_t address, int addrsize)
+{
+  switch (addrsize)
+    {
+    case 1:
+      return address == (unsigned char) -1;
+    case 2:
+      return address == (uint16_t) -1;
+    case 4:
+      return address == (uint32_t) -1;
+    case 8:
+      return address == (uint64_t) -1;
+    default:
+      return 0;
+    }
+}
+
+/* Read an unsigned LEB128 number.  */
+
+static uint64_t
+read_uleb128 (struct dwarf_buf *buf)
+{
+  uint64_t ret;
+  unsigned int shift;
+  int overflow;
+  unsigned char b;
+
+  ret = 0;
+  shift = 0;
+  overflow = 0;
+  do
+    {
+      const unsigned char *p;
+
+      p = buf->buf;
+      if (!advance (buf, 1))
+	return 0;
+      b = *p;
+      if (shift < 64)
+	ret |= ((uint64_t) (b & 0x7f)) << shift;
+      else if (!overflow)
+	{
+	  dwarf_buf_error (buf, "LEB128 overflows uint64_t");
+	  overflow = 1;
+	}
+      shift += 7;
+    }
+  while ((b & 0x80) != 0);
+
+  return ret;
+}
+
+/* Read a signed LEB128 number.  */
+
+static int64_t
+read_sleb128 (struct dwarf_buf *buf)
+{
+  uint64_t val;
+  unsigned int shift;
+  int overflow;
+  unsigned char b;
+
+  val = 0;
+  shift = 0;
+  overflow = 0;
+  do
+    {
+      const unsigned char *p;
+
+      p = buf->buf;
+      if (!advance (buf, 1))
+	return 0;
+      b = *p;
+      if (shift < 64)
+	val |= ((uint64_t) (b & 0x7f)) << shift;
+      else if (!overflow)
+	{
+	  dwarf_buf_error (buf, "signed LEB128 overflows uint64_t");
+	  overflow = 1;
+	}
+      shift += 7;
+    }
+  while ((b & 0x80) != 0);
+
+  if ((b & 0x40) != 0 && shift < 64)
+    val |= ((uint64_t) -1) << shift;
+
+  return (int64_t) val;
+}
+
+/* Return the length of an LEB128 number.  */
+
+static size_t
+leb128_len (const unsigned char *p)
+{
+  size_t ret;
+
+  ret = 1;
+  while ((*p & 0x80) != 0)
+    {
+      ++p;
+      ++ret;
+    }
+  return ret;
+}
+
+/* Free an abbreviations structure.  */
+
+static void
+free_abbrevs (struct backtrace_state *state, struct abbrevs *abbrevs,
+	      backtrace_error_callback error_callback, void *data)
+{
+  size_t i;
+
+  for (i = 0; i < abbrevs->num_abbrevs; ++i)
+    backtrace_free (state, abbrevs->abbrevs[i].attrs,
+		    abbrevs->abbrevs[i].num_attrs * sizeof (struct attr),
+		    error_callback, data);
+  backtrace_free (state, abbrevs->abbrevs,
+		  abbrevs->num_abbrevs * sizeof (struct abbrev),
+		  error_callback, data);
+  abbrevs->num_abbrevs = 0;
+  abbrevs->abbrevs = NULL;
+}
+
+/* Read an attribute value.  Returns 1 on success, 0 on failure.  If
+   the value can be represented as a uint64_t, sets *VAL and sets
+   *IS_VALID to 1.  We don't try to store the value of other attribute
+   forms, because we don't care about them.  */
+
+static int
+read_attribute (enum dwarf_form form, struct dwarf_buf *buf,
+		int is_dwarf64, int version, int addrsize,
+		const unsigned char *dwarf_str, size_t dwarf_str_size,
+		struct attr_val *val)
+{
+  /* Avoid warnings about val.u.FIELD may be used uninitialized if
+     this function is inlined.  The warnings aren't valid but can
+     occur because the different fields are set and used
+     conditionally.  */
+  memset (val, 0, sizeof *val);
+
+  switch (form)
+    {
+    case DW_FORM_addr:
+      val->encoding = ATTR_VAL_ADDRESS;
+      val->u.uint = read_address (buf, addrsize);
+      return 1;
+    case DW_FORM_block2:
+      val->encoding = ATTR_VAL_BLOCK;
+      return advance (buf, read_uint16 (buf));
+    case DW_FORM_block4:
+      val->encoding = ATTR_VAL_BLOCK;
+      return advance (buf, read_uint32 (buf));
+    case DW_FORM_data2:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = read_uint16 (buf);
+      return 1;
+    case DW_FORM_data4:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = read_uint32 (buf);
+      return 1;
+    case DW_FORM_data8:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = read_uint64 (buf);
+      return 1;
+    case DW_FORM_string:
+      val->encoding = ATTR_VAL_STRING;
+      val->u.string = (const char *) buf->buf;
+      return advance (buf, strnlen ((const char *) buf->buf, buf->left) + 1);
+    case DW_FORM_block:
+      val->encoding = ATTR_VAL_BLOCK;
+      return advance (buf, read_uleb128 (buf));
+    case DW_FORM_block1:
+      val->encoding = ATTR_VAL_BLOCK;
+      return advance (buf, read_byte (buf));
+    case DW_FORM_data1:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = read_byte (buf);
+      return 1;
+    case DW_FORM_flag:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = read_byte (buf);
+      return 1;
+    case DW_FORM_sdata:
+      val->encoding = ATTR_VAL_SINT;
+      val->u.sint = read_sleb128 (buf);
+      return 1;
+    case DW_FORM_strp:
+      {
+	uint64_t offset;
+
+	offset = read_offset (buf, is_dwarf64);
+	if (offset >= dwarf_str_size)
+	  {
+	    dwarf_buf_error (buf, "DW_FORM_strp out of range");
+	    return 0;
+	  }
+	val->encoding = ATTR_VAL_STRING;
+	val->u.string = (const char *) dwarf_str + offset;
+	return 1;
+      }
+    case DW_FORM_udata:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = read_uleb128 (buf);
+      return 1;
+    case DW_FORM_ref_addr:
+      val->encoding = ATTR_VAL_REF_INFO;
+      if (version == 2)
+	val->u.uint = read_address (buf, addrsize);
+      else
+	val->u.uint = read_offset (buf, is_dwarf64);
+      return 1;
+    case DW_FORM_ref1:
+      val->encoding = ATTR_VAL_REF_UNIT;
+      val->u.uint = read_byte (buf);
+      return 1;
+    case DW_FORM_ref2:
+      val->encoding = ATTR_VAL_REF_UNIT;
+      val->u.uint = read_uint16 (buf);
+      return 1;
+    case DW_FORM_ref4:
+      val->encoding = ATTR_VAL_REF_UNIT;
+      val->u.uint = read_uint32 (buf);
+      return 1;
+    case DW_FORM_ref8:
+      val->encoding = ATTR_VAL_REF_UNIT;
+      val->u.uint = read_uint64 (buf);
+      return 1;
+    case DW_FORM_ref_udata:
+      val->encoding = ATTR_VAL_REF_UNIT;
+      val->u.uint = read_uleb128 (buf);
+      return 1;
+    case DW_FORM_indirect:
+      {
+	uint64_t form;
+
+	form = read_uleb128 (buf);
+	return read_attribute ((enum dwarf_form) form, buf, is_dwarf64,
+			       version, addrsize, dwarf_str, dwarf_str_size,
+			       val);
+      }
+    case DW_FORM_sec_offset:
+      val->encoding = ATTR_VAL_REF_SECTION;
+      val->u.uint = read_offset (buf, is_dwarf64);
+      return 1;
+    case DW_FORM_exprloc:
+      val->encoding = ATTR_VAL_EXPR;
+      return advance (buf, read_uleb128 (buf));
+    case DW_FORM_flag_present:
+      val->encoding = ATTR_VAL_UINT;
+      val->u.uint = 1;
+      return 1;
+    case DW_FORM_ref_sig8:
+      val->encoding = ATTR_VAL_REF_TYPE;
+      val->u.uint = read_uint64 (buf);
+      return 1;
+    case DW_FORM_GNU_addr_index:
+      val->encoding = ATTR_VAL_REF_SECTION;
+      val->u.uint = read_uleb128 (buf);
+      return 1;
+    case DW_FORM_GNU_str_index:
+      val->encoding = ATTR_VAL_REF_SECTION;
+      val->u.uint = read_uleb128 (buf);
+      return 1;
+    case DW_FORM_GNU_ref_alt:
+      val->encoding = ATTR_VAL_REF_SECTION;
+      val->u.uint = read_offset (buf, is_dwarf64);
+      return 1;
+    case DW_FORM_GNU_strp_alt:
+      val->encoding = ATTR_VAL_REF_SECTION;
+      val->u.uint = read_offset (buf, is_dwarf64);
+      return 1;
+    default:
+      dwarf_buf_error (buf, "unrecognized DWARF form");
+      return 0;
+    }
+}
+
+/* Compare function_addrs for qsort.  When ranges are nested, make the
+   smallest one sort last.  */
+
+static int
+function_addrs_compare (const void *v1, const void *v2)
+{
+  const struct function_addrs *a1 = (const struct function_addrs *) v1;
+  const struct function_addrs *a2 = (const struct function_addrs *) v2;
+
+  if (a1->low < a2->low)
+    return -1;
+  if (a1->low > a2->low)
+    return 1;
+  if (a1->high < a2->high)
+    return 1;
+  if (a1->high > a2->high)
+    return -1;
+  return strcmp (a1->function->name, a2->function->name);
+}
+
+/* Compare a PC against a function_addrs for bsearch.  Note that if
+   there are multiple ranges containing PC, which one will be returned
+   is unpredictable.  We compensate for that in dwarf_fileline.  */
+
+static int
+function_addrs_search (const void *vkey, const void *ventry)
+{
+  const uintptr_t *key = (const uintptr_t *) vkey;
+  const struct function_addrs *entry = (const struct function_addrs *) ventry;
+  uintptr_t pc;
+
+  pc = *key;
+  if (pc < entry->low)
+    return -1;
+  else if (pc >= entry->high)
+    return 1;
+  else
+    return 0;
+}
+
+/* Add a new compilation unit address range to a vector.  Returns 1 on
+   success, 0 on failure.  */
+
+static int
+add_unit_addr (struct backtrace_state *state, uintptr_t base_address,
+	       struct unit_addrs addrs,
+	       backtrace_error_callback error_callback, void *data,
+	       struct unit_addrs_vector *vec)
+{
+  struct unit_addrs *p;
+
+  /* Add in the base address of the module here, so that we can look
+     up the PC directly.  */
+  addrs.low += base_address;
+  addrs.high += base_address;
+
+  /* Try to merge with the last entry.  */
+  if (vec->count > 0)
+    {
+      p = (struct unit_addrs *) vec->vec.base + (vec->count - 1);
+      if ((addrs.low == p->high || addrs.low == p->high + 1)
+	  && addrs.u == p->u)
+	{
+	  if (addrs.high > p->high)
+	    p->high = addrs.high;
+	  return 1;
+	}
+    }
+
+  p = ((struct unit_addrs *)
+       backtrace_vector_grow (state, sizeof (struct unit_addrs),
+			      error_callback, data, &vec->vec));
+  if (p == NULL)
+    return 0;
+
+  *p = addrs;
+  ++vec->count;
+  return 1;
+}
+
+/* Free a unit address vector.  */
+
+static void
+free_unit_addrs_vector (struct backtrace_state *state,
+			struct unit_addrs_vector *vec,
+			backtrace_error_callback error_callback, void *data)
+{
+  struct unit_addrs *addrs;
+  size_t i;
+
+  addrs = (struct unit_addrs *) vec->vec.base;
+  for (i = 0; i < vec->count; ++i)
+    free_abbrevs (state, &addrs[i].u->abbrevs, error_callback, data);
+}
+
+/* Compare unit_addrs for qsort.  When ranges are nested, make the
+   smallest one sort last.  */
+
+static int
+unit_addrs_compare (const void *v1, const void *v2)
+{
+  const struct unit_addrs *a1 = (const struct unit_addrs *) v1;
+  const struct unit_addrs *a2 = (const struct unit_addrs *) v2;
+
+  if (a1->low < a2->low)
+    return -1;
+  if (a1->low > a2->low)
+    return 1;
+  if (a1->high < a2->high)
+    return 1;
+  if (a1->high > a2->high)
+    return -1;
+  if (a1->u->lineoff < a2->u->lineoff)
+    return -1;
+  if (a1->u->lineoff > a2->u->lineoff)
+    return 1;
+  return 0;
+}
+
+/* Compare a PC against a unit_addrs for bsearch.  Note that if there
+   are multiple ranges containing PC, which one will be returned is
+   unpredictable.  We compensate for that in dwarf_fileline.  */
+
+static int
+unit_addrs_search (const void *vkey, const void *ventry)
+{
+  const uintptr_t *key = (const uintptr_t *) vkey;
+  const struct unit_addrs *entry = (const struct unit_addrs *) ventry;
+  uintptr_t pc;
+
+  pc = *key;
+  if (pc < entry->low)
+    return -1;
+  else if (pc >= entry->high)
+    return 1;
+  else
+    return 0;
+}
+
+/* Sort the line vector by PC.  We want a stable sort here to maintain
+   the order of lines for the same PC values.  Since the sequence is
+   being sorted in place, their addresses cannot be relied on to
+   maintain stability.  That is the purpose of the index member.  */
+
+static int
+line_compare (const void *v1, const void *v2)
+{
+  const struct line *ln1 = (const struct line *) v1;
+  const struct line *ln2 = (const struct line *) v2;
+
+  if (ln1->pc < ln2->pc)
+    return -1;
+  else if (ln1->pc > ln2->pc)
+    return 1;
+  else if (ln1->idx < ln2->idx)
+    return -1;
+  else if (ln1->idx > ln2->idx)
+    return 1;
+  else
+    return 0;
+}
+
+/* Find a PC in a line vector.  We always allocate an extra entry at
+   the end of the lines vector, so that this routine can safely look
+   at the next entry.  Note that when there are multiple mappings for
+   the same PC value, this will return the last one.  */
+
+static int
+line_search (const void *vkey, const void *ventry)
+{
+  const uintptr_t *key = (const uintptr_t *) vkey;
+  const struct line *entry = (const struct line *) ventry;
+  uintptr_t pc;
+
+  pc = *key;
+  if (pc < entry->pc)
+    return -1;
+  else if (pc >= (entry + 1)->pc)
+    return 1;
+  else
+    return 0;
+}
+
+/* Sort the abbrevs by the abbrev code.  This function is passed to
+   both qsort and bsearch.  */
+
+static int
+abbrev_compare (const void *v1, const void *v2)
+{
+  const struct abbrev *a1 = (const struct abbrev *) v1;
+  const struct abbrev *a2 = (const struct abbrev *) v2;
+
+  if (a1->code < a2->code)
+    return -1;
+  else if (a1->code > a2->code)
+    return 1;
+  else
+    {
+      /* This really shouldn't happen.  It means there are two
+	 different abbrevs with the same code, and that means we don't
+	 know which one lookup_abbrev should return.  */
+      return 0;
+    }
+}
+
+/* Read the abbreviation table for a compilation unit.  Returns 1 on
+   success, 0 on failure.  */
+
+static int
+read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
+	      const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
+	      int is_bigendian, backtrace_error_callback error_callback,
+	      void *data, struct abbrevs *abbrevs)
+{
+  struct dwarf_buf abbrev_buf;
+  struct dwarf_buf count_buf;
+  size_t num_abbrevs;
+
+  abbrevs->num_abbrevs = 0;
+  abbrevs->abbrevs = NULL;
+
+  if (abbrev_offset >= dwarf_abbrev_size)
+    {
+      error_callback (data, "abbrev offset out of range", 0);
+      return 0;
+    }
+
+  abbrev_buf.name = ".debug_abbrev";
+  abbrev_buf.start = dwarf_abbrev;
+  abbrev_buf.buf = dwarf_abbrev + abbrev_offset;
+  abbrev_buf.left = dwarf_abbrev_size - abbrev_offset;
+  abbrev_buf.is_bigendian = is_bigendian;
+  abbrev_buf.error_callback = error_callback;
+  abbrev_buf.data = data;
+  abbrev_buf.reported_underflow = 0;
+
+  /* Count the number of abbrevs in this list.  */
+
+  count_buf = abbrev_buf;
+  num_abbrevs = 0;
+  while (read_uleb128 (&count_buf) != 0)
+    {
+      if (count_buf.reported_underflow)
+	return 0;
+      ++num_abbrevs;
+      // Skip tag.
+      read_uleb128 (&count_buf);
+      // Skip has_children.
+      read_byte (&count_buf);
+      // Skip attributes.
+      while (read_uleb128 (&count_buf) != 0)
+	read_uleb128 (&count_buf);
+      // Skip form of last attribute.
+      read_uleb128 (&count_buf);
+    }
+
+  if (count_buf.reported_underflow)
+    return 0;
+
+  if (num_abbrevs == 0)
+    return 1;
+
+  abbrevs->num_abbrevs = num_abbrevs;
+  abbrevs->abbrevs = ((struct abbrev *)
+		      backtrace_alloc (state,
+				       num_abbrevs * sizeof (struct abbrev),
+				       error_callback, data));
+  if (abbrevs->abbrevs == NULL)
+    return 0;
+  memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
+
+  num_abbrevs = 0;
+  while (1)
+    {
+      uint64_t code;
+      struct abbrev a;
+      size_t num_attrs;
+      struct attr *attrs;
+
+      if (abbrev_buf.reported_underflow)
+	goto fail;
+
+      code = read_uleb128 (&abbrev_buf);
+      if (code == 0)
+	break;
+
+      a.code = code;
+      a.tag = (enum dwarf_tag) read_uleb128 (&abbrev_buf);
+      a.has_children = read_byte (&abbrev_buf);
+
+      count_buf = abbrev_buf;
+      num_attrs = 0;
+      while (read_uleb128 (&count_buf) != 0)
+	{
+	  ++num_attrs;
+	  read_uleb128 (&count_buf);
+	}
+
+      if (num_attrs == 0)
+	{
+	  attrs = NULL;
+	  read_uleb128 (&abbrev_buf);
+	  read_uleb128 (&abbrev_buf);
+	}
+      else
+	{
+	  attrs = ((struct attr *)
+		   backtrace_alloc (state, num_attrs * sizeof *attrs,
+				    error_callback, data));
+	  if (attrs == NULL)
+	    goto fail;
+	  num_attrs = 0;
+	  while (1)
+	    {
+	      uint64_t name;
+	      uint64_t form;
+
+	      name = read_uleb128 (&abbrev_buf);
+	      form = read_uleb128 (&abbrev_buf);
+	      if (name == 0)
+		break;
+	      attrs[num_attrs].name = (enum dwarf_attribute) name;
+	      attrs[num_attrs].form = (enum dwarf_form) form;
+	      ++num_attrs;
+	    }
+	}
+
+      a.num_attrs = num_attrs;
+      a.attrs = attrs;
+
+      abbrevs->abbrevs[num_abbrevs] = a;
+      ++num_abbrevs;
+    }
+
+  backtrace_qsort (abbrevs->abbrevs, abbrevs->num_abbrevs,
+		   sizeof (struct abbrev), abbrev_compare);
+
+  return 1;
+
+ fail:
+  free_abbrevs (state, abbrevs, error_callback, data);
+  return 0;
+}
+
+/* Return the abbrev information for an abbrev code.  */
+
+static const struct abbrev *
+lookup_abbrev (struct abbrevs *abbrevs, uint64_t code,
+	       backtrace_error_callback error_callback, void *data)
+{
+  struct abbrev key;
+  void *p;
+
+  /* With GCC, where abbrevs are simply numbered in order, we should
+     be able to just look up the entry.  */
+  if (code - 1 < abbrevs->num_abbrevs
+      && abbrevs->abbrevs[code - 1].code == code)
+    return &abbrevs->abbrevs[code - 1];
+
+  /* Otherwise we have to search.  */
+  memset (&key, 0, sizeof key);
+  key.code = code;
+  p = bsearch (&key, abbrevs->abbrevs, abbrevs->num_abbrevs,
+	       sizeof (struct abbrev), abbrev_compare);
+  if (p == NULL)
+    {
+      error_callback (data, "invalid abbreviation code", 0);
+      return NULL;
+    }
+  return (const struct abbrev *) p;
+}
+
+/* Add non-contiguous address ranges for a compilation unit.  Returns
+   1 on success, 0 on failure.  */
+
+static int
+add_unit_ranges (struct backtrace_state *state, uintptr_t base_address,
+		 struct unit *u, uint64_t ranges, uint64_t base,
+		 int is_bigendian, const unsigned char *dwarf_ranges,
+		 size_t dwarf_ranges_size,
+		 backtrace_error_callback error_callback, void *data,
+		 struct unit_addrs_vector *addrs)
+{
+  struct dwarf_buf ranges_buf;
+
+  if (ranges >= dwarf_ranges_size)
+    {
+      error_callback (data, "ranges offset out of range", 0);
+      return 0;
+    }
+
+  ranges_buf.name = ".debug_ranges";
+  ranges_buf.start = dwarf_ranges;
+  ranges_buf.buf = dwarf_ranges + ranges;
+  ranges_buf.left = dwarf_ranges_size - ranges;
+  ranges_buf.is_bigendian = is_bigendian;
+  ranges_buf.error_callback = error_callback;
+  ranges_buf.data = data;
+  ranges_buf.reported_underflow = 0;
+
+  while (1)
+    {
+      uint64_t low;
+      uint64_t high;
+
+      if (ranges_buf.reported_underflow)
+	return 0;
+
+      low = read_address (&ranges_buf, u->addrsize);
+      high = read_address (&ranges_buf, u->addrsize);
+
+      if (low == 0 && high == 0)
+	break;
+
+      if (is_highest_address (low, u->addrsize))
+	base = high;
+      else
+	{
+	  struct unit_addrs a;
+
+	  a.low = low + base;
+	  a.high = high + base;
+	  a.u = u;
+	  if (!add_unit_addr (state, base_address, a, error_callback, data,
+			      addrs))
+	    return 0;
+	}
+    }
+
+  if (ranges_buf.reported_underflow)
+    return 0;
+
+  return 1;
+}
+
+/* Find the address range covered by a compilation unit, reading from
+   UNIT_BUF and adding values to U.  Returns 1 if all data could be
+   read, 0 if there is some error.  */
+
+static int
+find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
+		     struct dwarf_buf *unit_buf,
+		     const unsigned char *dwarf_str, size_t dwarf_str_size,
+		     const unsigned char *dwarf_ranges,
+		     size_t dwarf_ranges_size,
+		     int is_bigendian, backtrace_error_callback error_callback,
+		     void *data, struct unit *u,
+		     struct unit_addrs_vector *addrs)
+{
+  while (unit_buf->left > 0)
+    {
+      uint64_t code;
+      const struct abbrev *abbrev;
+      uint64_t lowpc;
+      int have_lowpc;
+      uint64_t highpc;
+      int have_highpc;
+      int highpc_is_relative;
+      uint64_t ranges;
+      int have_ranges;
+      size_t i;
+
+      code = read_uleb128 (unit_buf);
+      if (code == 0)
+	return 1;
+
+      abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
+      if (abbrev == NULL)
+	return 0;
+
+      lowpc = 0;
+      have_lowpc = 0;
+      highpc = 0;
+      have_highpc = 0;
+      highpc_is_relative = 0;
+      ranges = 0;
+      have_ranges = 0;
+      for (i = 0; i < abbrev->num_attrs; ++i)
+	{
+	  struct attr_val val;
+
+	  if (!read_attribute (abbrev->attrs[i].form, unit_buf,
+			       u->is_dwarf64, u->version, u->addrsize,
+			       dwarf_str, dwarf_str_size, &val))
+	    return 0;
+
+	  switch (abbrev->attrs[i].name)
+	    {
+	    case DW_AT_low_pc:
+	      if (val.encoding == ATTR_VAL_ADDRESS)
+		{
+		  lowpc = val.u.uint;
+		  have_lowpc = 1;
+		}
+	      break;
+
+	    case DW_AT_high_pc:
+	      if (val.encoding == ATTR_VAL_ADDRESS)
+		{
+		  highpc = val.u.uint;
+		  have_highpc = 1;
+		}
+	      else if (val.encoding == ATTR_VAL_UINT)
+		{
+		  highpc = val.u.uint;
+		  have_highpc = 1;
+		  highpc_is_relative = 1;
+		}
+	      break;
+
+	    case DW_AT_ranges:
+	      if (val.encoding == ATTR_VAL_UINT
+		  || val.encoding == ATTR_VAL_REF_SECTION)
+		{
+		  ranges = val.u.uint;
+		  have_ranges = 1;
+		}
+	      break;
+
+	    case DW_AT_stmt_list:
+	      if (abbrev->tag == DW_TAG_compile_unit
+		  && (val.encoding == ATTR_VAL_UINT
+		      || val.encoding == ATTR_VAL_REF_SECTION))
+		u->lineoff = val.u.uint;
+	      break;
+
+	    case DW_AT_name:
+	      if (abbrev->tag == DW_TAG_compile_unit
+		  && val.encoding == ATTR_VAL_STRING)
+		u->filename = val.u.string;
+	      break;
+
+	    case DW_AT_comp_dir:
+	      if (abbrev->tag == DW_TAG_compile_unit
+		  && val.encoding == ATTR_VAL_STRING)
+		u->comp_dir = val.u.string;
+	      break;
+
+	    default:
+	      break;
+	    }
+	}
+
+      if (abbrev->tag == DW_TAG_compile_unit
+	  || abbrev->tag == DW_TAG_subprogram)
+	{
+	  if (have_ranges)
+	    {
+	      if (!add_unit_ranges (state, base_address, u, ranges, lowpc,
+				    is_bigendian, dwarf_ranges,
+				    dwarf_ranges_size, error_callback,
+				    data, addrs))
+		return 0;
+	    }
+	  else if (have_lowpc && have_highpc)
+	    {
+	      struct unit_addrs a;
+
+	      if (highpc_is_relative)
+		highpc += lowpc;
+	      a.low = lowpc;
+	      a.high = highpc;
+	      a.u = u;
+
+	      if (!add_unit_addr (state, base_address, a, error_callback, data,
+				  addrs))
+		return 0;
+	    }
+
+	  /* If we found the PC range in the DW_TAG_compile_unit, we
+	     can stop now.  */
+	  if (abbrev->tag == DW_TAG_compile_unit
+	      && (have_ranges || (have_lowpc && have_highpc)))
+	    return 1;
+	}
+
+      if (abbrev->has_children)
+	{
+	  if (!find_address_ranges (state, base_address, unit_buf,
+				    dwarf_str, dwarf_str_size,
+				    dwarf_ranges, dwarf_ranges_size,
+				    is_bigendian, error_callback, data,
+				    u, addrs))
+	    return 0;
+	}
+    }
+
+  return 1;
+}
+
+/* Build a mapping from address ranges to the compilation units where
+   the line number information for that range can be found.  Returns 1
+   on success, 0 on failure.  */
+
+static int
+build_address_map (struct backtrace_state *state, uintptr_t base_address,
+		   const unsigned char *dwarf_info, size_t dwarf_info_size,
+		   const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
+		   const unsigned char *dwarf_ranges, size_t dwarf_ranges_size,
+		   const unsigned char *dwarf_str, size_t dwarf_str_size,
+		   int is_bigendian, backtrace_error_callback error_callback,
+		   void *data, struct unit_addrs_vector *addrs)
+{
+  struct dwarf_buf info;
+  struct abbrevs abbrevs;
+
+  memset (&addrs->vec, 0, sizeof addrs->vec);
+  addrs->count = 0;
+
+  /* Read through the .debug_info section.  FIXME: Should we use the
+     .debug_aranges section?  gdb and addr2line don't use it, but I'm
+     not sure why.  */
+
+  info.name = ".debug_info";
+  info.start = dwarf_info;
+  info.buf = dwarf_info;
+  info.left = dwarf_info_size;
+  info.is_bigendian = is_bigendian;
+  info.error_callback = error_callback;
+  info.data = data;
+  info.reported_underflow = 0;
+
+  memset (&abbrevs, 0, sizeof abbrevs);
+  while (info.left > 0)
+    {
+      const unsigned char *unit_data_start;
+      uint64_t len;
+      int is_dwarf64;
+      struct dwarf_buf unit_buf;
+      int version;
+      uint64_t abbrev_offset;
+      int addrsize;
+      struct unit *u;
+
+      if (info.reported_underflow)
+	goto fail;
+
+      unit_data_start = info.buf;
+
+      is_dwarf64 = 0;
+      len = read_uint32 (&info);
+      if (len == 0xffffffff)
+	{
+	  len = read_uint64 (&info);
+	  is_dwarf64 = 1;
+	}
+
+      unit_buf = info;
+      unit_buf.left = len;
+
+      if (!advance (&info, len))
+	goto fail;
+
+      version = read_uint16 (&unit_buf);
+      if (version < 2 || version > 4)
+	{
+	  dwarf_buf_error (&unit_buf, "unrecognized DWARF version");
+	  goto fail;
+	}
+
+      abbrev_offset = read_offset (&unit_buf, is_dwarf64);
+      if (!read_abbrevs (state, abbrev_offset, dwarf_abbrev, dwarf_abbrev_size,
+			 is_bigendian, error_callback, data, &abbrevs))
+	goto fail;
+
+      addrsize = read_byte (&unit_buf);
+
+      u = ((struct unit *)
+	   backtrace_alloc (state, sizeof *u, error_callback, data));
+      if (u == NULL)
+	goto fail;
+      u->unit_data = unit_buf.buf;
+      u->unit_data_len = unit_buf.left;
+      u->unit_data_offset = unit_buf.buf - unit_data_start;
+      u->version = version;
+      u->is_dwarf64 = is_dwarf64;
+      u->addrsize = addrsize;
+      u->filename = NULL;
+      u->comp_dir = NULL;
+      u->abs_filename = NULL;
+      u->lineoff = 0;
+      u->abbrevs = abbrevs;
+      memset (&abbrevs, 0, sizeof abbrevs);
+
+      /* The actual line number mappings will be read as needed.  */
+      u->lines = NULL;
+      u->lines_count = 0;
+      u->function_addrs = NULL;
+      u->function_addrs_count = 0;
+
+      if (!find_address_ranges (state, base_address, &unit_buf,
+				dwarf_str, dwarf_str_size,
+				dwarf_ranges, dwarf_ranges_size,
+				is_bigendian, error_callback, data,
+				u, addrs))
+	{
+	  free_abbrevs (state, &u->abbrevs, error_callback, data);
+	  backtrace_free (state, u, sizeof *u, error_callback, data);
+	  goto fail;
+	}
+
+      if (unit_buf.reported_underflow)
+	{
+	  free_abbrevs (state, &u->abbrevs, error_callback, data);
+	  backtrace_free (state, u, sizeof *u, error_callback, data);
+	  goto fail;
+	}
+    }
+  if (info.reported_underflow)
+    goto fail;
+
+  return 1;
+
+ fail:
+  free_abbrevs (state, &abbrevs, error_callback, data);
+  free_unit_addrs_vector (state, addrs, error_callback, data);
+  return 0;
+}
+
+/* Add a new mapping to the vector of line mappings that we are
+   building.  Returns 1 on success, 0 on failure.  */
+
+static int
+add_line (struct backtrace_state *state, struct dwarf_data *ddata,
+	  uintptr_t pc, const char *filename, int lineno,
+	  backtrace_error_callback error_callback, void *data,
+	  struct line_vector *vec)
+{
+  struct line *ln;
+
+  /* If we are adding the same mapping, ignore it.  This can happen
+     when using discriminators.  */
+  if (vec->count > 0)
+    {
+      ln = (struct line *) vec->vec.base + (vec->count - 1);
+      if (pc == ln->pc && filename == ln->filename && lineno == ln->lineno)
+	return 1;
+    }
+
+  ln = ((struct line *)
+	backtrace_vector_grow (state, sizeof (struct line), error_callback,
+			       data, &vec->vec));
+  if (ln == NULL)
+    return 0;
+
+  /* Add in the base address here, so that we can look up the PC
+     directly.  */
+  ln->pc = pc + ddata->base_address;
+
+  ln->filename = filename;
+  ln->lineno = lineno;
+  ln->idx = vec->count;
+
+  ++vec->count;
+
+  return 1;
+}
+
+/* Free the line header information.  If FREE_FILENAMES is true we
+   free the file names themselves, otherwise we leave them, as there
+   may be line structures pointing to them.  */
+
+static void
+free_line_header (struct backtrace_state *state, struct line_header *hdr,
+		  backtrace_error_callback error_callback, void *data)
+{
+  backtrace_free (state, hdr->dirs, hdr->dirs_count * sizeof (const char *),
+		  error_callback, data);
+  backtrace_free (state, hdr->filenames,
+		  hdr->filenames_count * sizeof (char *),
+		  error_callback, data);
+}
+
+/* Read the line header.  Return 1 on success, 0 on failure.  */
+
+static int
+read_line_header (struct backtrace_state *state, struct unit *u,
+		  int is_dwarf64, struct dwarf_buf *line_buf,
+		  struct line_header *hdr)
+{
+  uint64_t hdrlen;
+  struct dwarf_buf hdr_buf;
+  const unsigned char *p;
+  const unsigned char *pend;
+  size_t i;
+
+  hdr->version = read_uint16 (line_buf);
+  if (hdr->version < 2 || hdr->version > 4)
+    {
+      dwarf_buf_error (line_buf, "unsupported line number version");
+      return 0;
+    }
+
+  hdrlen = read_offset (line_buf, is_dwarf64);
+
+  hdr_buf = *line_buf;
+  hdr_buf.left = hdrlen;
+
+  if (!advance (line_buf, hdrlen))
+    return 0;
+
+  hdr->min_insn_len = read_byte (&hdr_buf);
+  if (hdr->version < 4)
+    hdr->max_ops_per_insn = 1;
+  else
+    hdr->max_ops_per_insn = read_byte (&hdr_buf);
+
+  /* We don't care about default_is_stmt.  */
+  read_byte (&hdr_buf);
+
+  hdr->line_base = read_sbyte (&hdr_buf);
+  hdr->line_range = read_byte (&hdr_buf);
+
+  hdr->opcode_base = read_byte (&hdr_buf);
+  hdr->opcode_lengths = hdr_buf.buf;
+  if (!advance (&hdr_buf, hdr->opcode_base - 1))
+    return 0;
+
+  /* Count the number of directory entries.  */
+  hdr->dirs_count = 0;
+  p = hdr_buf.buf;
+  pend = p + hdr_buf.left;
+  while (p < pend && *p != '\0')
+    {
+      p += strnlen((const char *) p, pend - p) + 1;
+      ++hdr->dirs_count;
+    }
+
+  hdr->dirs = ((const char **)
+	       backtrace_alloc (state,
+				hdr->dirs_count * sizeof (const char *),
+				line_buf->error_callback, line_buf->data));
+  if (hdr->dirs == NULL)
+    return 0;
+
+  i = 0;
+  while (*hdr_buf.buf != '\0')
+    {
+      if (hdr_buf.reported_underflow)
+	return 0;
+
+      hdr->dirs[i] = (const char *) hdr_buf.buf;
+      ++i;
+      if (!advance (&hdr_buf,
+		    strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
+	return 0;
+    }
+  if (!advance (&hdr_buf, 1))
+    return 0;
+
+  /* Count the number of file entries.  */
+  hdr->filenames_count = 0;
+  p = hdr_buf.buf;
+  pend = p + hdr_buf.left;
+  while (p < pend && *p != '\0')
+    {
+      p += strnlen ((const char *) p, pend - p) + 1;
+      p += leb128_len (p);
+      p += leb128_len (p);
+      p += leb128_len (p);
+      ++hdr->filenames_count;
+    }
+
+  hdr->filenames = ((const char **)
+		    backtrace_alloc (state,
+				     hdr->filenames_count * sizeof (char *),
+				     line_buf->error_callback,
+				     line_buf->data));
+  if (hdr->filenames == NULL)
+    return 0;
+  i = 0;
+  while (*hdr_buf.buf != '\0')
+    {
+      const char *filename;
+      uint64_t dir_index;
+
+      if (hdr_buf.reported_underflow)
+	return 0;
+
+      filename = (const char *) hdr_buf.buf;
+      if (!advance (&hdr_buf,
+		    strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
+	return 0;
+      dir_index = read_uleb128 (&hdr_buf);
+      if (IS_ABSOLUTE_PATH (filename)
+	  || (dir_index == 0 && u->comp_dir == NULL))
+	hdr->filenames[i] = filename;
+      else
+	{
+	  const char *dir;
+	  size_t dir_len;
+	  size_t filename_len;
+	  char *s;
+
+	  if (dir_index == 0)
+	    dir = u->comp_dir;
+	  else if (dir_index - 1 < hdr->dirs_count)
+	    dir = hdr->dirs[dir_index - 1];
+	  else
+	    {
+	      dwarf_buf_error (line_buf,
+			       ("invalid directory index in "
+				"line number program header"));
+	      return 0;
+	    }
+	  dir_len = strlen (dir);
+	  filename_len = strlen (filename);
+	  s = ((char *)
+	       backtrace_alloc (state, dir_len + filename_len + 2,
+				line_buf->error_callback, line_buf->data));
+	  if (s == NULL)
+	    return 0;
+	  memcpy (s, dir, dir_len);
+	  /* FIXME: If we are on a DOS-based file system, and the
+	     directory or the file name use backslashes, then we
+	     should use a backslash here.  */
+	  s[dir_len] = '/';
+	  memcpy (s + dir_len + 1, filename, filename_len + 1);
+	  hdr->filenames[i] = s;
+	}
+
+      /* Ignore the modification time and size.  */
+      read_uleb128 (&hdr_buf);
+      read_uleb128 (&hdr_buf);
+
+      ++i;
+    }
+
+  if (hdr_buf.reported_underflow)
+    return 0;
+
+  return 1;
+}
+
+/* Read the line program, adding line mappings to VEC.  Return 1 on
+   success, 0 on failure.  */
+
+static int
+read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
+		   struct unit *u, const struct line_header *hdr,
+		   struct dwarf_buf *line_buf, struct line_vector *vec)
+{
+  uint64_t address;
+  unsigned int op_index;
+  const char *reset_filename;
+  const char *filename;
+  int lineno;
+
+  address = 0;
+  op_index = 0;
+  if (hdr->filenames_count > 0)
+    reset_filename = hdr->filenames[0];
+  else
+    reset_filename = "";
+  filename = reset_filename;
+  lineno = 1;
+  while (line_buf->left > 0)
+    {
+      unsigned int op;
+
+      op = read_byte (line_buf);
+      if (op >= hdr->opcode_base)
+	{
+	  unsigned int advance;
+
+	  /* Special opcode.  */
+	  op -= hdr->opcode_base;
+	  advance = op / hdr->line_range;
+	  address += (hdr->min_insn_len * (op_index + advance)
+		      / hdr->max_ops_per_insn);
+	  op_index = (op_index + advance) % hdr->max_ops_per_insn;
+	  lineno += hdr->line_base + (int) (op % hdr->line_range);
+	  add_line (state, ddata, address, filename, lineno,
+		    line_buf->error_callback, line_buf->data, vec);
+	}
+      else if (op == DW_LNS_extended_op)
+	{
+	  uint64_t len;
+
+	  len = read_uleb128 (line_buf);
+	  op = read_byte (line_buf);
+	  switch (op)
+	    {
+	    case DW_LNE_end_sequence:
+	      /* FIXME: Should we mark the high PC here?  It seems
+		 that we already have that information from the
+		 compilation unit.  */
+	      address = 0;
+	      op_index = 0;
+	      filename = reset_filename;
+	      lineno = 1;
+	      break;
+	    case DW_LNE_set_address:
+	      address = read_address (line_buf, u->addrsize);
+	      break;
+	    case DW_LNE_define_file:
+	      {
+		const char *f;
+		unsigned int dir_index;
+
+		f = (const char *) line_buf->buf;
+		if (!advance (line_buf, strnlen (f, line_buf->left) + 1))
+		  return 0;
+		dir_index = read_uleb128 (line_buf);
+		/* Ignore that time and length.  */
+		read_uleb128 (line_buf);
+		read_uleb128 (line_buf);
+		if (IS_ABSOLUTE_PATH (f))
+		  filename = f;
+		else
+		  {
+		    const char *dir;
+		    size_t dir_len;
+		    size_t f_len;
+		    char *p;
+
+		    if (dir_index == 0)
+		      dir = u->comp_dir;
+		    else if (dir_index - 1 < hdr->dirs_count)
+		      dir = hdr->dirs[dir_index - 1];
+		    else
+		      {
+			dwarf_buf_error (line_buf,
+					 ("invalid directory index "
+					  "in line number program"));
+			return 0;
+		      }
+		    dir_len = strlen (dir);
+		    f_len = strlen (f);
+		    p = ((char *)
+			 backtrace_alloc (state, dir_len + f_len + 2,
+					  line_buf->error_callback,
+					  line_buf->data));
+		    if (p == NULL)
+		      return 0;
+		    memcpy (p, dir, dir_len);
+		    /* FIXME: If we are on a DOS-based file system,
+		       and the directory or the file name use
+		       backslashes, then we should use a backslash
+		       here.  */
+		    p[dir_len] = '/';
+		    memcpy (p + dir_len + 1, f, f_len + 1);
+		    filename = p;
+		  }
+	      }
+	      break;
+	    case DW_LNE_set_discriminator:
+	      /* We don't care about discriminators.  */
+	      read_uleb128 (line_buf);
+	      break;
+	    default:
+	      if (!advance (line_buf, len - 1))
+		return 0;
+	      break;
+	    }
+	}
+      else
+	{
+	  switch (op)
+	    {
+	    case DW_LNS_copy:
+	      add_line (state, ddata, address, filename, lineno,
+			line_buf->error_callback, line_buf->data, vec);
+	      break;
+	    case DW_LNS_advance_pc:
+	      {
+		uint64_t advance;
+
+		advance = read_uleb128 (line_buf);
+		address += (hdr->min_insn_len * (op_index + advance)
+			    / hdr->max_ops_per_insn);
+		op_index = (op_index + advance) % hdr->max_ops_per_insn;
+	      }
+	      break;
+	    case DW_LNS_advance_line:
+	      lineno += (int) read_sleb128 (line_buf);
+	      break;
+	    case DW_LNS_set_file:
+	      {
+		uint64_t fileno;
+
+		fileno = read_uleb128 (line_buf);
+		if (fileno == 0)
+		  filename = "";
+		else
+		  {
+		    if (fileno - 1 >= hdr->filenames_count)
+		      {
+			dwarf_buf_error (line_buf,
+					 ("invalid file number in "
+					  "line number program"));
+			return 0;
+		      }
+		    filename = hdr->filenames[fileno - 1];
+		  }
+	      }
+	      break;
+	    case DW_LNS_set_column:
+	      read_uleb128 (line_buf);
+	      break;
+	    case DW_LNS_negate_stmt:
+	      break;
+	    case DW_LNS_set_basic_block:
+	      break;
+	    case DW_LNS_const_add_pc:
+	      {
+		unsigned int advance;
+
+		op = 255 - hdr->opcode_base;
+		advance = op / hdr->line_range;
+		address += (hdr->min_insn_len * (op_index + advance)
+			    / hdr->max_ops_per_insn);
+		op_index = (op_index + advance) % hdr->max_ops_per_insn;
+	      }
+	      break;
+	    case DW_LNS_fixed_advance_pc:
+	      address += read_uint16 (line_buf);
+	      op_index = 0;
+	      break;
+	    case DW_LNS_set_prologue_end:
+	      break;
+	    case DW_LNS_set_epilogue_begin:
+	      break;
+	    case DW_LNS_set_isa:
+	      read_uleb128 (line_buf);
+	      break;
+	    default:
+	      {
+		unsigned int i;
+
+		for (i = hdr->opcode_lengths[op - 1]; i > 0; --i)
+		  read_uleb128 (line_buf);
+	      }
+	      break;
+	    }
+	}
+    }
+
+  return 1;
+}
+
+/* Read the line number information for a compilation unit.  Returns 1
+   on success, 0 on failure.  */
+
+static int
+read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
+		backtrace_error_callback error_callback, void *data,
+		struct unit *u, struct line_header *hdr, struct line **lines,
+		size_t *lines_count)
+{
+  struct line_vector vec;
+  struct dwarf_buf line_buf;
+  uint64_t len;
+  int is_dwarf64;
+  struct line *ln;
+
+  memset (&vec.vec, 0, sizeof vec.vec);
+  vec.count = 0;
+
+  memset (hdr, 0, sizeof *hdr);
+
+  if (u->lineoff != (off_t) (size_t) u->lineoff
+      || (size_t) u->lineoff >= ddata->dwarf_line_size)
+    {
+      error_callback (data, "unit line offset out of range", 0);
+      goto fail;
+    }
+
+  line_buf.name = ".debug_line";
+  line_buf.start = ddata->dwarf_line;
+  line_buf.buf = ddata->dwarf_line + u->lineoff;
+  line_buf.left = ddata->dwarf_line_size - u->lineoff;
+  line_buf.is_bigendian = ddata->is_bigendian;
+  line_buf.error_callback = error_callback;
+  line_buf.data = data;
+  line_buf.reported_underflow = 0;
+
+  is_dwarf64 = 0;
+  len = read_uint32 (&line_buf);
+  if (len == 0xffffffff)
+    {
+      len = read_uint64 (&line_buf);
+      is_dwarf64 = 1;
+    }
+  line_buf.left = len;
+
+  if (!read_line_header (state, u, is_dwarf64, &line_buf, hdr))
+    goto fail;
+
+  if (!read_line_program (state, ddata, u, hdr, &line_buf, &vec))
+    goto fail;
+
+  if (line_buf.reported_underflow)
+    goto fail;
+
+  if (vec.count == 0)
+    {
+      /* This is not a failure in the sense of a generating an error,
+	 but it is a failure in that sense that we have no useful
+	 information.  */
+      goto fail;
+    }
+
+  /* Allocate one extra entry at the end.  */
+  ln = ((struct line *)
+	backtrace_vector_grow (state, sizeof (struct line), error_callback,
+			       data, &vec.vec));
+  if (ln == NULL)
+    goto fail;
+  ln->pc = (uintptr_t) -1;
+  ln->filename = NULL;
+  ln->lineno = 0;
+  ln->idx = 0;
+
+  if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
+    goto fail;
+
+  ln = (struct line *) vec.vec.base;
+  backtrace_qsort (ln, vec.count, sizeof (struct line), line_compare);
+
+  *lines = ln;
+  *lines_count = vec.count;
+
+  return 1;
+
+ fail:
+  vec.vec.alc += vec.vec.size;
+  vec.vec.size = 0;
+  backtrace_vector_release (state, &vec.vec, error_callback, data);
+  free_line_header (state, hdr, error_callback, data);
+  *lines = (struct line *) (uintptr_t) -1;
+  *lines_count = 0;
+  return 0;
+}
+
+/* Read the name of a function from a DIE referenced by a
+   DW_AT_abstract_origin or DW_AT_specification tag.  OFFSET is within
+   the same compilation unit.  */
+
+static const char *
+read_referenced_name (struct dwarf_data *ddata, struct unit *u,
+		      uint64_t offset, backtrace_error_callback error_callback,
+		      void *data)
+{
+  struct dwarf_buf unit_buf;
+  uint64_t code;
+  const struct abbrev *abbrev;
+  const char *ret;
+  size_t i;
+
+  /* OFFSET is from the start of the data for this compilation unit.
+     U->unit_data is the data, but it starts U->unit_data_offset bytes
+     from the beginning.  */
+
+  if (offset < u->unit_data_offset
+      || offset - u->unit_data_offset >= u->unit_data_len)
+    {
+      error_callback (data,
+		      "abstract origin or specification out of range",
+		      0);
+      return NULL;
+    }
+
+  offset -= u->unit_data_offset;
+
+  unit_buf.name = ".debug_info";
+  unit_buf.start = ddata->dwarf_info;
+  unit_buf.buf = u->unit_data + offset;
+  unit_buf.left = u->unit_data_len - offset;
+  unit_buf.is_bigendian = ddata->is_bigendian;
+  unit_buf.error_callback = error_callback;
+  unit_buf.data = data;
+  unit_buf.reported_underflow = 0;
+
+  code = read_uleb128 (&unit_buf);
+  if (code == 0)
+    {
+      dwarf_buf_error (&unit_buf, "invalid abstract origin or specification");
+      return NULL;
+    }
+
+  abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
+  if (abbrev == NULL)
+    return NULL;
+
+  ret = NULL;
+  for (i = 0; i < abbrev->num_attrs; ++i)
+    {
+      struct attr_val val;
+
+      if (!read_attribute (abbrev->attrs[i].form, &unit_buf,
+			   u->is_dwarf64, u->version, u->addrsize,
+			   ddata->dwarf_str, ddata->dwarf_str_size,
+			   &val))
+	return NULL;
+
+      switch (abbrev->attrs[i].name)
+	{
+	case DW_AT_name:
+	  /* We prefer the linkage name if get one.  */
+	  if (val.encoding == ATTR_VAL_STRING)
+	    ret = val.u.string;
+	  break;
+
+	case DW_AT_linkage_name:
+	case DW_AT_MIPS_linkage_name:
+	  if (val.encoding == ATTR_VAL_STRING)
+	    return val.u.string;
+	  break;
+
+	case DW_AT_specification:
+	  if (abbrev->attrs[i].form == DW_FORM_ref_addr
+	      || abbrev->attrs[i].form == DW_FORM_ref_sig8)
+	    {
+	      /* This refers to a specification defined in some other
+		 compilation unit.  We can handle this case if we
+		 must, but it's harder.  */
+	      break;
+	    }
+	  if (val.encoding == ATTR_VAL_UINT
+	      || val.encoding == ATTR_VAL_REF_UNIT)
+	    {
+	      const char *name;
+
+	      name = read_referenced_name (ddata, u, val.u.uint,
+					   error_callback, data);
+	      if (name != NULL)
+		ret = name;
+	    }
+	  break;
+
+	default:
+	  break;
+	}
+    }
+
+  return ret;
+}
+
+/* Add a single range to U that maps to function.  Returns 1 on
+   success, 0 on error.  */
+
+static int
+add_function_range (struct backtrace_state *state, struct dwarf_data *ddata,
+		    struct function *function, uint64_t lowpc, uint64_t highpc,
+		    backtrace_error_callback error_callback,
+		    void *data, struct function_vector *vec)
+{
+  struct function_addrs *p;
+
+  /* Add in the base address here, so that we can look up the PC
+     directly.  */
+  lowpc += ddata->base_address;
+  highpc += ddata->base_address;
+
+  if (vec->count > 0)
+    {
+      p = (struct function_addrs *) vec->vec.base + vec->count - 1;
+      if ((lowpc == p->high || lowpc == p->high + 1)
+	  && function == p->function)
+	{
+	  if (highpc > p->high)
+	    p->high = highpc;
+	  return 1;
+	}
+    }
+
+  p = ((struct function_addrs *)
+       backtrace_vector_grow (state, sizeof (struct function_addrs),
+			      error_callback, data, &vec->vec));
+  if (p == NULL)
+    return 0;
+
+  p->low = lowpc;
+  p->high = highpc;
+  p->function = function;
+  ++vec->count;
+  return 1;
+}
+
+/* Add PC ranges to U that map to FUNCTION.  Returns 1 on success, 0
+   on error.  */
+
+static int
+add_function_ranges (struct backtrace_state *state, struct dwarf_data *ddata,
+		     struct unit *u, struct function *function,
+		     uint64_t ranges, uint64_t base,
+		     backtrace_error_callback error_callback, void *data,
+		     struct function_vector *vec)
+{
+  struct dwarf_buf ranges_buf;
+
+  if (ranges >= ddata->dwarf_ranges_size)
+    {
+      error_callback (data, "function ranges offset out of range", 0);
+      return 0;
+    }
+
+  ranges_buf.name = ".debug_ranges";
+  ranges_buf.start = ddata->dwarf_ranges;
+  ranges_buf.buf = ddata->dwarf_ranges + ranges;
+  ranges_buf.left = ddata->dwarf_ranges_size - ranges;
+  ranges_buf.is_bigendian = ddata->is_bigendian;
+  ranges_buf.error_callback = error_callback;
+  ranges_buf.data = data;
+  ranges_buf.reported_underflow = 0;
+
+  while (1)
+    {
+      uint64_t low;
+      uint64_t high;
+
+      if (ranges_buf.reported_underflow)
+	return 0;
+
+      low = read_address (&ranges_buf, u->addrsize);
+      high = read_address (&ranges_buf, u->addrsize);
+
+      if (low == 0 && high == 0)
+	break;
+
+      if (is_highest_address (low, u->addrsize))
+	base = high;
+      else
+	{
+	  if (!add_function_range (state, ddata, function, low + base,
+				   high + base, error_callback, data, vec))
+	    return 0;
+	}
+    }
+
+  if (ranges_buf.reported_underflow)
+    return 0;
+
+  return 1;
+}
+
+/* Read one entry plus all its children.  Add function addresses to
+   VEC.  Returns 1 on success, 0 on error.  */
+
+static int
+read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
+		     struct unit *u, uint64_t base, struct dwarf_buf *unit_buf,
+		     const struct line_header *lhdr,
+		     backtrace_error_callback error_callback, void *data,
+		     struct function_vector *vec_function,
+		     struct function_vector *vec_inlined)
+{
+  while (unit_buf->left > 0)
+    {
+      uint64_t code;
+      const struct abbrev *abbrev;
+      int is_function;
+      struct function *function;
+      struct function_vector *vec;
+      size_t i;
+      uint64_t lowpc;
+      int have_lowpc;
+      uint64_t highpc;
+      int have_highpc;
+      int highpc_is_relative;
+      uint64_t ranges;
+      int have_ranges;
+
+      code = read_uleb128 (unit_buf);
+      if (code == 0)
+	return 1;
+
+      abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
+      if (abbrev == NULL)
+	return 0;
+
+      is_function = (abbrev->tag == DW_TAG_subprogram
+		     || abbrev->tag == DW_TAG_entry_point
+		     || abbrev->tag == DW_TAG_inlined_subroutine);
+
+      if (abbrev->tag == DW_TAG_inlined_subroutine)
+	vec = vec_inlined;
+      else
+	vec = vec_function;
+
+      function = NULL;
+      if (is_function)
+	{
+	  function = ((struct function *)
+		      backtrace_alloc (state, sizeof *function,
+				       error_callback, data));
+	  if (function == NULL)
+	    return 0;
+	  memset (function, 0, sizeof *function);
+	}
+
+      lowpc = 0;
+      have_lowpc = 0;
+      highpc = 0;
+      have_highpc = 0;
+      highpc_is_relative = 0;
+      ranges = 0;
+      have_ranges = 0;
+      for (i = 0; i < abbrev->num_attrs; ++i)
+	{
+	  struct attr_val val;
+
+	  if (!read_attribute (abbrev->attrs[i].form, unit_buf,
+			       u->is_dwarf64, u->version, u->addrsize,
+			       ddata->dwarf_str, ddata->dwarf_str_size,
+			       &val))
+	    return 0;
+
+	  /* The compile unit sets the base address for any address
+	     ranges in the function entries.  */
+	  if (abbrev->tag == DW_TAG_compile_unit
+	      && abbrev->attrs[i].name == DW_AT_low_pc
+	      && val.encoding == ATTR_VAL_ADDRESS)
+	    base = val.u.uint;
+
+	  if (is_function)
+	    {
+	      switch (abbrev->attrs[i].name)
+		{
+		case DW_AT_call_file:
+		  if (val.encoding == ATTR_VAL_UINT)
+		    {
+		      if (val.u.uint == 0)
+			function->caller_filename = "";
+		      else
+			{
+			  if (val.u.uint - 1 >= lhdr->filenames_count)
+			    {
+			      dwarf_buf_error (unit_buf,
+					       ("invalid file number in "
+						"DW_AT_call_file attribute"));
+			      return 0;
+			    }
+			  function->caller_filename =
+			    lhdr->filenames[val.u.uint - 1];
+			}
+		    }
+		  break;
+
+		case DW_AT_call_line:
+		  if (val.encoding == ATTR_VAL_UINT)
+		    function->caller_lineno = val.u.uint;
+		  break;
+
+		case DW_AT_abstract_origin:
+		case DW_AT_specification:
+		  if (abbrev->attrs[i].form == DW_FORM_ref_addr
+		      || abbrev->attrs[i].form == DW_FORM_ref_sig8)
+		    {
+		      /* This refers to an abstract origin defined in
+			 some other compilation unit.  We can handle
+			 this case if we must, but it's harder.  */
+		      break;
+		    }
+		  if (val.encoding == ATTR_VAL_UINT
+		      || val.encoding == ATTR_VAL_REF_UNIT)
+		    {
+		      const char *name;
+
+		      name = read_referenced_name (ddata, u, val.u.uint,
+						   error_callback, data);
+		      if (name != NULL)
+			function->name = name;
+		    }
+		  break;
+
+		case DW_AT_name:
+		  if (val.encoding == ATTR_VAL_STRING)
+		    {
+		      /* Don't override a name we found in some other
+			 way, as it will normally be more
+			 useful--e.g., this name is normally not
+			 mangled.  */
+		      if (function->name == NULL)
+			function->name = val.u.string;
+		    }
+		  break;
+
+		case DW_AT_linkage_name:
+		case DW_AT_MIPS_linkage_name:
+		  if (val.encoding == ATTR_VAL_STRING)
+		    function->name = val.u.string;
+		  break;
+
+		case DW_AT_low_pc:
+		  if (val.encoding == ATTR_VAL_ADDRESS)
+		    {
+		      lowpc = val.u.uint;
+		      have_lowpc = 1;
+		    }
+		  break;
+
+		case DW_AT_high_pc:
+		  if (val.encoding == ATTR_VAL_ADDRESS)
+		    {
+		      highpc = val.u.uint;
+		      have_highpc = 1;
+		    }
+		  else if (val.encoding == ATTR_VAL_UINT)
+		    {
+		      highpc = val.u.uint;
+		      have_highpc = 1;
+		      highpc_is_relative = 1;
+		    }
+		  break;
+
+		case DW_AT_ranges:
+		  if (val.encoding == ATTR_VAL_UINT
+		      || val.encoding == ATTR_VAL_REF_SECTION)
+		    {
+		      ranges = val.u.uint;
+		      have_ranges = 1;
+		    }
+		  break;
+
+		default:
+		  break;
+		}
+	    }
+	}
+
+      /* If we couldn't find a name for the function, we have no use
+	 for it.  */
+      if (is_function && function->name == NULL)
+	{
+	  backtrace_free (state, function, sizeof *function,
+			  error_callback, data);
+	  is_function = 0;
+	}
+
+      if (is_function)
+	{
+	  if (have_ranges)
+	    {
+	      if (!add_function_ranges (state, ddata, u, function, ranges,
+					base, error_callback, data, vec))
+		return 0;
+	    }
+	  else if (have_lowpc && have_highpc)
+	    {
+	      if (highpc_is_relative)
+		highpc += lowpc;
+	      if (!add_function_range (state, ddata, function, lowpc, highpc,
+				       error_callback, data, vec))
+		return 0;
+	    }
+	  else
+	    {
+	      backtrace_free (state, function, sizeof *function,
+			      error_callback, data);
+	      is_function = 0;
+	    }
+	}
+
+      if (abbrev->has_children)
+	{
+	  if (!is_function)
+	    {
+	      if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
+					error_callback, data, vec_function,
+					vec_inlined))
+		return 0;
+	    }
+	  else
+	    {
+	      struct function_vector fvec;
+
+	      /* Gather any information for inlined functions in
+		 FVEC.  */
+
+	      memset (&fvec, 0, sizeof fvec);
+
+	      if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
+					error_callback, data, vec_function,
+					&fvec))
+		return 0;
+
+	      if (fvec.count > 0)
+		{
+		  struct function_addrs *faddrs;
+
+		  if (!backtrace_vector_release (state, &fvec.vec,
+						 error_callback, data))
+		    return 0;
+
+		  faddrs = (struct function_addrs *) fvec.vec.base;
+		  backtrace_qsort (faddrs, fvec.count,
+				   sizeof (struct function_addrs),
+				   function_addrs_compare);
+
+		  function->function_addrs = faddrs;
+		  function->function_addrs_count = fvec.count;
+		}
+	    }
+	}
+    }
+
+  return 1;
+}
+
+/* Read function name information for a compilation unit.  We look
+   through the whole unit looking for function tags.  */
+
+static void
+read_function_info (struct backtrace_state *state, struct dwarf_data *ddata,
+		    const struct line_header *lhdr,
+		    backtrace_error_callback error_callback, void *data,
+		    struct unit *u, struct function_vector *fvec,
+		    struct function_addrs **ret_addrs,
+		    size_t *ret_addrs_count)
+{
+  struct function_vector lvec;
+  struct function_vector *pfvec;
+  struct dwarf_buf unit_buf;
+  struct function_addrs *addrs;
+  size_t addrs_count;
+
+  /* Use FVEC if it is not NULL.  Otherwise use our own vector.  */
+  if (fvec != NULL)
+    pfvec = fvec;
+  else
+    {
+      memset (&lvec, 0, sizeof lvec);
+      pfvec = &lvec;
+    }
+
+  unit_buf.name = ".debug_info";
+  unit_buf.start = ddata->dwarf_info;
+  unit_buf.buf = u->unit_data;
+  unit_buf.left = u->unit_data_len;
+  unit_buf.is_bigendian = ddata->is_bigendian;
+  unit_buf.error_callback = error_callback;
+  unit_buf.data = data;
+  unit_buf.reported_underflow = 0;
+
+  while (unit_buf.left > 0)
+    {
+      if (!read_function_entry (state, ddata, u, 0, &unit_buf, lhdr,
+				error_callback, data, pfvec, pfvec))
+	return;
+    }
+
+  if (pfvec->count == 0)
+    return;
+
+  addrs_count = pfvec->count;
+
+  if (fvec == NULL)
+    {
+      if (!backtrace_vector_release (state, &lvec.vec, error_callback, data))
+	return;
+      addrs = (struct function_addrs *) pfvec->vec.base;
+    }
+  else
+    {
+      /* Finish this list of addresses, but leave the remaining space in
+	 the vector available for the next function unit.  */
+      addrs = ((struct function_addrs *)
+	       backtrace_vector_finish (state, &fvec->vec,
+					error_callback, data));
+      if (addrs == NULL)
+	return;
+      fvec->count = 0;
+    }
+
+  backtrace_qsort (addrs, addrs_count, sizeof (struct function_addrs),
+		   function_addrs_compare);
+
+  *ret_addrs = addrs;
+  *ret_addrs_count = addrs_count;
+}
+
+/* See if PC is inlined in FUNCTION.  If it is, print out the inlined
+   information, and update FILENAME and LINENO for the caller.
+   Returns whatever CALLBACK returns, or 0 to keep going.  */
+
+static int
+report_inlined_functions (uintptr_t pc, struct function *function,
+			  backtrace_full_callback callback, void *data,
+			  const char **filename, int *lineno)
+{
+  struct function_addrs *function_addrs;
+  struct function *inlined;
+  int ret;
+
+  if (function->function_addrs_count == 0)
+    return 0;
+
+  function_addrs = ((struct function_addrs *)
+		    bsearch (&pc, function->function_addrs,
+			     function->function_addrs_count,
+			     sizeof (struct function_addrs),
+			     function_addrs_search));
+  if (function_addrs == NULL)
+    return 0;
+
+  while (((size_t) (function_addrs - function->function_addrs) + 1
+	  < function->function_addrs_count)
+	 && pc >= (function_addrs + 1)->low
+	 && pc < (function_addrs + 1)->high)
+    ++function_addrs;
+
+  /* We found an inlined call.  */
+
+  inlined = function_addrs->function;
+
+  /* Report any calls inlined into this one.  */
+  ret = report_inlined_functions (pc, inlined, callback, data,
+				  filename, lineno);
+  if (ret != 0)
+    return ret;
+
+  /* Report this inlined call.  */
+  ret = callback (data, pc, *filename, *lineno, inlined->name);
+  if (ret != 0)
+    return ret;
+
+  /* Our caller will report the caller of the inlined function; tell
+     it the appropriate filename and line number.  */
+  *filename = inlined->caller_filename;
+  *lineno = inlined->caller_lineno;
+
+  return 0;
+}
+
+/* Look for a PC in the DWARF mapping for one module.  On success,
+   call CALLBACK and return whatever it returns.  On error, call
+   ERROR_CALLBACK and return 0.  Sets *FOUND to 1 if the PC is found,
+   0 if not.  */
+
+static int
+dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
+		 uintptr_t pc, backtrace_full_callback callback,
+		 backtrace_error_callback error_callback, void *data,
+		 int *found)
+{
+  struct unit_addrs *entry;
+  struct unit *u;
+  int new_data;
+  struct line *lines;
+  struct line *ln;
+  struct function_addrs *function_addrs;
+  struct function *function;
+  const char *filename;
+  int lineno;
+  int ret;
+
+  *found = 1;
+
+  /* Find an address range that includes PC.  */
+  entry = bsearch (&pc, ddata->addrs, ddata->addrs_count,
+		   sizeof (struct unit_addrs), unit_addrs_search);
+
+  if (entry == NULL)
+    {
+      *found = 0;
+      return 0;
+    }
+
+  /* If there are multiple ranges that contain PC, use the last one,
+     in order to produce predictable results.  If we assume that all
+     ranges are properly nested, then the last range will be the
+     smallest one.  */
+  while ((size_t) (entry - ddata->addrs) + 1 < ddata->addrs_count
+	 && pc >= (entry + 1)->low
+	 && pc < (entry + 1)->high)
+    ++entry;
+
+  /* We need the lines, lines_count, function_addrs,
+     function_addrs_count fields of u.  If they are not set, we need
+     to set them.  When running in threaded mode, we need to allow for
+     the possibility that some other thread is setting them
+     simultaneously.  */
+
+  u = entry->u;
+  lines = u->lines;
+
+  /* Skip units with no useful line number information by walking
+     backward.  Useless line number information is marked by setting
+     lines == -1.  */
+  while (entry > ddata->addrs
+	 && pc >= (entry - 1)->low
+	 && pc < (entry - 1)->high)
+    {
+      if (state->threaded)
+	lines = (struct line *) backtrace_atomic_load_pointer (&u->lines);
+
+      if (lines != (struct line *) (uintptr_t) -1)
+	break;
+
+      --entry;
+
+      u = entry->u;
+      lines = u->lines;
+    }
+
+  if (state->threaded)
+    lines = backtrace_atomic_load_pointer (&u->lines);
+
+  new_data = 0;
+  if (lines == NULL)
+    {
+      size_t function_addrs_count;
+      struct line_header lhdr;
+      size_t count;
+
+      /* We have never read the line information for this unit.  Read
+	 it now.  */
+
+      function_addrs = NULL;
+      function_addrs_count = 0;
+      if (read_line_info (state, ddata, error_callback, data, entry->u, &lhdr,
+			  &lines, &count))
+	{
+	  struct function_vector *pfvec;
+
+	  /* If not threaded, reuse DDATA->FVEC for better memory
+	     consumption.  */
+	  if (state->threaded)
+	    pfvec = NULL;
+	  else
+	    pfvec = &ddata->fvec;
+	  read_function_info (state, ddata, &lhdr, error_callback, data,
+			      entry->u, pfvec, &function_addrs,
+			      &function_addrs_count);
+	  free_line_header (state, &lhdr, error_callback, data);
+	  new_data = 1;
+	}
+
+      /* Atomically store the information we just read into the unit.
+	 If another thread is simultaneously writing, it presumably
+	 read the same information, and we don't care which one we
+	 wind up with; we just leak the other one.  We do have to
+	 write the lines field last, so that the acquire-loads above
+	 ensure that the other fields are set.  */
+
+      if (!state->threaded)
+	{
+	  u->lines_count = count;
+	  u->function_addrs = function_addrs;
+	  u->function_addrs_count = function_addrs_count;
+	  u->lines = lines;
+	}
+      else
+	{
+	  backtrace_atomic_store_size_t (&u->lines_count, count);
+	  backtrace_atomic_store_pointer (&u->function_addrs, function_addrs);
+	  backtrace_atomic_store_size_t (&u->function_addrs_count,
+					 function_addrs_count);
+	  backtrace_atomic_store_pointer (&u->lines, lines);
+	}
+    }
+
+  /* Now all fields of U have been initialized.  */
+
+  if (lines == (struct line *) (uintptr_t) -1)
+    {
+      /* If reading the line number information failed in some way,
+	 try again to see if there is a better compilation unit for
+	 this PC.  */
+      if (new_data)
+	return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
+				data, found);
+      return callback (data, pc, NULL, 0, NULL);
+    }
+
+  /* Search for PC within this unit.  */
+
+  ln = (struct line *) bsearch (&pc, lines, entry->u->lines_count,
+				sizeof (struct line), line_search);
+  if (ln == NULL)
+    {
+      /* The PC is between the low_pc and high_pc attributes of the
+	 compilation unit, but no entry in the line table covers it.
+	 This implies that the start of the compilation unit has no
+	 line number information.  */
+
+      if (entry->u->abs_filename == NULL)
+	{
+	  const char *filename;
+
+	  filename = entry->u->filename;
+	  if (filename != NULL
+	      && !IS_ABSOLUTE_PATH (filename)
+	      && entry->u->comp_dir != NULL)
+	    {
+	      size_t filename_len;
+	      const char *dir;
+	      size_t dir_len;
+	      char *s;
+
+	      filename_len = strlen (filename);
+	      dir = entry->u->comp_dir;
+	      dir_len = strlen (dir);
+	      s = (char *) backtrace_alloc (state, dir_len + filename_len + 2,
+					    error_callback, data);
+	      if (s == NULL)
+		{
+		  *found = 0;
+		  return 0;
+		}
+	      memcpy (s, dir, dir_len);
+	      /* FIXME: Should use backslash if DOS file system.  */
+	      s[dir_len] = '/';
+	      memcpy (s + dir_len + 1, filename, filename_len + 1);
+	      filename = s;
+	    }
+	  entry->u->abs_filename = filename;
+	}
+
+      return callback (data, pc, entry->u->abs_filename, 0, NULL);
+    }
+
+  /* Search for function name within this unit.  */
+
+  if (entry->u->function_addrs_count == 0)
+    return callback (data, pc, ln->filename, ln->lineno, NULL);
+
+  function_addrs = ((struct function_addrs *)
+		    bsearch (&pc, entry->u->function_addrs,
+			     entry->u->function_addrs_count,
+			     sizeof (struct function_addrs),
+			     function_addrs_search));
+  if (function_addrs == NULL)
+    return callback (data, pc, ln->filename, ln->lineno, NULL);
+
+  /* If there are multiple function ranges that contain PC, use the
+     last one, in order to produce predictable results.  */
+
+  while (((size_t) (function_addrs - entry->u->function_addrs + 1)
+	  < entry->u->function_addrs_count)
+	 && pc >= (function_addrs + 1)->low
+	 && pc < (function_addrs + 1)->high)
+    ++function_addrs;
+
+  function = function_addrs->function;
+
+  filename = ln->filename;
+  lineno = ln->lineno;
+
+  ret = report_inlined_functions (pc, function, callback, data,
+				  &filename, &lineno);
+  if (ret != 0)
+    return ret;
+
+  return callback (data, pc, filename, lineno, function->name);
+}
+
+
+/* Return the file/line information for a PC using the DWARF mapping
+   we built earlier.  */
+
+static int
+dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
+		backtrace_full_callback callback,
+		backtrace_error_callback error_callback, void *data)
+{
+  struct dwarf_data *ddata;
+  int found;
+  int ret;
+
+  if (!state->threaded)
+    {
+      for (ddata = (struct dwarf_data *) state->fileline_data;
+	   ddata != NULL;
+	   ddata = ddata->next)
+	{
+	  ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
+				 data, &found);
+	  if (ret != 0 || found)
+	    return ret;
+	}
+    }
+  else
+    {
+      struct dwarf_data **pp;
+
+      pp = (struct dwarf_data **) (void *) &state->fileline_data;
+      while (1)
+	{
+	  ddata = backtrace_atomic_load_pointer (pp);
+	  if (ddata == NULL)
+	    break;
+
+	  ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
+				 data, &found);
+	  if (ret != 0 || found)
+	    return ret;
+
+	  pp = &ddata->next;
+	}
+    }
+
+  /* FIXME: See if any libraries have been dlopen'ed.  */
+
+  return callback (data, pc, NULL, 0, NULL);
+}
+
+/* Initialize our data structures from the DWARF debug info for a
+   file.  Return NULL on failure.  */
+
+static struct dwarf_data *
+build_dwarf_data (struct backtrace_state *state,
+		  uintptr_t base_address,
+		  const unsigned char *dwarf_info,
+		  size_t dwarf_info_size,
+		  const unsigned char *dwarf_line,
+		  size_t dwarf_line_size,
+		  const unsigned char *dwarf_abbrev,
+		  size_t dwarf_abbrev_size,
+		  const unsigned char *dwarf_ranges,
+		  size_t dwarf_ranges_size,
+		  const unsigned char *dwarf_str,
+		  size_t dwarf_str_size,
+		  int is_bigendian,
+		  backtrace_error_callback error_callback,
+		  void *data)
+{
+  struct unit_addrs_vector addrs_vec;
+  struct unit_addrs *addrs;
+  size_t addrs_count;
+  struct dwarf_data *fdata;
+
+  if (!build_address_map (state, base_address, dwarf_info, dwarf_info_size,
+			  dwarf_abbrev, dwarf_abbrev_size, dwarf_ranges,
+			  dwarf_ranges_size, dwarf_str, dwarf_str_size,
+			  is_bigendian, error_callback, data, &addrs_vec))
+    return NULL;
+
+  if (!backtrace_vector_release (state, &addrs_vec.vec, error_callback, data))
+    return NULL;
+  addrs = (struct unit_addrs *) addrs_vec.vec.base;
+  addrs_count = addrs_vec.count;
+  backtrace_qsort (addrs, addrs_count, sizeof (struct unit_addrs),
+		   unit_addrs_compare);
+
+  fdata = ((struct dwarf_data *)
+	   backtrace_alloc (state, sizeof (struct dwarf_data),
+			    error_callback, data));
+  if (fdata == NULL)
+    return NULL;
+
+  fdata->next = NULL;
+  fdata->base_address = base_address;
+  fdata->addrs = addrs;
+  fdata->addrs_count = addrs_count;
+  fdata->dwarf_info = dwarf_info;
+  fdata->dwarf_info_size = dwarf_info_size;
+  fdata->dwarf_line = dwarf_line;
+  fdata->dwarf_line_size = dwarf_line_size;
+  fdata->dwarf_ranges = dwarf_ranges;
+  fdata->dwarf_ranges_size = dwarf_ranges_size;
+  fdata->dwarf_str = dwarf_str;
+  fdata->dwarf_str_size = dwarf_str_size;
+  fdata->is_bigendian = is_bigendian;
+  memset (&fdata->fvec, 0, sizeof fdata->fvec);
+
+  return fdata;
+}
+
+/* Build our data structures from the DWARF sections for a module.
+   Set FILELINE_FN and STATE->FILELINE_DATA.  Return 1 on success, 0
+   on failure.  */
+
+int
+backtrace_dwarf_add (struct backtrace_state *state,
+		     uintptr_t base_address,
+		     const unsigned char *dwarf_info,
+		     size_t dwarf_info_size,
+		     const unsigned char *dwarf_line,
+		     size_t dwarf_line_size,
+		     const unsigned char *dwarf_abbrev,
+		     size_t dwarf_abbrev_size,
+		     const unsigned char *dwarf_ranges,
+		     size_t dwarf_ranges_size,
+		     const unsigned char *dwarf_str,
+		     size_t dwarf_str_size,
+		     int is_bigendian,
+		     backtrace_error_callback error_callback,
+		     void *data, fileline *fileline_fn)
+{
+  struct dwarf_data *fdata;
+
+  fdata = build_dwarf_data (state, base_address, dwarf_info, dwarf_info_size,
+			    dwarf_line, dwarf_line_size, dwarf_abbrev,
+			    dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size,
+			    dwarf_str, dwarf_str_size, is_bigendian,
+			    error_callback, data);
+  if (fdata == NULL)
+    return 0;
+
+  if (!state->threaded)
+    {
+      struct dwarf_data **pp;
+
+      for (pp = (struct dwarf_data **) (void *) &state->fileline_data;
+	   *pp != NULL;
+	   pp = &(*pp)->next)
+	;
+      *pp = fdata;
+    }
+  else
+    {
+      while (1)
+	{
+	  struct dwarf_data **pp;
+
+	  pp = (struct dwarf_data **) (void *) &state->fileline_data;
+
+	  while (1)
+	    {
+	      struct dwarf_data *p;
+
+	      p = backtrace_atomic_load_pointer (pp);
+
+	      if (p == NULL)
+		break;
+
+	      pp = &p->next;
+	    }
+
+	  if (__sync_bool_compare_and_swap (pp, NULL, fdata))
+	    break;
+	}
+    }
+
+  *fileline_fn = dwarf_fileline;
+
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/dwarf2.def
@@ -0,0 +1,773 @@
+/* -*- c -*-
+   Declarations and definitions of codes relating to the DWARF2 and
+   DWARF3 symbolic debugging information formats.
+   Copyright (C) 1992-2015 Free Software Foundation, Inc.
+
+   Written by Gary Funck (gary@intrepid.com) The Ada Joint Program
+   Office (AJPO), Florida State University and Silicon Graphics Inc.
+   provided support for this effort -- June 21, 1995.
+
+   Derived from the DWARF 1 implementation written by Ron Guilmette
+   (rfg@netcom.com), November 1990.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3, or (at your option) any later
+   version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file is derived from the DWARF specification (a public document)
+   Revision 2.0.0 (July 27, 1993) developed by the UNIX International
+   Programming Languages Special Interest Group (UI/PLSIG) and distributed
+   by UNIX International.  Copies of this specification are available from
+   UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.
+
+   This file also now contains definitions from the DWARF 3 specification
+   published Dec 20, 2005, available from: http://dwarf.freestandards.org.
+
+   This file also now contains definitions from the DWARF 4
+   specification, available from: http://dwarfstd.org/ */
+
+/* This file declares various DWARF-related constants using a set of
+   macros which can be redefined by the including file.
+   
+   The macros are in sections.  Each section corresponds to a single
+   set of DWARF constants and has a corresponding key.  The key is
+   used in all the macro names.
+   
+   The sections are TAG (for DW_TAG_ constants), FORM (DW_FORM_), AT
+   (DW_AT_), OP (DW_OP_), ATE (DW_ATE_), and CFA (DW_CFA_).
+   
+   Using TAG as an example, the following macros may be used for each
+   key:
+   
+   DW_FIRST_TAG(name, value) - Introduce the first DW_TAG constant.
+   
+   DW_TAG(name, value) - Define a subsequent constant.
+   
+   DW_TAG_DUP(name, value) - Define a subsequent constant whose value
+   is a duplicate of some other constant.  Not all keys use the _DUP
+   macro form.  If more than one name shares a value, then the base
+   (DW_TAG) form will be the preferred name and DW_TAG_DUP will hold
+   any alternate names.
+   
+   DW_END_TAG - Invoked at the end of the DW_TAG constants.  */
+
+DW_FIRST_TAG (DW_TAG_padding, 0x00)
+DW_TAG (DW_TAG_array_type, 0x01)
+DW_TAG (DW_TAG_class_type, 0x02)
+DW_TAG (DW_TAG_entry_point, 0x03)
+DW_TAG (DW_TAG_enumeration_type, 0x04)
+DW_TAG (DW_TAG_formal_parameter, 0x05)
+DW_TAG (DW_TAG_imported_declaration, 0x08)
+DW_TAG (DW_TAG_label, 0x0a)
+DW_TAG (DW_TAG_lexical_block, 0x0b)
+DW_TAG (DW_TAG_member, 0x0d)
+DW_TAG (DW_TAG_pointer_type, 0x0f)
+DW_TAG (DW_TAG_reference_type, 0x10)
+DW_TAG (DW_TAG_compile_unit, 0x11)
+DW_TAG (DW_TAG_string_type, 0x12)
+DW_TAG (DW_TAG_structure_type, 0x13)
+DW_TAG (DW_TAG_subroutine_type, 0x15)
+DW_TAG (DW_TAG_typedef, 0x16)
+DW_TAG (DW_TAG_union_type, 0x17)
+DW_TAG (DW_TAG_unspecified_parameters, 0x18)
+DW_TAG (DW_TAG_variant, 0x19)
+DW_TAG (DW_TAG_common_block, 0x1a)
+DW_TAG (DW_TAG_common_inclusion, 0x1b)
+DW_TAG (DW_TAG_inheritance, 0x1c)
+DW_TAG (DW_TAG_inlined_subroutine, 0x1d)
+DW_TAG (DW_TAG_module, 0x1e)
+DW_TAG (DW_TAG_ptr_to_member_type, 0x1f)
+DW_TAG (DW_TAG_set_type, 0x20)
+DW_TAG (DW_TAG_subrange_type, 0x21)
+DW_TAG (DW_TAG_with_stmt, 0x22)
+DW_TAG (DW_TAG_access_declaration, 0x23)
+DW_TAG (DW_TAG_base_type, 0x24)
+DW_TAG (DW_TAG_catch_block, 0x25)
+DW_TAG (DW_TAG_const_type, 0x26)
+DW_TAG (DW_TAG_constant, 0x27)
+DW_TAG (DW_TAG_enumerator, 0x28)
+DW_TAG (DW_TAG_file_type, 0x29)
+DW_TAG (DW_TAG_friend, 0x2a)
+DW_TAG (DW_TAG_namelist, 0x2b)
+DW_TAG (DW_TAG_namelist_item, 0x2c)
+DW_TAG (DW_TAG_packed_type, 0x2d)
+DW_TAG (DW_TAG_subprogram, 0x2e)
+DW_TAG (DW_TAG_template_type_param, 0x2f)
+DW_TAG (DW_TAG_template_value_param, 0x30)
+DW_TAG (DW_TAG_thrown_type, 0x31)
+DW_TAG (DW_TAG_try_block, 0x32)
+DW_TAG (DW_TAG_variant_part, 0x33)
+DW_TAG (DW_TAG_variable, 0x34)
+DW_TAG (DW_TAG_volatile_type, 0x35)
+/* DWARF 3.  */
+DW_TAG (DW_TAG_dwarf_procedure, 0x36)
+DW_TAG (DW_TAG_restrict_type, 0x37)
+DW_TAG (DW_TAG_interface_type, 0x38)
+DW_TAG (DW_TAG_namespace, 0x39)
+DW_TAG (DW_TAG_imported_module, 0x3a)
+DW_TAG (DW_TAG_unspecified_type, 0x3b)
+DW_TAG (DW_TAG_partial_unit, 0x3c)
+DW_TAG (DW_TAG_imported_unit, 0x3d)
+DW_TAG (DW_TAG_condition, 0x3f)
+DW_TAG (DW_TAG_shared_type, 0x40)
+/* DWARF 4.  */
+DW_TAG (DW_TAG_type_unit, 0x41)
+DW_TAG (DW_TAG_rvalue_reference_type, 0x42)
+DW_TAG (DW_TAG_template_alias, 0x43)
+/* DWARF 5.  */
+DW_TAG (DW_TAG_coarray_type, 0x44)
+DW_TAG (DW_TAG_generic_subrange, 0x45)
+DW_TAG (DW_TAG_dynamic_type, 0x46)
+DW_TAG (DW_TAG_atomic_type, 0x47)
+DW_TAG (DW_TAG_call_site, 0x48)
+DW_TAG (DW_TAG_call_site_parameter, 0x49)
+DW_TAG (DW_TAG_skeleton_unit, 0x4a)
+DW_TAG (DW_TAG_immutable_type, 0x4b)
+
+DW_TAG_DUP (DW_TAG_lo_user, 0x4080)
+DW_TAG_DUP (DW_TAG_hi_user, 0xffff)
+
+/* SGI/MIPS Extensions.  */
+DW_TAG (DW_TAG_MIPS_loop, 0x4081)
+
+/* HP extensions.  See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz .  */
+DW_TAG (DW_TAG_HP_array_descriptor, 0x4090)
+DW_TAG (DW_TAG_HP_Bliss_field, 0x4091)
+DW_TAG (DW_TAG_HP_Bliss_field_set, 0x4092)
+
+/* GNU extensions.  */
+DW_TAG (DW_TAG_format_label, 0x4101)	/* For FORTRAN 77 and Fortran 90.  */
+DW_TAG (DW_TAG_function_template, 0x4102)	/* For C++.  */
+DW_TAG (DW_TAG_class_template, 0x4103)	/* For C++.  */
+DW_TAG (DW_TAG_GNU_BINCL, 0x4104)
+DW_TAG (DW_TAG_GNU_EINCL, 0x4105)
+/* Template template parameter.
+   See http://gcc.gnu.org/wiki/TemplateParmsDwarf .  */
+DW_TAG (DW_TAG_GNU_template_template_param, 0x4106)
+
+/* Template parameter pack extension, specified at
+   http://wiki.dwarfstd.org/index.php?title=C%2B%2B0x:_Variadic_templates
+   The values of these two TAGS are in the DW_TAG_GNU_* space until the tags
+   are properly part of DWARF 5.  */
+DW_TAG (DW_TAG_GNU_template_parameter_pack, 0x4107)
+DW_TAG (DW_TAG_GNU_formal_parameter_pack, 0x4108)
+/* The GNU call site extension, specified at
+   http://www.dwarfstd.org/ShowIssue.php?issue=100909.2&type=open .
+   The values of these two TAGS are in the DW_TAG_GNU_* space until the tags
+   are properly part of DWARF 5.  */
+DW_TAG (DW_TAG_GNU_call_site, 0x4109)
+DW_TAG (DW_TAG_GNU_call_site_parameter, 0x410a)
+/* Extensions for UPC.  See: http://dwarfstd.org/doc/DWARF4.pdf.  */
+DW_TAG (DW_TAG_upc_shared_type, 0x8765)
+DW_TAG (DW_TAG_upc_strict_type, 0x8766)
+DW_TAG (DW_TAG_upc_relaxed_type, 0x8767)
+/* PGI (STMicroelectronics) extensions.  No documentation available.  */
+DW_TAG (DW_TAG_PGI_kanji_type, 0xA000)
+DW_TAG (DW_TAG_PGI_interface_block, 0xA020)
+DW_END_TAG
+
+DW_FIRST_FORM (DW_FORM_addr, 0x01)
+DW_FORM (DW_FORM_block2, 0x03)
+DW_FORM (DW_FORM_block4, 0x04)
+DW_FORM (DW_FORM_data2, 0x05)
+DW_FORM (DW_FORM_data4, 0x06)
+DW_FORM (DW_FORM_data8, 0x07)
+DW_FORM (DW_FORM_string, 0x08)
+DW_FORM (DW_FORM_block, 0x09)
+DW_FORM (DW_FORM_block1, 0x0a)
+DW_FORM (DW_FORM_data1, 0x0b)
+DW_FORM (DW_FORM_flag, 0x0c)
+DW_FORM (DW_FORM_sdata, 0x0d)
+DW_FORM (DW_FORM_strp, 0x0e)
+DW_FORM (DW_FORM_udata, 0x0f)
+DW_FORM (DW_FORM_ref_addr, 0x10)
+DW_FORM (DW_FORM_ref1, 0x11)
+DW_FORM (DW_FORM_ref2, 0x12)
+DW_FORM (DW_FORM_ref4, 0x13)
+DW_FORM (DW_FORM_ref8, 0x14)
+DW_FORM (DW_FORM_ref_udata, 0x15)
+DW_FORM (DW_FORM_indirect, 0x16)
+/* DWARF 4.  */
+DW_FORM (DW_FORM_sec_offset, 0x17)
+DW_FORM (DW_FORM_exprloc, 0x18)
+DW_FORM (DW_FORM_flag_present, 0x19)
+DW_FORM (DW_FORM_ref_sig8, 0x20)
+/* DWARF 5.  */
+DW_FORM (DW_FORM_strx, 0x1a)
+DW_FORM (DW_FORM_addrx, 0x1b)
+DW_FORM (DW_FORM_ref_sup, 0x1c)
+DW_FORM (DW_FORM_strp_sup, 0x1d)
+DW_FORM (DW_FORM_data16, 0x1e)
+DW_FORM (DW_FORM_line_strp, 0x1f)
+DW_FORM (DW_FORM_implicit_const, 0x21)
+DW_FORM (DW_FORM_loclistx, 0x22)
+DW_FORM (DW_FORM_rnglistx, 0x23)
+/* Extensions for Fission.  See http://gcc.gnu.org/wiki/DebugFission.  */
+DW_FORM (DW_FORM_GNU_addr_index, 0x1f01)
+DW_FORM (DW_FORM_GNU_str_index, 0x1f02)
+/* Extensions for DWZ multifile.
+   See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open .  */
+DW_FORM (DW_FORM_GNU_ref_alt, 0x1f20)
+DW_FORM (DW_FORM_GNU_strp_alt, 0x1f21)
+DW_END_FORM
+
+DW_FIRST_AT (DW_AT_sibling, 0x01)
+DW_AT (DW_AT_location, 0x02)
+DW_AT (DW_AT_name, 0x03)
+DW_AT (DW_AT_ordering, 0x09)
+DW_AT (DW_AT_subscr_data, 0x0a)
+DW_AT (DW_AT_byte_size, 0x0b)
+DW_AT (DW_AT_bit_offset, 0x0c)
+DW_AT (DW_AT_bit_size, 0x0d)
+DW_AT (DW_AT_element_list, 0x0f)
+DW_AT (DW_AT_stmt_list, 0x10)
+DW_AT (DW_AT_low_pc, 0x11)
+DW_AT (DW_AT_high_pc, 0x12)
+DW_AT (DW_AT_language, 0x13)
+DW_AT (DW_AT_member, 0x14)
+DW_AT (DW_AT_discr, 0x15)
+DW_AT (DW_AT_discr_value, 0x16)
+DW_AT (DW_AT_visibility, 0x17)
+DW_AT (DW_AT_import, 0x18)
+DW_AT (DW_AT_string_length, 0x19)
+DW_AT (DW_AT_common_reference, 0x1a)
+DW_AT (DW_AT_comp_dir, 0x1b)
+DW_AT (DW_AT_const_value, 0x1c)
+DW_AT (DW_AT_containing_type, 0x1d)
+DW_AT (DW_AT_default_value, 0x1e)
+DW_AT (DW_AT_inline, 0x20)
+DW_AT (DW_AT_is_optional, 0x21)
+DW_AT (DW_AT_lower_bound, 0x22)
+DW_AT (DW_AT_producer, 0x25)
+DW_AT (DW_AT_prototyped, 0x27)
+DW_AT (DW_AT_return_addr, 0x2a)
+DW_AT (DW_AT_start_scope, 0x2c)
+DW_AT (DW_AT_bit_stride, 0x2e)
+DW_AT (DW_AT_upper_bound, 0x2f)
+DW_AT (DW_AT_abstract_origin, 0x31)
+DW_AT (DW_AT_accessibility, 0x32)
+DW_AT (DW_AT_address_class, 0x33)
+DW_AT (DW_AT_artificial, 0x34)
+DW_AT (DW_AT_base_types, 0x35)
+DW_AT (DW_AT_calling_convention, 0x36)
+DW_AT (DW_AT_count, 0x37)
+DW_AT (DW_AT_data_member_location, 0x38)
+DW_AT (DW_AT_decl_column, 0x39)
+DW_AT (DW_AT_decl_file, 0x3a)
+DW_AT (DW_AT_decl_line, 0x3b)
+DW_AT (DW_AT_declaration, 0x3c)
+DW_AT (DW_AT_discr_list, 0x3d)
+DW_AT (DW_AT_encoding, 0x3e)
+DW_AT (DW_AT_external, 0x3f)
+DW_AT (DW_AT_frame_base, 0x40)
+DW_AT (DW_AT_friend, 0x41)
+DW_AT (DW_AT_identifier_case, 0x42)
+DW_AT (DW_AT_macro_info, 0x43)
+DW_AT (DW_AT_namelist_items, 0x44)
+DW_AT (DW_AT_priority, 0x45)
+DW_AT (DW_AT_segment, 0x46)
+DW_AT (DW_AT_specification, 0x47)
+DW_AT (DW_AT_static_link, 0x48)
+DW_AT (DW_AT_type, 0x49)
+DW_AT (DW_AT_use_location, 0x4a)
+DW_AT (DW_AT_variable_parameter, 0x4b)
+DW_AT (DW_AT_virtuality, 0x4c)
+DW_AT (DW_AT_vtable_elem_location, 0x4d)
+/* DWARF 3 values.  */
+DW_AT (DW_AT_allocated, 0x4e)
+DW_AT (DW_AT_associated, 0x4f)
+DW_AT (DW_AT_data_location, 0x50)
+DW_AT (DW_AT_byte_stride, 0x51)
+DW_AT (DW_AT_entry_pc, 0x52)
+DW_AT (DW_AT_use_UTF8, 0x53)
+DW_AT (DW_AT_extension, 0x54)
+DW_AT (DW_AT_ranges, 0x55)
+DW_AT (DW_AT_trampoline, 0x56)
+DW_AT (DW_AT_call_column, 0x57)
+DW_AT (DW_AT_call_file, 0x58)
+DW_AT (DW_AT_call_line, 0x59)
+DW_AT (DW_AT_description, 0x5a)
+DW_AT (DW_AT_binary_scale, 0x5b)
+DW_AT (DW_AT_decimal_scale, 0x5c)
+DW_AT (DW_AT_small, 0x5d)
+DW_AT (DW_AT_decimal_sign, 0x5e)
+DW_AT (DW_AT_digit_count, 0x5f)
+DW_AT (DW_AT_picture_string, 0x60)
+DW_AT (DW_AT_mutable, 0x61)
+DW_AT (DW_AT_threads_scaled, 0x62)
+DW_AT (DW_AT_explicit, 0x63)
+DW_AT (DW_AT_object_pointer, 0x64)
+DW_AT (DW_AT_endianity, 0x65)
+DW_AT (DW_AT_elemental, 0x66)
+DW_AT (DW_AT_pure, 0x67)
+DW_AT (DW_AT_recursive, 0x68)
+/* DWARF 4.  */
+DW_AT (DW_AT_signature, 0x69)
+DW_AT (DW_AT_main_subprogram, 0x6a)
+DW_AT (DW_AT_data_bit_offset, 0x6b)
+DW_AT (DW_AT_const_expr, 0x6c)
+DW_AT (DW_AT_enum_class, 0x6d)
+DW_AT (DW_AT_linkage_name, 0x6e)
+/* DWARF 5.  */
+DW_AT (DW_AT_string_length_bit_size, 0x6f)
+DW_AT (DW_AT_string_length_byte_size, 0x70)
+DW_AT (DW_AT_rank, 0x71)
+DW_AT (DW_AT_str_offsets_base, 0x72)
+DW_AT (DW_AT_addr_base, 0x73)
+DW_AT (DW_AT_rnglists_base, 0x74)
+DW_AT (DW_AT_dwo_name, 0x76)
+DW_AT (DW_AT_reference, 0x77)
+DW_AT (DW_AT_rvalue_reference, 0x78)
+DW_AT (DW_AT_macros, 0x79)
+DW_AT (DW_AT_call_all_calls, 0x7a)
+DW_AT (DW_AT_call_all_source_calls, 0x7b)
+DW_AT (DW_AT_call_all_tail_calls, 0x7c)
+DW_AT (DW_AT_call_return_pc, 0x7d)
+DW_AT (DW_AT_call_value, 0x7e)
+DW_AT (DW_AT_call_origin, 0x7f)
+DW_AT (DW_AT_call_parameter, 0x80)
+DW_AT (DW_AT_call_pc, 0x81)
+DW_AT (DW_AT_call_tail_call, 0x82)
+DW_AT (DW_AT_call_target, 0x83)
+DW_AT (DW_AT_call_target_clobbered, 0x84)
+DW_AT (DW_AT_call_data_location, 0x85)
+DW_AT (DW_AT_call_data_value, 0x86)
+DW_AT (DW_AT_noreturn, 0x87)
+DW_AT (DW_AT_alignment, 0x88)
+DW_AT (DW_AT_export_symbols, 0x89)
+DW_AT (DW_AT_deleted, 0x8a)
+DW_AT (DW_AT_defaulted, 0x8b)
+DW_AT (DW_AT_loclists_base, 0x8c)
+
+DW_AT_DUP (DW_AT_lo_user, 0x2000) /* Implementation-defined range start.  */
+DW_AT_DUP (DW_AT_hi_user, 0x3fff) /* Implementation-defined range end.  */
+
+/* SGI/MIPS extensions.  */
+DW_AT (DW_AT_MIPS_fde, 0x2001)
+DW_AT (DW_AT_MIPS_loop_begin, 0x2002)
+DW_AT (DW_AT_MIPS_tail_loop_begin, 0x2003)
+DW_AT (DW_AT_MIPS_epilog_begin, 0x2004)
+DW_AT (DW_AT_MIPS_loop_unroll_factor, 0x2005)
+DW_AT (DW_AT_MIPS_software_pipeline_depth, 0x2006)
+DW_AT (DW_AT_MIPS_linkage_name, 0x2007)
+DW_AT (DW_AT_MIPS_stride, 0x2008)
+DW_AT (DW_AT_MIPS_abstract_name, 0x2009)
+DW_AT (DW_AT_MIPS_clone_origin, 0x200a)
+DW_AT (DW_AT_MIPS_has_inlines, 0x200b)
+/* HP extensions.  */
+DW_AT (DW_AT_HP_block_index, 0x2000)
+DW_AT_DUP (DW_AT_HP_unmodifiable, 0x2001) /* Same as DW_AT_MIPS_fde.  */
+DW_AT_DUP (DW_AT_HP_prologue, 0x2005) /* Same as DW_AT_MIPS_loop_unroll.  */
+DW_AT_DUP (DW_AT_HP_epilogue, 0x2008) /* Same as DW_AT_MIPS_stride.  */
+DW_AT (DW_AT_HP_actuals_stmt_list, 0x2010)
+DW_AT (DW_AT_HP_proc_per_section, 0x2011)
+DW_AT (DW_AT_HP_raw_data_ptr, 0x2012)
+DW_AT (DW_AT_HP_pass_by_reference, 0x2013)
+DW_AT (DW_AT_HP_opt_level, 0x2014)
+DW_AT (DW_AT_HP_prof_version_id, 0x2015)
+DW_AT (DW_AT_HP_opt_flags, 0x2016)
+DW_AT (DW_AT_HP_cold_region_low_pc, 0x2017)
+DW_AT (DW_AT_HP_cold_region_high_pc, 0x2018)
+DW_AT (DW_AT_HP_all_variables_modifiable, 0x2019)
+DW_AT (DW_AT_HP_linkage_name, 0x201a)
+DW_AT (DW_AT_HP_prof_flags, 0x201b)  /* In comp unit of procs_info for -g.  */
+DW_AT (DW_AT_HP_unit_name, 0x201f)
+DW_AT (DW_AT_HP_unit_size, 0x2020)
+DW_AT (DW_AT_HP_widened_byte_size, 0x2021)
+DW_AT (DW_AT_HP_definition_points, 0x2022)
+DW_AT (DW_AT_HP_default_location, 0x2023)
+DW_AT (DW_AT_HP_is_result_param, 0x2029)
+
+/* GNU extensions.  */
+DW_AT (DW_AT_sf_names, 0x2101)
+DW_AT (DW_AT_src_info, 0x2102)
+DW_AT (DW_AT_mac_info, 0x2103)
+DW_AT (DW_AT_src_coords, 0x2104)
+DW_AT (DW_AT_body_begin, 0x2105)
+DW_AT (DW_AT_body_end, 0x2106)
+DW_AT (DW_AT_GNU_vector, 0x2107)
+/* Thread-safety annotations.
+   See http://gcc.gnu.org/wiki/ThreadSafetyAnnotation .  */
+DW_AT (DW_AT_GNU_guarded_by, 0x2108)
+DW_AT (DW_AT_GNU_pt_guarded_by, 0x2109)
+DW_AT (DW_AT_GNU_guarded, 0x210a)
+DW_AT (DW_AT_GNU_pt_guarded, 0x210b)
+DW_AT (DW_AT_GNU_locks_excluded, 0x210c)
+DW_AT (DW_AT_GNU_exclusive_locks_required, 0x210d)
+DW_AT (DW_AT_GNU_shared_locks_required, 0x210e)
+/* One-definition rule violation detection.
+   See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo .  */
+DW_AT (DW_AT_GNU_odr_signature, 0x210f)
+/* Template template argument name.
+   See http://gcc.gnu.org/wiki/TemplateParmsDwarf .  */
+DW_AT (DW_AT_GNU_template_name, 0x2110)
+/* The GNU call site extension.
+   See http://www.dwarfstd.org/ShowIssue.php?issue=100909.2&type=open .  */
+DW_AT (DW_AT_GNU_call_site_value, 0x2111)
+DW_AT (DW_AT_GNU_call_site_data_value, 0x2112)
+DW_AT (DW_AT_GNU_call_site_target, 0x2113)
+DW_AT (DW_AT_GNU_call_site_target_clobbered, 0x2114)
+DW_AT (DW_AT_GNU_tail_call, 0x2115)
+DW_AT (DW_AT_GNU_all_tail_call_sites, 0x2116)
+DW_AT (DW_AT_GNU_all_call_sites, 0x2117)
+DW_AT (DW_AT_GNU_all_source_call_sites, 0x2118)
+/* Section offset into .debug_macro section.  */
+DW_AT (DW_AT_GNU_macros, 0x2119)
+/* Attribute for C++ deleted special member functions (= delete;).  */
+DW_AT (DW_AT_GNU_deleted, 0x211a)
+/* Extensions for Fission.  See http://gcc.gnu.org/wiki/DebugFission.  */
+DW_AT (DW_AT_GNU_dwo_name, 0x2130)
+DW_AT (DW_AT_GNU_dwo_id, 0x2131)
+DW_AT (DW_AT_GNU_ranges_base, 0x2132)
+DW_AT (DW_AT_GNU_addr_base, 0x2133)
+DW_AT (DW_AT_GNU_pubnames, 0x2134)
+DW_AT (DW_AT_GNU_pubtypes, 0x2135)
+/* Attribute for discriminator.
+   See http://gcc.gnu.org/wiki/Discriminator  */
+DW_AT (DW_AT_GNU_discriminator, 0x2136)
+/* VMS extensions.  */
+DW_AT (DW_AT_VMS_rtnbeg_pd_address, 0x2201)
+/* GNAT extensions.  */
+/* GNAT descriptive type.
+   See http://gcc.gnu.org/wiki/DW_AT_GNAT_descriptive_type .  */
+DW_AT (DW_AT_use_GNAT_descriptive_type, 0x2301)
+DW_AT (DW_AT_GNAT_descriptive_type, 0x2302)
+/* Rational constant extension.
+   See https://gcc.gnu.org/wiki/DW_AT_GNU_numerator_denominator .  */
+DW_TAG (DW_AT_GNU_numerator, 0x2303)
+DW_TAG (DW_AT_GNU_denominator, 0x2304)
+/* Biased integer extension.
+   See https://gcc.gnu.org/wiki/DW_AT_GNU_bias .  */
+DW_TAG (DW_AT_GNU_bias, 0x2305)
+/* UPC extension.  */
+DW_AT (DW_AT_upc_threads_scaled, 0x3210)
+/* PGI (STMicroelectronics) extensions.  */
+DW_AT (DW_AT_PGI_lbase, 0x3a00)
+DW_AT (DW_AT_PGI_soffset, 0x3a01)
+DW_AT (DW_AT_PGI_lstride, 0x3a02)
+/* Apple extensions.  */
+DW_AT (DW_AT_APPLE_optimized, 0x3fe1)
+DW_AT (DW_AT_APPLE_flags, 0x3fe2)
+DW_AT (DW_AT_APPLE_isa, 0x3fe3)
+DW_AT (DW_AT_APPLE_block, 0x3fe4)
+DW_AT (DW_AT_APPLE_major_runtime_vers, 0x3fe5)
+DW_AT (DW_AT_APPLE_runtime_class, 0x3fe6)
+DW_AT (DW_AT_APPLE_omit_frame_ptr, 0x3fe7)
+DW_AT (DW_AT_APPLE_property_name, 0x3fe8)
+DW_AT (DW_AT_APPLE_property_getter, 0x3fe9)
+DW_AT (DW_AT_APPLE_property_setter, 0x3fea)
+DW_AT (DW_AT_APPLE_property_attribute, 0x3feb)
+DW_AT (DW_AT_APPLE_objc_complete_type, 0x3fec)
+DW_AT (DW_AT_APPLE_property, 0x3fed)
+DW_END_AT
+
+DW_FIRST_OP (DW_OP_addr, 0x03)
+DW_OP (DW_OP_deref, 0x06)
+DW_OP (DW_OP_const1u, 0x08)
+DW_OP (DW_OP_const1s, 0x09)
+DW_OP (DW_OP_const2u, 0x0a)
+DW_OP (DW_OP_const2s, 0x0b)
+DW_OP (DW_OP_const4u, 0x0c)
+DW_OP (DW_OP_const4s, 0x0d)
+DW_OP (DW_OP_const8u, 0x0e)
+DW_OP (DW_OP_const8s, 0x0f)
+DW_OP (DW_OP_constu, 0x10)
+DW_OP (DW_OP_consts, 0x11)
+DW_OP (DW_OP_dup, 0x12)
+DW_OP (DW_OP_drop, 0x13)
+DW_OP (DW_OP_over, 0x14)
+DW_OP (DW_OP_pick, 0x15)
+DW_OP (DW_OP_swap, 0x16)
+DW_OP (DW_OP_rot, 0x17)
+DW_OP (DW_OP_xderef, 0x18)
+DW_OP (DW_OP_abs, 0x19)
+DW_OP (DW_OP_and, 0x1a)
+DW_OP (DW_OP_div, 0x1b)
+DW_OP (DW_OP_minus, 0x1c)
+DW_OP (DW_OP_mod, 0x1d)
+DW_OP (DW_OP_mul, 0x1e)
+DW_OP (DW_OP_neg, 0x1f)
+DW_OP (DW_OP_not, 0x20)
+DW_OP (DW_OP_or, 0x21)
+DW_OP (DW_OP_plus, 0x22)
+DW_OP (DW_OP_plus_uconst, 0x23)
+DW_OP (DW_OP_shl, 0x24)
+DW_OP (DW_OP_shr, 0x25)
+DW_OP (DW_OP_shra, 0x26)
+DW_OP (DW_OP_xor, 0x27)
+DW_OP (DW_OP_bra, 0x28)
+DW_OP (DW_OP_eq, 0x29)
+DW_OP (DW_OP_ge, 0x2a)
+DW_OP (DW_OP_gt, 0x2b)
+DW_OP (DW_OP_le, 0x2c)
+DW_OP (DW_OP_lt, 0x2d)
+DW_OP (DW_OP_ne, 0x2e)
+DW_OP (DW_OP_skip, 0x2f)
+DW_OP (DW_OP_lit0, 0x30)
+DW_OP (DW_OP_lit1, 0x31)
+DW_OP (DW_OP_lit2, 0x32)
+DW_OP (DW_OP_lit3, 0x33)
+DW_OP (DW_OP_lit4, 0x34)
+DW_OP (DW_OP_lit5, 0x35)
+DW_OP (DW_OP_lit6, 0x36)
+DW_OP (DW_OP_lit7, 0x37)
+DW_OP (DW_OP_lit8, 0x38)
+DW_OP (DW_OP_lit9, 0x39)
+DW_OP (DW_OP_lit10, 0x3a)
+DW_OP (DW_OP_lit11, 0x3b)
+DW_OP (DW_OP_lit12, 0x3c)
+DW_OP (DW_OP_lit13, 0x3d)
+DW_OP (DW_OP_lit14, 0x3e)
+DW_OP (DW_OP_lit15, 0x3f)
+DW_OP (DW_OP_lit16, 0x40)
+DW_OP (DW_OP_lit17, 0x41)
+DW_OP (DW_OP_lit18, 0x42)
+DW_OP (DW_OP_lit19, 0x43)
+DW_OP (DW_OP_lit20, 0x44)
+DW_OP (DW_OP_lit21, 0x45)
+DW_OP (DW_OP_lit22, 0x46)
+DW_OP (DW_OP_lit23, 0x47)
+DW_OP (DW_OP_lit24, 0x48)
+DW_OP (DW_OP_lit25, 0x49)
+DW_OP (DW_OP_lit26, 0x4a)
+DW_OP (DW_OP_lit27, 0x4b)
+DW_OP (DW_OP_lit28, 0x4c)
+DW_OP (DW_OP_lit29, 0x4d)
+DW_OP (DW_OP_lit30, 0x4e)
+DW_OP (DW_OP_lit31, 0x4f)
+DW_OP (DW_OP_reg0, 0x50)
+DW_OP (DW_OP_reg1, 0x51)
+DW_OP (DW_OP_reg2, 0x52)
+DW_OP (DW_OP_reg3, 0x53)
+DW_OP (DW_OP_reg4, 0x54)
+DW_OP (DW_OP_reg5, 0x55)
+DW_OP (DW_OP_reg6, 0x56)
+DW_OP (DW_OP_reg7, 0x57)
+DW_OP (DW_OP_reg8, 0x58)
+DW_OP (DW_OP_reg9, 0x59)
+DW_OP (DW_OP_reg10, 0x5a)
+DW_OP (DW_OP_reg11, 0x5b)
+DW_OP (DW_OP_reg12, 0x5c)
+DW_OP (DW_OP_reg13, 0x5d)
+DW_OP (DW_OP_reg14, 0x5e)
+DW_OP (DW_OP_reg15, 0x5f)
+DW_OP (DW_OP_reg16, 0x60)
+DW_OP (DW_OP_reg17, 0x61)
+DW_OP (DW_OP_reg18, 0x62)
+DW_OP (DW_OP_reg19, 0x63)
+DW_OP (DW_OP_reg20, 0x64)
+DW_OP (DW_OP_reg21, 0x65)
+DW_OP (DW_OP_reg22, 0x66)
+DW_OP (DW_OP_reg23, 0x67)
+DW_OP (DW_OP_reg24, 0x68)
+DW_OP (DW_OP_reg25, 0x69)
+DW_OP (DW_OP_reg26, 0x6a)
+DW_OP (DW_OP_reg27, 0x6b)
+DW_OP (DW_OP_reg28, 0x6c)
+DW_OP (DW_OP_reg29, 0x6d)
+DW_OP (DW_OP_reg30, 0x6e)
+DW_OP (DW_OP_reg31, 0x6f)
+DW_OP (DW_OP_breg0, 0x70)
+DW_OP (DW_OP_breg1, 0x71)
+DW_OP (DW_OP_breg2, 0x72)
+DW_OP (DW_OP_breg3, 0x73)
+DW_OP (DW_OP_breg4, 0x74)
+DW_OP (DW_OP_breg5, 0x75)
+DW_OP (DW_OP_breg6, 0x76)
+DW_OP (DW_OP_breg7, 0x77)
+DW_OP (DW_OP_breg8, 0x78)
+DW_OP (DW_OP_breg9, 0x79)
+DW_OP (DW_OP_breg10, 0x7a)
+DW_OP (DW_OP_breg11, 0x7b)
+DW_OP (DW_OP_breg12, 0x7c)
+DW_OP (DW_OP_breg13, 0x7d)
+DW_OP (DW_OP_breg14, 0x7e)
+DW_OP (DW_OP_breg15, 0x7f)
+DW_OP (DW_OP_breg16, 0x80)
+DW_OP (DW_OP_breg17, 0x81)
+DW_OP (DW_OP_breg18, 0x82)
+DW_OP (DW_OP_breg19, 0x83)
+DW_OP (DW_OP_breg20, 0x84)
+DW_OP (DW_OP_breg21, 0x85)
+DW_OP (DW_OP_breg22, 0x86)
+DW_OP (DW_OP_breg23, 0x87)
+DW_OP (DW_OP_breg24, 0x88)
+DW_OP (DW_OP_breg25, 0x89)
+DW_OP (DW_OP_breg26, 0x8a)
+DW_OP (DW_OP_breg27, 0x8b)
+DW_OP (DW_OP_breg28, 0x8c)
+DW_OP (DW_OP_breg29, 0x8d)
+DW_OP (DW_OP_breg30, 0x8e)
+DW_OP (DW_OP_breg31, 0x8f)
+DW_OP (DW_OP_regx, 0x90)
+DW_OP (DW_OP_fbreg, 0x91)
+DW_OP (DW_OP_bregx, 0x92)
+DW_OP (DW_OP_piece, 0x93)
+DW_OP (DW_OP_deref_size, 0x94)
+DW_OP (DW_OP_xderef_size, 0x95)
+DW_OP (DW_OP_nop, 0x96)
+/* DWARF 3 extensions.  */
+DW_OP (DW_OP_push_object_address, 0x97)
+DW_OP (DW_OP_call2, 0x98)
+DW_OP (DW_OP_call4, 0x99)
+DW_OP (DW_OP_call_ref, 0x9a)
+DW_OP (DW_OP_form_tls_address, 0x9b)
+DW_OP (DW_OP_call_frame_cfa, 0x9c)
+DW_OP (DW_OP_bit_piece, 0x9d)
+
+/* DWARF 4 extensions.  */
+DW_OP (DW_OP_implicit_value, 0x9e)
+DW_OP (DW_OP_stack_value, 0x9f)
+
+/* DWARF 5 extensions.  */
+DW_OP (DW_OP_implicit_pointer, 0xa0)
+DW_OP (DW_OP_addrx, 0xa1)
+DW_OP (DW_OP_constx, 0xa2)
+DW_OP (DW_OP_entry_value, 0xa3)
+DW_OP (DW_OP_const_type, 0xa4)
+DW_OP (DW_OP_regval_type, 0xa5)
+DW_OP (DW_OP_deref_type, 0xa6)
+DW_OP (DW_OP_xderef_type, 0xa7)
+DW_OP (DW_OP_convert, 0xa8)
+DW_OP (DW_OP_reinterpret, 0xa9)
+
+DW_OP_DUP (DW_OP_lo_user, 0xe0)	/* Implementation-defined range start.  */
+DW_OP_DUP (DW_OP_hi_user, 0xff)	/* Implementation-defined range end.  */
+
+/* GNU extensions.  */
+DW_OP (DW_OP_GNU_push_tls_address, 0xe0)
+/* The following is for marking variables that are uninitialized.  */
+DW_OP (DW_OP_GNU_uninit, 0xf0)
+DW_OP (DW_OP_GNU_encoded_addr, 0xf1)
+/* The GNU implicit pointer extension.
+   See http://www.dwarfstd.org/ShowIssue.php?issue=100831.1&type=open .  */
+DW_OP (DW_OP_GNU_implicit_pointer, 0xf2)
+/* The GNU entry value extension.
+   See http://www.dwarfstd.org/ShowIssue.php?issue=100909.1&type=open .  */
+DW_OP (DW_OP_GNU_entry_value, 0xf3)
+/* The GNU typed stack extension.
+   See http://www.dwarfstd.org/doc/040408.1.html .  */
+DW_OP (DW_OP_GNU_const_type, 0xf4)
+DW_OP (DW_OP_GNU_regval_type, 0xf5)
+DW_OP (DW_OP_GNU_deref_type, 0xf6)
+DW_OP (DW_OP_GNU_convert, 0xf7)
+DW_OP (DW_OP_GNU_reinterpret, 0xf9)
+/* The GNU parameter ref extension.  */
+DW_OP (DW_OP_GNU_parameter_ref, 0xfa)
+/* Extensions for Fission.  See http://gcc.gnu.org/wiki/DebugFission.  */
+DW_OP (DW_OP_GNU_addr_index, 0xfb)
+DW_OP (DW_OP_GNU_const_index, 0xfc)
+/* HP extensions.  */
+DW_OP_DUP (DW_OP_HP_unknown, 0xe0) /* Ouch, the same as GNU_push_tls_address.  */
+DW_OP (DW_OP_HP_is_value, 0xe1)
+DW_OP (DW_OP_HP_fltconst4, 0xe2)
+DW_OP (DW_OP_HP_fltconst8, 0xe3)
+DW_OP (DW_OP_HP_mod_range, 0xe4)
+DW_OP (DW_OP_HP_unmod_range, 0xe5)
+DW_OP (DW_OP_HP_tls, 0xe6)
+/* PGI (STMicroelectronics) extensions.  */
+DW_OP (DW_OP_PGI_omp_thread_num, 0xf8)
+DW_END_OP
+
+DW_FIRST_ATE (DW_ATE_void, 0x0)
+DW_ATE (DW_ATE_address, 0x1)
+DW_ATE (DW_ATE_boolean, 0x2)
+DW_ATE (DW_ATE_complex_float, 0x3)
+DW_ATE (DW_ATE_float, 0x4)
+DW_ATE (DW_ATE_signed, 0x5)
+DW_ATE (DW_ATE_signed_char, 0x6)
+DW_ATE (DW_ATE_unsigned, 0x7)
+DW_ATE (DW_ATE_unsigned_char, 0x8)
+/* DWARF 3.  */
+DW_ATE (DW_ATE_imaginary_float, 0x9)
+DW_ATE (DW_ATE_packed_decimal, 0xa)
+DW_ATE (DW_ATE_numeric_string, 0xb)
+DW_ATE (DW_ATE_edited, 0xc)
+DW_ATE (DW_ATE_signed_fixed, 0xd)
+DW_ATE (DW_ATE_unsigned_fixed, 0xe)
+DW_ATE (DW_ATE_decimal_float, 0xf)
+/* DWARF 4.  */
+DW_ATE (DW_ATE_UTF, 0x10)
+/* DWARF 5.  */
+DW_ATE (DW_ATE_UCS, 0x11)
+DW_ATE (DW_ATE_ASCII, 0x12)
+
+DW_ATE_DUP (DW_ATE_lo_user, 0x80)
+DW_ATE_DUP (DW_ATE_hi_user, 0xff)
+
+/* HP extensions.  */
+DW_ATE (DW_ATE_HP_float80, 0x80) /* Floating-point (80 bit).  */
+DW_ATE (DW_ATE_HP_complex_float80, 0x81) /* Complex floating-point (80 bit).  */
+DW_ATE (DW_ATE_HP_float128, 0x82) /* Floating-point (128 bit).  */
+DW_ATE (DW_ATE_HP_complex_float128, 0x83) /* Complex fp (128 bit).  */
+DW_ATE (DW_ATE_HP_floathpintel, 0x84) /* Floating-point (82 bit IA64).  */
+DW_ATE (DW_ATE_HP_imaginary_float80, 0x85)
+DW_ATE (DW_ATE_HP_imaginary_float128, 0x86)
+DW_ATE (DW_ATE_HP_VAX_float, 0x88) /* F or G floating.  */
+DW_ATE (DW_ATE_HP_VAX_float_d, 0x89) /* D floating.  */
+DW_ATE (DW_ATE_HP_packed_decimal, 0x8a) /* Cobol.  */
+DW_ATE (DW_ATE_HP_zoned_decimal, 0x8b) /* Cobol.  */
+DW_ATE (DW_ATE_HP_edited, 0x8c) /* Cobol.  */
+DW_ATE (DW_ATE_HP_signed_fixed, 0x8d) /* Cobol.  */
+DW_ATE (DW_ATE_HP_unsigned_fixed, 0x8e) /* Cobol.  */
+DW_ATE (DW_ATE_HP_VAX_complex_float, 0x8f) /* F or G floating complex.  */
+DW_ATE (DW_ATE_HP_VAX_complex_float_d, 0x90) /* D floating complex.  */
+
+DW_END_ATE
+
+DW_FIRST_CFA (DW_CFA_advance_loc, 0x40)
+DW_CFA (DW_CFA_offset, 0x80)
+DW_CFA (DW_CFA_restore, 0xc0)
+DW_CFA (DW_CFA_nop, 0x00)
+DW_CFA (DW_CFA_set_loc, 0x01)
+DW_CFA (DW_CFA_advance_loc1, 0x02)
+DW_CFA (DW_CFA_advance_loc2, 0x03)
+DW_CFA (DW_CFA_advance_loc4, 0x04)
+DW_CFA (DW_CFA_offset_extended, 0x05)
+DW_CFA (DW_CFA_restore_extended, 0x06)
+DW_CFA (DW_CFA_undefined, 0x07)
+DW_CFA (DW_CFA_same_value, 0x08)
+DW_CFA (DW_CFA_register, 0x09)
+DW_CFA (DW_CFA_remember_state, 0x0a)
+DW_CFA (DW_CFA_restore_state, 0x0b)
+DW_CFA (DW_CFA_def_cfa, 0x0c)
+DW_CFA (DW_CFA_def_cfa_register, 0x0d)
+DW_CFA (DW_CFA_def_cfa_offset, 0x0e)
+/* DWARF 3.  */
+DW_CFA (DW_CFA_def_cfa_expression, 0x0f)
+DW_CFA (DW_CFA_expression, 0x10)
+DW_CFA (DW_CFA_offset_extended_sf, 0x11)
+DW_CFA (DW_CFA_def_cfa_sf, 0x12)
+DW_CFA (DW_CFA_def_cfa_offset_sf, 0x13)
+DW_CFA (DW_CFA_val_offset, 0x14)
+DW_CFA (DW_CFA_val_offset_sf, 0x15)
+DW_CFA (DW_CFA_val_expression, 0x16)
+
+DW_CFA (DW_CFA_lo_user, 0x1c)
+DW_CFA (DW_CFA_hi_user, 0x3f)
+
+/* SGI/MIPS specific.  */
+DW_CFA (DW_CFA_MIPS_advance_loc8, 0x1d)
+/* GNU extensions.  */
+DW_CFA (DW_CFA_GNU_window_save, 0x2d)
+DW_CFA (DW_CFA_GNU_args_size, 0x2e)
+DW_CFA (DW_CFA_GNU_negative_offset_extended, 0x2f)
+
+DW_END_CFA
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/dwarf2.h
@@ -0,0 +1,531 @@
+/* Declarations and definitions of codes relating to the DWARF2 and
+   DWARF3 symbolic debugging information formats.
+   Copyright (C) 1992-2016 Free Software Foundation, Inc.
+
+   Written by Gary Funck (gary@intrepid.com) The Ada Joint Program
+   Office (AJPO), Florida State University and Silicon Graphics Inc.
+   provided support for this effort -- June 21, 1995.
+
+   Derived from the DWARF 1 implementation written by Ron Guilmette
+   (rfg@netcom.com), November 1990.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3, or (at your option) any later
+   version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file is derived from the DWARF specification (a public document)
+   Revision 2.0.0 (July 27, 1993) developed by the UNIX International
+   Programming Languages Special Interest Group (UI/PLSIG) and distributed
+   by UNIX International.  Copies of this specification are available from
+   UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.
+
+   This file also now contains definitions from the DWARF 3 specification
+   published Dec 20, 2005, available from: http://dwarf.freestandards.org.  */
+
+#ifndef _DWARF2_H
+#define _DWARF2_H
+
+#define DW_TAG(name, value) , name = value
+#define DW_TAG_DUP(name, value) , name = value
+#define DW_FORM(name, value) , name = value
+#define DW_AT(name, value) , name = value
+#define DW_AT_DUP(name, value) , name = value
+#define DW_OP(name, value) , name = value
+#define DW_OP_DUP(name, value) , name = value
+#define DW_ATE(name, value) , name = value
+#define DW_ATE_DUP(name, value) , name = value
+#define DW_CFA(name, value) , name = value
+
+#define DW_FIRST_TAG(name, value) enum dwarf_tag { \
+  name = value
+#define DW_END_TAG };
+#define DW_FIRST_FORM(name, value) enum dwarf_form { \
+  name = value
+#define DW_END_FORM };
+#define DW_FIRST_AT(name, value) enum dwarf_attribute { \
+  name = value
+#define DW_END_AT };
+#define DW_FIRST_OP(name, value) enum dwarf_location_atom { \
+  name = value
+#define DW_END_OP };
+#define DW_FIRST_ATE(name, value) enum dwarf_type { \
+  name = value
+#define DW_END_ATE };
+#define DW_FIRST_CFA(name, value) enum dwarf_call_frame_info { \
+  name = value
+#define DW_END_CFA };
+
+#include "dwarf2.def"
+
+#undef DW_FIRST_TAG
+#undef DW_END_TAG
+#undef DW_FIRST_FORM
+#undef DW_END_FORM
+#undef DW_FIRST_AT
+#undef DW_END_AT
+#undef DW_FIRST_OP
+#undef DW_END_OP
+#undef DW_FIRST_ATE
+#undef DW_END_ATE
+#undef DW_FIRST_CFA
+#undef DW_END_CFA
+
+#undef DW_TAG
+#undef DW_TAG_DUP
+#undef DW_FORM
+#undef DW_AT
+#undef DW_AT_DUP
+#undef DW_OP
+#undef DW_OP_DUP
+#undef DW_ATE
+#undef DW_ATE_DUP
+#undef DW_CFA
+
+/* Flag that tells whether entry has a child or not.  */
+#define DW_children_no   0
+#define	DW_children_yes  1
+
+#define DW_AT_stride_size   DW_AT_bit_stride  /* Note: The use of DW_AT_stride_size is deprecated.  */
+#define DW_AT_stride   DW_AT_byte_stride  /* Note: The use of DW_AT_stride is deprecated.  */
+
+/* Decimal sign encodings.  */
+enum dwarf_decimal_sign_encoding
+  {
+    /* DWARF 3.  */
+    DW_DS_unsigned = 0x01,
+    DW_DS_leading_overpunch = 0x02,
+    DW_DS_trailing_overpunch = 0x03,
+    DW_DS_leading_separate = 0x04,
+    DW_DS_trailing_separate = 0x05
+  };
+
+/* Endianity encodings.  */
+enum dwarf_endianity_encoding
+  {
+    /* DWARF 3.  */
+    DW_END_default = 0x00,
+    DW_END_big = 0x01,
+    DW_END_little = 0x02,
+
+    DW_END_lo_user = 0x40,
+    DW_END_hi_user = 0xff
+  };
+
+/* Array ordering names and codes.  */
+enum dwarf_array_dim_ordering
+  {
+    DW_ORD_row_major = 0,
+    DW_ORD_col_major = 1
+  };
+
+/* Access attribute.  */
+enum dwarf_access_attribute
+  {
+    DW_ACCESS_public = 1,
+    DW_ACCESS_protected = 2,
+    DW_ACCESS_private = 3
+  };
+
+/* Visibility.  */
+enum dwarf_visibility_attribute
+  {
+    DW_VIS_local = 1,
+    DW_VIS_exported = 2,
+    DW_VIS_qualified = 3
+  };
+
+/* Virtuality.  */
+enum dwarf_virtuality_attribute
+  {
+    DW_VIRTUALITY_none = 0,
+    DW_VIRTUALITY_virtual = 1,
+    DW_VIRTUALITY_pure_virtual = 2
+  };
+
+/* Case sensitivity.  */
+enum dwarf_id_case
+  {
+    DW_ID_case_sensitive = 0,
+    DW_ID_up_case = 1,
+    DW_ID_down_case = 2,
+    DW_ID_case_insensitive = 3
+  };
+
+/* Calling convention.  */
+enum dwarf_calling_convention
+  {
+    DW_CC_normal = 0x1,
+    DW_CC_program = 0x2,
+    DW_CC_nocall = 0x3,
+
+    /* DWARF 5.  */
+    DW_CC_pass_by_reference = 0x4,
+    DW_CC_pass_by_value = 0x5,
+
+    DW_CC_lo_user = 0x40,
+    DW_CC_hi_user = 0xff,
+
+    DW_CC_GNU_renesas_sh = 0x40,
+    DW_CC_GNU_borland_fastcall_i386 = 0x41,
+
+    /* This DW_CC_ value is not currently generated by any toolchain.  It is
+       used internally to GDB to indicate OpenCL C functions that have been
+       compiled with the IBM XL C for OpenCL compiler and use a non-platform
+       calling convention for passing OpenCL C vector types.  This value may
+       be changed freely as long as it does not conflict with any other DW_CC_
+       value defined here.  */
+    DW_CC_GDB_IBM_OpenCL = 0xff
+  };
+
+/* Inline attribute.  */
+enum dwarf_inline_attribute
+  {
+    DW_INL_not_inlined = 0,
+    DW_INL_inlined = 1,
+    DW_INL_declared_not_inlined = 2,
+    DW_INL_declared_inlined = 3
+  };
+
+/* Discriminant lists.  */
+enum dwarf_discrim_list
+  {
+    DW_DSC_label = 0,
+    DW_DSC_range = 1
+  };
+
+/* Line number opcodes.  */
+enum dwarf_line_number_ops
+  {
+    DW_LNS_extended_op = 0,
+    DW_LNS_copy = 1,
+    DW_LNS_advance_pc = 2,
+    DW_LNS_advance_line = 3,
+    DW_LNS_set_file = 4,
+    DW_LNS_set_column = 5,
+    DW_LNS_negate_stmt = 6,
+    DW_LNS_set_basic_block = 7,
+    DW_LNS_const_add_pc = 8,
+    DW_LNS_fixed_advance_pc = 9,
+    /* DWARF 3.  */
+    DW_LNS_set_prologue_end = 10,
+    DW_LNS_set_epilogue_begin = 11,
+    DW_LNS_set_isa = 12
+  };
+
+/* Line number extended opcodes.  */
+enum dwarf_line_number_x_ops
+  {
+    DW_LNE_end_sequence = 1,
+    DW_LNE_set_address = 2,
+    DW_LNE_define_file = 3,
+    DW_LNE_set_discriminator = 4,
+    /* HP extensions.  */
+    DW_LNE_HP_negate_is_UV_update      = 0x11,
+    DW_LNE_HP_push_context             = 0x12,
+    DW_LNE_HP_pop_context              = 0x13,
+    DW_LNE_HP_set_file_line_column     = 0x14,
+    DW_LNE_HP_set_routine_name         = 0x15,
+    DW_LNE_HP_set_sequence             = 0x16,
+    DW_LNE_HP_negate_post_semantics    = 0x17,
+    DW_LNE_HP_negate_function_exit     = 0x18,
+    DW_LNE_HP_negate_front_end_logical = 0x19,
+    DW_LNE_HP_define_proc              = 0x20,
+    DW_LNE_HP_source_file_correlation  = 0x80,
+
+    DW_LNE_lo_user = 0x80,
+    DW_LNE_hi_user = 0xff
+  };
+
+/* Sub-opcodes for DW_LNE_HP_source_file_correlation.  */
+enum dwarf_line_number_hp_sfc_ops
+  {
+    DW_LNE_HP_SFC_formfeed = 1,
+    DW_LNE_HP_SFC_set_listing_line = 2,
+    DW_LNE_HP_SFC_associate = 3
+  };
+
+/* Content type codes in line table directory_entry_format
+   and file_name_entry_format sequences.  */
+enum dwarf_line_number_content_type
+  {
+    DW_LNCT_path = 0x1,
+    DW_LNCT_directory_index = 0x2,
+    DW_LNCT_timestamp = 0x3,
+    DW_LNCT_size = 0x4,
+    DW_LNCT_MD5 = 0x5,
+    DW_LNCT_lo_user = 0x2000,
+    DW_LNCT_hi_user = 0x3fff
+  };
+
+/* Type codes for location list entries.  */
+enum dwarf_location_list_entry_type
+  {
+    DW_LLE_end_of_list = 0x00,
+    DW_LLE_base_addressx = 0x01,
+    DW_LLE_startx_endx = 0x02,
+    DW_LLE_startx_length = 0x03,
+    DW_LLE_offset_pair = 0x04,
+    DW_LLE_default_location = 0x05,
+    DW_LLE_base_address = 0x06,
+    DW_LLE_start_end = 0x07,
+    DW_LLE_start_length = 0x08,
+
+    /* Former extension for Fission.
+       See http://gcc.gnu.org/wiki/DebugFission.  */
+    DW_LLE_GNU_end_of_list_entry = 0x00,
+    DW_LLE_GNU_base_address_selection_entry = 0x01,
+    DW_LLE_GNU_start_end_entry = 0x02,
+    DW_LLE_GNU_start_length_entry = 0x03
+  };
+
+#define DW_CIE_ID	  0xffffffff
+#define DW64_CIE_ID	  0xffffffffffffffffULL
+#define DW_CIE_VERSION	  1
+
+#define DW_CFA_extended   0
+
+#define DW_CHILDREN_no		     0x00
+#define DW_CHILDREN_yes		     0x01
+
+#define DW_ADDR_none		0
+
+/* Source language names and codes.  */
+enum dwarf_source_language
+  {
+    DW_LANG_C89 = 0x0001,
+    DW_LANG_C = 0x0002,
+    DW_LANG_Ada83 = 0x0003,
+    DW_LANG_C_plus_plus = 0x0004,
+    DW_LANG_Cobol74 = 0x0005,
+    DW_LANG_Cobol85 = 0x0006,
+    DW_LANG_Fortran77 = 0x0007,
+    DW_LANG_Fortran90 = 0x0008,
+    DW_LANG_Pascal83 = 0x0009,
+    DW_LANG_Modula2 = 0x000a,
+    /* DWARF 3.  */
+    DW_LANG_Java = 0x000b,
+    DW_LANG_C99 = 0x000c,
+    DW_LANG_Ada95 = 0x000d,
+    DW_LANG_Fortran95 = 0x000e,
+    DW_LANG_PLI = 0x000f,
+    DW_LANG_ObjC = 0x0010,
+    DW_LANG_ObjC_plus_plus = 0x0011,
+    DW_LANG_UPC = 0x0012,
+    DW_LANG_D = 0x0013,
+    /* DWARF 4.  */
+    DW_LANG_Python = 0x0014,
+    /* DWARF 5.  */
+    DW_LANG_OpenCL = 0x0015,
+    DW_LANG_Go = 0x0016,
+    DW_LANG_Modula3 = 0x0017,
+    DW_LANG_Haskell = 0x0018,
+    DW_LANG_C_plus_plus_03 = 0x0019,
+    DW_LANG_C_plus_plus_11 = 0x001a,
+    DW_LANG_OCaml = 0x001b,
+    DW_LANG_Rust = 0x001c,
+    DW_LANG_C11 = 0x001d,
+    DW_LANG_Swift = 0x001e,
+    DW_LANG_Julia = 0x001f,
+    DW_LANG_Dylan = 0x0020,
+    DW_LANG_C_plus_plus_14 = 0x0021,
+    DW_LANG_Fortran03 = 0x0022,
+    DW_LANG_Fortran08 = 0x0023,
+    DW_LANG_RenderScript = 0x0024,
+
+    DW_LANG_lo_user = 0x8000,	/* Implementation-defined range start.  */
+    DW_LANG_hi_user = 0xffff,	/* Implementation-defined range start.  */
+
+    /* MIPS.  */
+    DW_LANG_Mips_Assembler = 0x8001,
+    /* UPC.  */
+    DW_LANG_Upc = 0x8765,
+    /* HP extensions.  */
+    DW_LANG_HP_Bliss     = 0x8003,
+    DW_LANG_HP_Basic91   = 0x8004,
+    DW_LANG_HP_Pascal91  = 0x8005,
+    DW_LANG_HP_IMacro    = 0x8006,
+    DW_LANG_HP_Assembler = 0x8007,
+
+    /* Rust extension, but replaced in DWARF 5.  */
+    DW_LANG_Rust_old = 0x9000
+  };
+
+/* Names and codes for macro information.  */
+enum dwarf_macinfo_record_type
+  {
+    DW_MACINFO_define = 1,
+    DW_MACINFO_undef = 2,
+    DW_MACINFO_start_file = 3,
+    DW_MACINFO_end_file = 4,
+    DW_MACINFO_vendor_ext = 255
+  };
+
+/* DW_TAG_defaulted/DW_TAG_GNU_defaulted attributes.  */
+enum dwarf_defaulted_attribute
+  {
+    DW_DEFAULTED_no = 0x00,
+    DW_DEFAULTED_in_class = 0x01,
+    DW_DEFAULTED_out_of_class = 0x02
+  };
+
+/* Names and codes for new style macro information.  */
+enum dwarf_macro_record_type
+  {
+    DW_MACRO_define = 0x01,
+    DW_MACRO_undef = 0x02,
+    DW_MACRO_start_file = 0x03,
+    DW_MACRO_end_file = 0x04,
+    DW_MACRO_define_strp = 0x05,
+    DW_MACRO_undef_strp = 0x06,
+    DW_MACRO_import = 0x07,
+    DW_MACRO_define_sup = 0x08,
+    DW_MACRO_undef_sup = 0x09,
+    DW_MACRO_import_sup = 0x0a,
+    DW_MACRO_define_strx = 0x0b,
+    DW_MACRO_undef_strx = 0x0c,
+    DW_MACRO_lo_user = 0xe0,
+    DW_MACRO_hi_user = 0xff,
+
+    /* Compatibility macros for the GNU .debug_macro extension.  */
+    DW_MACRO_GNU_define = 0x01,
+    DW_MACRO_GNU_undef = 0x02,
+    DW_MACRO_GNU_start_file = 0x03,
+    DW_MACRO_GNU_end_file = 0x04,
+    DW_MACRO_GNU_define_indirect = 0x05,
+    DW_MACRO_GNU_undef_indirect = 0x06,
+    DW_MACRO_GNU_transparent_include = 0x07,
+    /* Extensions for DWZ multifile.
+       See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open .  */
+    DW_MACRO_GNU_define_indirect_alt = 0x08,
+    DW_MACRO_GNU_undef_indirect_alt = 0x09,
+    DW_MACRO_GNU_transparent_include_alt = 0x0a,
+    DW_MACRO_GNU_lo_user = 0xe0,
+    DW_MACRO_GNU_hi_user = 0xff
+  };
+
+/* Index attributes in the Abbreviations Table.  */
+enum dwarf_name_index_attribute
+  {
+    DW_IDX_compile_unit = 1,
+    DW_IDX_type_unit = 2,
+    DW_IDX_die_offset = 3,
+    DW_IDX_parent = 4,
+    DW_IDX_type_hash = 5,
+    DW_IDX_lo_user = 0x2000,
+    DW_IDX_hi_user = 0x3fff
+  };
+
+/* Range list entry kinds in .debug_rnglists* section.  */
+enum dwarf_range_list_entry
+  {
+    DW_RLE_end_of_list = 0x00,
+    DW_RLE_base_addressx = 0x01,
+    DW_RLE_startx_endx = 0x02,
+    DW_RLE_startx_length = 0x03,
+    DW_RLE_offset_pair = 0x04,
+    DW_RLE_base_address = 0x05,
+    DW_RLE_start_end = 0x06,
+    DW_RLE_start_length = 0x07
+  };
+
+/* Unit types in unit_type unit header field.  */
+enum dwarf_unit_type
+  {
+    DW_UT_compile = 0x01,
+    DW_UT_type = 0x02,
+    DW_UT_partial = 0x03,
+    DW_UT_skeleton = 0x04,
+    DW_UT_split_compile = 0x05,
+    DW_UT_split_type = 0x06,
+    DW_UT_lo_user = 0x80,
+    DW_UT_hi_user = 0xff
+  };
+
+/* @@@ For use with GNU frame unwind information.  */
+
+#define DW_EH_PE_absptr		0x00
+#define DW_EH_PE_omit		0xff
+
+#define DW_EH_PE_uleb128	0x01
+#define DW_EH_PE_udata2		0x02
+#define DW_EH_PE_udata4		0x03
+#define DW_EH_PE_udata8		0x04
+#define DW_EH_PE_sleb128	0x09
+#define DW_EH_PE_sdata2		0x0A
+#define DW_EH_PE_sdata4		0x0B
+#define DW_EH_PE_sdata8		0x0C
+#define DW_EH_PE_signed		0x08
+
+#define DW_EH_PE_pcrel		0x10
+#define DW_EH_PE_textrel	0x20
+#define DW_EH_PE_datarel	0x30
+#define DW_EH_PE_funcrel	0x40
+#define DW_EH_PE_aligned	0x50
+
+#define DW_EH_PE_indirect	0x80
+
+/* Codes for the debug sections in a dwarf package (.dwp) file.
+   Extensions for Fission.  See http://gcc.gnu.org/wiki/DebugFissionDWP.  */
+enum dwarf_sect
+  {
+    DW_SECT_INFO = 1,
+    DW_SECT_TYPES = 2,
+    DW_SECT_ABBREV = 3,
+    DW_SECT_LINE = 4,
+    DW_SECT_LOC = 5,
+    DW_SECT_STR_OFFSETS = 6,
+    DW_SECT_MACINFO = 7,
+    DW_SECT_MACRO = 8,
+    DW_SECT_MAX = 8
+  };
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Return the name of a DW_TAG_ constant, or NULL if the value is not
+   recognized.  */
+extern const char *get_DW_TAG_name (unsigned int tag);
+
+/* Return the name of a DW_AT_ constant, or NULL if the value is not
+   recognized.  */
+extern const char *get_DW_AT_name (unsigned int attr);
+
+/* Return the name of a DW_FORM_ constant, or NULL if the value is not
+   recognized.  */
+extern const char *get_DW_FORM_name (unsigned int form);
+
+/* Return the name of a DW_OP_ constant, or NULL if the value is not
+   recognized.  */
+extern const char *get_DW_OP_name (unsigned int op);
+
+/* Return the name of a DW_ATE_ constant, or NULL if the value is not
+   recognized.  */
+extern const char *get_DW_ATE_name (unsigned int enc);
+
+/* Return the name of a DW_CFA_ constant, or NULL if the value is not
+   recognized.  */
+extern const char *get_DW_CFA_name (unsigned int opc);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _DWARF2_H */
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/elf.c
@@ -0,0 +1,979 @@
+/* elf.c -- Get debug data from an ELF file for backtraces.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef HAVE_DL_ITERATE_PHDR
+#include <link.h>
+#endif
+
+#include "backtrace.h"
+#include "internal.h"
+
+#ifndef HAVE_DL_ITERATE_PHDR
+
+/* Dummy version of dl_iterate_phdr for systems that don't have it.  */
+
+#define dl_phdr_info x_dl_phdr_info
+#define dl_iterate_phdr x_dl_iterate_phdr
+
+struct dl_phdr_info
+{
+  uintptr_t dlpi_addr;
+  const char *dlpi_name;
+};
+
+static int
+dl_iterate_phdr (int (*callback) (struct dl_phdr_info *,
+				  size_t, void *) ATTRIBUTE_UNUSED,
+		 void *data ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+#endif /* ! defined (HAVE_DL_ITERATE_PHDR) */
+
+/* The configure script must tell us whether we are 32-bit or 64-bit
+   ELF.  We could make this code test and support either possibility,
+   but there is no point.  This code only works for the currently
+   running executable, which means that we know the ELF mode at
+   configure mode.  */
+
+#if BACKTRACE_ELF_SIZE != 32 && BACKTRACE_ELF_SIZE != 64
+#error "Unknown BACKTRACE_ELF_SIZE"
+#endif
+
+/* <link.h> might #include <elf.h> which might define our constants
+   with slightly different values.  Undefine them to be safe.  */
+
+#undef EI_NIDENT
+#undef EI_MAG0
+#undef EI_MAG1
+#undef EI_MAG2
+#undef EI_MAG3
+#undef EI_CLASS
+#undef EI_DATA
+#undef EI_VERSION
+#undef ELF_MAG0
+#undef ELF_MAG1
+#undef ELF_MAG2
+#undef ELF_MAG3
+#undef ELFCLASS32
+#undef ELFCLASS64
+#undef ELFDATA2LSB
+#undef ELFDATA2MSB
+#undef EV_CURRENT
+#undef ET_DYN
+#undef SHN_LORESERVE
+#undef SHN_XINDEX
+#undef SHN_UNDEF
+#undef SHT_SYMTAB
+#undef SHT_STRTAB
+#undef SHT_DYNSYM
+#undef STT_OBJECT
+#undef STT_FUNC
+
+/* Basic types.  */
+
+typedef uint16_t b_elf_half;    /* Elf_Half.  */
+typedef uint32_t b_elf_word;    /* Elf_Word.  */
+typedef int32_t  b_elf_sword;   /* Elf_Sword.  */
+
+#if BACKTRACE_ELF_SIZE == 32
+
+typedef uint32_t b_elf_addr;    /* Elf_Addr.  */
+typedef uint32_t b_elf_off;     /* Elf_Off.  */
+
+typedef uint32_t b_elf_wxword;  /* 32-bit Elf_Word, 64-bit ELF_Xword.  */
+
+#else
+
+typedef uint64_t b_elf_addr;    /* Elf_Addr.  */
+typedef uint64_t b_elf_off;     /* Elf_Off.  */
+typedef uint64_t b_elf_xword;   /* Elf_Xword.  */
+typedef int64_t  b_elf_sxword;  /* Elf_Sxword.  */
+
+typedef uint64_t b_elf_wxword;  /* 32-bit Elf_Word, 64-bit ELF_Xword.  */
+
+#endif
+
+/* Data structures and associated constants.  */
+
+#define EI_NIDENT 16
+
+typedef struct {
+  unsigned char	e_ident[EI_NIDENT];	/* ELF "magic number" */
+  b_elf_half	e_type;			/* Identifies object file type */
+  b_elf_half	e_machine;		/* Specifies required architecture */
+  b_elf_word	e_version;		/* Identifies object file version */
+  b_elf_addr	e_entry;		/* Entry point virtual address */
+  b_elf_off	e_phoff;		/* Program header table file offset */
+  b_elf_off	e_shoff;		/* Section header table file offset */
+  b_elf_word	e_flags;		/* Processor-specific flags */
+  b_elf_half	e_ehsize;		/* ELF header size in bytes */
+  b_elf_half	e_phentsize;		/* Program header table entry size */
+  b_elf_half	e_phnum;		/* Program header table entry count */
+  b_elf_half	e_shentsize;		/* Section header table entry size */
+  b_elf_half	e_shnum;		/* Section header table entry count */
+  b_elf_half	e_shstrndx;		/* Section header string table index */
+} b_elf_ehdr;  /* Elf_Ehdr.  */
+
+#define EI_MAG0 0
+#define EI_MAG1 1
+#define EI_MAG2 2
+#define EI_MAG3 3
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+
+#define ELFMAG0 0x7f
+#define ELFMAG1 'E'
+#define ELFMAG2 'L'
+#define ELFMAG3 'F'
+
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+
+#define EV_CURRENT 1
+
+#define ET_DYN 3
+
+typedef struct {
+  b_elf_word	sh_name;		/* Section name, index in string tbl */
+  b_elf_word	sh_type;		/* Type of section */
+  b_elf_wxword	sh_flags;		/* Miscellaneous section attributes */
+  b_elf_addr	sh_addr;		/* Section virtual addr at execution */
+  b_elf_off	sh_offset;		/* Section file offset */
+  b_elf_wxword	sh_size;		/* Size of section in bytes */
+  b_elf_word	sh_link;		/* Index of another section */
+  b_elf_word	sh_info;		/* Additional section information */
+  b_elf_wxword	sh_addralign;		/* Section alignment */
+  b_elf_wxword	sh_entsize;		/* Entry size if section holds table */
+} b_elf_shdr;  /* Elf_Shdr.  */
+
+#define SHN_UNDEF	0x0000		/* Undefined section */
+#define SHN_LORESERVE	0xFF00		/* Begin range of reserved indices */
+#define SHN_XINDEX	0xFFFF		/* Section index is held elsewhere */
+
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_DYNSYM 11
+
+#if BACKTRACE_ELF_SIZE == 32
+
+typedef struct
+{
+  b_elf_word	st_name;		/* Symbol name, index in string tbl */
+  b_elf_addr	st_value;		/* Symbol value */
+  b_elf_word	st_size;		/* Symbol size */
+  unsigned char	st_info;		/* Symbol binding and type */
+  unsigned char	st_other;		/* Visibility and other data */
+  b_elf_half	st_shndx;		/* Symbol section index */
+} b_elf_sym;  /* Elf_Sym.  */
+
+#else /* BACKTRACE_ELF_SIZE != 32 */
+
+typedef struct
+{
+  b_elf_word	st_name;		/* Symbol name, index in string tbl */
+  unsigned char	st_info;		/* Symbol binding and type */
+  unsigned char	st_other;		/* Visibility and other data */
+  b_elf_half	st_shndx;		/* Symbol section index */
+  b_elf_addr	st_value;		/* Symbol value */
+  b_elf_xword	st_size;		/* Symbol size */
+} b_elf_sym;  /* Elf_Sym.  */
+
+#endif /* BACKTRACE_ELF_SIZE != 32 */
+
+#define STT_OBJECT 1
+#define STT_FUNC 2
+
+/* An index of ELF sections we care about.  */
+
+enum debug_section
+{
+  DEBUG_INFO,
+  DEBUG_LINE,
+  DEBUG_ABBREV,
+  DEBUG_RANGES,
+  DEBUG_STR,
+  DEBUG_MAX
+};
+
+/* Names of sections, indexed by enum elf_section.  */
+
+static const char * const debug_section_names[DEBUG_MAX] =
+{
+  ".debug_info",
+  ".debug_line",
+  ".debug_abbrev",
+  ".debug_ranges",
+  ".debug_str"
+};
+
+/* Information we gather for the sections we care about.  */
+
+struct debug_section_info
+{
+  /* Section file offset.  */
+  off_t offset;
+  /* Section size.  */
+  size_t size;
+  /* Section contents, after read from file.  */
+  const unsigned char *data;
+};
+
+/* Information we keep for an ELF symbol.  */
+
+struct elf_symbol
+{
+  /* The name of the symbol.  */
+  const char *name;
+  /* The address of the symbol.  */
+  uintptr_t address;
+  /* The size of the symbol.  */
+  size_t size;
+};
+
+/* Information to pass to elf_syminfo.  */
+
+struct elf_syminfo_data
+{
+  /* Symbols for the next module.  */
+  struct elf_syminfo_data *next;
+  /* The ELF symbols, sorted by address.  */
+  struct elf_symbol *symbols;
+  /* The number of symbols.  */
+  size_t count;
+};
+
+/* A dummy callback function used when we can't find any debug info.  */
+
+static int
+elf_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
+	     uintptr_t pc ATTRIBUTE_UNUSED,
+	     backtrace_full_callback callback ATTRIBUTE_UNUSED,
+	     backtrace_error_callback error_callback, void *data)
+{
+  error_callback (data, "no debug info in ELF executable", -1);
+  return 0;
+}
+
+/* A dummy callback function used when we can't find a symbol
+   table.  */
+
+static void
+elf_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
+	    uintptr_t addr ATTRIBUTE_UNUSED,
+	    backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
+	    backtrace_error_callback error_callback, void *data)
+{
+  error_callback (data, "no symbol table in ELF executable", -1);
+}
+
+/* Compare struct elf_symbol for qsort.  */
+
+static int
+elf_symbol_compare (const void *v1, const void *v2)
+{
+  const struct elf_symbol *e1 = (const struct elf_symbol *) v1;
+  const struct elf_symbol *e2 = (const struct elf_symbol *) v2;
+
+  if (e1->address < e2->address)
+    return -1;
+  else if (e1->address > e2->address)
+    return 1;
+  else
+    return 0;
+}
+
+/* Compare an ADDR against an elf_symbol for bsearch.  We allocate one
+   extra entry in the array so that this can look safely at the next
+   entry.  */
+
+static int
+elf_symbol_search (const void *vkey, const void *ventry)
+{
+  const uintptr_t *key = (const uintptr_t *) vkey;
+  const struct elf_symbol *entry = (const struct elf_symbol *) ventry;
+  uintptr_t addr;
+
+  addr = *key;
+  if (addr < entry->address)
+    return -1;
+  else if (addr >= entry->address + entry->size)
+    return 1;
+  else
+    return 0;
+}
+
+/* Initialize the symbol table info for elf_syminfo.  */
+
+static int
+elf_initialize_syminfo (struct backtrace_state *state,
+			uintptr_t base_address,
+			const unsigned char *symtab_data, size_t symtab_size,
+			const unsigned char *strtab, size_t strtab_size,
+			backtrace_error_callback error_callback,
+			void *data, struct elf_syminfo_data *sdata)
+{
+  size_t sym_count;
+  const b_elf_sym *sym;
+  size_t elf_symbol_count;
+  size_t elf_symbol_size;
+  struct elf_symbol *elf_symbols;
+  size_t i;
+  unsigned int j;
+
+  sym_count = symtab_size / sizeof (b_elf_sym);
+
+  /* We only care about function symbols.  Count them.  */
+  sym = (const b_elf_sym *) symtab_data;
+  elf_symbol_count = 0;
+  for (i = 0; i < sym_count; ++i, ++sym)
+    {
+      int info;
+
+      info = sym->st_info & 0xf;
+      if ((info == STT_FUNC || info == STT_OBJECT)
+	  && sym->st_shndx != SHN_UNDEF)
+	++elf_symbol_count;
+    }
+
+  elf_symbol_size = elf_symbol_count * sizeof (struct elf_symbol);
+  elf_symbols = ((struct elf_symbol *)
+		 backtrace_alloc (state, elf_symbol_size, error_callback,
+				  data));
+  if (elf_symbols == NULL)
+    return 0;
+
+  sym = (const b_elf_sym *) symtab_data;
+  j = 0;
+  for (i = 0; i < sym_count; ++i, ++sym)
+    {
+      int info;
+
+      info = sym->st_info & 0xf;
+      if (info != STT_FUNC && info != STT_OBJECT)
+	continue;
+      if (sym->st_shndx == SHN_UNDEF)
+	continue;
+      if (sym->st_name >= strtab_size)
+	{
+	  error_callback (data, "symbol string index out of range", 0);
+	  backtrace_free (state, elf_symbols, elf_symbol_size, error_callback,
+			  data);
+	  return 0;
+	}
+      elf_symbols[j].name = (const char *) strtab + sym->st_name;
+      elf_symbols[j].address = sym->st_value + base_address;
+      elf_symbols[j].size = sym->st_size;
+      ++j;
+    }
+
+  backtrace_qsort (elf_symbols, elf_symbol_count, sizeof (struct elf_symbol),
+		   elf_symbol_compare);
+
+  sdata->next = NULL;
+  sdata->symbols = elf_symbols;
+  sdata->count = elf_symbol_count;
+
+  return 1;
+}
+
+/* Add EDATA to the list in STATE.  */
+
+static void
+elf_add_syminfo_data (struct backtrace_state *state,
+		      struct elf_syminfo_data *edata)
+{
+  if (!state->threaded)
+    {
+      struct elf_syminfo_data **pp;
+
+      for (pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
+	   *pp != NULL;
+	   pp = &(*pp)->next)
+	;
+      *pp = edata;
+    }
+  else
+    {
+      while (1)
+	{
+	  struct elf_syminfo_data **pp;
+
+	  pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
+
+	  while (1)
+	    {
+	      struct elf_syminfo_data *p;
+
+	      p = backtrace_atomic_load_pointer (pp);
+
+	      if (p == NULL)
+		break;
+
+	      pp = &p->next;
+	    }
+
+	  if (__sync_bool_compare_and_swap (pp, NULL, edata))
+	    break;
+	}
+    }
+}
+
+/* Return the symbol name and value for an ADDR.  */
+
+static void
+elf_syminfo (struct backtrace_state *state, uintptr_t addr,
+	     backtrace_syminfo_callback callback,
+	     backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+	     void *data)
+{
+  struct elf_syminfo_data *edata;
+  struct elf_symbol *sym = NULL;
+
+  if (!state->threaded)
+    {
+      for (edata = (struct elf_syminfo_data *) state->syminfo_data;
+	   edata != NULL;
+	   edata = edata->next)
+	{
+	  sym = ((struct elf_symbol *)
+		 bsearch (&addr, edata->symbols, edata->count,
+			  sizeof (struct elf_symbol), elf_symbol_search));
+	  if (sym != NULL)
+	    break;
+	}
+    }
+  else
+    {
+      struct elf_syminfo_data **pp;
+
+      pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
+      while (1)
+	{
+	  edata = backtrace_atomic_load_pointer (pp);
+	  if (edata == NULL)
+	    break;
+
+	  sym = ((struct elf_symbol *)
+		 bsearch (&addr, edata->symbols, edata->count,
+			  sizeof (struct elf_symbol), elf_symbol_search));
+	  if (sym != NULL)
+	    break;
+
+	  pp = &edata->next;
+	}
+    }
+
+  if (sym == NULL)
+    callback (data, addr, NULL, 0, 0);
+  else
+    callback (data, addr, sym->name, sym->address, sym->size);
+}
+
+/* Add the backtrace data for one ELF file.  Returns 1 on success,
+   0 on failure (in both cases descriptor is closed) or -1 if exe
+   is non-zero and the ELF file is ET_DYN, which tells the caller that
+   elf_add will need to be called on the descriptor again after
+   base_address is determined.  */
+
+static int
+elf_add (struct backtrace_state *state, int descriptor, uintptr_t base_address,
+	 backtrace_error_callback error_callback, void *data,
+	 fileline *fileline_fn, int *found_sym, int *found_dwarf, int exe)
+{
+  struct backtrace_view ehdr_view;
+  b_elf_ehdr ehdr;
+  off_t shoff;
+  unsigned int shnum;
+  unsigned int shstrndx;
+  struct backtrace_view shdrs_view;
+  int shdrs_view_valid;
+  const b_elf_shdr *shdrs;
+  const b_elf_shdr *shstrhdr;
+  size_t shstr_size;
+  off_t shstr_off;
+  struct backtrace_view names_view;
+  int names_view_valid;
+  const char *names;
+  unsigned int symtab_shndx;
+  unsigned int dynsym_shndx;
+  unsigned int i;
+  struct debug_section_info sections[DEBUG_MAX];
+  struct backtrace_view symtab_view;
+  int symtab_view_valid;
+  struct backtrace_view strtab_view;
+  int strtab_view_valid;
+  off_t min_offset;
+  off_t max_offset;
+  struct backtrace_view debug_view;
+  int debug_view_valid;
+
+  *found_sym = 0;
+  *found_dwarf = 0;
+
+  shdrs_view_valid = 0;
+  names_view_valid = 0;
+  symtab_view_valid = 0;
+  strtab_view_valid = 0;
+  debug_view_valid = 0;
+
+  if (!backtrace_get_view (state, descriptor, 0, sizeof ehdr, error_callback,
+			   data, &ehdr_view))
+    goto fail;
+
+  memcpy (&ehdr, ehdr_view.data, sizeof ehdr);
+
+  backtrace_release_view (state, &ehdr_view, error_callback, data);
+
+  if (ehdr.e_ident[EI_MAG0] != ELFMAG0
+      || ehdr.e_ident[EI_MAG1] != ELFMAG1
+      || ehdr.e_ident[EI_MAG2] != ELFMAG2
+      || ehdr.e_ident[EI_MAG3] != ELFMAG3)
+    {
+      error_callback (data, "executable file is not ELF", 0);
+      goto fail;
+    }
+  if (ehdr.e_ident[EI_VERSION] != EV_CURRENT)
+    {
+      error_callback (data, "executable file is unrecognized ELF version", 0);
+      goto fail;
+    }
+
+#if BACKTRACE_ELF_SIZE == 32
+#define BACKTRACE_ELFCLASS ELFCLASS32
+#else
+#define BACKTRACE_ELFCLASS ELFCLASS64
+#endif
+
+  if (ehdr.e_ident[EI_CLASS] != BACKTRACE_ELFCLASS)
+    {
+      error_callback (data, "executable file is unexpected ELF class", 0);
+      goto fail;
+    }
+
+  if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB
+      && ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
+    {
+      error_callback (data, "executable file has unknown endianness", 0);
+      goto fail;
+    }
+
+  /* If the executable is ET_DYN, it is either a PIE, or we are running
+     directly a shared library with .interp.  We need to wait for
+     dl_iterate_phdr in that case to determine the actual base_address.  */
+  if (exe && ehdr.e_type == ET_DYN)
+    return -1;
+
+  shoff = ehdr.e_shoff;
+  shnum = ehdr.e_shnum;
+  shstrndx = ehdr.e_shstrndx;
+
+  if ((shnum == 0 || shstrndx == SHN_XINDEX)
+      && shoff != 0)
+    {
+      struct backtrace_view shdr_view;
+      const b_elf_shdr *shdr;
+
+      if (!backtrace_get_view (state, descriptor, shoff, sizeof shdr,
+			       error_callback, data, &shdr_view))
+	goto fail;
+
+      shdr = (const b_elf_shdr *) shdr_view.data;
+
+      if (shnum == 0)
+	shnum = shdr->sh_size;
+
+      if (shstrndx == SHN_XINDEX)
+	{
+	  shstrndx = shdr->sh_link;
+
+	  /* Versions of the GNU binutils between 2.12 and 2.18 did
+	     not handle objects with more than SHN_LORESERVE sections
+	     correctly.  All large section indexes were offset by
+	     0x100.  There is more information at
+	     http://sourceware.org/bugzilla/show_bug.cgi?id-5900 .
+	     Fortunately these object files are easy to detect, as the
+	     GNU binutils always put the section header string table
+	     near the end of the list of sections.  Thus if the
+	     section header string table index is larger than the
+	     number of sections, then we know we have to subtract
+	     0x100 to get the real section index.  */
+	  if (shstrndx >= shnum && shstrndx >= SHN_LORESERVE + 0x100)
+	    shstrndx -= 0x100;
+	}
+
+      backtrace_release_view (state, &shdr_view, error_callback, data);
+    }
+
+  /* To translate PC to file/line when using DWARF, we need to find
+     the .debug_info and .debug_line sections.  */
+
+  /* Read the section headers, skipping the first one.  */
+
+  if (!backtrace_get_view (state, descriptor, shoff + sizeof (b_elf_shdr),
+			   (shnum - 1) * sizeof (b_elf_shdr),
+			   error_callback, data, &shdrs_view))
+    goto fail;
+  shdrs_view_valid = 1;
+  shdrs = (const b_elf_shdr *) shdrs_view.data;
+
+  /* Read the section names.  */
+
+  shstrhdr = &shdrs[shstrndx - 1];
+  shstr_size = shstrhdr->sh_size;
+  shstr_off = shstrhdr->sh_offset;
+
+  if (!backtrace_get_view (state, descriptor, shstr_off, shstr_size,
+			   error_callback, data, &names_view))
+    goto fail;
+  names_view_valid = 1;
+  names = (const char *) names_view.data;
+
+  symtab_shndx = 0;
+  dynsym_shndx = 0;
+
+  memset (sections, 0, sizeof sections);
+
+  /* Look for the symbol table.  */
+  for (i = 1; i < shnum; ++i)
+    {
+      const b_elf_shdr *shdr;
+      unsigned int sh_name;
+      const char *name;
+      int j;
+
+      shdr = &shdrs[i - 1];
+
+      if (shdr->sh_type == SHT_SYMTAB)
+	symtab_shndx = i;
+      else if (shdr->sh_type == SHT_DYNSYM)
+	dynsym_shndx = i;
+
+      sh_name = shdr->sh_name;
+      if (sh_name >= shstr_size)
+	{
+	  error_callback (data, "ELF section name out of range", 0);
+	  goto fail;
+	}
+
+      name = names + sh_name;
+
+      for (j = 0; j < (int) DEBUG_MAX; ++j)
+	{
+	  if (strcmp (name, debug_section_names[j]) == 0)
+	    {
+	      sections[j].offset = shdr->sh_offset;
+	      sections[j].size = shdr->sh_size;
+	      break;
+	    }
+	}
+    }
+
+  if (symtab_shndx == 0)
+    symtab_shndx = dynsym_shndx;
+  if (symtab_shndx != 0)
+    {
+      const b_elf_shdr *symtab_shdr;
+      unsigned int strtab_shndx;
+      const b_elf_shdr *strtab_shdr;
+      struct elf_syminfo_data *sdata;
+
+      symtab_shdr = &shdrs[symtab_shndx - 1];
+      strtab_shndx = symtab_shdr->sh_link;
+      if (strtab_shndx >= shnum)
+	{
+	  error_callback (data,
+			  "ELF symbol table strtab link out of range", 0);
+	  goto fail;
+	}
+      strtab_shdr = &shdrs[strtab_shndx - 1];
+
+      if (!backtrace_get_view (state, descriptor, symtab_shdr->sh_offset,
+			       symtab_shdr->sh_size, error_callback, data,
+			       &symtab_view))
+	goto fail;
+      symtab_view_valid = 1;
+
+      if (!backtrace_get_view (state, descriptor, strtab_shdr->sh_offset,
+			       strtab_shdr->sh_size, error_callback, data,
+			       &strtab_view))
+	goto fail;
+      strtab_view_valid = 1;
+
+      sdata = ((struct elf_syminfo_data *)
+	       backtrace_alloc (state, sizeof *sdata, error_callback, data));
+      if (sdata == NULL)
+	goto fail;
+
+      if (!elf_initialize_syminfo (state, base_address,
+				   symtab_view.data, symtab_shdr->sh_size,
+				   strtab_view.data, strtab_shdr->sh_size,
+				   error_callback, data, sdata))
+	{
+	  backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
+	  goto fail;
+	}
+
+      /* We no longer need the symbol table, but we hold on to the
+	 string table permanently.  */
+      backtrace_release_view (state, &symtab_view, error_callback, data);
+
+      *found_sym = 1;
+
+      elf_add_syminfo_data (state, sdata);
+    }
+
+  /* FIXME: Need to handle compressed debug sections.  */
+
+  backtrace_release_view (state, &shdrs_view, error_callback, data);
+  shdrs_view_valid = 0;
+  backtrace_release_view (state, &names_view, error_callback, data);
+  names_view_valid = 0;
+
+  /* Read all the debug sections in a single view, since they are
+     probably adjacent in the file.  We never release this view.  */
+
+  min_offset = 0;
+  max_offset = 0;
+  for (i = 0; i < (int) DEBUG_MAX; ++i)
+    {
+      off_t end;
+
+      if (sections[i].size == 0)
+	continue;
+      if (min_offset == 0 || sections[i].offset < min_offset)
+	min_offset = sections[i].offset;
+      end = sections[i].offset + sections[i].size;
+      if (end > max_offset)
+	max_offset = end;
+    }
+  if (min_offset == 0 || max_offset == 0)
+    {
+      if (!backtrace_close (descriptor, error_callback, data))
+	goto fail;
+      return 1;
+    }
+
+  if (!backtrace_get_view (state, descriptor, min_offset,
+			   max_offset - min_offset,
+			   error_callback, data, &debug_view))
+    goto fail;
+  debug_view_valid = 1;
+
+  /* We've read all we need from the executable.  */
+  if (!backtrace_close (descriptor, error_callback, data))
+    goto fail;
+  descriptor = -1;
+
+  for (i = 0; i < (int) DEBUG_MAX; ++i)
+    {
+      if (sections[i].size == 0)
+	sections[i].data = NULL;
+      else
+	sections[i].data = ((const unsigned char *) debug_view.data
+			    + (sections[i].offset - min_offset));
+    }
+
+  if (!backtrace_dwarf_add (state, base_address,
+			    sections[DEBUG_INFO].data,
+			    sections[DEBUG_INFO].size,
+			    sections[DEBUG_LINE].data,
+			    sections[DEBUG_LINE].size,
+			    sections[DEBUG_ABBREV].data,
+			    sections[DEBUG_ABBREV].size,
+			    sections[DEBUG_RANGES].data,
+			    sections[DEBUG_RANGES].size,
+			    sections[DEBUG_STR].data,
+			    sections[DEBUG_STR].size,
+			    ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
+			    error_callback, data, fileline_fn))
+    goto fail;
+
+  *found_dwarf = 1;
+
+  return 1;
+
+ fail:
+  if (shdrs_view_valid)
+    backtrace_release_view (state, &shdrs_view, error_callback, data);
+  if (names_view_valid)
+    backtrace_release_view (state, &names_view, error_callback, data);
+  if (symtab_view_valid)
+    backtrace_release_view (state, &symtab_view, error_callback, data);
+  if (strtab_view_valid)
+    backtrace_release_view (state, &strtab_view, error_callback, data);
+  if (debug_view_valid)
+    backtrace_release_view (state, &debug_view, error_callback, data);
+  if (descriptor != -1)
+    backtrace_close (descriptor, error_callback, data);
+  return 0;
+}
+
+/* Data passed to phdr_callback.  */
+
+struct phdr_data
+{
+  struct backtrace_state *state;
+  backtrace_error_callback error_callback;
+  void *data;
+  fileline *fileline_fn;
+  int *found_sym;
+  int *found_dwarf;
+  int exe_descriptor;
+};
+
+/* Callback passed to dl_iterate_phdr.  Load debug info from shared
+   libraries.  */
+
+static int
+#ifdef __i386__
+__attribute__ ((__force_align_arg_pointer__))
+#endif
+phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
+	       void *pdata)
+{
+  struct phdr_data *pd = (struct phdr_data *) pdata;
+  int descriptor;
+  int does_not_exist;
+  fileline elf_fileline_fn;
+  int found_dwarf;
+
+  /* There is not much we can do if we don't have the module name,
+     unless executable is ET_DYN, where we expect the very first
+     phdr_callback to be for the PIE.  */
+  if (info->dlpi_name == NULL || info->dlpi_name[0] == '\0')
+    {
+      if (pd->exe_descriptor == -1)
+	return 0;
+      descriptor = pd->exe_descriptor;
+      pd->exe_descriptor = -1;
+    }
+  else
+    {
+      if (pd->exe_descriptor != -1)
+	{
+	  backtrace_close (pd->exe_descriptor, pd->error_callback, pd->data);
+	  pd->exe_descriptor = -1;
+	}
+
+      descriptor = backtrace_open (info->dlpi_name, pd->error_callback,
+				   pd->data, &does_not_exist);
+      if (descriptor < 0)
+	return 0;
+    }
+
+  if (elf_add (pd->state, descriptor, info->dlpi_addr, pd->error_callback,
+	       pd->data, &elf_fileline_fn, pd->found_sym, &found_dwarf, 0))
+    {
+      if (found_dwarf)
+	{
+	  *pd->found_dwarf = 1;
+	  *pd->fileline_fn = elf_fileline_fn;
+	}
+    }
+
+  return 0;
+}
+
+/* Initialize the backtrace data we need from an ELF executable.  At
+   the ELF level, all we need to do is find the debug info
+   sections.  */
+
+int
+backtrace_initialize (struct backtrace_state *state, int descriptor,
+		      backtrace_error_callback error_callback,
+		      void *data, fileline *fileline_fn)
+{
+  int ret;
+  int found_sym;
+  int found_dwarf;
+  fileline elf_fileline_fn = elf_nodebug;
+  struct phdr_data pd;
+
+  ret = elf_add (state, descriptor, 0, error_callback, data, &elf_fileline_fn,
+		 &found_sym, &found_dwarf, 1);
+  if (!ret)
+    return 0;
+
+  pd.state = state;
+  pd.error_callback = error_callback;
+  pd.data = data;
+  pd.fileline_fn = &elf_fileline_fn;
+  pd.found_sym = &found_sym;
+  pd.found_dwarf = &found_dwarf;
+  pd.exe_descriptor = ret < 0 ? descriptor : -1;
+
+  dl_iterate_phdr (phdr_callback, (void *) &pd);
+
+  if (!state->threaded)
+    {
+      if (found_sym)
+	state->syminfo_fn = elf_syminfo;
+      else if (state->syminfo_fn == NULL)
+	state->syminfo_fn = elf_nosyms;
+    }
+  else
+    {
+      if (found_sym)
+	backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
+      else
+	(void) __sync_bool_compare_and_swap (&state->syminfo_fn, NULL,
+					     elf_nosyms);
+    }
+
+  if (!state->threaded)
+    {
+      if (state->fileline_fn == NULL || state->fileline_fn == elf_nodebug)
+	*fileline_fn = elf_fileline_fn;
+    }
+  else
+    {
+      fileline current_fn;
+
+      current_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
+      if (current_fn == NULL || current_fn == elf_nodebug)
+	*fileline_fn = elf_fileline_fn;
+    }
+
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/fileline.c
@@ -0,0 +1,194 @@
+/* fileline.c -- Get file and line number information in a backtrace.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+#ifndef HAVE_GETEXECNAME
+#define getexecname() NULL
+#endif
+
+/* Initialize the fileline information from the executable.  Returns 1
+   on success, 0 on failure.  */
+
+static int
+fileline_initialize (struct backtrace_state *state,
+		     backtrace_error_callback error_callback, void *data)
+{
+  int failed;
+  fileline fileline_fn;
+  int pass;
+  int called_error_callback;
+  int descriptor;
+
+  if (!state->threaded)
+    failed = state->fileline_initialization_failed;
+  else
+    failed = backtrace_atomic_load_int (&state->fileline_initialization_failed);
+
+  if (failed)
+    {
+      error_callback (data, "failed to read executable information", -1);
+      return 0;
+    }
+
+  if (!state->threaded)
+    fileline_fn = state->fileline_fn;
+  else
+    fileline_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
+  if (fileline_fn != NULL)
+    return 1;
+
+  /* We have not initialized the information.  Do it now.  */
+
+  descriptor = -1;
+  called_error_callback = 0;
+  for (pass = 0; pass < 4; ++pass)
+    {
+      const char *filename;
+      int does_not_exist;
+
+      switch (pass)
+	{
+	case 0:
+	  filename = state->filename;
+	  break;
+	case 1:
+	  filename = getexecname ();
+	  break;
+	case 2:
+	  filename = "/proc/self/exe";
+	  break;
+	case 3:
+	  filename = "/proc/curproc/file";
+	  break;
+	default:
+	  abort ();
+	}
+
+      if (filename == NULL)
+	continue;
+
+      descriptor = backtrace_open (filename, error_callback, data,
+				   &does_not_exist);
+      if (descriptor < 0 && !does_not_exist)
+	{
+	  called_error_callback = 1;
+	  break;
+	}
+      if (descriptor >= 0)
+	break;
+    }
+
+  if (descriptor < 0)
+    {
+      if (!called_error_callback)
+	{
+	  if (state->filename != NULL)
+	    error_callback (data, state->filename, ENOENT);
+	  else
+	    error_callback (data,
+			    "libbacktrace could not find executable to open",
+			    0);
+	}
+      failed = 1;
+    }
+
+  if (!failed)
+    {
+      if (!backtrace_initialize (state, descriptor, error_callback, data,
+				 &fileline_fn))
+	failed = 1;
+    }
+
+  if (failed)
+    {
+      if (!state->threaded)
+	state->fileline_initialization_failed = 1;
+      else
+	backtrace_atomic_store_int (&state->fileline_initialization_failed, 1);
+      return 0;
+    }
+
+  if (!state->threaded)
+    state->fileline_fn = fileline_fn;
+  else
+    {
+      backtrace_atomic_store_pointer (&state->fileline_fn, fileline_fn);
+
+      /* Note that if two threads initialize at once, one of the data
+	 sets may be leaked.  */
+    }
+
+  return 1;
+}
+
+/* Given a PC, find the file name, line number, and function name.  */
+
+int
+backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
+		  backtrace_full_callback callback,
+		  backtrace_error_callback error_callback, void *data)
+{
+  if (!fileline_initialize (state, error_callback, data))
+    return 0;
+
+  if (state->fileline_initialization_failed)
+    return 0;
+
+  return state->fileline_fn (state, pc, callback, error_callback, data);
+}
+
+/* Given a PC, find the symbol for it, and its value.  */
+
+int
+backtrace_syminfo (struct backtrace_state *state, uintptr_t pc,
+		   backtrace_syminfo_callback callback,
+		   backtrace_error_callback error_callback, void *data)
+{
+  if (!fileline_initialize (state, error_callback, data))
+    return 0;
+
+  if (state->fileline_initialization_failed)
+    return 0;
+
+  state->syminfo_fn (state, pc, callback, error_callback, data);
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/filenames.h
@@ -0,0 +1,99 @@
+/* Macros for taking apart, interpreting and processing file names.
+
+   These are here because some non-Posix (a.k.a. DOSish) systems have
+   drive letter brain-damage at the beginning of an absolute file name,
+   use forward- and back-slash in path names interchangeably, and
+   some of them have case-insensitive file names.
+
+   Copyright (C) 2000-2015 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef FILENAMES_H
+#define FILENAMES_H
+
+#include "hashtab.h" /* for hashval_t */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__)
+#  ifndef HAVE_DOS_BASED_FILE_SYSTEM
+#    define HAVE_DOS_BASED_FILE_SYSTEM 1
+#  endif
+#  ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM
+#    define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1
+#  endif
+#  define HAS_DRIVE_SPEC(f) HAS_DOS_DRIVE_SPEC (f)
+#  define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c)
+#  define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f)
+#else /* not DOSish */
+#  if defined(__APPLE__)
+#    ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM
+#      define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1
+#    endif
+#  endif /* __APPLE__ */
+#  define HAS_DRIVE_SPEC(f) (0)
+#  define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c)
+#  define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f)
+#endif
+
+#define IS_DIR_SEPARATOR_1(dos_based, c)				\
+  (((c) == '/')								\
+   || (((c) == '\\') && (dos_based)))
+
+#define HAS_DRIVE_SPEC_1(dos_based, f)			\
+  ((f)[0] && ((f)[1] == ':') && (dos_based))
+
+/* Remove the drive spec from F, assuming HAS_DRIVE_SPEC (f).
+   The result is a pointer to the remainder of F.  */
+#define STRIP_DRIVE_SPEC(f)	((f) + 2)
+
+#define IS_DOS_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (1, c)
+#define IS_DOS_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (1, f)
+#define HAS_DOS_DRIVE_SPEC(f) HAS_DRIVE_SPEC_1 (1, f)
+
+#define IS_UNIX_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (0, c)
+#define IS_UNIX_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (0, f)
+
+/* Note that when DOS_BASED is true, IS_ABSOLUTE_PATH accepts d:foo as
+   well, although it is only semi-absolute.  This is because the users
+   of IS_ABSOLUTE_PATH want to know whether to prepend the current
+   working directory to a file name, which should not be done with a
+   name like d:foo.  */
+#define IS_ABSOLUTE_PATH_1(dos_based, f)		 \
+  (IS_DIR_SEPARATOR_1 (dos_based, (f)[0])		 \
+   || HAS_DRIVE_SPEC_1 (dos_based, f))
+
+extern int filename_cmp (const char *s1, const char *s2);
+#define FILENAME_CMP(s1, s2)	filename_cmp(s1, s2)
+
+extern int filename_ncmp (const char *s1, const char *s2,
+			  size_t n);
+
+extern hashval_t filename_hash (const void *s);
+
+extern int filename_eq (const void *s1, const void *s2);
+
+extern int canonical_filename_eq (const char *a, const char *b);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FILENAMES_H */
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/filetype.awk
@@ -0,0 +1,5 @@
+# An awk script to determine the type of a file.
+/\177ELF\001/ { if (NR == 1) { print "elf32"; exit } }
+/\177ELF\002/ { if (NR == 1) { print "elf64"; exit } }
+/\114\001/    { if (NR == 1) { print "pecoff"; exit } }
+/\144\206/    { if (NR == 1) { print "pecoff"; exit } }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/hashtab.h
@@ -0,0 +1,204 @@
+/* An expandable hash tables datatype.  
+   Copyright (C) 1999-2015 Free Software Foundation, Inc.
+   Contributed by Vladimir Makarov (vmakarov@cygnus.com).
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/* This package implements basic hash table functionality.  It is possible
+   to search for an entry, create an entry and destroy an entry.
+
+   Elements in the table are generic pointers.
+
+   The size of the table is not fixed; if the occupancy of the table
+   grows too high the hash table will be expanded.
+
+   The abstract data implementation is based on generalized Algorithm D
+   from Knuth's book "The art of computer programming".  Hash table is
+   expanded by creation of new hash table and transferring elements from
+   the old table to the new table.  */
+
+#ifndef __HASHTAB_H__
+#define __HASHTAB_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "ansidecl.h"
+
+/* The type for a hash code.  */
+typedef unsigned int hashval_t;
+
+/* Callback function pointer types.  */
+
+/* Calculate hash of a table entry.  */
+typedef hashval_t (*htab_hash) (const void *);
+
+/* Compare a table entry with a possible entry.  The entry already in
+   the table always comes first, so the second element can be of a
+   different type (but in this case htab_find and htab_find_slot
+   cannot be used; instead the variants that accept a hash value
+   must be used).  */
+typedef int (*htab_eq) (const void *, const void *);
+
+/* Cleanup function called whenever a live element is removed from
+   the hash table.  */
+typedef void (*htab_del) (void *);
+  
+/* Function called by htab_traverse for each live element.  The first
+   arg is the slot of the element (which can be passed to htab_clear_slot
+   if desired), the second arg is the auxiliary pointer handed to
+   htab_traverse.  Return 1 to continue scan, 0 to stop.  */
+typedef int (*htab_trav) (void **, void *);
+
+/* Memory-allocation function, with the same functionality as calloc().
+   Iff it returns NULL, the hash table implementation will pass an error
+   code back to the user, so if your code doesn't handle errors,
+   best if you use xcalloc instead.  */
+typedef void *(*htab_alloc) (size_t, size_t);
+
+/* We also need a free() routine.  */
+typedef void (*htab_free) (void *);
+
+/* Memory allocation and deallocation; variants which take an extra
+   argument.  */
+typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
+typedef void (*htab_free_with_arg) (void *, void *);
+
+/* This macro defines reserved value for empty table entry.  */
+
+#define HTAB_EMPTY_ENTRY    ((PTR) 0)
+
+/* This macro defines reserved value for table entry which contained
+   a deleted element. */
+
+#define HTAB_DELETED_ENTRY  ((PTR) 1)
+
+/* Hash tables are of the following type.  The structure
+   (implementation) of this type is not needed for using the hash
+   tables.  All work with hash table should be executed only through
+   functions mentioned below.  The size of this structure is subject to
+   change.  */
+
+struct htab {
+  /* Pointer to hash function.  */
+  htab_hash hash_f;
+
+  /* Pointer to comparison function.  */
+  htab_eq eq_f;
+
+  /* Pointer to cleanup function.  */
+  htab_del del_f;
+
+  /* Table itself.  */
+  void **entries;
+
+  /* Current size (in entries) of the hash table.  */
+  size_t size;
+
+  /* Current number of elements including also deleted elements.  */
+  size_t n_elements;
+
+  /* Current number of deleted elements in the table.  */
+  size_t n_deleted;
+
+  /* The following member is used for debugging. Its value is number
+     of all calls of `htab_find_slot' for the hash table. */
+  unsigned int searches;
+
+  /* The following member is used for debugging.  Its value is number
+     of collisions fixed for time of work with the hash table. */
+  unsigned int collisions;
+
+  /* Pointers to allocate/free functions.  */
+  htab_alloc alloc_f;
+  htab_free free_f;
+
+  /* Alternate allocate/free functions, which take an extra argument.  */
+  void *alloc_arg;
+  htab_alloc_with_arg alloc_with_arg_f;
+  htab_free_with_arg free_with_arg_f;
+
+  /* Current size (in entries) of the hash table, as an index into the
+     table of primes.  */
+  unsigned int size_prime_index;
+};
+
+typedef struct htab *htab_t;
+
+/* An enum saying whether we insert into the hash table or not.  */
+enum insert_option {NO_INSERT, INSERT};
+
+/* The prototypes of the package functions. */
+
+extern htab_t	htab_create_alloc  (size_t, htab_hash,
+                                    htab_eq, htab_del,
+                                    htab_alloc, htab_free);
+
+extern htab_t	htab_create_alloc_ex (size_t, htab_hash,
+                                      htab_eq, htab_del,
+                                      void *, htab_alloc_with_arg,
+                                      htab_free_with_arg);
+
+extern htab_t  htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del,
+					htab_alloc, htab_alloc, htab_free);
+
+/* Backward-compatibility functions.  */
+extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del);
+extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del);
+
+extern void	htab_set_functions_ex (htab_t, htab_hash,
+                                       htab_eq, htab_del,
+                                       void *, htab_alloc_with_arg,
+                                       htab_free_with_arg);
+
+extern void	htab_delete (htab_t);
+extern void	htab_empty (htab_t);
+
+extern void *	htab_find (htab_t, const void *);
+extern void **	htab_find_slot (htab_t, const void *, enum insert_option);
+extern void *	htab_find_with_hash (htab_t, const void *, hashval_t);
+extern void **	htab_find_slot_with_hash (htab_t, const void *,
+					  hashval_t, enum insert_option);
+extern void	htab_clear_slot	(htab_t, void **);
+extern void	htab_remove_elt	(htab_t, void *);
+extern void	htab_remove_elt_with_hash (htab_t, void *, hashval_t);
+
+extern void	htab_traverse (htab_t, htab_trav, void *);
+extern void	htab_traverse_noresize (htab_t, htab_trav, void *);
+
+extern size_t	htab_size (htab_t);
+extern size_t	htab_elements (htab_t);
+extern double	htab_collisions	(htab_t);
+
+/* A hash function for pointers.  */
+extern htab_hash htab_hash_pointer;
+
+/* An equality function for pointers.  */
+extern htab_eq htab_eq_pointer;
+
+/* A hash function for null-terminated strings.  */
+extern hashval_t htab_hash_string (const void *);
+
+/* An iterative hash function for arbitrary data.  */
+extern hashval_t iterative_hash (const void *, size_t, hashval_t);
+/* Shorthand for hashing something with an intrinsic size.  */
+#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT)
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __HASHTAB_H */
new file mode 100755
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/install-sh
@@ -0,0 +1,501 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2013-12-25.23; # 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 (C) 1994 X Consortium
+#
+# 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
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='	'
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+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}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+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
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+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 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 test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+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
+
+  # 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;;
+
+    *[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 "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      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
+          mkdir_mode=
+        fi
+
+        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 (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
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          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
+
+      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
+
+  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
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 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.
+    #
+    # 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 -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` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       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 ||
+
+      # 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
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# 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:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/internal.h
@@ -0,0 +1,294 @@
+/* internal.h -- Internal header file for stack backtrace library.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 BACKTRACE_INTERNAL_H
+#define BACKTRACE_INTERNAL_H
+
+/* We assume that <sys/types.h> and "backtrace.h" have already been
+   included.  */
+
+#ifndef GCC_VERSION
+# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
+#endif
+
+#if (GCC_VERSION < 2007)
+# define __attribute__(x)
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+#ifndef ATTRIBUTE_MALLOC
+# if (GCC_VERSION >= 2096)
+#  define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define ATTRIBUTE_MALLOC
+# endif
+#endif
+
+#ifndef HAVE_SYNC_FUNCTIONS
+
+/* Define out the sync functions.  These should never be called if
+   they are not available.  */
+
+#define __sync_bool_compare_and_swap(A, B, C) (abort(), 1)
+#define __sync_lock_test_and_set(A, B) (abort(), 0)
+#define __sync_lock_release(A) abort()
+
+#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
+
+#ifdef HAVE_ATOMIC_FUNCTIONS
+
+/* We have the atomic builtin functions.  */
+
+#define backtrace_atomic_load_pointer(p) \
+    __atomic_load_n ((p), __ATOMIC_ACQUIRE)
+#define backtrace_atomic_load_int(p) \
+    __atomic_load_n ((p), __ATOMIC_ACQUIRE)
+#define backtrace_atomic_store_pointer(p, v) \
+    __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
+#define backtrace_atomic_store_size_t(p, v) \
+    __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
+#define backtrace_atomic_store_int(p, v) \
+    __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
+
+#else /* !defined (HAVE_ATOMIC_FUNCTIONS) */
+#ifdef HAVE_SYNC_FUNCTIONS
+
+/* We have the sync functions but not the atomic functions.  Define
+   the atomic ones in terms of the sync ones.  */
+
+extern void *backtrace_atomic_load_pointer (void *);
+extern int backtrace_atomic_load_int (int *);
+extern void backtrace_atomic_store_pointer (void *, void *);
+extern void backtrace_atomic_store_size_t (size_t *, size_t);
+extern void backtrace_atomic_store_int (int *, int);
+
+#else /* !defined (HAVE_SYNC_FUNCTIONS) */
+
+/* We have neither the sync nor the atomic functions.  These will
+   never be called.  */
+
+#define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
+#define backtrace_atomic_load_int(p) (abort(), 0)
+#define backtrace_atomic_store_pointer(p, v) abort()
+#define backtrace_atomic_store_size_t(p, v) abort()
+#define backtrace_atomic_store_int(p, v) abort()
+
+#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
+#endif /* !defined (HAVE_ATOMIC_FUNCTIONS) */
+
+/* The type of the function that collects file/line information.  This
+   is like backtrace_pcinfo.  */
+
+typedef int (*fileline) (struct backtrace_state *state, uintptr_t pc,
+			 backtrace_full_callback callback,
+			 backtrace_error_callback error_callback, void *data);
+
+/* The type of the function that collects symbol information.  This is
+   like backtrace_syminfo.  */
+
+typedef void (*syminfo) (struct backtrace_state *state, uintptr_t pc,
+			 backtrace_syminfo_callback callback,
+			 backtrace_error_callback error_callback, void *data);
+
+/* What the backtrace state pointer points to.  */
+
+struct backtrace_state
+{
+  /* The name of the executable.  */
+  const char *filename;
+  /* Non-zero if threaded.  */
+  int threaded;
+  /* The master lock for fileline_fn, fileline_data, syminfo_fn,
+     syminfo_data, fileline_initialization_failed and everything the
+     data pointers point to.  */
+  void *lock;
+  /* The function that returns file/line information.  */
+  fileline fileline_fn;
+  /* The data to pass to FILELINE_FN.  */
+  void *fileline_data;
+  /* The function that returns symbol information.  */
+  syminfo syminfo_fn;
+  /* The data to pass to SYMINFO_FN.  */
+  void *syminfo_data;
+  /* Whether initializing the file/line information failed.  */
+  int fileline_initialization_failed;
+  /* The lock for the freelist.  */
+  int lock_alloc;
+  /* The freelist when using mmap.  */
+  struct backtrace_freelist_struct *freelist;
+};
+
+/* Open a file for reading.  Returns -1 on error.  If DOES_NOT_EXIST
+   is not NULL, *DOES_NOT_EXIST will be set to 0 normally and set to 1
+   if the file does not exist.  If the file does not exist and
+   DOES_NOT_EXIST is not NULL, the function will return -1 and will
+   not call ERROR_CALLBACK.  On other errors, or if DOES_NOT_EXIST is
+   NULL, the function will call ERROR_CALLBACK before returning.  */
+extern int backtrace_open (const char *filename,
+			   backtrace_error_callback error_callback,
+			   void *data,
+			   int *does_not_exist);
+
+/* A view of the contents of a file.  This supports mmap when
+   available.  A view will remain in memory even after backtrace_close
+   is called on the file descriptor from which the view was
+   obtained.  */
+
+struct backtrace_view
+{
+  /* The data that the caller requested.  */
+  const void *data;
+  /* The base of the view.  */
+  void *base;
+  /* The total length of the view.  */
+  size_t len;
+};
+
+/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  Store the
+   result in *VIEW.  Returns 1 on success, 0 on error.  */
+extern int backtrace_get_view (struct backtrace_state *state, int descriptor,
+			       off_t offset, size_t size,
+			       backtrace_error_callback error_callback,
+			       void *data, struct backtrace_view *view);
+
+/* Release a view created by backtrace_get_view.  */
+extern void backtrace_release_view (struct backtrace_state *state,
+				    struct backtrace_view *view,
+				    backtrace_error_callback error_callback,
+				    void *data);
+
+/* Close a file opened by backtrace_open.  Returns 1 on success, 0 on
+   error.  */
+
+extern int backtrace_close (int descriptor,
+			    backtrace_error_callback error_callback,
+			    void *data);
+
+/* Sort without using memory.  */
+
+extern void backtrace_qsort (void *base, size_t count, size_t size,
+			     int (*compar) (const void *, const void *));
+
+/* Allocate memory.  This is like malloc.  If ERROR_CALLBACK is NULL,
+   this does not report an error, it just returns NULL.  */
+
+extern void *backtrace_alloc (struct backtrace_state *state, size_t size,
+			      backtrace_error_callback error_callback,
+			      void *data) ATTRIBUTE_MALLOC;
+
+/* Free memory allocated by backtrace_alloc.  If ERROR_CALLBACK is
+   NULL, this does not report an error.  */
+
+extern void backtrace_free (struct backtrace_state *state, void *mem,
+			    size_t size,
+			    backtrace_error_callback error_callback,
+			    void *data);
+
+/* A growable vector of some struct.  This is used for more efficient
+   allocation when we don't know the final size of some group of data
+   that we want to represent as an array.  */
+
+struct backtrace_vector
+{
+  /* The base of the vector.  */
+  void *base;
+  /* The number of bytes in the vector.  */
+  size_t size;
+  /* The number of bytes available at the current allocation.  */
+  size_t alc;
+};
+
+/* Grow VEC by SIZE bytes.  Return a pointer to the newly allocated
+   bytes.  Note that this may move the entire vector to a new memory
+   location.  Returns NULL on failure.  */
+
+extern void *backtrace_vector_grow (struct backtrace_state *state, size_t size,
+				    backtrace_error_callback error_callback,
+				    void *data,
+				    struct backtrace_vector *vec);
+
+/* Finish the current allocation on VEC.  Prepare to start a new
+   allocation.  The finished allocation will never be freed.  Returns
+   a pointer to the base of the finished entries, or NULL on
+   failure.  */
+
+extern void* backtrace_vector_finish (struct backtrace_state *state,
+				      struct backtrace_vector *vec,
+				      backtrace_error_callback error_callback,
+				      void *data);
+
+/* Release any extra space allocated for VEC.  This may change
+   VEC->base.  Returns 1 on success, 0 on failure.  */
+
+extern int backtrace_vector_release (struct backtrace_state *state,
+				     struct backtrace_vector *vec,
+				     backtrace_error_callback error_callback,
+				     void *data);
+
+/* Read initial debug data from a descriptor, and set the
+   fileline_data, syminfo_fn, and syminfo_data fields of STATE.
+   Return the fileln_fn field in *FILELN_FN--this is done this way so
+   that the synchronization code is only implemented once.  This is
+   called after the descriptor has first been opened.  It will close
+   the descriptor if it is no longer needed.  Returns 1 on success, 0
+   on error.  There will be multiple implementations of this function,
+   for different file formats.  Each system will compile the
+   appropriate one.  */
+
+extern int backtrace_initialize (struct backtrace_state *state,
+				 int descriptor,
+				 backtrace_error_callback error_callback,
+				 void *data,
+				 fileline *fileline_fn);
+
+/* Add file/line information for a DWARF module.  */
+
+extern int backtrace_dwarf_add (struct backtrace_state *state,
+				uintptr_t base_address,
+				const unsigned char* dwarf_info,
+				size_t dwarf_info_size,
+				const unsigned char *dwarf_line,
+				size_t dwarf_line_size,
+				const unsigned char *dwarf_abbrev,
+				size_t dwarf_abbrev_size,
+				const unsigned char *dwarf_ranges,
+				size_t dwarf_range_size,
+				const unsigned char *dwarf_str,
+				size_t dwarf_str_size,
+				int is_bigendian,
+				backtrace_error_callback error_callback,
+				void *data, fileline *fileline_fn);
+
+#endif
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/ltmain.sh
@@ -0,0 +1,8636 @@
+# Generated from ltmain.m4sh.
+
+# libtool (GNU libtool 1.3134 2009-11-29) 2.2.7a
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --no-finish          let install mode avoid finish commands
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool 1.3134 2009-11-29) 2.2.7a
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.2.7a
+TIMESTAMP=" 1.3134 2009-11-29"
+package_revision=1.3134
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+
+$lt_unset CDPATH
+
+
+
+
+
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+: ${ECHO=$as_echo}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/mount/endor/wildenhu/local-x86_64/bin/sed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+  func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+}
+
+# Generated shell functions inserted here.
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname${mode+: }$mode: $*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# //
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $SED -n '/^# Usage:/,/^#  *-h/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+     }' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    func_error "missing argument for $1"
+    exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+opt_dry_run=false
+opt_finish=:
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# Parse options once, thoroughly.  This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
+
+  # Shorthand for --mode=foo, only valid as the first argument
+  case $1 in
+  clean|clea|cle|cl)
+    shift; set dummy --mode clean ${1+"$@"}; shift
+    ;;
+  compile|compil|compi|comp|com|co|c)
+    shift; set dummy --mode compile ${1+"$@"}; shift
+    ;;
+  execute|execut|execu|exec|exe|ex|e)
+    shift; set dummy --mode execute ${1+"$@"}; shift
+    ;;
+  finish|finis|fini|fin|fi|f)
+    shift; set dummy --mode finish ${1+"$@"}; shift
+    ;;
+  install|instal|insta|inst|ins|in|i)
+    shift; set dummy --mode install ${1+"$@"}; shift
+    ;;
+  link|lin|li|l)
+    shift; set dummy --mode link ${1+"$@"}; shift
+    ;;
+  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+    shift; set dummy --mode uninstall ${1+"$@"}; shift
+    ;;
+  esac
+
+  # Parse non-mode specific arguments:
+  while test "$#" -gt 0; do
+    opt="$1"
+    shift
+
+    case $opt in
+      --config)		func_config					;;
+
+      --debug)		preserve_args="$preserve_args $opt"
+			func_echo "enabling shell trace mode"
+			opt_debug='set -x'
+			$opt_debug
+			;;
+
+      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			execute_dlfiles="$execute_dlfiles $1"
+			shift
+			;;
+
+      --dry-run | -n)	opt_dry_run=:					;;
+      --features)       func_features					;;
+      --finish)		mode="finish"					;;
+      --no-finish)	opt_finish=false				;;
+
+      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			case $1 in
+			  # Valid mode arguments:
+			  clean)	;;
+			  compile)	;;
+			  execute)	;;
+			  finish)	;;
+			  install)	;;
+			  link)		;;
+			  relink)	;;
+			  uninstall)	;;
+
+			  # Catch anything else as an error
+			  *) func_error "invalid argument for $opt"
+			     exit_cmd=exit
+			     break
+			     ;;
+		        esac
+
+			mode="$1"
+			shift
+			;;
+
+      --preserve-dup-deps)
+			opt_duplicate_deps=:				;;
+
+      --quiet|--silent)	preserve_args="$preserve_args $opt"
+			opt_silent=:
+			opt_verbose=false
+			;;
+
+      --no-quiet|--no-silent)
+			preserve_args="$preserve_args $opt"
+			opt_silent=false
+			;;
+
+      --verbose| -v)	preserve_args="$preserve_args $opt"
+			opt_silent=false
+			opt_verbose=:
+			;;
+
+      --no-verbose)	preserve_args="$preserve_args $opt"
+			opt_verbose=false
+			;;
+
+      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			preserve_args="$preserve_args $opt $1"
+			func_enable_tag "$1"	# tagname is set here
+			shift
+			;;
+
+      # Separate optargs to long options:
+      -dlopen=*|--mode=*|--tag=*)
+			func_opt_split "$opt"
+			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+			shift
+			;;
+
+      -\?|-h)		func_usage					;;
+      --help)		opt_help=:					;;
+      --help-all)	opt_help=': help-all'				;;
+      --version)	func_version					;;
+
+      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
+
+      *)		nonopt="$opt"
+			break
+			;;
+    esac
+  done
+
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* )
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      ;;
+  esac
+
+  # Having warned about all mis-specified options, bail out if
+  # anything was wrong.
+  $exit_cmd $EXIT_FAILURE
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+$opt_help || {
+  # Sanity checks first:
+  func_check_version_match
+
+  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+    func_fatal_configuration "not configured to build any kind of library"
+  fi
+
+  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+  # Darwin sucks
+  eval "std_shrext=\"$shrext_cmds\""
+
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    func_error "unrecognized option \`-dlopen'"
+    $ECHO "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$progname --help --mode=$mode' for more information."
+}
+
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_ltwrapper_scriptname_result=""
+    if func_ltwrapper_executable_p "$1"; then
+	func_dirname_and_basename "$1" "" "."
+	func_stripname '' '.exe' "$func_basename_result"
+	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    fi
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval "cmd=\"$cmd\""
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+        func_quote_for_eval "$arg"
+	CC_quoted="$CC_quoted $func_quote_for_eval_result"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_quote_for_eval "$arg"
+	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag="$pie_flag $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_quote_for_eval "$arg"
+	    lastarg="$lastarg $func_quote_for_eval_result"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_quote_for_eval "$lastarg"
+      base_compile="$base_compile $func_quote_for_eval_result"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      removelist="$removelist $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    removelist="$removelist $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    if test -n "$fix_srcfile_path"; then
+      eval "srcfile=\"$fix_srcfile_path\""
+    fi
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval test -z \"\$$shlibpath_var\"; then
+	eval $shlibpath_var=\$dir
+      else
+	eval $shlibpath_var=\$dir:\$$shlibpath_var
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_quote_for_eval "$file"
+      args="$args $func_quote_for_eval_result"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    echo "----------------------------------------------------------------------"
+    echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $ECHO "   $libdir"
+    done
+    echo
+    echo "If you ever happen to want to link against installed libraries"
+    echo "in a given directory, LIBDIR, you must either use libtool, and"
+    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval "flag=\"$hardcode_libdir_flag_spec\""
+
+      $ECHO "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $ECHO "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    echo
+
+    echo "See any operating system documentation about shared libraries for"
+    case $host in
+      solaris2.[6789]|solaris2.1[0-9])
+        echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	echo "pages."
+	;;
+      *)
+        echo "more information, such as the ld(1) and ld.so(8) manual pages."
+        ;;
+    esac
+    echo "----------------------------------------------------------------------"
+    exit $EXIT_SUCCESS
+}
+
+test "$mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog="$install_prog$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog="$install_prog $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      install_shared_prog="$install_shared_prog $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs" && $opt_finish; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_verbose "extracting global C symbols from \`$progfile'"
+	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $MV "$nlist"T "$nlist"
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      $EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T
+	      $MV "$nlist"T "$nlist"
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      ${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' < "$nlist" > "$export_symbols"
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                echo EXPORTS > "$output_objdir/$outputname.def"
+                cat "$export_symbols" >> "$output_objdir/$outputname.def"
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      ${SED} -e 's/\([].[*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/' < "$export_symbols" > "$output_objdir/$outputname.exp"
+	      $GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T
+	      $MV "$nlist"T "$nlist"
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          echo EXPORTS > "$output_objdir/$outputname.def"
+	          cat "$nlist" >> "$output_objdir/$outputname.def"
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+	  $opt_dry_run || {
+	    $ECHO ": $name " >> "$nlist"
+	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	  }
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+"
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* )
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs.  */"
+	    lt_dlsym_const= ;;
+	  *osf5*)
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+	    lt_dlsym_const= ;;
+	  *)
+	    lt_dlsym_const=const ;;
+	  esac
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+extern $lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+$lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags="$symtab_cflags $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if $OBJDUMP -f "$1" | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pe-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      win32_nmres=`$NM -f posix -A "$1" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \"\$relink_command\" 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2* | *-cegcc*)
+	  $ECHO "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $ECHO "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null |
+              $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_result=`cygpath -w "$1" |
+	      $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" |
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  \`$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
+
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1"; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+	func_stripname : : "$1"
+        func_to_host_pathlist_tmp1=$func_stripname_result
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            func_to_host_pathlist_result=`
+	      ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null |
+	      $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" |
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_append func_to_host_pathlist_result ";$func_to_host_path_result"
+                  fi
+                fi
+              fi
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result"; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  \`$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_append func_to_host_pathlist_result ";"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "$SHELL $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined LT_DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+    va_list args;
+    va_start (args, fmt);
+    (void) vfprintf (stderr, fmt, args);
+    va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
+
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+
+  /* very simple arg parsing; don't want to rely on getopt */
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+    }
+
+  newargz = XMALLOC (char *, argc + 1);
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal ("Couldn't find %s", argv[0]);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+			  tmp_pathspec));
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+			  actual_cwrapper_path));
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
+    {
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
+			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal ("getcwd failed");
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+			      tmp_pathspec));
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  char *errstr = strerror (errno);
+	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal ("Could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+              $SED -e 's/\([\\"]\)/\\\1/g' \
+	           -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
+
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval "$file_magic_cmd \"\$1\" 2>/dev/null" | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs="$weak_libs $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname '-L' '' "$arg"
+	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-linux*)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+	  linker_flags="$linker_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # @file GCC response files
+      # -tp=* Portland pgcc target processor selection
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval "arg=\"$export_dynamic_flag_spec\""
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval "sys_lib_search_path=\"$sys_lib_search_path_spec\""
+    eval "sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\""
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_duplicate_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  case $lib in
+	  *.la)	func_source "$lib" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs="$deplibs $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    dir=$func_stripname_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	    # Keep a list of preopened convenience libraries to check
+	    # that they are being used correctly in the link pass.
+	    test -z "$libdir" && \
+		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         newlib_search_path="$newlib_search_path $func_stripname_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath="$temp_rpath$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    eval "libname=\"$libname_spec\""
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval "soname=\"$soname_spec\""
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_dirname "$deplib" "" "."
+		dir="$func_dirname_result"
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\$$var
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\$tmp_libs
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval "shared_ext=\"$shrext_cmds\""
+	eval "libname=\"$libname_spec\""
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval "shared_ext=\"$shrext_cmds\""
+	  eval "libname=\"$libname_spec\""
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs="$libobjs $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  eval "libname=\"$libname_spec\""
+		  eval "deplib_matches=\"$library_names_spec\""
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    eval "libname=\"$libname_spec\""
+		    eval "deplib_matches=\"$library_names_spec\""
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		eval "libname=\"$libname_spec\""
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval "$file_magic_cmd \"\$potlib\"" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		eval "libname=\"$libname_spec\""
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval "flag=\"$hardcode_libdir_flag_spec\""
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval "dep_rpath=\"$hardcode_libdir_flag_spec_ld\""
+	    else
+	      eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval $runpath_var=\$rpath\$$runpath_var
+	    export $runpath_var
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval $shlibpath_var=\$shlibpath\$$shlibpath_var
+	  export $shlibpath_var
+	fi
+
+	# Get the real and link names of the library.
+	eval "shared_ext=\"$shrext_cmds\""
+	eval "library_names=\"$library_names_spec\""
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval "soname=\"$soname_spec\""
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles="$delfiles $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval "cmd=\"$cmd\""
+	      func_len " $cmd"
+	      len=$func_len_result
+	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || $ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs="$tmp_deplibs $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval "libobjs=\"\$libobjs $whole_archive_flag_spec\""
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval "flag=\"$thread_safe_flag_spec\""
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $opt_dry_run || (cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U) || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval "test_cmds=\"$module_expsym_cmds\""
+	    cmds=$module_expsym_cmds
+	  else
+	    eval "test_cmds=\"$module_cmds\""
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval "test_cmds=\"$archive_expsym_cmds\""
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval "test_cmds=\"$archive_cmds\""
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    echo ')' >> $output
+	    delfiles="$delfiles $output"
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    delfiles="$delfiles $output"
+	    output=$firstobj\"$file_list_spec$output\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval "test_cmds=\"$reload_cmds\""
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval "concat_cmds=\"$reload_cmds\""
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval "concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\""
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval "concat_cmds=\"\${concat_cmds}$reload_cmds\""
+	      if test -n "$last_robj"; then
+	        eval "concat_cmds=\"\${concat_cmds}~\$RM $last_robj\""
+	      fi
+	      delfiles="$delfiles $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval "concat_cmds=\"\$concat_cmds$export_symbols_cmds\""
+	      if test -n "$last_robj"; then
+		eval "concat_cmds=\"\$concat_cmds~\$RM $last_robj\""
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || $ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval "libobjs=\"\$libobjs $whole_archive_flag_spec\""
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval "cmds=\"\$cmds~\$RM $delfiles\""
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs="$libobjs $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval "cmd=\"$cmd\""
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $opt_dry_run || (cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname) || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval "tmp_whole_archive_flags=\"$whole_archive_flag_spec\""
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || echo timestamp > $libobj || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command="$compile_command ${wl}-bind_at_load"
+	      finalize_command="$finalize_command ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval "flag=\"$hardcode_libdir_flag_spec\""
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval "rpath=\" $hardcode_libdir_flag_spec\""
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval "flag=\"$hardcode_libdir_flag_spec\""
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval "rpath=\" $hardcode_libdir_flag_spec\""
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs="$oldobjs $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs="$oldobjs $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+	eval "cmds=\"$old_archive_cmds\""
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval "test_cmds=\"$old_archive_cmds\""
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval "concat_cmds=\"\${concat_cmds}$old_archive_cmds\""
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval "cmds=\"\$concat_cmds\""
+	  else
+	    eval "cmds=\"\$concat_cmds~\$old_archive_cmds\""
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles="$newdlfiles $libdir/$name"
+		;;
+	      *) newdlfiles="$newdlfiles $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles="$newdlprefiles $libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$mode" = link || test "$mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) RM="$RM $arg"; rmforce=yes ;;
+      -*) RM="$RM $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$mode" = uninstall || test "$mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
new file mode 100755
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# 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:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/mmap.c
@@ -0,0 +1,303 @@
+/* mmap.c -- Memory allocation with mmap.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* Memory allocation on systems that provide anonymous mmap.  This
+   permits the backtrace functions to be invoked from a signal
+   handler, assuming that mmap is async-signal safe.  */
+
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *)-1)
+#endif
+
+/* A list of free memory blocks.  */
+
+struct backtrace_freelist_struct
+{
+  /* Next on list.  */
+  struct backtrace_freelist_struct *next;
+  /* Size of this block, including this structure.  */
+  size_t size;
+};
+
+/* Free memory allocated by backtrace_alloc.  */
+
+static void
+backtrace_free_locked (struct backtrace_state *state, void *addr, size_t size)
+{
+  /* Just leak small blocks.  We don't have to be perfect.  */
+  if (size >= sizeof (struct backtrace_freelist_struct))
+    {
+      struct backtrace_freelist_struct *p;
+
+      p = (struct backtrace_freelist_struct *) addr;
+      p->next = state->freelist;
+      p->size = size;
+      state->freelist = p;
+    }
+}
+
+/* Allocate memory like malloc.  If ERROR_CALLBACK is NULL, don't
+   report an error.  */
+
+void *
+backtrace_alloc (struct backtrace_state *state,
+		 size_t size, backtrace_error_callback error_callback,
+		 void *data)
+{
+  void *ret;
+  int locked;
+  struct backtrace_freelist_struct **pp;
+  size_t pagesize;
+  size_t asksize;
+  void *page;
+
+  ret = NULL;
+
+  /* If we can acquire the lock, then see if there is space on the
+     free list.  If we can't acquire the lock, drop straight into
+     using mmap.  __sync_lock_test_and_set returns the old state of
+     the lock, so we have acquired it if it returns 0.  */
+
+  if (!state->threaded)
+    locked = 1;
+  else
+    locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
+
+  if (locked)
+    {
+      for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
+	{
+	  if ((*pp)->size >= size)
+	    {
+	      struct backtrace_freelist_struct *p;
+
+	      p = *pp;
+	      *pp = p->next;
+
+	      /* Round for alignment; we assume that no type we care about
+		 is more than 8 bytes.  */
+	      size = (size + 7) & ~ (size_t) 7;
+	      if (size < p->size)
+		backtrace_free_locked (state, (char *) p + size,
+				       p->size - size);
+
+	      ret = (void *) p;
+
+	      break;
+	    }
+	}
+
+      if (state->threaded)
+	__sync_lock_release (&state->lock_alloc);
+    }
+
+  if (ret == NULL)
+    {
+      /* Allocate a new page.  */
+
+      pagesize = getpagesize ();
+      asksize = (size + pagesize - 1) & ~ (pagesize - 1);
+      page = mmap (NULL, asksize, PROT_READ | PROT_WRITE,
+		   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+      if (page == MAP_FAILED)
+	{
+	  if (error_callback)
+	    error_callback (data, "mmap", errno);
+	}
+      else
+	{
+	  size = (size + 7) & ~ (size_t) 7;
+	  if (size < asksize)
+	    backtrace_free (state, (char *) page + size, asksize - size,
+			    error_callback, data);
+
+	  ret = page;
+	}
+    }
+
+  return ret;
+}
+
+/* Free memory allocated by backtrace_alloc.  */
+
+void
+backtrace_free (struct backtrace_state *state, void *addr, size_t size,
+		backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+		void *data ATTRIBUTE_UNUSED)
+{
+  int locked;
+
+  /* If we are freeing a large aligned block, just release it back to
+     the system.  This case arises when growing a vector for a large
+     binary with lots of debug info.  Calling munmap here may cause us
+     to call mmap again if there is also a large shared library; we
+     just live with that.  */
+  if (size >= 16 * 4096)
+    {
+      size_t pagesize;
+
+      pagesize = getpagesize ();
+      if (((uintptr_t) addr & (pagesize - 1)) == 0
+	  && (size & (pagesize - 1)) == 0)
+	{
+	  /* If munmap fails for some reason, just add the block to
+	     the freelist.  */
+	  if (munmap (addr, size) == 0)
+	    return;
+	}
+    }
+
+  /* If we can acquire the lock, add the new space to the free list.
+     If we can't acquire the lock, just leak the memory.
+     __sync_lock_test_and_set returns the old state of the lock, so we
+     have acquired it if it returns 0.  */
+
+  if (!state->threaded)
+    locked = 1;
+  else
+    locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
+
+  if (locked)
+    {
+      backtrace_free_locked (state, addr, size);
+
+      if (state->threaded)
+	__sync_lock_release (&state->lock_alloc);
+    }
+}
+
+/* Grow VEC by SIZE bytes.  */
+
+void *
+backtrace_vector_grow (struct backtrace_state *state,size_t size,
+		       backtrace_error_callback error_callback,
+		       void *data, struct backtrace_vector *vec)
+{
+  void *ret;
+
+  if (size > vec->alc)
+    {
+      size_t pagesize;
+      size_t alc;
+      void *base;
+
+      pagesize = getpagesize ();
+      alc = vec->size + size;
+      if (vec->size == 0)
+	alc = 16 * size;
+      else if (alc < pagesize)
+	{
+	  alc *= 2;
+	  if (alc > pagesize)
+	    alc = pagesize;
+	}
+      else
+	{
+	  alc *= 2;
+	  alc = (alc + pagesize - 1) & ~ (pagesize - 1);
+	}
+      base = backtrace_alloc (state, alc, error_callback, data);
+      if (base == NULL)
+	return NULL;
+      if (vec->base != NULL)
+	{
+	  memcpy (base, vec->base, vec->size);
+	  backtrace_free (state, vec->base, vec->size + vec->alc,
+			  error_callback, data);
+	}
+      vec->base = base;
+      vec->alc = alc - vec->size;
+    }
+
+  ret = (char *) vec->base + vec->size;
+  vec->size += size;
+  vec->alc -= size;
+  return ret;
+}
+
+/* Finish the current allocation on VEC.  */
+
+void *
+backtrace_vector_finish (
+  struct backtrace_state *state ATTRIBUTE_UNUSED,
+  struct backtrace_vector *vec,
+  backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+  void *data ATTRIBUTE_UNUSED)
+{
+  void *ret;
+
+  ret = vec->base;
+  vec->base = (char *) vec->base + vec->size;
+  vec->size = 0;
+  return ret;
+}
+
+/* Release any extra space allocated for VEC.  */
+
+int
+backtrace_vector_release (struct backtrace_state *state,
+			  struct backtrace_vector *vec,
+			  backtrace_error_callback error_callback,
+			  void *data)
+{
+  size_t size;
+  size_t alc;
+  size_t aligned;
+
+  /* Make sure that the block that we free is aligned on an 8-byte
+     boundary.  */
+  size = vec->size;
+  alc = vec->alc;
+  aligned = (size + 7) & ~ (size_t) 7;
+  alc -= aligned - size;
+
+  backtrace_free (state, (char *) vec->base + aligned, alc,
+		  error_callback, data);
+  vec->alc = 0;
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/mmapio.c
@@ -0,0 +1,100 @@
+/* mmapio.c -- File views using mmap.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *)-1)
+#endif
+
+/* This file implements file views and memory allocation when mmap is
+   available.  */
+
+/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  */
+
+int
+backtrace_get_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		    int descriptor, off_t offset, size_t size,
+		    backtrace_error_callback error_callback,
+		    void *data, struct backtrace_view *view)
+{
+  size_t pagesize;
+  unsigned int inpage;
+  off_t pageoff;
+  void *map;
+
+  pagesize = getpagesize ();
+  inpage = offset % pagesize;
+  pageoff = offset - inpage;
+
+  size += inpage;
+  size = (size + (pagesize - 1)) & ~ (pagesize - 1);
+
+  map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, descriptor, pageoff);
+  if (map == MAP_FAILED)
+    {
+      error_callback (data, "mmap", errno);
+      return 0;
+    }
+
+  view->data = (char *) map + inpage;
+  view->base = map;
+  view->len = size;
+
+  return 1;
+}
+
+/* Release a view read by backtrace_get_view.  */
+
+void
+backtrace_release_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
+			struct backtrace_view *view,
+			backtrace_error_callback error_callback,
+			void *data)
+{
+  union {
+    const void *cv;
+    void *v;
+  } const_cast;
+
+  const_cast.cv = view->base;
+  if (munmap (const_cast.v, view->len) < 0)
+    error_callback (data, "munmap", errno);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/nounwind.c
@@ -0,0 +1,66 @@
+/* backtrace.c -- Entry point for stack backtrace library.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <sys/types.h>
+
+#include "backtrace.h"
+
+#include "internal.h"
+
+/* This source file is compiled if the unwind library is not
+   available.  */
+
+int
+backtrace_full (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		int skip ATTRIBUTE_UNUSED,
+		backtrace_full_callback callback ATTRIBUTE_UNUSED,
+		backtrace_error_callback error_callback, void *data)
+{
+  error_callback (data,
+		  "no stack trace because unwind library not available",
+		  0);
+  return 0;
+}
+
+int
+backtrace_simple (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		  int skip ATTRIBUTE_UNUSED,
+		  backtrace_simple_callback callback ATTRIBUTE_UNUSED,
+		  backtrace_error_callback error_callback, void *data)
+{
+  error_callback (data,
+		  "no stack trace because unwind library not available",
+		  0);
+  return 0;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/pecoff.c
@@ -0,0 +1,937 @@
+/* pecoff.c -- Get debug data from a PE/COFFF file for backtraces.
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Adapted from elf.c by Tristan Gingold, AdaCore.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* Coff file header.  */
+
+typedef struct {
+  uint16_t machine;
+  uint16_t number_of_sections;
+  uint32_t time_date_stamp;
+  uint32_t pointer_to_symbol_table;
+  uint32_t number_of_symbols;
+  uint16_t size_of_optional_header;
+  uint16_t characteristics;
+} b_coff_file_header;
+
+/* Coff optional header.  */
+
+typedef struct {
+  uint16_t magic;
+  uint8_t  major_linker_version;
+  uint8_t  minor_linker_version;
+  uint32_t size_of_code;
+  uint32_t size_of_initialized_data;
+  uint32_t size_of_uninitialized_data;
+  uint32_t address_of_entry_point;
+  uint32_t base_of_code;
+  union {
+    struct {
+      uint32_t base_of_data;
+      uint32_t image_base;
+    } pe;
+    struct {
+      uint64_t image_base;
+    } pep;
+  } u;
+} b_coff_optional_header;
+
+/* Values of magic in optional header.  */
+
+#define PE_MAGIC 0x10b		/* PE32 executable.  */
+#define PEP_MAGIC 0x20b		/* PE32+ executable (for 64bit targets).  */
+
+/* Coff section header.  */
+
+typedef struct {
+  char name[8];
+  uint32_t virtual_size;
+  uint32_t virtual_address;
+  uint32_t size_of_raw_data;
+  uint32_t pointer_to_raw_data;
+  uint32_t pointer_to_relocations;
+  uint32_t pointer_to_line_numbers;
+  uint16_t number_of_relocations;
+  uint16_t number_of_line_numbers;
+  uint32_t characteristics;
+} b_coff_section_header;
+
+/* Coff symbol name.  */
+
+typedef union {
+  char short_name[8];
+  struct {
+    unsigned char zeroes[4];
+    unsigned char off[4];
+  } long_name;
+} b_coff_name;
+
+/* Coff symbol (external representation which is unaligned).  */
+
+typedef struct {
+  b_coff_name name;
+  unsigned char value[4];
+  unsigned char section_number[2];
+  unsigned char type[2];
+  unsigned char storage_class;
+  unsigned char number_of_aux_symbols;
+} b_coff_external_symbol;
+
+/* Symbol types.  */
+
+#define N_TBSHFT 4			/* Shift for the derived type.  */
+#define IMAGE_SYM_DTYPE_FUNCTION 2	/* Function derived type.  */
+
+/* Size of a coff symbol.  */
+
+#define SYM_SZ 18
+
+/* Coff symbol, internal representation (aligned).  */
+
+typedef struct {
+  const char *name;
+  uint32_t value;
+  int16_t sec;
+  uint16_t type;
+  uint16_t sc;
+} b_coff_internal_symbol;
+
+/* An index of sections we care about.  */
+
+enum debug_section
+{
+  DEBUG_INFO,
+  DEBUG_LINE,
+  DEBUG_ABBREV,
+  DEBUG_RANGES,
+  DEBUG_STR,
+  DEBUG_MAX
+};
+
+/* Names of sections, indexed by enum debug_section.  */
+
+static const char * const debug_section_names[DEBUG_MAX] =
+{
+  ".debug_info",
+  ".debug_line",
+  ".debug_abbrev",
+  ".debug_ranges",
+  ".debug_str"
+};
+
+/* Information we gather for the sections we care about.  */
+
+struct debug_section_info
+{
+  /* Section file offset.  */
+  off_t offset;
+  /* Section size.  */
+  size_t size;
+  /* Section contents, after read from file.  */
+  const unsigned char *data;
+};
+
+/* Information we keep for an coff symbol.  */
+
+struct coff_symbol
+{
+  /* The name of the symbol.  */
+  const char *name;
+  /* The address of the symbol.  */
+  uintptr_t address;
+};
+
+/* Information to pass to coff_syminfo.  */
+
+struct coff_syminfo_data
+{
+  /* Symbols for the next module.  */
+  struct coff_syminfo_data *next;
+  /* The COFF symbols, sorted by address.  */
+  struct coff_symbol *symbols;
+  /* The number of symbols.  */
+  size_t count;
+};
+
+/* A dummy callback function used when we can't find any debug info.  */
+
+static int
+coff_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
+	      uintptr_t pc ATTRIBUTE_UNUSED,
+	      backtrace_full_callback callback ATTRIBUTE_UNUSED,
+	      backtrace_error_callback error_callback, void *data)
+{
+  error_callback (data, "no debug info in PE/COFF executable", -1);
+  return 0;
+}
+
+/* A dummy callback function used when we can't find a symbol
+   table.  */
+
+static void
+coff_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
+	     uintptr_t addr ATTRIBUTE_UNUSED,
+	     backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
+	     backtrace_error_callback error_callback, void *data)
+{
+  error_callback (data, "no symbol table in PE/COFF executable", -1);
+}
+
+/* Read a potentially unaligned 4 byte word at P, using native endianness.  */
+
+static uint32_t
+coff_read4 (const unsigned char *p)
+{
+  uint32_t res;
+
+  memcpy (&res, p, 4);
+  return res;
+}
+
+/* Read a potentially unaligned 2 byte word at P, using native endianness.
+   All 2 byte word in symbols are always aligned, but for coherency all
+   fields are declared as char arrays.  */
+
+static uint16_t
+coff_read2 (const unsigned char *p)
+{
+  uint16_t res;
+
+  memcpy (&res, p, sizeof (res));
+  return res;
+}
+
+/* Return the length (without the trailing 0) of a COFF short name.  */
+
+static size_t
+coff_short_name_len (const char *name)
+{
+  int i;
+
+  for (i = 0; i < 8; i++)
+    if (name[i] == 0)
+      return i;
+  return 8;
+}
+
+/* Return true iff COFF short name CNAME is the same as NAME (a NUL-terminated
+   string).  */
+
+static int
+coff_short_name_eq (const char *name, const char *cname)
+{
+  int i;
+
+  for (i = 0; i < 8; i++)
+    {
+      if (name[i] != cname[i])
+	return 0;
+      if (name[i] == 0)
+	return 1;
+    }
+  return name[8] == 0;
+}
+
+/* Return true iff NAME is the same as string at offset OFF.  */
+
+static int
+coff_long_name_eq (const char *name, unsigned int off,
+		   struct backtrace_view *str_view)
+{
+  if (off >= str_view->len)
+    return 0;
+  return strcmp (name, (const char *)str_view->data + off) == 0;
+}
+
+/* Compare struct coff_symbol for qsort.  */
+
+static int
+coff_symbol_compare (const void *v1, const void *v2)
+{
+  const struct coff_symbol *e1 = (const struct coff_symbol *) v1;
+  const struct coff_symbol *e2 = (const struct coff_symbol *) v2;
+
+  if (e1->address < e2->address)
+    return -1;
+  else if (e1->address > e2->address)
+    return 1;
+  else
+    return 0;
+}
+
+/* Convert SYM to internal (and aligned) format ISYM, using string table
+   from STRTAB and STRTAB_SIZE, and number of sections SECTS_NUM.
+   Return -1 in case of error (invalid section number or string index).  */
+
+static int
+coff_expand_symbol (b_coff_internal_symbol *isym,
+		    const b_coff_external_symbol *sym,
+		    uint16_t sects_num,
+		    const unsigned char *strtab, size_t strtab_size)
+{
+  isym->type = coff_read2 (sym->type);
+  isym->sec = coff_read2 (sym->section_number);
+  isym->sc = sym->storage_class;
+
+  if (isym->sec > 0 && (uint16_t) isym->sec > sects_num)
+    return -1;
+  if (sym->name.short_name[0] != 0)
+    isym->name = sym->name.short_name;
+  else
+    {
+      uint32_t off = coff_read4 (sym->name.long_name.off);
+
+      if (off >= strtab_size)
+	return -1;
+      isym->name = (const char *) strtab + off;
+    }
+  return 0;
+}
+
+/* Return true iff SYM is a defined symbol for a function.  Data symbols
+   aren't considered because they aren't easily identified (same type as
+   section names, presence of symbols defined by the linker script).  */
+
+static int
+coff_is_function_symbol (const b_coff_internal_symbol *isym)
+{
+  return (isym->type >> N_TBSHFT) == IMAGE_SYM_DTYPE_FUNCTION
+    && isym->sec > 0;
+}
+
+/* Initialize the symbol table info for coff_syminfo.  */
+
+static int
+coff_initialize_syminfo (struct backtrace_state *state,
+			 uintptr_t base_address,
+			 const b_coff_section_header *sects, size_t sects_num,
+			 const b_coff_external_symbol *syms, size_t syms_size,
+			 const unsigned char *strtab, size_t strtab_size,
+			 backtrace_error_callback error_callback,
+			 void *data, struct coff_syminfo_data *sdata)
+{
+  size_t syms_count;
+  char *coff_symstr;
+  size_t coff_symstr_len;
+  size_t coff_symbol_count;
+  size_t coff_symbol_size;
+  struct coff_symbol *coff_symbols;
+  struct coff_symbol *coff_sym;
+  char *coff_str;
+  size_t i;
+
+  syms_count = syms_size / SYM_SZ;
+
+  /* We only care about function symbols.  Count them.  Also count size of
+     strings for in-symbol names.  */
+  coff_symbol_count = 0;
+  coff_symstr_len = 0;
+  for (i = 0; i < syms_count; ++i)
+    {
+      const b_coff_external_symbol *asym = &syms[i];
+      b_coff_internal_symbol isym;
+
+      if (coff_expand_symbol (&isym, asym, sects_num, strtab, strtab_size) < 0)
+	{
+	  error_callback (data, "invalid section or offset in coff symbol", 0);
+	  return 0;
+	}
+      if (coff_is_function_symbol (&isym))
+	{
+	  ++coff_symbol_count;
+	  if (asym->name.short_name[0] != 0)
+	    coff_symstr_len += coff_short_name_len (asym->name.short_name) + 1;
+	}
+
+      i += asym->number_of_aux_symbols;
+    }
+
+  coff_symbol_size = (coff_symbol_count + 1) * sizeof (struct coff_symbol);
+  coff_symbols = ((struct coff_symbol *)
+		  backtrace_alloc (state, coff_symbol_size, error_callback,
+				   data));
+  if (coff_symbols == NULL)
+    return 0;
+
+  /* Allocate memory for symbols strings.  */
+  if (coff_symstr_len > 0)
+    {
+      coff_symstr = ((char *)
+		     backtrace_alloc (state, coff_symstr_len, error_callback,
+				      data));
+      if (coff_symstr == NULL)
+	{
+	  backtrace_free (state, coff_symbols, coff_symbol_size,
+			  error_callback, data);
+	  return 0;
+	}
+    }
+  else
+    coff_symstr = NULL;
+
+  /* Copy symbols.  */
+  coff_sym = coff_symbols;
+  coff_str = coff_symstr;
+  for (i = 0; i < syms_count; ++i)
+    {
+      const b_coff_external_symbol *asym = &syms[i];
+      b_coff_internal_symbol isym;
+
+      if (coff_expand_symbol (&isym, asym, sects_num, strtab, strtab_size))
+	{
+	  /* Should not fail, as it was already tested in the previous
+	     loop.  */
+	  abort ();
+	}
+      if (coff_is_function_symbol (&isym))
+	{
+	  const char *name;
+	  int16_t secnum;
+
+	  if (asym->name.short_name[0] != 0)
+	    {
+	      size_t len = coff_short_name_len (isym.name);
+	      name = coff_str;
+	      memcpy (coff_str, isym.name, len);
+	      coff_str[len] = 0;
+	      coff_str += len + 1;
+	    }
+	  else
+	    name = isym.name;
+
+	  /* Strip leading '_'.  */
+	  if (name[0] == '_')
+	    name++;
+
+	  /* Symbol value is section relative, so we need to read the address
+	     of its section.  */
+	  secnum = coff_read2 (asym->section_number);
+
+	  coff_sym->name = name;
+	  coff_sym->address = (coff_read4 (asym->value)
+			       + sects[secnum - 1].virtual_address
+			       + base_address);
+	  coff_sym++;
+	}
+
+      i += asym->number_of_aux_symbols;
+    }
+
+  /* End of symbols marker.  */
+  coff_sym->name = NULL;
+  coff_sym->address = -1;
+
+  backtrace_qsort (coff_symbols, coff_symbol_count,
+		   sizeof (struct coff_symbol), coff_symbol_compare);
+
+  sdata->next = NULL;
+  sdata->symbols = coff_symbols;
+  sdata->count = coff_symbol_count;
+
+  return 1;
+}
+
+/* Add EDATA to the list in STATE.  */
+
+static void
+coff_add_syminfo_data (struct backtrace_state *state,
+		       struct coff_syminfo_data *sdata)
+{
+  if (!state->threaded)
+    {
+      struct coff_syminfo_data **pp;
+
+      for (pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
+	   *pp != NULL;
+	   pp = &(*pp)->next)
+	;
+      *pp = sdata;
+    }
+  else
+    {
+      while (1)
+	{
+	  struct coff_syminfo_data **pp;
+
+	  pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
+
+	  while (1)
+	    {
+	      struct coff_syminfo_data *p;
+
+	      p = backtrace_atomic_load_pointer (pp);
+
+	      if (p == NULL)
+		break;
+
+	      pp = &p->next;
+	    }
+
+	  if (__sync_bool_compare_and_swap (pp, NULL, sdata))
+	    break;
+	}
+    }
+}
+
+/* Compare an ADDR against an elf_symbol for bsearch.  We allocate one
+   extra entry in the array so that this can look safely at the next
+   entry.  */
+
+static int
+coff_symbol_search (const void *vkey, const void *ventry)
+{
+  const uintptr_t *key = (const uintptr_t *) vkey;
+  const struct coff_symbol *entry = (const struct coff_symbol *) ventry;
+  uintptr_t addr;
+
+  addr = *key;
+  if (addr < entry->address)
+    return -1;
+  else if (addr >= entry[1].address)
+    return 1;
+  else
+    return 0;
+}
+
+/* Return the symbol name and value for an ADDR.  */
+
+static void
+coff_syminfo (struct backtrace_state *state, uintptr_t addr,
+	      backtrace_syminfo_callback callback,
+	      backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+	      void *data)
+{
+  struct coff_syminfo_data *sdata;
+  struct coff_symbol *sym = NULL;
+
+  if (!state->threaded)
+    {
+      for (sdata = (struct coff_syminfo_data *) state->syminfo_data;
+	   sdata != NULL;
+	   sdata = sdata->next)
+	{
+	  sym = ((struct coff_symbol *)
+		 bsearch (&addr, sdata->symbols, sdata->count,
+			  sizeof (struct coff_symbol), coff_symbol_search));
+	  if (sym != NULL)
+	    break;
+	}
+    }
+  else
+    {
+      struct coff_syminfo_data **pp;
+
+      pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
+      while (1)
+	{
+	  sdata = backtrace_atomic_load_pointer (pp);
+	  if (sdata == NULL)
+	    break;
+
+	  sym = ((struct coff_symbol *)
+		 bsearch (&addr, sdata->symbols, sdata->count,
+			  sizeof (struct coff_symbol), coff_symbol_search));
+	  if (sym != NULL)
+	    break;
+
+	  pp = &sdata->next;
+	}
+    }
+
+  if (sym == NULL)
+    callback (data, addr, NULL, 0, 0);
+  else
+    callback (data, addr, sym->name, sym->address, 0);
+}
+
+/* Add the backtrace data for one PE/COFF file.  Returns 1 on success,
+   0 on failure (in both cases descriptor is closed).  */
+
+static int
+coff_add (struct backtrace_state *state, int descriptor,
+	  backtrace_error_callback error_callback, void *data,
+	  fileline *fileline_fn, int *found_sym, int *found_dwarf)
+{
+  struct backtrace_view fhdr_view;
+  off_t fhdr_off;
+  int magic_ok;
+  b_coff_file_header fhdr;
+  off_t opt_sects_off;
+  size_t opt_sects_size;
+  unsigned int sects_num;
+  struct backtrace_view sects_view;
+  int sects_view_valid;
+  const b_coff_optional_header *opt_hdr;
+  const b_coff_section_header *sects;
+  struct backtrace_view str_view;
+  int str_view_valid;
+  size_t str_size;
+  off_t str_off;
+  struct backtrace_view syms_view;
+  off_t syms_off;
+  size_t syms_size;
+  int syms_view_valid;
+  unsigned int syms_num;
+  unsigned int i;
+  struct debug_section_info sections[DEBUG_MAX];
+  off_t min_offset;
+  off_t max_offset;
+  struct backtrace_view debug_view;
+  int debug_view_valid;
+  uintptr_t image_base;
+
+  *found_sym = 0;
+  *found_dwarf = 0;
+
+  sects_view_valid = 0;
+  syms_view_valid = 0;
+  str_view_valid = 0;
+  debug_view_valid = 0;
+
+  /* Map the MS-DOS stub (if any) and extract file header offset.  */
+  if (!backtrace_get_view (state, descriptor, 0, 0x40, error_callback,
+			   data, &fhdr_view))
+    goto fail;
+
+  {
+    const char *vptr = (const char *)fhdr_view.data;
+
+    if (vptr[0] == 'M' && vptr[1] == 'Z')
+      memcpy (&fhdr_off, vptr + 0x3c, 4);
+    else
+      fhdr_off = 0;
+  }
+
+  backtrace_release_view (state, &fhdr_view, error_callback, data);
+
+  /* Map the coff file header.  */
+  if (!backtrace_get_view (state, descriptor, fhdr_off,
+			   sizeof (b_coff_file_header) + 4,
+			   error_callback, data, &fhdr_view))
+    goto fail;
+
+  if (fhdr_off != 0)
+    {
+      const char *magic = (const char *) fhdr_view.data;
+      magic_ok = memcmp (magic, "PE\0", 4) == 0;
+      fhdr_off += 4;
+
+      memcpy (&fhdr, fhdr_view.data + 4, sizeof fhdr);
+    }
+  else
+    {
+      memcpy (&fhdr, fhdr_view.data, sizeof fhdr);
+      /* TODO: test fhdr.machine for coff but non-PE platforms.  */
+      magic_ok = 0;
+    }
+  backtrace_release_view (state, &fhdr_view, error_callback, data);
+
+  if (!magic_ok)
+    {
+      error_callback (data, "executable file is not COFF", 0);
+      goto fail;
+    }
+
+  sects_num = fhdr.number_of_sections;
+  syms_num = fhdr.number_of_symbols;
+
+  opt_sects_off = fhdr_off + sizeof (fhdr);
+  opt_sects_size = (fhdr.size_of_optional_header
+		    + sects_num * sizeof (b_coff_section_header));
+
+  /* To translate PC to file/line when using DWARF, we need to find
+     the .debug_info and .debug_line sections.  */
+
+  /* Read the optional header and the section headers.  */
+
+  if (!backtrace_get_view (state, descriptor, opt_sects_off, opt_sects_size,
+			   error_callback, data, &sects_view))
+    goto fail;
+  sects_view_valid = 1;
+  opt_hdr = (const b_coff_optional_header *) sects_view.data;
+  sects = (const b_coff_section_header *)
+    (sects_view.data + fhdr.size_of_optional_header);
+
+  if (fhdr.size_of_optional_header > sizeof (*opt_hdr))
+    {
+      if (opt_hdr->magic == PE_MAGIC)
+	image_base = opt_hdr->u.pe.image_base;
+      else if (opt_hdr->magic == PEP_MAGIC)
+	image_base = opt_hdr->u.pep.image_base;
+      else
+	{
+	  error_callback (data, "bad magic in PE optional header", 0);
+	  goto fail;
+	}
+    }
+  else
+    image_base = 0;
+
+  /* Read the symbol table and the string table.  */
+
+  if (fhdr.pointer_to_symbol_table == 0)
+    {
+      /* No symbol table, no string table.  */
+      str_off = 0;
+      str_size = 0;
+      syms_num = 0;
+      syms_size = 0;
+    }
+  else
+    {
+      /* Symbol table is followed by the string table.  The string table
+	 starts with its length (on 4 bytes).
+	 Map the symbol table and the length of the string table.  */
+      syms_off = fhdr.pointer_to_symbol_table;
+      syms_size = syms_num * SYM_SZ;
+
+      if (!backtrace_get_view (state, descriptor, syms_off, syms_size + 4,
+			       error_callback, data, &syms_view))
+	goto fail;
+      syms_view_valid = 1;
+
+      memcpy (&str_size, syms_view.data + syms_size, 4);
+
+      str_off = syms_off + syms_size;
+
+      if (str_size > 4)
+	{
+	  /* Map string table (including the length word).  */
+
+	  if (!backtrace_get_view (state, descriptor, str_off, str_size,
+				   error_callback, data, &str_view))
+	    goto fail;
+	  str_view_valid = 1;
+	}
+    }
+
+  memset (sections, 0, sizeof sections);
+
+  /* Look for the symbol table.  */
+  for (i = 0; i < sects_num; ++i)
+    {
+      const b_coff_section_header *s = sects + i;
+      unsigned int str_off;
+      int j;
+
+      if (s->name[0] == '/')
+	{
+	  /* Extended section name.  */
+	  str_off = atoi (s->name + 1);
+	}
+      else
+	str_off = 0;
+
+      for (j = 0; j < (int) DEBUG_MAX; ++j)
+	{
+	  const char *dbg_name = debug_section_names[j];
+	  int match;
+
+	  if (str_off != 0)
+	    match = coff_long_name_eq (dbg_name, str_off, &str_view);
+	  else
+	    match = coff_short_name_eq (dbg_name, s->name);
+	  if (match)
+	    {
+	      sections[j].offset = s->pointer_to_raw_data;
+	      sections[j].size = s->virtual_size <= s->size_of_raw_data ?
+		s->virtual_size : s->size_of_raw_data;
+	      break;
+	    }
+	}
+    }
+
+  if (syms_num != 0)
+    {
+      struct coff_syminfo_data *sdata;
+
+      sdata = ((struct coff_syminfo_data *)
+	       backtrace_alloc (state, sizeof *sdata, error_callback, data));
+      if (sdata == NULL)
+	goto fail;
+
+      if (!coff_initialize_syminfo (state, image_base,
+				    sects, sects_num,
+				    syms_view.data, syms_size,
+				    str_view.data, str_size,
+				    error_callback, data, sdata))
+	{
+	  backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
+	  goto fail;
+	}
+
+      *found_sym = 1;
+
+      coff_add_syminfo_data (state, sdata);
+    }
+
+  backtrace_release_view (state, &sects_view, error_callback, data);
+  sects_view_valid = 0;
+  backtrace_release_view (state, &syms_view, error_callback, data);
+  syms_view_valid = 0;
+
+  /* Read all the debug sections in a single view, since they are
+     probably adjacent in the file.  We never release this view.  */
+
+  min_offset = 0;
+  max_offset = 0;
+  for (i = 0; i < (int) DEBUG_MAX; ++i)
+    {
+      off_t end;
+
+      if (sections[i].size == 0)
+	continue;
+      if (min_offset == 0 || sections[i].offset < min_offset)
+	min_offset = sections[i].offset;
+      end = sections[i].offset + sections[i].size;
+      if (end > max_offset)
+	max_offset = end;
+    }
+  if (min_offset == 0 || max_offset == 0)
+    {
+      if (!backtrace_close (descriptor, error_callback, data))
+	goto fail;
+      *fileline_fn = coff_nodebug;
+      return 1;
+    }
+
+  if (!backtrace_get_view (state, descriptor, min_offset,
+			   max_offset - min_offset,
+			   error_callback, data, &debug_view))
+    goto fail;
+  debug_view_valid = 1;
+
+  /* We've read all we need from the executable.  */
+  if (!backtrace_close (descriptor, error_callback, data))
+    goto fail;
+  descriptor = -1;
+
+  for (i = 0; i < (int) DEBUG_MAX; ++i)
+    {
+      if (sections[i].size == 0)
+	sections[i].data = NULL;
+      else
+	sections[i].data = ((const unsigned char *) debug_view.data
+			    + (sections[i].offset - min_offset));
+    }
+
+  if (!backtrace_dwarf_add (state, /* base_address */ 0,
+			    sections[DEBUG_INFO].data,
+			    sections[DEBUG_INFO].size,
+			    sections[DEBUG_LINE].data,
+			    sections[DEBUG_LINE].size,
+			    sections[DEBUG_ABBREV].data,
+			    sections[DEBUG_ABBREV].size,
+			    sections[DEBUG_RANGES].data,
+			    sections[DEBUG_RANGES].size,
+			    sections[DEBUG_STR].data,
+			    sections[DEBUG_STR].size,
+			    0, /* FIXME */
+			    error_callback, data, fileline_fn))
+    goto fail;
+
+  *found_dwarf = 1;
+
+  return 1;
+
+ fail:
+  if (sects_view_valid)
+    backtrace_release_view (state, &sects_view, error_callback, data);
+  if (str_view_valid)
+    backtrace_release_view (state, &str_view, error_callback, data);
+  if (syms_view_valid)
+    backtrace_release_view (state, &syms_view, error_callback, data);
+  if (debug_view_valid)
+    backtrace_release_view (state, &debug_view, error_callback, data);
+  if (descriptor != -1)
+    backtrace_close (descriptor, error_callback, data);
+  return 0;
+}
+
+/* Initialize the backtrace data we need from an ELF executable.  At
+   the ELF level, all we need to do is find the debug info
+   sections.  */
+
+int
+backtrace_initialize (struct backtrace_state *state, int descriptor,
+		      backtrace_error_callback error_callback,
+		      void *data, fileline *fileline_fn)
+{
+  int ret;
+  int found_sym;
+  int found_dwarf;
+  fileline coff_fileline_fn;
+
+  ret = coff_add (state, descriptor, error_callback, data,
+		  &coff_fileline_fn, &found_sym, &found_dwarf);
+  if (!ret)
+    return 0;
+
+  if (!state->threaded)
+    {
+      if (found_sym)
+	state->syminfo_fn = coff_syminfo;
+      else if (state->syminfo_fn == NULL)
+	state->syminfo_fn = coff_nosyms;
+    }
+  else
+    {
+      if (found_sym)
+	backtrace_atomic_store_pointer (&state->syminfo_fn, coff_syminfo);
+      else
+	__sync_bool_compare_and_swap (&state->syminfo_fn, NULL, coff_nosyms);
+    }
+
+  if (!state->threaded)
+    {
+      if (state->fileline_fn == NULL || state->fileline_fn == coff_nodebug)
+	*fileline_fn = coff_fileline_fn;
+    }
+  else
+    {
+      fileline current_fn;
+
+      current_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
+      if (current_fn == NULL || current_fn == coff_nodebug)
+	*fileline_fn = coff_fileline_fn;
+    }
+
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/posix.c
@@ -0,0 +1,100 @@
+/* posix.c -- POSIX file I/O routines for the backtrace library.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
+#ifndef FD_CLOEXEC
+#define FD_CLOEXEC 1
+#endif
+
+/* Open a file for reading.  */
+
+int
+backtrace_open (const char *filename, backtrace_error_callback error_callback,
+		void *data, int *does_not_exist)
+{
+  int descriptor;
+
+  if (does_not_exist != NULL)
+    *does_not_exist = 0;
+
+  descriptor = open (filename, (int) (O_RDONLY | O_BINARY | O_CLOEXEC));
+  if (descriptor < 0)
+    {
+      if (does_not_exist != NULL && errno == ENOENT)
+	*does_not_exist = 1;
+      else
+	error_callback (data, filename, errno);
+      return -1;
+    }
+
+#ifdef HAVE_FCNTL
+  /* Set FD_CLOEXEC just in case the kernel does not support
+     O_CLOEXEC. It doesn't matter if this fails for some reason.
+     FIXME: At some point it should be safe to only do this if
+     O_CLOEXEC == 0.  */
+  fcntl (descriptor, F_SETFD, FD_CLOEXEC);
+#endif
+
+  return descriptor;
+}
+
+/* Close DESCRIPTOR.  */
+
+int
+backtrace_close (int descriptor, backtrace_error_callback error_callback,
+		 void *data)
+{
+  if (close (descriptor) < 0)
+    {
+      error_callback (data, "close", errno);
+      return 0;
+    }
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/print.c
@@ -0,0 +1,92 @@
+/* print.c -- Print the current backtrace.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* Passed to callbacks.  */
+
+struct print_data
+{
+  struct backtrace_state *state;
+  FILE *f;
+};
+
+/* Print one level of a backtrace.  */
+
+static int
+print_callback (void *data, uintptr_t pc, const char *filename, int lineno,
+		const char *function)
+{
+  struct print_data *pdata = (struct print_data *) data;
+
+  fprintf (pdata->f, "0x%lx %s\n\t%s:%d\n",
+	   (unsigned long) pc,
+	   function == NULL ? "???" : function,
+	   filename == NULL ? "???" : filename,
+	   lineno);
+  return 0;
+}
+
+/* Print errors to stderr.  */
+
+static void
+error_callback (void *data, const char *msg, int errnum)
+{
+  struct print_data *pdata = (struct print_data *) data;
+
+  if (pdata->state->filename != NULL)
+    fprintf (stderr, "%s: ", pdata->state->filename);
+  fprintf (stderr, "libbacktrace: %s", msg);
+  if (errnum > 0)
+    fprintf (stderr, ": %s", strerror (errnum));
+  fputc ('\n', stderr);
+}
+
+/* Print a backtrace.  */
+
+void
+backtrace_print (struct backtrace_state *state, int skip, FILE *f)
+{
+  struct print_data data;
+
+  data.state = state;
+  data.f = f;
+  backtrace_full (state, skip + 1, print_callback, error_callback,
+		  (void *) &data);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/read.c
@@ -0,0 +1,96 @@
+/* read.c -- File views without mmap.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* This file implements file views when mmap is not available.  */
+
+/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  */
+
+int
+backtrace_get_view (struct backtrace_state *state, int descriptor,
+		    off_t offset, size_t size,
+		    backtrace_error_callback error_callback,
+		    void *data, struct backtrace_view *view)
+{
+  ssize_t got;
+
+  if (lseek (descriptor, offset, SEEK_SET) < 0)
+    {
+      error_callback (data, "lseek", errno);
+      return 0;
+    }
+
+  view->base = backtrace_alloc (state, size, error_callback, data);
+  if (view->base == NULL)
+    return 0;
+  view->data = view->base;
+  view->len = size;
+
+  got = read (descriptor, view->base, size);
+  if (got < 0)
+    {
+      error_callback (data, "read", errno);
+      free (view->base);
+      return 0;
+    }
+
+  if ((size_t) got < size)
+    {
+      error_callback (data, "file too short", 0);
+      free (view->base);
+      return 0;
+    }
+
+  return 1;
+}
+
+/* Release a view read by backtrace_get_view.  */
+
+void
+backtrace_release_view (struct backtrace_state *state,
+			struct backtrace_view *view,
+			backtrace_error_callback error_callback,
+			void *data)
+{
+  backtrace_free (state, view->base, view->len, error_callback, data);
+  view->data = NULL;
+  view->base = NULL;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/simple.c
@@ -0,0 +1,108 @@
+/* simple.c -- The backtrace_simple function.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include "unwind.h"
+#include "backtrace.h"
+
+/* The simple_backtrace routine.  */
+
+/* Data passed through _Unwind_Backtrace.  */
+
+struct backtrace_simple_data
+{
+  /* Number of frames to skip.  */
+  int skip;
+  /* Library state.  */
+  struct backtrace_state *state;
+  /* Callback routine.  */
+  backtrace_simple_callback callback;
+  /* Error callback routine.  */
+  backtrace_error_callback error_callback;
+  /* Data to pass to callback routine.  */
+  void *data;
+  /* Value to return from backtrace.  */
+  int ret;
+};
+
+/* Unwind library callback routine.  This is passd to
+   _Unwind_Backtrace.  */
+
+static _Unwind_Reason_Code
+simple_unwind (struct _Unwind_Context *context, void *vdata)
+{
+  struct backtrace_simple_data *bdata = (struct backtrace_simple_data *) vdata;
+  uintptr_t pc;
+  int ip_before_insn = 0;
+
+#ifdef HAVE_GETIPINFO
+  pc = _Unwind_GetIPInfo (context, &ip_before_insn);
+#else
+  pc = _Unwind_GetIP (context);
+#endif
+
+  if (bdata->skip > 0)
+    {
+      --bdata->skip;
+      return _URC_NO_REASON;
+    }
+
+  if (!ip_before_insn)
+    --pc;
+
+  bdata->ret = bdata->callback (bdata->data, pc);
+
+  if (bdata->ret != 0)
+    return _URC_END_OF_STACK;
+
+  return _URC_NO_REASON;
+}
+
+/* Get a simple stack backtrace.  */
+
+int
+backtrace_simple (struct backtrace_state *state, int skip,
+		  backtrace_simple_callback callback,
+		  backtrace_error_callback error_callback, void *data)
+{
+  struct backtrace_simple_data bdata;
+
+  bdata.skip = skip + 1;
+  bdata.state = state;
+  bdata.callback = callback;
+  bdata.error_callback = error_callback;
+  bdata.data = data;
+  bdata.ret = 0;
+  _Unwind_Backtrace (simple_unwind, &bdata);
+  return bdata.ret;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/sort.c
@@ -0,0 +1,108 @@
+/* sort.c -- Sort without allocating memory
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <stddef.h>
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* The GNU glibc version of qsort allocates memory, which we must not
+   do if we are invoked by a signal handler.  So provide our own
+   sort.  */
+
+static void
+swap (char *a, char *b, size_t size)
+{
+  size_t i;
+
+  for (i = 0; i < size; i++, a++, b++)
+    {
+      char t;
+
+      t = *a;
+      *a = *b;
+      *b = t;
+    }
+}
+
+void
+backtrace_qsort (void *basearg, size_t count, size_t size,
+		 int (*compar) (const void *, const void *))
+{
+  char *base = (char *) basearg;
+  size_t i;
+  size_t mid;
+
+ tail_recurse:
+  if (count < 2)
+    return;
+
+  /* The symbol table and DWARF tables, which is all we use this
+     routine for, tend to be roughly sorted.  Pick the middle element
+     in the array as our pivot point, so that we are more likely to
+     cut the array in half for each recursion step.  */
+  swap (base, base + (count / 2) * size, size);
+
+  mid = 0;
+  for (i = 1; i < count; i++)
+    {
+      if ((*compar) (base, base + i * size) > 0)
+	{
+	  ++mid;
+	  if (i != mid)
+	    swap (base + mid * size, base + i * size, size);
+	}
+    }
+
+  if (mid > 0)
+    swap (base, base + mid * size, size);
+
+  /* Recurse with the smaller array, loop with the larger one.  That
+     ensures that our maximum stack depth is log count.  */
+  if (2 * mid < count)
+    {
+      backtrace_qsort (base, mid, size, compar);
+      base += (mid + 1) * size;
+      count -= mid + 1;
+      goto tail_recurse;
+    }
+  else
+    {
+      backtrace_qsort (base + (mid + 1) * size, count - (mid + 1),
+		       size, compar);
+      count = mid;
+      goto tail_recurse;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/state.c
@@ -0,0 +1,72 @@
+/* state.c -- Create the backtrace state.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <string.h>
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "backtrace-supported.h"
+#include "internal.h"
+
+/* Create the backtrace state.  This will then be passed to all the
+   other routines.  */
+
+struct backtrace_state *
+backtrace_create_state (const char *filename, int threaded,
+			backtrace_error_callback error_callback,
+			void *data)
+{
+  struct backtrace_state init_state;
+  struct backtrace_state *state;
+
+#ifndef HAVE_SYNC_FUNCTIONS
+  if (threaded)
+    {
+      error_callback (data, "backtrace library does not support threads", 0);
+      return NULL;
+    }
+#endif
+
+  memset (&init_state, 0, sizeof init_state);
+  init_state.filename = filename;
+  init_state.threaded = threaded;
+
+  state = ((struct backtrace_state *)
+	   backtrace_alloc (&init_state, sizeof *state, error_callback, data));
+  if (state == NULL)
+    return NULL;
+  *state = init_state;
+
+  return state;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/stest.c
@@ -0,0 +1,137 @@
+/* stest.c -- Test for libbacktrace internal sort function
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* Test the local qsort implementation.  */
+
+#define MAX 10
+
+struct test
+{
+  size_t count;
+  int input[MAX];
+  int output[MAX];
+};
+
+static struct test tests[] =
+  {
+    {
+      10,
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
+    },
+    {
+      9,
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
+    },
+    {
+      10,
+      { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
+    },
+    {
+      9,
+      { 9, 8, 7, 6, 5, 4, 3, 2, 1 },
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
+    },
+    {
+      10,
+      { 2, 4, 6, 8, 10, 1, 3, 5, 7, 9 },
+      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
+    },
+    {
+      5,
+      { 4, 5, 3, 1, 2 },
+      { 1, 2, 3, 4, 5 },
+    },
+    {
+      5,
+      { 1, 1, 1, 1, 1 },
+      { 1, 1, 1, 1, 1 },
+    },
+    {
+      5,
+      { 1, 1, 2, 1, 1 },
+      { 1, 1, 1, 1, 2 },
+    },
+    {
+      5,
+      { 2, 1, 1, 1, 1 },
+      { 1, 1, 1, 1, 2 },
+    },
+  };
+
+static int
+compare (const void *a, const void *b)
+{
+  const int *ai = (const int *) a;
+  const int *bi = (const int *) b;
+
+  return *ai - *bi;
+}
+
+int
+main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
+{
+  int failures;
+  size_t i;
+  int a[MAX];
+
+  failures = 0;
+  for (i = 0; i < sizeof tests / sizeof tests[0]; i++)
+    {
+      memcpy (a, tests[i].input, tests[i].count * sizeof (int));
+      backtrace_qsort (a, tests[i].count, sizeof (int), compare);
+      if (memcmp (a, tests[i].output, tests[i].count * sizeof (int)) != 0)
+	{
+	  size_t j;
+
+	  fprintf (stderr, "test %d failed:", (int) i);
+	  for (j = 0; j < tests[i].count; j++)
+	    fprintf (stderr, " %d", a[j]);
+	  fprintf (stderr, "\n");
+	  ++failures;
+	}
+    }
+
+  exit (failures > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/src/libbacktrace/unknown.c
@@ -0,0 +1,64 @@
+/* unknown.c -- used when backtrace configury does not know file format.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor, Google.
+
+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.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+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 "config.h"
+
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* A trivial routine that always fails to find fileline data.  */
+
+static int
+unknown_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		  uintptr_t pc, backtrace_full_callback callback,
+		  backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+		  void *data)
+
+{
+  return callback (data, pc, NULL, 0, NULL);
+}
+
+/* Initialize the backtrace data when we don't know how to read the
+   debug info.  */
+
+int
+backtrace_initialize (struct backtrace_state *state ATTRIBUTE_UNUSED,
+		      int descriptor ATTRIBUTE_UNUSED,
+		      backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+		      void *data ATTRIBUTE_UNUSED, fileline *fileline_fn)
+{
+  state->fileline_data = NULL;
+  *fileline_fn = unknown_fileline;
+  return 1;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace-sys/symbol-map
@@ -0,0 +1,18 @@
+backtrace_full __rbt_backtrace_full
+backtrace_dwarf_add __rbt_backtrace_dwarf_add
+backtrace_initialize __rbt_backtrace_initialize
+backtrace_pcinfo __rbt_backtrace_pcinfo
+backtrace_syminfo __rbt_backtrace_syminfo
+backtrace_get_view __rbt_backtrace_get_view
+backtrace_release_view __rbt_backtrace_release_view
+backtrace_alloc __rbt_backtrace_alloc
+backtrace_free __rbt_backtrace_free
+backtrace_vector_finish __rbt_backtrace_vector_finish
+backtrace_vector_grow __rbt_backtrace_vector_grow
+backtrace_vector_release __rbt_backtrace_vector_release
+backtrace_close __rbt_backtrace_close
+backtrace_open __rbt_backtrace_open
+backtrace_print __rbt_backtrace_print
+backtrace_simple __rbt_backtrace_simple
+backtrace_qsort __rbt_backtrace_qsort
+backtrace_create_state __rbt_backtrace_create_state
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"6f11d19317924088c90d605e1d13e4af230b10e289c5df6139c40a62409eabd9","Cargo.toml":"f893b7b701611e48ab80db25670342084b11d8d4ed3f3471b68842c490d247b8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"11061a4c1e27fde148b5b1fb6df553f8eb464e279be0f5e278d262bf35d7b0f8","appveyor.yml":"29d9f44137560479a75b02a7953cfa0c378c2577ed1925f579b400295c7937e3","examples/backtrace.rs":"fd6e1cc6c3378ec7d41cd03b2bef187051298dceb01147e71f207dbb8a0c4867","examples/raw.rs":"f07be26d1f97cd7ac79290ac99d19c4eec5d27031fe270ab5364c25d9c2ad9e0","src/backtrace/dbghelp.rs":"45c5052763857d4a3727c3082be1b2f6c28f7973afd66706657defda5d97c6ec","src/backtrace/libunwind.rs":"cc9cdc1d389571cdedf43dfc2d39b8c3af85531a3965ed700c724f436afb213e","src/backtrace/mod.rs":"d00f4a574fae44df81b1d40bf44acea84addb70b4c76c85bfaa1f3ab0bcd7f0d","src/backtrace/noop.rs":"dc4a6602e9852b945c382194402314d3d68c8ca90199af9a8159419fb91a3c99","src/backtrace/unix_backtrace.rs":"1bb4a4a2f1e56f8ac04002dd77411116d8b4920f905d1ddfcb289e242f939a86","src/capture.rs":"de3250fcb9ff941391dea24decc8166d058f17abe77d25ff82b766ac384f00ea","src/dylib.rs":"09f3d7f32849cf0daa4de9df48f8e4a4d5ba62e20723c79578201bd271dc4777","src/lib.rs":"7ccd8cc3679435f0e39efd26f23d9d7a01094ab09ba6d411c6587b2420c6886b","src/symbolize/coresymbolication.rs":"99280684791694f560824b39291ee7ad78a2b53f82e5972ff3d9b77b43671f60","src/symbolize/dbghelp.rs":"d743545bb3e64eafc4903e3e7aec115b64da2174e75afd7b465bc0b89573b88a","src/symbolize/dladdr.rs":"8287cbca440a9e92e74d88c5a7b920f6b4cf6d8f50bc8b0f61aca5ba42d5b5ec","src/symbolize/libbacktrace.rs":"0cdad7de2501baef9da193ee6aab21c453d26348a2071c805a133efe1209eaa1","src/symbolize/mod.rs":"7f2efe54ce40f42ba38673614cff2a510632123cb6d1bc3da88566f12bcba588","src/symbolize/noop.rs":"b622fcecb4e22b42c3d3e2ef5dc5a6ab14601fec83c7797ee1fbbacc12fe6ca1","tests/smoke.rs":"fc882d7db0f4842e4415e3319774a33ba27c4d6412a62f8ee194a5dafd8a6128"},"package":"72f9b4182546f4b04ebc4ab7f84948953a118bd6021a1b6a6c909e3e94f6be76"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/.travis.yml
@@ -0,0 +1,40 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+before_script:
+  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
+script:
+  - cargo test
+  - cargo test --no-default-features
+  - cargo test --no-default-features --features 'libunwind'
+  - cargo test --no-default-features --features 'libunwind dladdr'
+  - cargo test --no-default-features --features 'libunwind libbacktrace'
+  - cargo test --no-default-features --features 'unix-backtrace'
+  - cargo test --no-default-features --features 'unix-backtrace dladdr'
+  - cargo test --no-default-features --features 'unix-backtrace libbacktrace'
+  - cargo test --no-default-features --features 'serialize-serde'
+  - cargo test --no-default-features --features 'serialize-rustc'
+  - cargo test --no-default-features --features 'serialize-rustc serialize-serde'
+  - cargo test --no-default-features --features 'cpp_demangle'
+  - cd ./cpp_smoke_test && cargo test && cd ..
+  - cargo clean && cargo build
+  - rustdoc --test README.md -L target/debug/deps -L target/debug
+  - cargo doc --no-deps
+notifications:
+  email:
+    on_success: never
+after_success:
+  - travis-cargo --only nightly doc-upload
+env:
+  global:
+    # serde-codegen has historically needed a large stack to expand
+    - RUST_MIN_STACK=16777216
+    - secure: "Kuf3j6gC3MhR+F7g8/5J4+3tu+FXJP/SqKjsUVVjs/qjniIVX3MwZPhtP/pVtdRvYjW0NzLw5Nufb4o1cyY4uKwR8BHHNuEUE/h3mPShjWHqzLyn5QiBumPozsFCa32H4gconRmp3+s0YrBT7nLoGvUZZS0dkldMkpvvrPL/yUKXLS8HEP4L1GO5iMQQYG6i3sbWTbHikE6ZQogW/iZommyqUkVB/s/SQvdH9SXu89ttNXlm/F+EIsgsgyzpbULp5sD34GRDPJe+H1m+sgA1kTRrzmuBGNmz9mx6GyIKaqACTm1gRcb06nFjTPVTQioJBNnoV7TEqZCvjuSsUjcGmP4Aeissafo93ADzV+bd0uoWIScE9ltSVS+RgCDV+sd0GHz5U6FjhgZp0amaVl3d6hPp8lbTfK/gfj1i9ktQfKZbG7rB4tfIU1KeQRkyE9vb/TaKp8nwBbc4SVQ4EKFOlRbE1S1FooaKZweW8w57d2u+sMMMVJbO28/Ap8tk9xDSOl4shPaT0iM0U9/heF8FmCZB1OKXLKn6TAaNFnaMTvdTHl+Tjrf6Vzd/oPXJ7GuaB6eLxXYjXvZHuKiLkSZriOzhL7PbijNILbSgZt7+Fa0vcnXP8zgD4dmupx/CoIHLN9NP4o9cGXuBcaJ/iFryJ4i5LKGFNEUHtXkavDrcgcA="
+
+
+os:
+  - linux
+  - osx
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/Cargo.toml
@@ -0,0 +1,87 @@
+[package]
+name = "backtrace"
+version = "0.3.2"
+authors = ["Alex Crichton <alex@alexcrichton.com>",
+           "The Rust Project Developers"]
+license = "MIT/Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/alexcrichton/backtrace-rs"
+homepage = "https://github.com/alexcrichton/backtrace-rs"
+documentation = "http://alexcrichton.com/backtrace-rs"
+description = """
+A library to acquire a stack trace (backtrace) at runtime in a Rust program.
+"""
+[dependencies]
+libc = "0.2"
+cfg-if = "0.1"
+rustc-demangle = "0.1.4"
+
+# Optionally enable the ability to serialize a `Backtrace`
+serde = { version = "1.0", optional = true }
+serde_derive = { version = "1.0", optional = true }
+rustc-serialize = { version = "0.3", optional = true }
+
+# Optionally demangle C++ frames' symbols in backtraces.
+cpp_demangle = { default-features = false, version = "0.2.3", optional = true }
+
+[target.'cfg(windows)'.dependencies]
+dbghelp-sys = { version = "0.2", optional = true }
+kernel32-sys = { version = "0.2", optional = true }
+winapi = { version = "0.2.5", optional = true }
+
+[target.'cfg(all(unix, not(target_os = "emscripten"), not(target_os = "macos"), not(target_os = "ios")))'.dependencies]
+backtrace-sys = { path = "backtrace-sys", version = "0.1.3", optional = true }
+
+# Each feature controls the two phases of finding a backtrace: getting a
+# backtrace and then resolving instruction pointers to symbols. The default
+# feature enables all the necessary features for each platform this library
+# supports, but it can be disabled to have finer grained control over the
+# dependencies.
+#
+# Note that not all features are available on all platforms, so even though a
+# feature is enabled some other feature may be used instead.
+[features]
+default = ["libunwind", "libbacktrace", "coresymbolication", "dladdr", "dbghelp"]
+
+    #=======================================
+    # Methods of acquiring a backtrace
+    #
+    # - libunwind: when using this the libgcc library is linked against to get
+    #   the unwinding support. This is generally the most reliable method to get
+    #   a backtrace on unix.
+    # - unix-backtrace: this uses the backtrace(3) function to acquire a
+    #   backtrace, but is not as reliable as libunwind. It is, however,
+    #   generally found in more locations.
+    # - dbghelp: on windows this enables usage of dbghelp.dll to find a
+    #   backtrace at runtime
+    # - kernel32: on windows this enables using RtlCaptureStackBackTrace as the
+    #   function to acquire a backtrace
+    libunwind = []
+    unix-backtrace = []
+    dbghelp = ["kernel32-sys", "winapi", "dbghelp-sys"]
+    kernel32 = []
+
+    #=======================================
+    # Methods of resolving symbols
+    #
+    # - libbacktrace: this feature activates the `backtrace-sys` dependency,
+    #   building the libbacktrace library found in gcc repos. This library
+    #   parses the DWARF info of ELF executables to find symbol names, and it
+    #   can also provide filename/line number information if debuginfo is
+    #   compiled in. This library currently only primarily works on unixes that
+    #   are not OSX, however.
+    # - dladdr: this feature uses the dladdr(3) function (a glibc extension) to
+    #   resolve symbol names. This is fairly unreliable on linux, but works well
+    #   enough on OSX.
+    # - coresymbolication: this feature uses the undocumented core symbolication
+    #   framework on OS X to symbolize.
+    libbacktrace = ["backtrace-sys"]
+    dladdr = []
+    coresymbolication = []
+
+    #=======================================
+    # Methods of serialization
+    #
+    # Various features used for enabling rustc-serialize or syntex codegen.
+    serialize-rustc = ["rustc-serialize"]
+    serialize-serde = ["serde", "serde_derive"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/README.md
@@ -0,0 +1,82 @@
+# backtrace-rs
+
+[![Build Status](https://travis-ci.org/alexcrichton/backtrace-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/backtrace-rs)
+[![Build status](https://ci.appveyor.com/api/projects/status/v4l9oj4aqbbgyx44?svg=true)](https://ci.appveyor.com/project/alexcrichton/backtrace-rs)
+
+[Documentation](http://alexcrichton.com/backtrace-rs)
+
+A library for acquiring backtraces at runtime for Rust. This library aims to
+enhance the support given by the standard library at `std::rt` by providing a
+more stable and programmatic interface.
+
+## Install
+
+```toml
+[dependencies]
+backtrace = "0.3"
+```
+
+```rust
+extern crate backtrace;
+```
+
+Note that this crate requires `make`, `objcopy`, and `ar` to be present on Linux
+systems.
+
+## Usage
+
+To simply capture a backtrace and defer dealing with it until a later time,
+you can use the top-level `Backtrace` type.
+
+```rust
+extern crate backtrace;
+
+use backtrace::Backtrace;
+
+fn main() {
+    let bt = Backtrace::new();
+
+    // do_some_work();
+
+    println!("{:?}", bt);
+}
+```
+
+If, however, you'd like more raw access to the actual tracing functionality, you
+can use the `trace` and `resolve` functions directly.
+
+```rust
+extern crate backtrace;
+
+fn main() {
+    backtrace::trace(|frame| {
+        let ip = frame.ip();
+        let symbol_address = frame.symbol_address();
+
+        // Resolve this instruction pointer to a symbol name
+        backtrace::resolve(ip, |symbol| {
+            if let Some(name) = symbol.name() {
+                // ...
+            }
+            if let Some(filename) = symbol.filename() {
+                // ...
+            }
+        });
+
+        true // keep going to the next frame
+    });
+}
+```
+
+## Platform Support
+
+This library currently supports OSX, Linux, and Windows. Support for other
+platforms is always welcome!
+
+## License
+
+`backtrace-rs` is primarily distributed under the terms of both the MIT license
+and the Apache License (Version 2.0), with portions covered by various BSD-like
+licenses.
+
+See LICENSE-APACHE, and LICENSE-MIT for details.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/appveyor.yml
@@ -0,0 +1,20 @@
+environment:
+  matrix:
+  - TARGET: x86_64-pc-windows-gnu
+    MSYS_BITS: 64
+  - TARGET: i686-pc-windows-gnu
+    MSYS_BITS: 32
+  - TARGET: x86_64-pc-windows-msvc
+  - TARGET: i686-pc-windows-msvc
+install:
+  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
+  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
+  - set PATH=%PATH%;C:\Program Files (x86)\Rust\bin
+  - if defined MSYS_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS_BITS%\bin
+  - rustc -V
+  - cargo -V
+
+build: false
+
+test_script:
+  - cargo test --target %TARGET%
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/examples/backtrace.rs
@@ -0,0 +1,7 @@
+extern crate backtrace;
+
+use backtrace::Backtrace;
+
+fn main() {
+    println!("{:?}", Backtrace::new());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/examples/raw.rs
@@ -0,0 +1,48 @@
+extern crate backtrace;
+
+fn main() {
+    foo();
+}
+
+fn foo() { bar() }
+fn bar() { baz() }
+fn baz() { print() }
+
+#[cfg(target_pointer_width = "32")] const HEX_WIDTH: usize = 10;
+#[cfg(target_pointer_width = "64")] const HEX_WIDTH: usize = 20;
+
+fn print() {
+    let mut cnt = 0;
+    backtrace::trace(|frame| {
+        let ip = frame.ip();
+        print!("frame #{:<2} - {:#02$x}", cnt, ip as usize, HEX_WIDTH);
+        cnt += 1;
+
+        let mut resolved = false;
+        backtrace::resolve(frame.ip(), |symbol| {
+            if !resolved {
+                resolved = true;
+            } else {
+                print!("{}", vec![" "; 7 + 2 + 3 + HEX_WIDTH].join(""));
+            }
+
+            if let Some(name) = symbol.name() {
+                print!(" - {}", name);
+            } else {
+                print!(" - <unknown>");
+            }
+            if let Some(file) = symbol.filename() {
+                if let Some(l) = symbol.lineno() {
+                    print!("\n{:13}{:4$}@ {}:{}", "", "", file.display(), l,
+                           HEX_WIDTH);
+                }
+            }
+            println!("");
+
+        });
+        if !resolved {
+            println!(" - <no info>");
+        }
+        true // keep going
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/backtrace/dbghelp.rs
@@ -0,0 +1,99 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(bad_style)]
+
+use std::mem;
+use winapi::*;
+use kernel32;
+
+pub struct Frame {
+    inner: STACKFRAME64,
+}
+
+impl Frame {
+    pub fn ip(&self) -> *mut c_void {
+        self.inner.AddrPC.Offset as *mut _
+    }
+
+    pub fn symbol_address(&self) -> *mut c_void {
+        self.ip()
+    }
+}
+
+#[inline(always)]
+pub fn trace(cb: &mut FnMut(&super::Frame) -> bool) {
+    // According to windows documentation, all dbghelp functions are
+    // single-threaded.
+    let _g = ::lock::lock();
+
+    unsafe {
+        // Allocate necessary structures for doing the stack walk
+        let process = kernel32::GetCurrentProcess();
+        let thread = kernel32::GetCurrentThread();
+
+        // The CONTEXT structure needs to be aligned on a 16-byte boundary for
+        // 64-bit Windows, but currently we don't have a way to express that in
+        // Rust. Allocations are generally aligned to 16-bytes, though, so we
+        // box this up.
+        let mut context = Box::new(mem::zeroed::<CONTEXT>());
+        kernel32::RtlCaptureContext(&mut *context);
+        let mut frame = super::Frame {
+            inner: Frame { inner: mem::zeroed() },
+        };
+        let image = init_frame(&mut frame.inner.inner, &context);
+
+        // Initialize this process's symbols
+        let _c = ::dbghelp_init();
+
+        // And now that we're done with all the setup, do the stack walking!
+        while ::dbghelp::StackWalk64(image as DWORD,
+                                     process,
+                                     thread,
+                                     &mut frame.inner.inner,
+                                     &mut *context as *mut _ as *mut _,
+                                     None,
+                                     Some(::dbghelp::SymFunctionTableAccess64),
+                                     Some(::dbghelp::SymGetModuleBase64),
+                                     None) == TRUE {
+            if frame.inner.inner.AddrPC.Offset == frame.inner.inner.AddrReturn.Offset ||
+               frame.inner.inner.AddrPC.Offset == 0 ||
+               frame.inner.inner.AddrReturn.Offset == 0 {
+                break
+            }
+
+            if !cb(&frame) {
+                break
+            }
+        }
+    }
+}
+
+#[cfg(target_arch = "x86_64")]
+fn init_frame(frame: &mut STACKFRAME64, ctx: &CONTEXT) -> WORD {
+    frame.AddrPC.Offset = ctx.Rip as u64;
+    frame.AddrPC.Mode = AddrModeFlat;
+    frame.AddrStack.Offset = ctx.Rsp as u64;
+    frame.AddrStack.Mode = AddrModeFlat;
+    frame.AddrFrame.Offset = ctx.Rbp as u64;
+    frame.AddrFrame.Mode = AddrModeFlat;
+    IMAGE_FILE_MACHINE_AMD64
+}
+
+#[cfg(target_arch = "x86")]
+fn init_frame(frame: &mut STACKFRAME64, ctx: &CONTEXT) -> WORD {
+    frame.AddrPC.Offset = ctx.Eip as u64;
+    frame.AddrPC.Mode = AddrModeFlat;
+    frame.AddrStack.Offset = ctx.Esp as u64;
+    frame.AddrStack.Mode = AddrModeFlat;
+    frame.AddrFrame.Offset = ctx.Ebp as u64;
+    frame.AddrFrame.Mode = AddrModeFlat;
+    IMAGE_FILE_MACHINE_I386
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/backtrace/libunwind.rs
@@ -0,0 +1,200 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::os::raw::c_void;
+
+pub struct Frame {
+    ctx: *mut uw::_Unwind_Context,
+}
+
+impl Frame {
+    pub fn ip(&self) -> *mut c_void {
+        let mut ip_before_insn = 0;
+        let mut ip = unsafe {
+            uw::_Unwind_GetIPInfo(self.ctx, &mut ip_before_insn) as *mut c_void
+        };
+        if !ip.is_null() && ip_before_insn == 0 {
+            // this is a non-signaling frame, so `ip` refers to the address
+            // after the calling instruction. account for that.
+            ip = (ip as usize - 1) as *mut _;
+        }
+        return ip
+    }
+
+    pub fn symbol_address(&self) -> *mut c_void {
+        // dladdr() on osx gets whiny when we use FindEnclosingFunction, and
+        // it appears to work fine without it, so we only use
+        // FindEnclosingFunction on non-osx platforms. In doing so, we get a
+        // slightly more accurate stack trace in the process.
+        //
+        // This is often because panic involves the last instruction of a
+        // function being "call std::rt::begin_unwind", with no ret
+        // instructions after it. This means that the return instruction
+        // pointer points *outside* of the calling function, and by
+        // unwinding it we go back to the original function.
+        if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
+            self.ip()
+        } else {
+            unsafe { uw::_Unwind_FindEnclosingFunction(self.ip()) }
+        }
+    }
+}
+
+#[inline(always)]
+pub fn trace(mut cb: &mut FnMut(&super::Frame) -> bool) {
+    unsafe {
+        uw::_Unwind_Backtrace(trace_fn, &mut cb as *mut _ as *mut _);
+    }
+
+    extern fn trace_fn(ctx: *mut uw::_Unwind_Context,
+                       arg: *mut c_void) -> uw::_Unwind_Reason_Code {
+        let cb = unsafe { &mut *(arg as *mut &mut FnMut(&super::Frame) -> bool) };
+        let cx = super::Frame {
+            inner: Frame { ctx: ctx },
+        };
+
+        let mut bomb = ::Bomb { enabled: true };
+        let keep_going = cb(&cx);
+        bomb.enabled = false;
+
+        if keep_going {
+            uw::_URC_NO_REASON
+        } else {
+            uw::_URC_FAILURE
+        }
+    }
+}
+
+/// Unwind library interface used for backtraces
+///
+/// Note that dead code is allowed as here are just bindings
+/// iOS doesn't use all of them it but adding more
+/// platform-specific configs pollutes the code too much
+#[allow(non_camel_case_types)]
+#[allow(non_snake_case)]
+#[allow(dead_code)]
+mod uw {
+    pub use self::_Unwind_Reason_Code::*;
+
+    use libc;
+    use std::os::raw::{c_int, c_void};
+
+    #[repr(C)]
+    pub enum _Unwind_Reason_Code {
+        _URC_NO_REASON = 0,
+        _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
+        _URC_FATAL_PHASE2_ERROR = 2,
+        _URC_FATAL_PHASE1_ERROR = 3,
+        _URC_NORMAL_STOP = 4,
+        _URC_END_OF_STACK = 5,
+        _URC_HANDLER_FOUND = 6,
+        _URC_INSTALL_CONTEXT = 7,
+        _URC_CONTINUE_UNWIND = 8,
+        _URC_FAILURE = 9, // used only by ARM EABI
+    }
+
+    pub enum _Unwind_Context {}
+
+    pub type _Unwind_Trace_Fn =
+            extern fn(ctx: *mut _Unwind_Context,
+                      arg: *mut c_void) -> _Unwind_Reason_Code;
+
+    extern {
+        // No native _Unwind_Backtrace on iOS
+        #[cfg(not(all(target_os = "ios", target_arch = "arm")))]
+        pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
+                                 trace_argument: *mut c_void)
+                    -> _Unwind_Reason_Code;
+
+        // available since GCC 4.2.0, should be fine for our purpose
+        #[cfg(all(not(all(target_os = "android", target_arch = "arm")),
+                  not(all(target_os = "linux", target_arch = "arm"))))]
+        pub fn _Unwind_GetIPInfo(ctx: *mut _Unwind_Context,
+                                 ip_before_insn: *mut c_int)
+                    -> libc::uintptr_t;
+
+        #[cfg(all(not(target_os = "android"),
+                  not(all(target_os = "linux", target_arch = "arm"))))]
+        pub fn _Unwind_FindEnclosingFunction(pc: *mut c_void)
+            -> *mut c_void;
+    }
+
+    // On android, the function _Unwind_GetIP is a macro, and this is the
+    // expansion of the macro. This is all copy/pasted directly from the
+    // header file with the definition of _Unwind_GetIP.
+    #[cfg(any(all(target_os = "android", target_arch = "arm"),
+              all(target_os = "linux", target_arch = "arm")))]
+    pub unsafe fn _Unwind_GetIP(ctx: *mut _Unwind_Context) -> libc::uintptr_t {
+        #[repr(C)]
+        enum _Unwind_VRS_Result {
+            _UVRSR_OK = 0,
+            _UVRSR_NOT_IMPLEMENTED = 1,
+            _UVRSR_FAILED = 2,
+        }
+        #[repr(C)]
+        enum _Unwind_VRS_RegClass {
+            _UVRSC_CORE = 0,
+            _UVRSC_VFP = 1,
+            _UVRSC_FPA = 2,
+            _UVRSC_WMMXD = 3,
+            _UVRSC_WMMXC = 4,
+        }
+        #[repr(C)]
+        enum _Unwind_VRS_DataRepresentation {
+            _UVRSD_UINT32 = 0,
+            _UVRSD_VFPX = 1,
+            _UVRSD_FPAX = 2,
+            _UVRSD_UINT64 = 3,
+            _UVRSD_FLOAT = 4,
+            _UVRSD_DOUBLE = 5,
+        }
+
+        type _Unwind_Word = libc::c_uint;
+        extern {
+            fn _Unwind_VRS_Get(ctx: *mut _Unwind_Context,
+                               klass: _Unwind_VRS_RegClass,
+                               word: _Unwind_Word,
+                               repr: _Unwind_VRS_DataRepresentation,
+                               data: *mut c_void)
+                -> _Unwind_VRS_Result;
+        }
+
+        let mut val: _Unwind_Word = 0;
+        let ptr = &mut val as *mut _Unwind_Word;
+        let _ = _Unwind_VRS_Get(ctx, _Unwind_VRS_RegClass::_UVRSC_CORE, 15,
+                                _Unwind_VRS_DataRepresentation::_UVRSD_UINT32,
+                                ptr as *mut c_void);
+        (val & !1) as libc::uintptr_t
+    }
+
+    // This function doesn't exist on Android or ARM/Linux, so make it same
+    // to _Unwind_GetIP
+    #[cfg(any(all(target_os = "android", target_arch = "arm"),
+              all(target_os = "linux", target_arch = "arm")))]
+    pub unsafe fn _Unwind_GetIPInfo(ctx: *mut _Unwind_Context,
+                                    ip_before_insn: *mut c_int)
+        -> libc::uintptr_t
+    {
+        *ip_before_insn = 0;
+        _Unwind_GetIP(ctx)
+    }
+
+    // This function also doesn't exist on Android or ARM/Linux, so make it
+    // a no-op
+    #[cfg(any(target_os = "android",
+              all(target_os = "linux", target_arch = "arm")))]
+    pub unsafe fn _Unwind_FindEnclosingFunction(pc: *mut c_void)
+        -> *mut c_void
+    {
+        pc
+    }
+}
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/backtrace/mod.rs
@@ -0,0 +1,112 @@
+use std::fmt;
+
+use std::os::raw::c_void;
+
+/// Inspects the current call-stack, passing all active frames into the closure
+/// provided to calculate a stack trace.
+///
+/// This function is the workhorse of this library in calculating the stack
+/// traces for a program. The given closure `cb` is yielded instances of a
+/// `Frame` which represent information about that call frame on the stack. The
+/// closure is yielded frames in a top-down fashion (most recently called
+/// functions first).
+///
+/// The closure's return value is an indication of whether the backtrace should
+/// continue. A return value of `false` will terminate the backtrace and return
+/// immediately.
+///
+/// Once a `Frame` is acquired you will likely want to call `backtrace::resolve`
+/// to convert the `ip` (instruction pointer) or symbol address to a `Symbol`
+/// through which the name and/or filename/line number can be learned.
+///
+/// Note that this is a relatively low-level function and if you'd like to, for
+/// example, capture a backtrace to be inspected later, then the `Backtrace`
+/// type may be more appropriate.
+///
+/// # Example
+///
+/// ```
+/// extern crate backtrace;
+///
+/// fn main() {
+///     backtrace::trace(|frame| {
+///         // ...
+///
+///         true // continue the backtrace
+///     });
+/// }
+/// ```
+#[inline(never)] // if this is never inlined then the first frame can be konwn
+                 // to be skipped
+pub fn trace<F: FnMut(&Frame) -> bool>(mut cb: F) {
+    trace_imp(&mut cb)
+}
+
+/// A trait representing one frame of a backtrace, yielded to the `trace`
+/// function of this crate.
+///
+/// The tracing function's closure will be yielded frames, and the frame is
+/// virtually dispatched as the underlying implementation is not always known
+/// until runtime.
+pub struct Frame {
+    inner: FrameImp,
+}
+
+impl Frame {
+    /// Returns the current instruction pointer of this frame.
+    ///
+    /// This is normally the next instruction to execute in the frame, but not
+    /// all implementations list this with 100% accuracy (but it's generally
+    /// pretty close).
+    ///
+    /// It is recommended to pass this value to `backtrace::resolve` to turn it
+    /// into a symbol name.
+    pub fn ip(&self) -> *mut c_void {
+        self.inner.ip()
+    }
+
+    /// Returns the starting symbol address of the frame of this function.
+    ///
+    /// This will attempt to rewind the instruction pointer returned by `ip` to
+    /// the start of the function, returning that value. In some cases, however,
+    /// backends will just return `ip` from this function.
+    ///
+    /// The returned value can sometimes be used if `backtrace::resolve` failed
+    /// on the `ip` given above.
+    pub fn symbol_address(&self) -> *mut c_void {
+        self.inner.symbol_address()
+    }
+}
+
+impl fmt::Debug for Frame {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("Frame")
+            .field("ip", &self.ip())
+            .field("symbol_address", &self.symbol_address())
+            .finish()
+    }
+}
+
+cfg_if! {
+    if #[cfg(all(unix,
+                 not(target_os = "emscripten"),
+                 feature = "libunwind"))] {
+        mod libunwind;
+        use self::libunwind::trace as trace_imp;
+        use self::libunwind::Frame as FrameImp;
+    } else if #[cfg(all(unix,
+                        not(target_os = "emscripten"),
+                        feature = "unix-backtrace"))] {
+        mod unix_backtrace;
+        use self::unix_backtrace::trace as trace_imp;
+        use self::unix_backtrace::Frame as FrameImp;
+    } else if #[cfg(all(windows, feature = "dbghelp"))] {
+        mod dbghelp;
+        use self::dbghelp::trace as trace_imp;
+        use self::dbghelp::Frame as FrameImp;
+    } else {
+        mod noop;
+        use self::noop::trace as trace_imp;
+        use self::noop::Frame as FrameImp;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/backtrace/noop.rs
@@ -0,0 +1,16 @@
+use std::os::raw::c_void;
+
+#[inline(always)]
+pub fn trace(_cb: &mut FnMut(&super::Frame) -> bool) {}
+
+pub struct Frame;
+
+impl Frame {
+    pub fn ip(&self) -> *mut c_void {
+        0 as *mut _
+    }
+
+    pub fn symbol_address(&self) -> *mut c_void {
+        0 as *mut _
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/backtrace/unix_backtrace.rs
@@ -0,0 +1,46 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::mem;
+use std::os::raw::{c_void, c_int};
+
+pub struct Frame {
+    addr: *mut c_void,
+}
+
+impl Frame {
+    pub fn ip(&self) -> *mut c_void { self.addr }
+    pub fn symbol_address(&self) -> *mut c_void { self.addr }
+}
+
+extern {
+    fn backtrace(buf: *mut *mut c_void, sz: c_int) -> c_int;
+}
+
+#[inline(always)]
+pub fn trace(mut cb: &mut FnMut(&super::Frame) -> bool) {
+    const SIZE: usize = 100;
+
+    let mut buf: [*mut c_void; SIZE];
+    let cnt;
+    unsafe {
+        buf = mem::zeroed();
+        cnt = backtrace(buf.as_mut_ptr(), SIZE as c_int);
+    }
+
+    for addr in buf[..cnt as usize].iter() {
+        let cx = super::Frame {
+            inner: Frame { addr: *addr },
+        };
+        if !cb(&cx) {
+            return
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/capture.rs
@@ -0,0 +1,194 @@
+use std::fmt;
+use std::mem;
+use std::os::raw::c_void;
+use std::path::{Path, PathBuf};
+
+use {trace, resolve, SymbolName};
+
+/// Representation of an owned and self-contained backtrace.
+///
+/// This structure can be used to capture a backtrace at various points in a
+/// program and later used to inspect what the backtrace was at that time.
+#[derive(Clone)]
+#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
+#[cfg_attr(feature = "serialize-serde", derive(Deserialize, Serialize))]
+pub struct Backtrace {
+    frames: Vec<BacktraceFrame>,
+}
+
+/// Captured version of a frame in a backtrace.
+///
+/// This type is returned as a list from `Backtrace::frames` and represents one
+/// stack frame in a captured backtrace.
+#[derive(Clone)]
+#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
+#[cfg_attr(feature = "serialize-serde", derive(Deserialize, Serialize))]
+pub struct BacktraceFrame {
+    ip: usize,
+    symbol_address: usize,
+    symbols: Vec<BacktraceSymbol>,
+}
+
+/// Captured version of a symbol in a backtrace.
+///
+/// This type is returned as a list from `BacktraceFrame::symbols` and
+/// represents the metadata for a symbol in a backtrace.
+#[derive(Clone)]
+#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
+#[cfg_attr(feature = "serialize-serde", derive(Deserialize, Serialize))]
+pub struct BacktraceSymbol {
+    name: Option<Vec<u8>>,
+    addr: Option<usize>,
+    filename: Option<PathBuf>,
+    lineno: Option<u32>,
+}
+
+impl Backtrace {
+    /// Captures a backtrace at the callsite of this function, returning an
+    /// owned representation.
+    ///
+    /// This function is useful for representing a backtrace as an object in
+    /// Rust. This returned value can be sent across threads and printed
+    /// elsewhere, and thie purpose of this value is to be entirely self
+    /// contained.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use backtrace::Backtrace;
+    ///
+    /// let current_backtrace = Backtrace::new();
+    /// ```
+    pub fn new() -> Backtrace {
+        let mut frames = Vec::new();
+        trace(|frame| {
+            let mut symbols = Vec::new();
+            resolve(frame.ip(), |symbol| {
+                symbols.push(BacktraceSymbol {
+                    name: symbol.name().map(|m| m.as_bytes().to_vec()),
+                    addr: symbol.addr().map(|a| a as usize),
+                    filename: symbol.filename().map(|m| m.to_path_buf()),
+                    lineno: symbol.lineno(),
+                });
+            });
+            frames.push(BacktraceFrame {
+                ip: frame.ip() as usize,
+                symbol_address: frame.symbol_address() as usize,
+                symbols: symbols,
+            });
+            true
+        });
+
+        Backtrace { frames: frames }
+    }
+
+    /// Returns the frames from when this backtrace was captured.
+    ///
+    /// The first entry of this slice is likely the function `Backtrace::new`,
+    /// and the last frame is likely something about how this thread or the main
+    /// function started.
+    pub fn frames(&self) -> &[BacktraceFrame] {
+        &self.frames
+    }
+}
+
+impl From<Vec<BacktraceFrame>> for Backtrace {
+    fn from(frames: Vec<BacktraceFrame>) -> Self {
+        Backtrace {
+            frames: frames
+        }
+    }
+}
+
+impl Into<Vec<BacktraceFrame>> for Backtrace {
+    fn into(self) -> Vec<BacktraceFrame> {
+        self.frames
+    }
+}
+
+impl BacktraceFrame {
+    /// Same as `Frame::ip`
+    pub fn ip(&self) -> *mut c_void {
+        self.ip as *mut c_void
+    }
+
+    /// Same as `Frame::symbol_address`
+    pub fn symbol_address(&self) -> *mut c_void {
+        self.symbol_address as *mut c_void
+    }
+}
+
+impl BacktraceFrame {
+    /// Returns the list of symbols that this frame corresponds to.
+    ///
+    /// Normally there is only one symbol per frame, but sometimes if a number
+    /// of functions are inlined into one frame then multiple symbols will be
+    /// returned. The first symbol listed is the "innermost function", whereas
+    /// the last symbol is the outermost (last caller).
+    pub fn symbols(&self) -> &[BacktraceSymbol] {
+        &self.symbols
+    }
+}
+
+impl BacktraceSymbol {
+    /// Same as `Symbol::name`
+    pub fn name(&self) -> Option<SymbolName> {
+        self.name.as_ref().map(|s| SymbolName::new(s))
+    }
+
+    /// Same as `Symbol::addr`
+    pub fn addr(&self) -> Option<*mut c_void> {
+        self.addr.map(|s| s as *mut c_void)
+    }
+
+    /// Same as `Symbol::filename`
+    pub fn filename(&self) -> Option<&Path> {
+        self.filename.as_ref().map(|p| &**p)
+    }
+
+    /// Same as `Symbol::lineno`
+    pub fn lineno(&self) -> Option<u32> {
+        self.lineno
+    }
+}
+
+impl fmt::Debug for Backtrace {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        let hex_width = mem::size_of::<usize>() * 2 + 2;
+
+        try!(write!(fmt, "stack backtrace:"));
+
+        for (idx, frame) in self.frames().iter().enumerate() {
+            let ip = frame.ip();
+            try!(write!(fmt, "\n{:4}: {:2$?}", idx, ip, hex_width));
+
+            if frame.symbols.len() == 0 {
+                try!(write!(fmt, " - <no info>"));
+            }
+
+            for (idx, symbol) in frame.symbols().iter().enumerate() {
+                if idx != 0 {
+                    try!(write!(fmt, "\n      {:1$}", "", hex_width));
+                }
+
+                if let Some(name) = symbol.name() {
+                    try!(write!(fmt, " - {}", name));
+                } else {
+                    try!(write!(fmt, " - <unknown>"));
+                }
+
+                if let (Some(file), Some(line)) = (symbol.filename(), symbol.lineno()) {
+                    try!(write!(fmt, "\n      {:3$}at {}:{}", "", file.display(), line, hex_width));
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl Default for Backtrace {
+    fn default() -> Backtrace {
+        Backtrace::new()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/dylib.rs
@@ -0,0 +1,70 @@
+use std::ffi::CString;
+use std::marker;
+use std::mem;
+use std::sync::atomic::{AtomicUsize, Ordering};
+
+use libc::{self, c_char, c_void};
+
+pub struct Dylib {
+    pub init: AtomicUsize,
+}
+
+pub struct Symbol<T> {
+    pub name: &'static str,
+    pub addr: AtomicUsize,
+    pub _marker: marker::PhantomData<T>,
+}
+
+impl Dylib {
+    pub unsafe fn get<'a, T>(&self, sym: &'a Symbol<T>) -> Option<&'a T> {
+        self.load().and_then(|handle| {
+            sym.get(handle)
+        })
+    }
+
+    pub unsafe fn init(&self, path: &str) -> bool {
+        if self.init.load(Ordering::SeqCst) != 0 {
+            return true
+        }
+        let name = CString::new(path).unwrap();
+        let ptr = libc::dlopen(name.as_ptr() as *const c_char, libc::RTLD_LAZY);
+        if ptr.is_null() {
+            return false
+        }
+        match self.init.compare_and_swap(0, ptr as usize, Ordering::SeqCst) {
+            0 => {}
+            _ => { libc::dlclose(ptr); }
+        }
+        return true
+    }
+
+    unsafe fn load(&self) -> Option<*mut c_void> {
+        match self.init.load(Ordering::SeqCst) {
+            0 => None,
+            n => Some(n as *mut c_void),
+        }
+    }
+}
+
+impl<T> Symbol<T> {
+    unsafe fn get(&self, handle: *mut c_void) -> Option<&T> {
+        assert_eq!(mem::size_of::<T>(), mem::size_of_val(&self.addr));
+        if self.addr.load(Ordering::SeqCst) == 0 {
+            self.addr.store(fetch(handle, self.name.as_ptr()), Ordering::SeqCst)
+        }
+        if self.addr.load(Ordering::SeqCst) == 1 {
+            None
+        } else {
+            mem::transmute::<&AtomicUsize, Option<&T>>(&self.addr)
+        }
+    }
+}
+
+unsafe fn fetch(handle: *mut c_void, name: *const u8) -> usize {
+    let ptr = libc::dlsym(handle, name as *const _);
+    if ptr.is_null() {
+        1
+    } else {
+        ptr as usize
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/lib.rs
@@ -0,0 +1,169 @@
+//! A library for acquiring a backtrace at runtime
+//!
+//! This library is meant to supplement the `RUST_BACKTRACE=1` support of the
+//! standard library by allowing an acquisition of a backtrace at runtime
+//! programmatically. The backtraces generated by this library do not need to be
+//! parsed, for example, and expose the functionality of multiple backend
+//! implementations.
+//!
+//! # Implementation
+//!
+//! This library makes use of a number of strategies for actually acquiring a
+//! backtrace. For example unix uses libgcc's libunwind bindings by default to
+//! acquire a backtrace, but coresymbolication or dladdr is used on OSX to
+//! acquire symbol names while linux uses gcc's libbacktrace.
+//!
+//! When using the default feature set of this library the "most reasonable" set
+//! of defaults is chosen for the current platform, but the features activated
+//! can also be controlled at a finer granularity.
+//!
+//! # Platform Support
+//!
+//! Currently this library is verified to work on Linux, OSX, and Windows, but
+//! it may work on other platforms as well. Note that the quality of the
+//! backtrace may vary across platforms.
+//!
+//! # API Principles
+//!
+//! This library attempts to be as flexible as possible to accomodate different
+//! backend implementations of acquiring a backtrace. Consequently the currently
+//! exported functions are closure-based as opposed to the likely expected
+//! iterator-based versions. This is done due to limitations of the underlying
+//! APIs used from the system.
+//!
+//! # Usage
+//!
+//! First, add this to your Cargo.toml
+//!
+//! ```toml
+//! [dependencies]
+//! backtrace = "0.2"
+//! ```
+//!
+//! Next:
+//!
+//! ```
+//! extern crate backtrace;
+//!
+//! fn main() {
+//!     backtrace::trace(|frame| {
+//!         let ip = frame.ip();
+//!         let symbol_address = frame.symbol_address();
+//!
+//!         // Resolve this instruction pointer to a symbol name
+//!         backtrace::resolve(ip, |symbol| {
+//!             if let Some(name) = symbol.name() {
+//!                 // ...
+//!             }
+//!             if let Some(filename) = symbol.filename() {
+//!                 // ...
+//!             }
+//!         });
+//!
+//!         true // keep going to the next frame
+//!     });
+//! }
+//! ```
+
+#![doc(html_root_url = "http://alexcrichton.com/backtrace-rs")]
+#![deny(missing_docs)]
+#![deny(warnings)]
+
+extern crate libc;
+#[cfg(all(windows, feature = "kernel32-sys"))] extern crate kernel32;
+#[cfg(all(windows, feature = "winapi"))] extern crate winapi;
+#[cfg(all(windows, feature = "dbghelp"))] extern crate dbghelp;
+
+#[cfg(feature = "serde")]
+extern crate serde;
+
+#[cfg(feature = "serde_derive")]
+#[cfg_attr(feature = "serde_derive", macro_use)]
+extern crate serde_derive;
+
+#[cfg(feature = "rustc-serialize")]
+extern crate rustc_serialize;
+
+#[macro_use]
+extern crate cfg_if;
+
+extern crate rustc_demangle;
+
+#[cfg(feature = "cpp_demangle")]
+extern crate cpp_demangle;
+
+#[allow(dead_code)] // not used everywhere
+#[cfg(unix)]
+#[macro_use]
+mod dylib;
+
+pub use backtrace::{trace, Frame};
+mod backtrace;
+
+pub use symbolize::{resolve, Symbol, SymbolName};
+mod symbolize;
+
+pub use capture::{Backtrace, BacktraceFrame, BacktraceSymbol};
+mod capture;
+
+#[allow(dead_code)]
+struct Bomb {
+    enabled: bool,
+}
+
+#[allow(dead_code)]
+impl Drop for Bomb {
+    fn drop(&mut self) {
+        if self.enabled {
+            panic!("cannot panic during the backtrace function");
+        }
+    }
+}
+
+#[allow(dead_code)]
+mod lock {
+    use std::cell::Cell;
+    use std::mem;
+    use std::sync::{Once, Mutex, MutexGuard, ONCE_INIT};
+
+    pub struct LockGuard(MutexGuard<'static, ()>);
+
+    static mut LOCK: *mut Mutex<()> = 0 as *mut _;
+    static INIT: Once = ONCE_INIT;
+    thread_local!(static LOCK_HELD: Cell<bool> = Cell::new(false));
+
+    impl Drop for LockGuard {
+        fn drop(&mut self) {
+            LOCK_HELD.with(|slot| {
+                assert!(slot.get());
+                slot.set(false);
+            });
+        }
+    }
+
+    pub fn lock() -> Option<LockGuard> {
+        if LOCK_HELD.with(|l| l.get()) {
+            return None
+        }
+        LOCK_HELD.with(|s| s.set(true));
+        unsafe {
+            INIT.call_once(|| {
+                LOCK = mem::transmute(Box::new(Mutex::new(())));
+            });
+            Some(LockGuard((*LOCK).lock().unwrap()))
+        }
+    }
+}
+
+// requires external synchronization
+#[cfg(all(windows, feature = "dbghelp"))]
+unsafe fn dbghelp_init() {
+    static mut INITIALIZED: bool = false;
+
+    if !INITIALIZED {
+        dbghelp::SymInitializeW(kernel32::GetCurrentProcess(),
+                                0 as *mut _,
+                                winapi::TRUE);
+        INITIALIZED = true;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/symbolize/coresymbolication.rs
@@ -0,0 +1,192 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(bad_style)]
+
+use std::ffi::{CStr, OsStr};
+use std::mem;
+use std::os::raw::{c_void, c_char, c_int};
+use std::os::unix::prelude::*;
+use std::path::Path;
+use std::ptr;
+use std::sync::atomic::ATOMIC_USIZE_INIT;
+
+use libc::{self, Dl_info};
+
+use SymbolName;
+use dylib::Dylib;
+use dylib::Symbol as DylibSymbol;
+
+#[repr(C)]
+#[derive(Copy, Clone, PartialEq)]
+pub struct CSTypeRef {
+    cpp_data: *const c_void,
+    cpp_obj: *const c_void
+}
+
+const CS_NOW: u64 = 0x80000000;
+const CSREF_NULL: CSTypeRef = CSTypeRef {
+    cpp_data: 0 as *const c_void,
+    cpp_obj: 0 as *const c_void,
+};
+
+pub enum Symbol {
+    Core {
+        path: *const c_char,
+        lineno: u32,
+        name: *const c_char,
+        addr: *mut c_void,
+    },
+    Dladdr(Dl_info),
+}
+
+impl Symbol {
+    pub fn name(&self) -> Option<SymbolName> {
+        let name = match *self {
+            Symbol::Core { name, .. } => name,
+            Symbol::Dladdr(ref info) => info.dli_sname,
+        };
+        if name.is_null() {
+            None
+        } else {
+            Some(SymbolName::new(unsafe {
+                CStr::from_ptr(name).to_bytes()
+            }))
+        }
+    }
+
+    pub fn addr(&self) -> Option<*mut c_void> {
+        match *self {
+            Symbol::Core { addr, .. } => Some(addr),
+            Symbol::Dladdr(ref info) => Some(info.dli_saddr as *mut _),
+        }
+    }
+
+    pub fn filename(&self) -> Option<&Path> {
+        match *self {
+            Symbol::Core { path, .. } => {
+                if path.is_null() {
+                    None
+                } else {
+                    Some(Path::new(OsStr::from_bytes(unsafe {
+                        CStr::from_ptr(path).to_bytes()
+                    })))
+                }
+            }
+            Symbol::Dladdr(_) => None,
+        }
+    }
+
+    pub fn lineno(&self) -> Option<u32> {
+        match *self {
+            Symbol::Core { lineno: 0, .. } => None,
+            Symbol::Core { lineno, .. } => Some(lineno),
+            Symbol::Dladdr(_) => None,
+        }
+    }
+}
+
+static CORESYMBOLICATION: Dylib = Dylib { init: ATOMIC_USIZE_INIT };
+
+macro_rules! dlsym {
+    (extern {
+        $(fn $name:ident($($arg:ident: $t:ty),*) -> $ret:ty;)*
+    }) => ($(
+        static $name: ::dylib::Symbol<unsafe extern fn($($t),*) -> $ret> =
+            ::dylib::Symbol {
+                name: concat!(stringify!($name), "\0"),
+                addr: ::std::sync::atomic::ATOMIC_USIZE_INIT,
+                _marker: ::std::marker::PhantomData,
+            };
+    )*)
+}
+
+dlsym! {
+    extern {
+        fn CSSymbolicatorCreateWithPid(pid: c_int) -> CSTypeRef;
+        fn CSRelease(rf: CSTypeRef) -> c_void;
+        fn CSSymbolicatorGetSymbolWithAddressAtTime(
+            cs: CSTypeRef, addr: *const c_void, time: u64) -> CSTypeRef;
+        fn CSSymbolicatorGetSourceInfoWithAddressAtTime(
+            cs: CSTypeRef, addr: *const c_void, time: u64) -> CSTypeRef;
+        fn CSSourceInfoGetLineNumber(info: CSTypeRef) -> c_int;
+        fn CSSourceInfoGetPath(info: CSTypeRef) -> *const c_char;
+        fn CSSourceInfoGetSymbol(info: CSTypeRef) -> CSTypeRef;
+        fn CSSymbolGetName(sym: CSTypeRef) -> *const c_char;
+        fn CSSymbolGetSymbolOwner(sym: CSTypeRef) -> CSTypeRef;
+        fn CSSymbolOwnerGetBaseAddress(symowner: CSTypeRef) -> *mut c_void;
+    }
+}
+
+unsafe fn get<T>(sym: &DylibSymbol<T>) -> &T {
+    CORESYMBOLICATION.get(sym).unwrap()
+}
+
+unsafe fn try_resolve(addr: *mut c_void, cb: &mut FnMut(&super::Symbol)) -> bool {
+    let path = "/System/Library/PrivateFrameworks/CoreSymbolication.framework\
+                /Versions/A/CoreSymbolication";
+    if !CORESYMBOLICATION.init(path) {
+        return false;
+    }
+
+    let cs = get(&CSSymbolicatorCreateWithPid)(libc::getpid());
+    if cs == CSREF_NULL {
+        return false
+    }
+
+    let info = get(&CSSymbolicatorGetSourceInfoWithAddressAtTime)(
+        cs, addr, CS_NOW);
+    let sym = if info == CSREF_NULL {
+        get(&CSSymbolicatorGetSymbolWithAddressAtTime)(cs, addr, CS_NOW)
+    } else {
+        get(&CSSourceInfoGetSymbol)(info)
+    };
+
+    let mut rv = false;
+    if sym != CSREF_NULL {
+        let owner = get(&CSSymbolGetSymbolOwner)(sym);
+        if owner != CSREF_NULL {
+            cb(&super::Symbol {
+                inner: Symbol::Core {
+                    path: if info != CSREF_NULL {
+                        get(&CSSourceInfoGetPath)(info)
+                    } else {
+                        ptr::null()
+                    },
+                    lineno: if info != CSREF_NULL {
+                        get(&CSSourceInfoGetLineNumber)(info) as u32
+                    } else {
+                        0
+                    },
+                    name: get(&CSSymbolGetName)(sym),
+                    addr: get(&CSSymbolOwnerGetBaseAddress)(owner),
+                },
+            });
+            rv = true;
+        }
+    }
+    get(&CSRelease)(cs);
+
+    rv
+}
+
+pub fn resolve(addr: *mut c_void, cb: &mut FnMut(&super::Symbol)) {
+    unsafe {
+        if try_resolve(addr, cb) {
+            return
+        }
+        let mut info: Dl_info = mem::zeroed();
+        if libc::dladdr(addr as *mut _, &mut info) != 0 {
+            cb(&super::Symbol {
+                inner: Symbol::Dladdr(info),
+            });
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/symbolize/dbghelp.rs
@@ -0,0 +1,107 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(bad_style)]
+
+use std::ffi::OsString;
+use std::mem;
+use std::path::Path;
+use std::os::windows::prelude::*;
+use std::slice;
+use kernel32;
+use winapi::*;
+
+use SymbolName;
+
+pub struct Symbol {
+    name: OsString,
+    addr: *mut c_void,
+    line: Option<u32>,
+    filename: Option<OsString>,
+}
+
+impl Symbol {
+    pub fn name(&self) -> Option<SymbolName> {
+        self.name.to_str().map(|s| SymbolName::new(s.as_bytes()))
+    }
+
+    pub fn addr(&self) -> Option<*mut c_void> {
+        Some(self.addr as *mut _)
+    }
+
+    pub fn filename(&self) -> Option<&Path> {
+        self.filename.as_ref().map(Path::new)
+    }
+
+    pub fn lineno(&self) -> Option<u32> {
+        self.line
+    }
+}
+
+pub fn resolve(addr: *mut c_void, cb: &mut FnMut(&super::Symbol)) {
+    // According to windows documentation, all dbghelp functions are
+    // single-threaded.
+    let _g = ::lock::lock();
+
+    unsafe {
+        let size = 2 * MAX_SYM_NAME + mem::size_of::<SYMBOL_INFOW>();
+        let mut data = vec![0u8; size];
+        let info = &mut *(data.as_mut_ptr() as *mut SYMBOL_INFOW);
+        info.MaxNameLen = MAX_SYM_NAME as ULONG;
+        // the struct size in C.  the value is different to
+        // `size_of::<SYMBOL_INFOW>() - MAX_SYM_NAME + 1` (== 81)
+        // due to struct alignment.
+        info.SizeOfStruct = 88;
+
+        let _c = ::dbghelp_init();
+
+        let mut displacement = 0u64;
+        let ret = ::dbghelp::SymFromAddrW(kernel32::GetCurrentProcess(),
+                                          addr as DWORD64,
+                                          &mut displacement,
+                                          info);
+        if ret != TRUE {
+            return
+        }
+        let name = slice::from_raw_parts(info.Name.as_ptr() as *const u16,
+                                         info.NameLen as usize);
+        let name = OsString::from_wide(name);
+
+        let mut line = mem::zeroed::<IMAGEHLP_LINEW64>();
+        line.SizeOfStruct = mem::size_of::<IMAGEHLP_LINEW64>() as DWORD;
+        let mut displacement = 0;
+        let ret = ::dbghelp::SymGetLineFromAddrW64(kernel32::GetCurrentProcess(),
+                                                   addr as DWORD64,
+                                                   &mut displacement,
+                                                   &mut line);
+        let mut filename = None;
+        let mut lineno = None;
+        if ret == TRUE {
+            lineno = Some(line.LineNumber as u32);
+
+            let base = line.FileName;
+            let mut len = 0;
+            while *base.offset(len) != 0 {
+                len += 1;
+            }
+            let name = slice::from_raw_parts(base, len as usize);
+            filename = Some(OsString::from_wide(name));
+        }
+
+        cb(&super::Symbol {
+            inner: Symbol {
+                name: name,
+                addr: info.Address as *mut _,
+                line: lineno,
+                filename: filename,
+            },
+        })
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/symbolize/dladdr.rs
@@ -0,0 +1,59 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::ffi::CStr;
+use std::mem;
+use std::os::raw::c_void;
+use std::path::Path;
+
+use libc::{self, Dl_info};
+
+use SymbolName;
+
+pub struct Symbol {
+    inner: Dl_info,
+}
+
+impl Symbol {
+    pub fn name(&self) -> Option<SymbolName> {
+        if self.inner.dli_sname.is_null() {
+            None
+        } else {
+            Some(SymbolName::new(unsafe {
+                CStr::from_ptr(self.inner.dli_sname).to_bytes()
+            }))
+        }
+    }
+
+    pub fn addr(&self) -> Option<*mut c_void> {
+        Some(self.inner.dli_saddr as *mut _)
+    }
+
+    pub fn filename(&self) -> Option<&Path> {
+        None
+    }
+
+    pub fn lineno(&self) -> Option<u32> {
+        None
+    }
+}
+
+pub fn resolve(addr: *mut c_void, cb: &mut FnMut(&super::Symbol)) {
+    unsafe {
+        let mut info: super::Symbol = super::Symbol {
+            inner: Symbol {
+                inner: mem::zeroed(),
+            },
+        };
+        if libc::dladdr(addr as *mut _, &mut info.inner.inner) != 0 {
+            cb(&info)
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/symbolize/libbacktrace.rs
@@ -0,0 +1,180 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(bad_style)]
+
+extern crate backtrace_sys as bt;
+
+use libc::uintptr_t;
+use std::ffi::{CStr, OsStr};
+use std::os::raw::{c_void, c_char, c_int};
+use std::os::unix::prelude::*;
+use std::path::Path;
+use std::ptr;
+use std::sync::{ONCE_INIT, Once};
+
+use SymbolName;
+
+pub enum Symbol {
+    Syminfo {
+        pc: uintptr_t,
+        symname: *const c_char,
+    },
+    Pcinfo {
+        pc: uintptr_t,
+        filename: *const c_char,
+        lineno: c_int,
+        function: *const c_char,
+    },
+}
+
+impl Symbol {
+    pub fn name(&self) -> Option<SymbolName> {
+        let ptr = match *self {
+            Symbol::Syminfo { symname, .. } => symname,
+            Symbol::Pcinfo { function, .. } => function,
+        };
+        if ptr.is_null() {
+            None
+        } else {
+            Some(SymbolName::new(unsafe { CStr::from_ptr(ptr).to_bytes() }))
+        }
+    }
+
+    pub fn addr(&self) -> Option<*mut c_void> {
+        let pc = match *self {
+            Symbol::Syminfo { pc, .. } => pc,
+            Symbol::Pcinfo { pc, .. } => pc,
+        };
+        if pc == 0 {None} else {Some(pc as *mut _)}
+    }
+
+    pub fn filename(&self) -> Option<&Path> {
+        match *self {
+            Symbol::Syminfo { .. } => None,
+            Symbol::Pcinfo { filename, .. } => {
+                Some(Path::new(OsStr::from_bytes(unsafe {
+                    CStr::from_ptr(filename).to_bytes()
+                })))
+            }
+        }
+    }
+
+    pub fn lineno(&self) -> Option<u32> {
+        match *self {
+            Symbol::Syminfo { .. } => None,
+            Symbol::Pcinfo { lineno, .. } => Some(lineno as u32),
+        }
+    }
+}
+
+extern fn error_cb(_data: *mut c_void, _msg: *const c_char,
+                   _errnum: c_int) {
+    // do nothing for now
+}
+
+extern fn syminfo_cb(data: *mut c_void,
+                     pc: uintptr_t,
+                     symname: *const c_char,
+                     _symval: uintptr_t,
+                     _symsize: uintptr_t) {
+    unsafe {
+        call(data, &super::Symbol {
+            inner: Symbol::Syminfo {
+                pc: pc,
+                symname: symname,
+            },
+        });
+    }
+}
+
+extern fn pcinfo_cb(data: *mut c_void,
+                    pc: uintptr_t,
+                    filename: *const c_char,
+                    lineno: c_int,
+                    function: *const c_char) -> c_int {
+    unsafe {
+        if filename.is_null() || function.is_null() {
+            return -1
+        }
+        call(data, &super::Symbol {
+            inner: Symbol::Pcinfo {
+                pc: pc,
+                filename: filename,
+                lineno: lineno,
+                function: function,
+            },
+        });
+        return 0
+    }
+}
+
+unsafe fn call(data: *mut c_void, sym: &super::Symbol) {
+    let cb = data as *mut &mut FnMut(&super::Symbol);
+    let mut bomb = ::Bomb { enabled: true };
+    (*cb)(sym);
+    bomb.enabled = false;
+}
+
+// The libbacktrace API supports creating a state, but it does not
+// support destroying a state. I personally take this to mean that a
+// state is meant to be created and then live forever.
+//
+// I would love to register an at_exit() handler which cleans up this
+// state, but libbacktrace provides no way to do so.
+//
+// With these constraints, this function has a statically cached state
+// that is calculated the first time this is requested. Remember that
+// backtracing all happens serially (one global lock).
+//
+// Things don't work so well on not-Linux since libbacktrace can't track down
+// that executable this is. We at one point used env::current_exe but it turns
+// out that there are some serious security issues with that approach.
+//
+// Specifically, on certain platforms like BSDs, a malicious actor can cause an
+// arbitrary file to be placed at the path returned by current_exe. libbacktrace
+// does not behave defensively in the presence of ill-formed DWARF information,
+// and has been demonstrated to segfault in at least one case. There is no
+// evidence at the moment to suggest that a more carefully constructed file
+// can't cause arbitrary code execution. As a result of all of this, we don't
+// hint libbacktrace with the path to the current process.
+unsafe fn init_state() -> *mut bt::backtrace_state {
+    static mut STATE: *mut bt::backtrace_state = 0 as *mut _;
+    static INIT: Once = ONCE_INIT;
+    INIT.call_once(|| {
+        // Our libbacktrace may not have multithreading support, so
+        // set `threaded = 0` and synchronize ourselves.
+        STATE = bt::backtrace_create_state(ptr::null(), 0, error_cb,
+                                           ptr::null_mut());
+    });
+
+    STATE
+}
+
+pub fn resolve(symaddr: *mut c_void, mut cb: &mut FnMut(&super::Symbol)) {
+    let _guard = ::lock::lock();
+
+    // backtrace errors are currently swept under the rug
+    unsafe {
+        let state = init_state();
+        if state.is_null() {
+            return
+        }
+
+        let ret = bt::backtrace_pcinfo(state, symaddr as uintptr_t,
+                                       pcinfo_cb, error_cb,
+                                       &mut cb as *mut _ as *mut _);
+        if ret != 0 {
+            bt::backtrace_syminfo(state, symaddr as uintptr_t,
+                                  syminfo_cb, error_cb,
+                                  &mut cb as *mut _ as *mut _);
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/symbolize/mod.rs
@@ -0,0 +1,283 @@
+use std::fmt;
+#[cfg(not(feature = "cpp_demangle"))]
+use std::marker::PhantomData;
+use std::os::raw::c_void;
+use std::path::Path;
+use std::str;
+use rustc_demangle::{try_demangle, Demangle};
+
+/// Resolve an address to a symbol, passing the symbol to the specified
+/// closure.
+///
+/// This function will look up the given address in areas such as the local
+/// symbol table, dynamic symbol table, or DWARF debug info (depending on the
+/// activated implementation) to find symbols to yield.
+///
+/// The closure may not be called if resolution could not be performed, and it
+/// also may be called more than once in the case of inlined functions.
+///
+/// Symbols yielded represent the execution at the specified `addr`, returning
+/// file/line pairs for that addres (if available).
+///
+/// # Example
+///
+/// ```
+/// extern crate backtrace;
+///
+/// fn main() {
+///     backtrace::trace(|frame| {
+///         let ip = frame.ip();
+///
+///         backtrace::resolve(ip, |symbol| {
+///             // ...
+///         });
+///
+///         false // only look at the top frame
+///     });
+/// }
+/// ```
+pub fn resolve<F: FnMut(&Symbol)>(addr: *mut c_void, mut cb: F) {
+    resolve_imp(addr, &mut cb)
+}
+
+/// A trait representing the resolution of a symbol in a file.
+///
+/// This trait is yielded as a trait object to the closure given to the
+/// `backtrace::resolve` function, and it is virtually dispatched as it's
+/// unknown which implementation is behind it.
+///
+/// A symbol can give contextual information about a funciton, for example the
+/// name, filename, line number, precise address, etc. Not all information is
+/// always available in a symbol, however, so all methods return an `Option`.
+pub struct Symbol {
+    inner: SymbolImp,
+}
+
+impl Symbol {
+    /// Returns the name of this function.
+    ///
+    /// The returned structure can be used to query various properties about the
+    /// symbol name:
+    ///
+    /// * The `Display` implementation will print out the demangled symbol.
+    /// * The raw `str` value of the symbol can be accessed (if it's valid
+    ///   utf-8).
+    /// * The raw bytes for the symbol name can be accessed.
+    pub fn name(&self) -> Option<SymbolName> {
+        self.inner.name()
+    }
+
+    /// Returns the starting address of this function.
+    pub fn addr(&self) -> Option<*mut c_void> {
+        self.inner.addr()
+    }
+
+    /// Returns the file name where this function was defined.
+    ///
+    /// This is currently only available when libbacktrace is being used (e.g.
+    /// unix platforms other than OSX) and when a binary is compiled with
+    /// debuginfo. If neither of these conditions is met then this will likely
+    /// return `None`.
+    pub fn filename(&self) -> Option<&Path> {
+        self.inner.filename()
+    }
+
+    /// Returns the line number for where this symbol is currently executing.
+    ///
+    /// This return value is typically `Some` if `filename` returns `Some`, and
+    /// is consequently subject to similar caveats.
+    pub fn lineno(&self) -> Option<u32> {
+        self.inner.lineno()
+    }
+}
+
+impl fmt::Debug for Symbol {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let mut d = f.debug_struct("Symbol");
+        if let Some(name) = self.name() {
+            d.field("name", &name);
+        }
+        if let Some(addr) = self.addr() {
+            d.field("addr", &addr);
+        }
+        if let Some(filename) = self.filename() {
+            d.field("filename", &filename);
+        }
+        if let Some(lineno) = self.lineno() {
+            d.field("lineno", &lineno);
+        }
+        d.finish()
+    }
+}
+
+
+cfg_if! {
+    if #[cfg(feature = "cpp_demangle")] {
+        // Maybe a parsed C++ symbol, if parsing the mangled symbol as Rust
+        // failed.
+        struct OptionCppSymbol<'a>(Option<::cpp_demangle::BorrowedSymbol<'a>>);
+
+        impl<'a> OptionCppSymbol<'a> {
+            fn parse(input: &'a [u8]) -> OptionCppSymbol<'a> {
+                OptionCppSymbol(::cpp_demangle::BorrowedSymbol::new(input).ok())
+            }
+
+            fn none() -> OptionCppSymbol<'a> {
+                OptionCppSymbol(None)
+            }
+        }
+    } else {
+        // Make sure to keep this zero-sized, so that the `cpp_demangle` feature
+        // has no cost when disabled.
+        struct OptionCppSymbol<'a>(PhantomData<&'a ()>);
+
+        impl<'a> OptionCppSymbol<'a> {
+            fn parse(_: &'a [u8]) -> OptionCppSymbol<'a> {
+                OptionCppSymbol(PhantomData)
+            }
+
+            fn none() -> OptionCppSymbol<'a> {
+                OptionCppSymbol(PhantomData)
+            }
+        }
+    }
+}
+
+/// A wrapper around a symbol name to provide ergonomic accessors to the
+/// demangled name, the raw bytes, the raw string, etc.
+// Allow dead code for when the `cpp_demangle` feature is not enabled.
+#[allow(dead_code)]
+pub struct SymbolName<'a> {
+    bytes: &'a [u8],
+    demangled: Option<Demangle<'a>>,
+    cpp_demangled: OptionCppSymbol<'a>,
+}
+
+impl<'a> SymbolName<'a> {
+    /// Creates a new symbol name from the raw underlying bytes.
+    pub fn new(bytes: &'a [u8]) -> SymbolName<'a> {
+        let str_bytes = str::from_utf8(bytes).ok();
+        let demangled = str_bytes.and_then(|s| try_demangle(s).ok());
+
+        let cpp = if demangled.is_none() {
+            OptionCppSymbol::parse(bytes)
+        } else {
+            OptionCppSymbol::none()
+        };
+
+        SymbolName {
+            bytes: bytes,
+            demangled: demangled,
+            cpp_demangled: cpp,
+        }
+    }
+
+    /// Returns the raw symbol name as a `str` if the symbols is valid utf-8.
+    pub fn as_str(&self) -> Option<&'a str> {
+        self.demangled
+            .as_ref()
+            .map(|s| s.as_str())
+            .or_else(|| {
+                str::from_utf8(self.bytes).ok()
+            })
+    }
+
+    /// Returns the raw symbol name as a list of bytes
+    pub fn as_bytes(&self) -> &'a [u8] {
+        self.bytes
+    }
+}
+
+cfg_if! {
+    if #[cfg(feature = "cpp_demangle")] {
+        impl<'a> fmt::Display for SymbolName<'a> {
+            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                if let Some(ref s) = self.demangled {
+                    s.fmt(f)
+                } else if let Some(ref cpp) = self.cpp_demangled.0 {
+                    cpp.fmt(f)
+                } else {
+                    String::from_utf8_lossy(self.bytes).fmt(f)
+                }
+            }
+        }
+    } else {
+        impl<'a> fmt::Display for SymbolName<'a> {
+            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                if let Some(ref s) = self.demangled {
+                    s.fmt(f)
+                } else {
+                    String::from_utf8_lossy(self.bytes).fmt(f)
+                }
+            }
+        }
+    }
+}
+
+cfg_if! {
+    if #[cfg(feature = "cpp_demangle")] {
+        impl<'a> fmt::Debug for SymbolName<'a> {
+            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                use std::fmt::Write;
+
+                if let Some(ref s) = self.demangled {
+                    return s.fmt(f)
+                }
+
+                // This may to print if the demangled symbol isn't actually
+                // valid, so handle the error here gracefully by not propagating
+                // it outwards.
+                if let Some(ref cpp) = self.cpp_demangled.0 {
+                    let mut s = String::new();
+                    if write!(s, "{}", cpp).is_ok() {
+                        return s.fmt(f)
+                    }
+                }
+
+                String::from_utf8_lossy(self.bytes).fmt(f)
+            }
+        }
+    } else {
+        impl<'a> fmt::Debug for SymbolName<'a> {
+            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                if let Some(ref s) = self.demangled {
+                    s.fmt(f)
+                } else {
+                    String::from_utf8_lossy(self.bytes).fmt(f)
+                }
+            }
+        }
+    }
+}
+
+cfg_if! {
+    if #[cfg(all(windows, feature = "dbghelp"))] {
+        mod dbghelp;
+        use self::dbghelp::resolve as resolve_imp;
+        use self::dbghelp::Symbol as SymbolImp;
+    } else if #[cfg(all(feature = "libbacktrace",
+                        unix,
+                        not(target_os = "emscripten"),
+                        not(target_os = "macos"),
+                        not(target_os = "ios")))] {
+        mod libbacktrace;
+        use self::libbacktrace::resolve as resolve_imp;
+        use self::libbacktrace::Symbol as SymbolImp;
+    } else if #[cfg(all(feature = "coresymbolication",
+                        any(target_os = "macos",
+                            target_os = "ios")))] {
+        mod coresymbolication;
+        use self::coresymbolication::resolve as resolve_imp;
+        use self::coresymbolication::Symbol as SymbolImp;
+    } else if #[cfg(all(unix,
+                        not(target_os = "emscripten"),
+                        feature = "dladdr"))] {
+        mod dladdr;
+        use self::dladdr::resolve as resolve_imp;
+        use self::dladdr::Symbol as SymbolImp;
+    } else {
+        mod noop;
+        use self::noop::resolve as resolve_imp;
+        use self::noop::Symbol as SymbolImp;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/src/symbolize/noop.rs
@@ -0,0 +1,27 @@
+use std::path::Path;
+use std::os::raw::c_void;
+
+use SymbolName;
+
+pub fn resolve(_addr: *mut c_void, _cb: &mut FnMut(&super::Symbol)) {
+}
+
+pub struct Symbol;
+
+impl Symbol {
+    pub fn name(&self) -> Option<SymbolName> {
+        None
+    }
+
+    pub fn addr(&self) -> Option<*mut c_void> {
+        None
+    }
+
+    pub fn filename(&self) -> Option<&Path> {
+        None
+    }
+
+    pub fn lineno(&self) -> Option<u32> {
+        None
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/backtrace/tests/smoke.rs
@@ -0,0 +1,167 @@
+extern crate backtrace;
+
+use std::os::raw::c_void;
+use std::thread;
+
+static LIBUNWIND: bool = cfg!(all(unix, feature = "libunwind"));
+static UNIX_BACKTRACE: bool = cfg!(all(unix, feature = "unix-backtrace"));
+static LIBBACKTRACE: bool = cfg!(all(unix, feature = "libbacktrace")) &&
+                            !cfg!(target_os = "macos") && !cfg!(target_os = "ios");
+static CORESYMBOLICATION: bool = cfg!(all(any(target_os = "macos", target_os = "ios"),
+                                          feature = "coresymbolication"));
+static DLADDR: bool = cfg!(all(unix, feature = "dladdr"));
+static DBGHELP: bool = cfg!(all(windows, feature = "dbghelp"));
+static MSVC: bool = cfg!(target_env = "msvc");
+
+#[test]
+fn smoke_test_frames() {
+    frame_1(line!());
+    #[inline(never)] fn frame_1(start_line: u32) { frame_2(start_line) }
+    #[inline(never)] fn frame_2(start_line: u32) { frame_3(start_line) }
+    #[inline(never)] fn frame_3(start_line: u32) { frame_4(start_line) }
+    #[inline(never)] fn frame_4(start_line: u32) {
+        let mut v = Vec::new();
+        backtrace::trace(|cx| {
+            v.push((cx.ip(), cx.symbol_address()));
+            true
+        });
+
+        if v.len() < 5 {
+            assert!(!LIBUNWIND);
+            assert!(!UNIX_BACKTRACE);
+            assert!(!DBGHELP);
+            return
+        }
+
+        // On 32-bit windows apparently the first frame isn't our backtrace
+        // frame but it's actually this frame. I'm not entirely sure why, but at
+        // least it seems consistent?
+        let o = if cfg!(all(windows, target_pointer_width = "32")) {1} else {0};
+        // frame offset 0 is the `backtrace::trace` function, but that's generic
+        assert_frame(&v, o, 1, frame_4 as usize, "frame_4",
+                     "tests/smoke.rs", start_line + 6);
+        assert_frame(&v, o, 2, frame_3 as usize, "frame_3", "tests/smoke.rs",
+                     start_line + 3);
+        assert_frame(&v, o, 3, frame_2 as usize, "frame_2", "tests/smoke.rs",
+                     start_line + 2);
+        assert_frame(&v, o, 4, frame_1 as usize, "frame_1", "tests/smoke.rs",
+                     start_line + 1);
+        assert_frame(&v, o, 5, smoke_test_frames as usize,
+                     "smoke_test_frames", "", 0);
+    }
+
+    fn assert_frame(syms: &[(*mut c_void, *mut c_void)],
+                    offset: usize,
+                    idx: usize,
+                    actual_fn_pointer: usize,
+                    expected_name: &str,
+                    expected_file: &str,
+                    expected_line: u32) {
+        if offset > idx { return }
+        let (ip, sym) = syms[idx - offset];
+        let ip = ip as usize;
+        let sym = sym as usize;
+        assert!(ip >= sym);
+        assert!(sym >= actual_fn_pointer);
+
+        // windows dbghelp is *quite* liberal (and wrong) in many of its reports
+        // right now...
+        if !DBGHELP {
+            assert!(sym - actual_fn_pointer < 1024);
+        }
+
+        let mut resolved = 0;
+        let can_resolve = DLADDR || LIBBACKTRACE || CORESYMBOLICATION || DBGHELP;
+
+        let mut name = None;
+        let mut addr = None;
+        let mut line = None;
+        let mut file = None;
+        backtrace::resolve(ip as *mut c_void, |sym| {
+            resolved += 1;
+            name = sym.name().map(|v| v.to_string());
+            addr = sym.addr();
+            line = sym.lineno();
+            file = sym.filename().map(|v| v.to_path_buf());
+        });
+
+        // dbghelp doesn't always resolve symbols right now
+        match resolved {
+            0 => return assert!(!can_resolve || DBGHELP),
+            _ => {}
+        }
+
+        // * linux dladdr doesn't work (only consults local symbol table)
+        // * windows dbghelp isn't great for GNU
+        if can_resolve &&
+           !(cfg!(target_os = "linux") && DLADDR) &&
+           !(DBGHELP && !MSVC)
+        {
+            let name = name.expect("didn't find a name");
+            assert!(name.contains(expected_name),
+                    "didn't find `{}` in `{}`", expected_name, name);
+        }
+
+        if can_resolve {
+            addr.expect("didn't find a symbol");
+        }
+
+        if (LIBBACKTRACE || CORESYMBOLICATION || (DBGHELP && MSVC)) && cfg!(debug_assertions) {
+            let line = line.expect("didn't find a line number");
+            let file = file.expect("didn't find a line number");
+            if !expected_file.is_empty() {
+                assert!(file.ends_with(expected_file),
+                        "{:?} didn't end with {:?}", file, expected_file);
+            }
+            if expected_line != 0 {
+                assert!(line == expected_line,
+                        "bad line number on frame for `{}`: {} != {}",
+                        expected_name, line, expected_line);
+            }
+        }
+    }
+}
+
+#[test]
+fn many_threads() {
+    let threads = (0..16).map(|_| {
+        thread::spawn(|| {
+            for _ in 0..16 {
+                backtrace::trace(|frame| {
+                    backtrace::resolve(frame.ip(), |symbol| {
+                        let _s = symbol.name().map(|s| s.to_string());
+                    });
+                    true
+                });
+            }
+        })
+    }).collect::<Vec<_>>();
+
+    for t in threads {
+        t.join().unwrap()
+    }
+}
+
+#[test]
+#[cfg(feature = "rustc-serialize")]
+fn is_rustc_serialize() {
+    extern crate rustc_serialize;
+
+    fn is_encode<T: rustc_serialize::Encodable>() {}
+    fn is_decode<T: rustc_serialize::Decodable>() {}
+
+    is_encode::<backtrace::Backtrace>();
+    is_decode::<backtrace::Backtrace>();
+}
+
+#[test]
+#[cfg(feature = "serde")]
+fn is_serde() {
+    extern crate serde;
+
+    fn is_serialize<T: serde::ser::Serialize>() {}
+    fn is_deserialize<T: serde::de::DeserializeOwned>() {}
+
+    is_serialize::<backtrace::Backtrace>();
+    is_deserialize::<backtrace::Backtrace>();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"923a5b8789a70a59cd7faa52904c4496259e0e90acb7170d3ced9a16eb144364","Cargo.toml":"79fbb792e6c1d05c44188c808ef7120c592e50291a706fe0f669b8ac9a2ad5e5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7","README.md":"b2da2fd61c4f3abf45127d183b61eb2dabc1c97cd191854987aa0328549a663f","benches/benchmarks.rs":"f0469f65f901c3e92fa506c0deb277fd136a7f968cae7cc4f030c0c15e52322f","examples/make_tables.rs":"3c80f2a8cdb204168cc1b60f8904d544b2da067b9e6a7b40ade5fb4a994b4175","src/lib.rs":"a3ac363513ae99a9b0049c19c92bc46b57ac9a0ebfd3317b7b387c5fbaa16a8a","src/tables.rs":"378743892907cde87c1a92e6afee2df36ce590311e61381b2cc0404b3e018039","tests/tests.rs":"dc2c293bae576cc596bdfb6ef783dc1d24d3bf992bf532caaebe1738cb0608cc"},"package":"30e93c03064e7590d0466209155251b90c22e37fab1daf2771582598b5827557"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/.gitignore
@@ -0,0 +1,13 @@
+target/
+Cargo.lock
+*~
+*.swp
+*.swo
+main.rs
+
+# JetBrains tools
+.idea
+*.iml
+
+# `perf record` files
+perf.data*
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "base64"
+version = "0.5.2"
+authors = ["Alice Maz <alice@alicemaz.com>", "Marshall Pierce <marshall@mpierce.org>"]
+description = "encodes and decodes base64 as bytes or utf8"
+repository = "https://github.com/alicemaz/rust-base64"
+documentation = "https://github.com/alicemaz/rust-base64/blob/master/README.md"
+readme = "README.md"
+keywords = ["base64", "utf8", "encode", "decode"]
+categories = ["encoding"]
+license = "MIT"
+
+[dependencies]
+byteorder = "1.0.0"
+
+[dev-dependencies]
+rand = "=0.3.15"
+
+[profile.bench]
+# Uncomment when using `perf record`
+#debug = true
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/LICENSE-MIT
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Alice Maz
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/README.md
@@ -0,0 +1,112 @@
+[base64](https://crates.io/crates/base64)
+===
+
+It's base64. What more could anyone want?
+
+Example
+---
+
+In Cargo.toml: `base64 = "~0.5.0"`
+
+```rust
+extern crate base64;
+
+use base64::{encode, decode};
+
+fn main() {
+    let a = b"hello world";
+    let b = "aGVsbG8gd29ybGQ=";
+
+    assert_eq!(encode(a), b);
+    assert_eq!(a, &decode(b).unwrap()[..]);
+}
+```
+
+API
+---
+
+base64 exposes six functions:
+
+```rust
+fn encode<T: ?Sized + AsRef<[u8]>>(&T) -> String;
+fn decode<T: ?Sized + AsRef<[u8]>>(&T) -> Result<Vec<u8>, DecodeError>;
+fn encode_config<T: ?Sized + AsRef<[u8]>>(&T, Config) -> String;
+fn encode_config_buf<T: ?Sized + AsRef<[u8]>>(&T, Config, &mut String);
+fn decode_config<T: ?Sized + AsRef<[u8]>>(&T, Config) -> Result<Vec<u8>, DecodeError>;
+fn decode_config_buf<T: ?Sized + AsRef<[u8]>>(&T, Config, &mut Vec<u8>) -> Result<(), DecodeError>;
+```
+
+`STANDARD`, `URL_SAFE`, `URL_SAFE_NO_PAD`, and `MIME` configuation structs are provided for convenience. `encode` and `decode` are convenience wrappers for the `_config` functions called with the `STANDARD` config, and they are themselves wrappers of the `_buf` functions that allocate on the user's behalf. Encode produces valid padding absent a config that states otherwise; decode produces the same output for valid or omitted padding in all cases, but errors on invalid (superfluous) padding. Whitespace in the input to decode is an error for all modes except `MIME`, which disregards it ("whitespace" according to POSIX-locale `isspace`, meaning \n \r \f \t \v and space).
+
+`Config` exposes a constructor to allow custom combinations of character set, output padding, input whitespace permissiveness, linewrapping, and line ending character(s). The vast majority of usecases should be covered by the four provided, however.
+
+Purpose
+---
+
+I have a fondness for small dependency footprints, ecosystems where you can pick and choose what functionality you need, and no more. Unix philosophy sort of thing I guess, many tiny utilities interoperating across a common interface. One time making a Twitter bot, I ran into the need to correctly pluralize arbitrary words. I found on npm a module that did nothing but pluralize words. Nothing else, just a couple of functions. I'd like for this to be that "just a couple of functions."
+
+Developing
+---
+
+Benchmarks are in `benches/`. Running them requires nightly rust, but `rustup` makes it easy:
+
+```
+rustup run nightly cargo bench
+```
+
+Decoding is aided by some pre-calculated tables, which are generated by:
+
+```
+cargo run --example make_tables > src/tables.rs.tmp && mv src/tables.rs.tmp src/tables.rs
+```
+
+Profiling
+---
+
+On Linux, you can use [perf](https://perf.wiki.kernel.org/index.php/Main_Page) for profiling. First, enable debug symbols in Cargo.toml. Don't commit this change, though, since it's usually not what you want (and costs some performance):
+
+```
+[profile.release]
+debug = true
+```
+
+Then compile the benchmarks. (Just re-run them and ^C once the benchmarks start running; all that's needed is to recompile them.)
+
+Run the benchmark binary with `perf` (shown here filtering to one particular benchmark, which will make the results easier to read). `perf` is only available to the root user on most systems as it fiddles with event counters in your CPU, so use `sudo`. We need to run the actual benchmark binary, hence the path into `target`. You can see the actual full path with `rustup run nightly cargo bench -v`; it will print out the commands it runs. If you use the exact path that `bench` outputs, make sure you get the one that's for the benchmarks, not the tests. You may also want to `cargo clean` so you have only one `benchmarks-` binary (they tend to accumulate).
+
+```
+sudo perf record target/release/deps/benchmarks-* --bench decode_10mib_reuse
+```
+
+Then analyze the results, again with perf:
+
+```
+sudo perf annotate -l
+```
+
+You'll see a bunch of interleaved rust source and assembly like this. The section with `lib.rs:327` is telling us that 4.02% of samples saw the `movzbl` aka bit shift as the active instruction. However, this percentage is not as exact as it seems due to a phenomenon called *skid*. Basically, a consequence of how fancy modern CPUs are is that this sort of instruction profiling is inherently inaccurate, especially in branch-heavy code.
+
+```
+ lib.rs:322    0.70 :     10698:       mov    %rdi,%rax
+    2.82 :        1069b:       shr    $0x38,%rax
+         :                  if morsel == decode_tables::INVALID_VALUE {
+         :                      bad_byte_index = input_index;
+         :                      break;
+         :                  };
+         :                  accum = (morsel as u64) << 58;
+ lib.rs:327    4.02 :     1069f:       movzbl (%r9,%rax,1),%r15d
+         :              // fast loop of 8 bytes at a time
+         :              while input_index < length_of_full_chunks {
+         :                  let mut accum: u64;
+         :
+         :                  let input_chunk = BigEndian::read_u64(&input_bytes[input_index..(input_index + 8)]);
+         :                  morsel = decode_table[(input_chunk >> 56) as usize];
+ lib.rs:322    3.68 :     106a4:       cmp    $0xff,%r15
+         :                  if morsel == decode_tables::INVALID_VALUE {
+    0.00 :        106ab:       je     1090e <base64::decode_config_buf::hbf68a45fefa299c1+0x46e>
+```
+
+License
+---
+
+This project is dual-licensed under MIT and Apache 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/benches/benchmarks.rs
@@ -0,0 +1,230 @@
+#![feature(test)]
+
+extern crate base64;
+extern crate test;
+extern crate rand;
+
+use base64::{decode, decode_config_buf, encode, encode_config_buf, STANDARD};
+
+use test::Bencher;
+use rand::Rng;
+
+#[bench]
+fn encode_3b(b: &mut Bencher) {
+    do_encode_bench(b, 3)
+}
+
+#[bench]
+fn encode_3b_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 3)
+}
+
+#[bench]
+fn encode_50b(b: &mut Bencher) {
+    do_encode_bench(b, 50)
+}
+
+#[bench]
+fn encode_50b_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 50)
+}
+
+#[bench]
+fn encode_100b(b: &mut Bencher) {
+    do_encode_bench(b, 100)
+}
+
+#[bench]
+fn encode_100b_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 100)
+}
+
+#[bench]
+fn encode_500b(b: &mut Bencher) {
+    do_encode_bench(b, 500)
+}
+
+#[bench]
+fn encode_500b_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 500)
+}
+
+#[bench]
+fn encode_3kib(b: &mut Bencher) {
+    do_encode_bench(b, 3 * 1024)
+}
+
+#[bench]
+fn encode_3kib_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 3 * 1024)
+}
+
+#[bench]
+fn encode_3mib(b: &mut Bencher) {
+    do_encode_bench(b, 3 * 1024 * 1024)
+}
+
+#[bench]
+fn encode_3mib_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 3 * 1024 * 1024)
+}
+
+#[bench]
+fn encode_10mib(b: &mut Bencher) {
+    do_encode_bench(b, 10 * 1024 * 1024)
+}
+
+#[bench]
+fn encode_10mib_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 10 * 1024 * 1024)
+}
+
+#[bench]
+fn encode_30mib(b: &mut Bencher) {
+    do_encode_bench(b, 30 * 1024 * 1024)
+}
+
+#[bench]
+fn encode_30mib_reuse_buf(b: &mut Bencher) {
+    do_encode_bench_reuse_buf(b, 30 * 1024 * 1024)
+}
+
+#[bench]
+fn decode_3b(b: &mut Bencher) {
+    do_decode_bench(b, 3)
+}
+
+#[bench]
+fn decode_3b_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 3)
+}
+
+#[bench]
+fn decode_50b(b: &mut Bencher) {
+    do_decode_bench(b, 50)
+}
+
+#[bench]
+fn decode_50b_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 50)
+}
+
+#[bench]
+fn decode_100b(b: &mut Bencher) {
+    do_decode_bench(b, 100)
+}
+
+#[bench]
+fn decode_100b_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 100)
+}
+
+#[bench]
+fn decode_500b(b: &mut Bencher) {
+    do_decode_bench(b, 500)
+}
+
+#[bench]
+fn decode_500b_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 500)
+}
+
+#[bench]
+fn decode_3kib(b: &mut Bencher) {
+    do_decode_bench(b, 3 * 1024)
+}
+
+#[bench]
+fn decode_3kib_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 3 * 1024)
+}
+
+#[bench]
+fn decode_3mib(b: &mut Bencher) {
+    do_decode_bench(b, 3 * 1024 * 1024)
+}
+
+#[bench]
+fn decode_3mib_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 3 * 1024 * 1024)
+}
+
+#[bench]
+fn decode_10mib(b: &mut Bencher) {
+    do_decode_bench(b, 10 * 1024 * 1024)
+}
+
+#[bench]
+fn decode_10mib_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 10 * 1024 * 1024)
+}
+
+#[bench]
+fn decode_30mib(b: &mut Bencher) {
+    do_decode_bench(b, 30 * 1024 * 1024)
+}
+
+#[bench]
+fn decode_30mib_reuse_buf(b: &mut Bencher) {
+    do_decode_bench_reuse_buf(b, 30 * 1024 * 1024)
+}
+
+fn do_decode_bench(b: &mut Bencher, size: usize) {
+    let mut v: Vec<u8> = Vec::with_capacity(size * 3 / 4);
+    fill(&mut v);
+    let encoded = encode(&v);
+
+    b.bytes = encoded.len() as u64;
+    b.iter(|| {
+        let orig = decode(&encoded);
+        test::black_box(&orig);
+    });
+}
+
+fn do_decode_bench_reuse_buf(b: &mut Bencher, size: usize) {
+    let mut v: Vec<u8> = Vec::with_capacity(size * 3 / 4);
+    fill(&mut v);
+    let encoded = encode(&v);
+
+    let mut buf = Vec::new();
+    b.bytes = encoded.len() as u64;
+    b.iter(|| {
+        decode_config_buf(&encoded, STANDARD, &mut buf).unwrap();
+        test::black_box(&buf);
+        buf.clear();
+    });
+}
+
+fn do_encode_bench(b: &mut Bencher, size: usize) {
+    let mut v: Vec<u8> = Vec::with_capacity(size);
+    fill(&mut v);
+
+    b.bytes = v.len() as u64;
+    b.iter(|| {
+        let e = encode(&v);
+        test::black_box(&e);
+    });
+}
+
+fn do_encode_bench_reuse_buf(b: &mut Bencher, size: usize) {
+    let mut v: Vec<u8> = Vec::with_capacity(size);
+    fill(&mut v);
+
+    let mut buf = String::new();
+
+    b.bytes = v.len() as u64;
+    b.iter(|| {
+        let e = encode_config_buf(&v, STANDARD, &mut buf);
+        test::black_box(&e);
+        buf.clear();
+    });
+}
+
+fn fill(v: &mut Vec<u8>) {
+    let cap = v.capacity();
+    // weak randomness is plenty; we just want to not be completely friendly to the branch predictor
+    let mut r = rand::weak_rng();
+    while v.len() < cap {
+        v.push(r.gen::<u8>());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/examples/make_tables.rs
@@ -0,0 +1,73 @@
+use std::collections::HashMap;
+use std::iter::Iterator;
+
+fn main() {
+    println!("pub const INVALID_VALUE: u8 = 255;");
+
+    // A-Z
+    let standard_alphabet: Vec<u8> = (0x41..0x5B)
+        // a-z
+        .chain(0x61..0x7B)
+        // 0-9
+        .chain(0x30..0x3A)
+        // +
+        .chain(0x2B..0x2C)
+        // /
+        .chain(0x2F..0x30)
+        .collect();
+    print_encode_table(&standard_alphabet, "STANDARD_ENCODE", 0);
+    print_decode_table(&standard_alphabet, "STANDARD_DECODE", 0);
+
+    // A-Z
+    let url_alphabet: Vec<u8> = (0x41..0x5B)
+        // a-z
+        .chain(0x61..0x7B)
+        // 0-9
+        .chain(0x30..0x3A)
+        // -
+        .chain(0x2D..0x2E)
+        // _s
+        .chain(0x5F..0x60)
+        .collect();
+    print_encode_table(&url_alphabet, "URL_SAFE_ENCODE", 0);
+    print_decode_table(&url_alphabet, "URL_SAFE_DECODE", 0);
+
+}
+
+fn print_encode_table(alphabet: &[u8], const_name: &str, indent_depth: usize) {
+    println!("{:width$}pub const {}: &'static [u8; 64] = &[", "", const_name, width=indent_depth);
+
+    for (i, b) in alphabet.iter().enumerate() {
+        println!("{:width$}{}, // input {} (0x{:X}) => '{}' (0x{:X})", "",
+                 b, i, i, String::from_utf8(vec!(*b as u8)).unwrap(), b, width=indent_depth + 4);
+    }
+
+    println!("{:width$}];", "", width=indent_depth);
+}
+
+fn print_decode_table(alphabet: &[u8], const_name: &str, indent_depth: usize) {
+    // map of alphabet bytes to 6-bit morsels
+    let mut input_to_morsel = HashMap::<u8, u8>::new();
+
+    // standard base64 alphabet bytes, in order
+    for (morsel, ascii_byte) in alphabet.iter().enumerate() {
+        // truncation cast is fine here
+        let _ = input_to_morsel.insert(*ascii_byte, morsel as u8);
+    }
+
+    println!("{:width$}pub const {}: &'static [u8; 256] = &[", "", const_name, width=indent_depth);
+    for ascii_byte in 0..256 {
+        let (value, comment) = match input_to_morsel.get(&(ascii_byte as u8)) {
+            None => ("INVALID_VALUE".to_string(),
+                    format!("input {} (0x{:X})", ascii_byte, ascii_byte)),
+            Some(v) => (format!("{}", *v),
+                        format!("input {} (0x{:X} char '{}') => {} (0x{:X})",
+                                ascii_byte,
+                                ascii_byte,
+                                String::from_utf8(vec!(ascii_byte as u8)).unwrap(), *v, *v))
+        };
+
+        println!("{:width$}{}, // {}", "", value, comment, width=indent_depth + 4);
+    }
+    println!("{:width$}];", "", width=indent_depth);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/src/lib.rs
@@ -0,0 +1,675 @@
+extern crate byteorder;
+
+use std::{fmt, error, str};
+
+use byteorder::{BigEndian, ByteOrder};
+
+mod tables;
+
+/// Available encoding character sets
+#[derive(Clone, Copy, Debug)]
+pub enum CharacterSet {
+    /// The standard character set (uses `+` and `/`)
+    Standard,
+    /// The URL safe character set (uses `-` and `_`)
+    UrlSafe
+}
+
+#[derive(Clone, Copy, Debug)]
+pub enum LineEnding {
+    LF,
+    CRLF,
+}
+
+#[derive(Clone, Copy, Debug)]
+pub enum LineWrap {
+    NoWrap,
+    Wrap(usize, LineEnding)
+}
+
+/// Contains configuration parameters for base64 encoding
+#[derive(Clone, Copy, Debug)]
+pub struct Config {
+    /// Character set to use
+    char_set: CharacterSet,
+    /// True to pad output with `=` characters
+    pad: bool,
+    /// Remove whitespace before decoding, at the cost of an allocation
+    strip_whitespace: bool,
+    /// ADT signifying whether to linewrap output, and if so by how many characters and with what ending
+    line_wrap: LineWrap,
+}
+
+impl Config {
+    pub fn new(char_set: CharacterSet,
+               pad: bool,
+               strip_whitespace: bool,
+               input_line_wrap: LineWrap) -> Config {
+        let line_wrap = match input_line_wrap  {
+            LineWrap::Wrap(0, _) => LineWrap::NoWrap,
+            _ => input_line_wrap,
+        };
+
+        Config {
+            char_set: char_set,
+            pad: pad,
+            strip_whitespace: strip_whitespace,
+            line_wrap: line_wrap,
+        }
+    }
+}
+
+pub static STANDARD: Config = Config {
+    char_set: CharacterSet::Standard,
+    pad: true,
+    strip_whitespace: false,
+    line_wrap: LineWrap::NoWrap,
+};
+
+pub static MIME: Config = Config {
+    char_set: CharacterSet::Standard,
+    pad: true,
+    strip_whitespace: true,
+    line_wrap: LineWrap::Wrap(76, LineEnding::CRLF),
+};
+
+pub static URL_SAFE: Config = Config {
+    char_set: CharacterSet::UrlSafe,
+    pad: true,
+    strip_whitespace: false,
+    line_wrap: LineWrap::NoWrap,
+};
+
+pub static URL_SAFE_NO_PAD: Config = Config {
+    char_set: CharacterSet::UrlSafe,
+    pad: false,
+    strip_whitespace: false,
+    line_wrap: LineWrap::NoWrap,
+};
+
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum DecodeError {
+    InvalidByte(usize, u8),
+    InvalidLength,
+}
+
+impl fmt::Display for DecodeError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            DecodeError::InvalidByte(index, byte) =>
+                write!(f, "Invalid byte {}, offset {}.", byte, index),
+            DecodeError::InvalidLength =>
+                write!(f, "Encoded text cannot have a 6-bit remainder.")
+        }
+    }
+}
+
+impl error::Error for DecodeError {
+    fn description(&self) -> &str {
+        match *self {
+            DecodeError::InvalidByte(_, _) => "invalid byte",
+            DecodeError::InvalidLength => "invalid length"
+        }
+    }
+
+    fn cause(&self) -> Option<&error::Error> {
+        None
+    }
+}
+
+///Encode arbitrary octets as base64.
+///Returns a String.
+///Convenience for `encode_config(input, base64::STANDARD);`.
+///
+///# Example
+///
+///```rust
+///extern crate base64;
+///
+///fn main() {
+///    let b64 = base64::encode(b"hello world");
+///    println!("{}", b64);
+///}
+///```
+pub fn encode<T: ?Sized + AsRef<[u8]>>(input: &T) -> String {
+    encode_config(input, STANDARD)
+}
+
+///Decode from string reference as octets.
+///Returns a Result containing a Vec<u8>.
+///Convenience `decode_config(input, base64::STANDARD);`.
+///
+///# Example
+///
+///```rust
+///extern crate base64;
+///
+///fn main() {
+///    let bytes = base64::decode("aGVsbG8gd29ybGQ=").unwrap();
+///    println!("{:?}", bytes);
+///}
+///```
+pub fn decode<T: ?Sized + AsRef<[u8]>>(input: &T) -> Result<Vec<u8>, DecodeError> {
+    decode_config(input, STANDARD)
+}
+
+///Encode arbitrary octets as base64.
+///Returns a String.
+///
+///# Example
+///
+///```rust
+///extern crate base64;
+///
+///fn main() {
+///    let b64 = base64::encode_config(b"hello world~", base64::STANDARD);
+///    println!("{}", b64);
+///
+///    let b64_url = base64::encode_config(b"hello internet~", base64::URL_SAFE);
+///    println!("{}", b64_url);
+///}
+///```
+pub fn encode_config<T: ?Sized + AsRef<[u8]>>(input: &T, config: Config) -> String {
+    let mut buf = match encoded_size(input.as_ref().len(), config) {
+        Some(n) => String::with_capacity(n),
+        None => panic!("integer overflow when calculating buffer size")
+    };
+
+    encode_config_buf(input, config, &mut buf);
+
+    buf
+}
+
+/// calculate the base64 encoded string size, including padding
+fn encoded_size(bytes_len: usize, config: Config) -> Option<usize> {
+    let printing_output_chars = bytes_len
+        .checked_add(2)
+        .map(|x| x / 3)
+        .and_then(|x| x.checked_mul(4));
+
+    //TODO this is subtly wrong but in a not dangerous way
+    //pushing patch with identical to previous behavior, then fixing
+    let line_ending_output_chars = match config.line_wrap {
+        LineWrap::NoWrap => Some(0),
+        LineWrap::Wrap(n, LineEnding::CRLF) =>
+            printing_output_chars.map(|y| y / n).and_then(|y| y.checked_mul(2)),
+        LineWrap::Wrap(n, LineEnding::LF) =>
+            printing_output_chars.map(|y| y / n),
+    };
+
+    printing_output_chars.and_then(|x|
+        line_ending_output_chars.and_then(|y| x.checked_add(y))
+    )
+}
+
+///Encode arbitrary octets as base64.
+///Writes into the supplied buffer to avoid allocations.
+///
+///# Example
+///
+///```rust
+///extern crate base64;
+///
+///fn main() {
+///    let mut buf = String::new();
+///    base64::encode_config_buf(b"hello world~", base64::STANDARD, &mut buf);
+///    println!("{}", buf);
+///
+///    buf.clear();
+///    base64::encode_config_buf(b"hello internet~", base64::URL_SAFE, &mut buf);
+///    println!("{}", buf);
+///}
+///```
+pub fn encode_config_buf<T: ?Sized + AsRef<[u8]>>(input: &T, config: Config, buf: &mut String) {
+    let input_bytes = input.as_ref();
+    let ref charset = match config.char_set {
+        CharacterSet::Standard => tables::STANDARD_ENCODE,
+        CharacterSet::UrlSafe => tables::URL_SAFE_ENCODE,
+    };
+
+    // reserve to make sure the memory we'll be writing to with unsafe is allocated
+    let resv_size = match encoded_size(input_bytes.len(), config) {
+        Some(n) => n,
+        None => panic!("integer overflow when calculating buffer size"),
+    };
+    buf.reserve(resv_size);
+
+    let orig_buf_len = buf.len();
+    let mut fast_loop_output_buf_len = orig_buf_len;
+
+    let input_chunk_len = 6;
+
+    let last_fast_index = input_bytes.len().saturating_sub(8);
+
+    // we're only going to insert valid utf8
+    let mut raw = unsafe { buf.as_mut_vec() };
+    // start at the first free part of the output buf
+    let mut output_ptr = unsafe { raw.as_mut_ptr().offset(orig_buf_len as isize) };
+    let mut input_index: usize = 0;
+    if input_bytes.len() >= 8 {
+        while input_index <= last_fast_index {
+            let input_chunk = BigEndian::read_u64(&input_bytes[input_index..(input_index + 8)]);
+
+            // strip off 6 bits at a time for the first 6 bytes
+            unsafe {
+                std::ptr::write(output_ptr, charset[((input_chunk >> 58) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(1), charset[((input_chunk >> 52) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(2), charset[((input_chunk >> 46) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(3), charset[((input_chunk >> 40) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(4), charset[((input_chunk >> 34) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(5), charset[((input_chunk >> 28) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(6), charset[((input_chunk >> 22) & 0x3F) as usize]);
+                std::ptr::write(output_ptr.offset(7), charset[((input_chunk >> 16) & 0x3F) as usize]);
+                output_ptr = output_ptr.offset(8);
+            }
+
+            input_index += input_chunk_len;
+            fast_loop_output_buf_len += 8;
+        }
+    }
+
+    unsafe {
+        // expand len to include the bytes we just wrote
+        raw.set_len(fast_loop_output_buf_len);
+    }
+
+    // encode the 0 to 7 bytes left after the fast loop
+
+    let rem = input_bytes.len() % 3;
+    let start_of_rem = input_bytes.len() - rem;
+
+    // start at the first index not handled by fast loop, which may be 0.
+    let mut leftover_index = input_index;
+
+    while leftover_index < start_of_rem {
+        raw.push(charset[(input_bytes[leftover_index] >> 2) as usize]);
+        raw.push(charset[((input_bytes[leftover_index] << 4 | input_bytes[leftover_index + 1] >> 4) & 0x3f) as usize]);
+        raw.push(charset[((input_bytes[leftover_index + 1] << 2 | input_bytes[leftover_index + 2] >> 6) & 0x3f) as usize]);
+        raw.push(charset[(input_bytes[leftover_index + 2] & 0x3f) as usize]);
+
+        leftover_index += 3;
+    }
+
+    if rem == 2 {
+        raw.push(charset[(input_bytes[start_of_rem] >> 2) as usize]);
+        raw.push(charset[((input_bytes[start_of_rem] << 4 | input_bytes[start_of_rem + 1] >> 4) & 0x3f) as usize]);
+        raw.push(charset[(input_bytes[start_of_rem + 1] << 2 & 0x3f) as usize]);
+    } else if rem == 1 {
+        raw.push(charset[(input_bytes[start_of_rem] >> 2) as usize]);
+        raw.push(charset[(input_bytes[start_of_rem] << 4 & 0x3f) as usize]);
+    }
+
+    if config.pad {
+        for _ in 0..((3 - rem) % 3) {
+            raw.push(0x3d);
+        }
+    }
+
+    //TODO FIXME this does the wrong thing for nonempty buffers
+    if orig_buf_len == 0 {
+        if let LineWrap::Wrap(line_size, line_end) = config.line_wrap {
+            let len = raw.len();
+            let mut i = 0;
+            let mut j = 0;
+
+            while i < len {
+                if i > 0 && i % line_size == 0 {
+                    match line_end {
+                        LineEnding::LF => { raw.insert(j, b'\n'); j += 1; }
+                        LineEnding::CRLF => { raw.insert(j, b'\r'); raw.insert(j + 1, b'\n'); j += 2; }
+                    }
+                }
+
+                i += 1;
+                j += 1;
+            }
+        }
+    }
+}
+
+///Decode from string reference as octets.
+///Returns a Result containing a Vec<u8>.
+///
+///# Example
+///
+///```rust
+///extern crate base64;
+///
+///fn main() {
+///    let bytes = base64::decode_config("aGVsbG8gd29ybGR+Cg==", base64::STANDARD).unwrap();
+///    println!("{:?}", bytes);
+///
+///    let bytes_url = base64::decode_config("aGVsbG8gaW50ZXJuZXR-Cg==", base64::URL_SAFE).unwrap();
+///    println!("{:?}", bytes_url);
+///}
+///```
+pub fn decode_config<T: ?Sized + AsRef<[u8]>>(input: &T, config: Config) -> Result<Vec<u8>, DecodeError> {
+    let mut buffer = Vec::<u8>::with_capacity(input.as_ref().len() * 4 / 3);
+
+    decode_config_buf(input, config, &mut buffer).map(|_| buffer)
+}
+
+///Decode from string reference as octets.
+///Writes into the supplied buffer to avoid allocation.
+///Returns a Result containing an empty tuple, aka ().
+///
+///# Example
+///
+///```rust
+///extern crate base64;
+///
+///fn main() {
+///    let mut buffer = Vec::<u8>::new();
+///    base64::decode_config_buf("aGVsbG8gd29ybGR+Cg==", base64::STANDARD, &mut buffer).unwrap();
+///    println!("{:?}", buffer);
+///
+///    buffer.clear();
+///
+///    base64::decode_config_buf("aGVsbG8gaW50ZXJuZXR-Cg==", base64::URL_SAFE, &mut buffer).unwrap();
+///    println!("{:?}", buffer);
+///}
+///```
+pub fn decode_config_buf<T: ?Sized + AsRef<[u8]>>(input: &T,
+                                                  config: Config,
+                                                  buffer: &mut Vec<u8>)
+                                                  -> Result<(), DecodeError> {
+    let mut input_copy;
+    let input_bytes = if config.strip_whitespace {
+        input_copy = Vec::<u8>::with_capacity(input.as_ref().len());
+        input_copy.extend(input.as_ref().iter().filter(|b| !b" \n\t\r\x0b\x0c".contains(b)));
+
+        input_copy.as_ref()
+    } else {
+        input.as_ref()
+    };
+
+    let ref decode_table = match config.char_set {
+        CharacterSet::Standard => tables::STANDARD_DECODE,
+        CharacterSet::UrlSafe => tables::URL_SAFE_DECODE,
+    };
+
+    buffer.reserve(input_bytes.len() * 3 / 4);
+
+    // the fast loop only handles complete chunks of 8 input bytes without padding
+    let chunk_len = 8;
+    let decoded_chunk_len = 6;
+    let remainder_len = input_bytes.len() % chunk_len;
+    let trailing_bytes_to_skip = if remainder_len == 0 {
+        // if input is a multiple of the chunk size, ignore the last chunk as it may have padding
+        chunk_len
+    } else {
+        remainder_len
+    };
+
+    let length_of_full_chunks = input_bytes.len().saturating_sub(trailing_bytes_to_skip);
+
+    let starting_output_index = buffer.len();
+    // Resize to hold decoded output from fast loop. Need the extra two bytes because
+    // we write a full 8 bytes for the last 6-byte decoded chunk and then truncate off two
+    let new_size = starting_output_index
+        + length_of_full_chunks / chunk_len * decoded_chunk_len
+        + (chunk_len - decoded_chunk_len);
+    buffer.resize(new_size, 0);
+
+    let mut output_index = starting_output_index;
+
+    {
+        let buffer_slice = buffer.as_mut_slice();
+
+        let mut input_index = 0;
+        // initial value is never used; always set if fast loop breaks
+        let mut bad_byte_index: usize = 0;
+        // a non-invalid value means it's not an error if fast loop never runs
+        let mut morsel: u8 = 0;
+
+        // fast loop of 8 bytes at a time
+        while input_index < length_of_full_chunks {
+            let mut accum: u64;
+
+            let input_chunk = BigEndian::read_u64(&input_bytes[input_index..(input_index + 8)]);
+            morsel = decode_table[(input_chunk >> 56) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index;
+                break;
+            };
+            accum = (morsel as u64) << 58;
+
+            morsel = decode_table[(input_chunk >> 48 & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 1;
+                break;
+            };
+            accum |= (morsel as u64) << 52;
+
+            morsel = decode_table[(input_chunk >> 40 & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 2;
+                break;
+            };
+            accum |= (morsel as u64) << 46;
+
+            morsel = decode_table[(input_chunk >> 32 & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 3;
+                break;
+            };
+            accum |= (morsel as u64) << 40;
+
+            morsel = decode_table[(input_chunk >> 24 & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 4;
+                break;
+            };
+            accum |= (morsel as u64) << 34;
+
+            morsel = decode_table[(input_chunk >> 16 & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 5;
+                break;
+            };
+            accum |= (morsel as u64) << 28;
+
+            morsel = decode_table[(input_chunk >> 8 & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 6;
+                break;
+            };
+            accum |= (morsel as u64) << 22;
+
+            morsel = decode_table[(input_chunk & 0xFF) as usize];
+            if morsel == tables::INVALID_VALUE {
+                bad_byte_index = input_index + 7;
+                break;
+            };
+            accum |= (morsel as u64) << 16;
+
+            BigEndian::write_u64(&mut buffer_slice[(output_index)..(output_index + 8)],
+                                 accum);
+
+            output_index += 6;
+            input_index += chunk_len;
+        };
+
+        if morsel == tables::INVALID_VALUE {
+            // we got here from a break
+            return Err(DecodeError::InvalidByte(bad_byte_index, input_bytes[bad_byte_index]));
+        }
+    }
+
+    // Truncate off the last two bytes from writing the last u64.
+    // Unconditional because we added on the extra 2 bytes in the resize before the loop,
+    // so it will never underflow.
+    let new_len = buffer.len() - (chunk_len - decoded_chunk_len);
+    buffer.truncate(new_len);
+
+    // handle leftovers (at most 8 bytes, decoded to 6).
+    // Use a u64 as a stack-resident 8 bytes buffer.
+    let mut leftover_bits: u64 = 0;
+    let mut morsels_in_leftover = 0;
+    let mut padding_bytes = 0;
+    let mut first_padding_index: usize = 0;
+    for (i, b) in input_bytes[length_of_full_chunks..].iter().enumerate() {
+        // '=' padding
+        if *b == 0x3D {
+            // There can be bad padding in a few ways:
+            // 1 - Padding with non-padding characters after it
+            // 2 - Padding after zero or one non-padding characters before it
+            //     in the current quad.
+            // 3 - More than two characters of padding. If 3 or 4 padding chars
+            //     are in the same quad, that implies it will be caught by #2.
+            //     If it spreads from one quad to another, it will be caught by
+            //     #2 in the second quad.
+
+            if i % 4 < 2 {
+                // Check for case #2.
+                // TODO InvalidPadding error
+                return Err(DecodeError::InvalidByte(length_of_full_chunks + i, *b));
+            };
+
+            if padding_bytes == 0 {
+                first_padding_index = i;
+            };
+
+            padding_bytes += 1;
+            continue;
+        };
+
+        // Check for case #1.
+        // To make '=' handling consistent with the main loop, don't allow
+        // non-suffix '=' in trailing chunk either. Report error as first
+        // erroneous padding.
+        if padding_bytes > 0 {
+            return Err(DecodeError::InvalidByte(
+                length_of_full_chunks + first_padding_index, 0x3D));
+        };
+
+        // can use up to 8 * 6 = 48 bits of the u64, if last chunk has no padding.
+        // To minimize shifts, pack the leftovers from left to right.
+        let shift = 64 - (morsels_in_leftover + 1) * 6;
+        // tables are all 256 elements, cannot overflow from a u8 index
+        let morsel = decode_table[*b as usize];
+        if morsel == tables::INVALID_VALUE {
+            return Err(DecodeError::InvalidByte(length_of_full_chunks + i, *b));
+        };
+
+        leftover_bits |= (morsel as u64) << shift;
+        morsels_in_leftover += 1;
+    };
+
+    let leftover_bits_ready_to_append = match morsels_in_leftover {
+        0 => 0,
+        1 => return Err(DecodeError::InvalidLength),
+        2 => 8,
+        3 => 16,
+        4 => 24,
+        5 => return Err(DecodeError::InvalidLength),
+        6 => 32,
+        7 => 40,
+        8 => 48,
+        _ => panic!("Impossible: must only have 0 to 4 input bytes in last quad")
+    };
+
+    let mut leftover_bits_appended_to_buf = 0;
+    while leftover_bits_appended_to_buf < leftover_bits_ready_to_append {
+        // `as` simply truncates the higher bits, which is what we want here
+        let selected_bits = (leftover_bits >> (56 - leftover_bits_appended_to_buf)) as u8;
+        buffer.push(selected_bits);
+
+        leftover_bits_appended_to_buf += 8;
+    };
+
+    Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn encoded_size_correct() {
+        assert_eq!(Some(0), encoded_size(0, STANDARD));
+
+        assert_eq!(Some(4), encoded_size(1, STANDARD));
+        assert_eq!(Some(4), encoded_size(2, STANDARD));
+        assert_eq!(Some(4), encoded_size(3, STANDARD));
+
+        assert_eq!(Some(8), encoded_size(4, STANDARD));
+        assert_eq!(Some(8), encoded_size(5, STANDARD));
+        assert_eq!(Some(8), encoded_size(6, STANDARD));
+
+        assert_eq!(Some(12), encoded_size(7, STANDARD));
+        assert_eq!(Some(12), encoded_size(8, STANDARD));
+        assert_eq!(Some(12), encoded_size(9, STANDARD));
+
+        assert_eq!(Some(72), encoded_size(54, STANDARD));
+
+        assert_eq!(Some(76), encoded_size(55, STANDARD));
+        assert_eq!(Some(76), encoded_size(56, STANDARD));
+        assert_eq!(Some(76), encoded_size(57, STANDARD));
+
+        assert_eq!(Some(80), encoded_size(58, STANDARD));
+    }
+
+    #[test]
+    fn encoded_size_correct_mime() {
+        assert_eq!(Some(0), encoded_size(0, MIME));
+
+        assert_eq!(Some(4), encoded_size(1, MIME));
+        assert_eq!(Some(4), encoded_size(2, MIME));
+        assert_eq!(Some(4), encoded_size(3, MIME));
+
+        assert_eq!(Some(8), encoded_size(4, MIME));
+        assert_eq!(Some(8), encoded_size(5, MIME));
+        assert_eq!(Some(8), encoded_size(6, MIME));
+
+        assert_eq!(Some(12), encoded_size(7, MIME));
+        assert_eq!(Some(12), encoded_size(8, MIME));
+        assert_eq!(Some(12), encoded_size(9, MIME));
+
+        assert_eq!(Some(72), encoded_size(54, MIME));
+
+        assert_eq!(Some(78), encoded_size(55, MIME));
+        assert_eq!(Some(78), encoded_size(56, MIME));
+        assert_eq!(Some(78), encoded_size(57, MIME));
+
+        assert_eq!(Some(82), encoded_size(58, MIME));
+    }
+
+    #[test]
+    fn encoded_size_correct_lf() {
+        let config = Config::new(
+            CharacterSet::Standard,
+            true,
+            false,
+            LineWrap::Wrap(76, LineEnding::LF)
+        );
+
+        assert_eq!(Some(0), encoded_size(0, config));
+
+        assert_eq!(Some(4), encoded_size(1, config));
+        assert_eq!(Some(4), encoded_size(2, config));
+        assert_eq!(Some(4), encoded_size(3, config));
+
+        assert_eq!(Some(8), encoded_size(4, config));
+        assert_eq!(Some(8), encoded_size(5, config));
+        assert_eq!(Some(8), encoded_size(6, config));
+
+        assert_eq!(Some(12), encoded_size(7, config));
+        assert_eq!(Some(12), encoded_size(8, config));
+        assert_eq!(Some(12), encoded_size(9, config));
+
+        assert_eq!(Some(72), encoded_size(54, config));
+
+        assert_eq!(Some(77), encoded_size(55, config));
+        assert_eq!(Some(77), encoded_size(56, config));
+        assert_eq!(Some(77), encoded_size(57, config));
+
+        assert_eq!(Some(81), encoded_size(58, config));
+    }
+
+    #[test]
+    fn encoded_size_overflow() {
+        assert_eq!(None, encoded_size(std::usize::MAX, STANDARD));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/src/tables.rs
@@ -0,0 +1,649 @@
+pub const INVALID_VALUE: u8 = 255;
+pub const STANDARD_ENCODE: &'static [u8; 64] = &[
+    65, // input 0 (0x0) => 'A' (0x41)
+    66, // input 1 (0x1) => 'B' (0x42)
+    67, // input 2 (0x2) => 'C' (0x43)
+    68, // input 3 (0x3) => 'D' (0x44)
+    69, // input 4 (0x4) => 'E' (0x45)
+    70, // input 5 (0x5) => 'F' (0x46)
+    71, // input 6 (0x6) => 'G' (0x47)
+    72, // input 7 (0x7) => 'H' (0x48)
+    73, // input 8 (0x8) => 'I' (0x49)
+    74, // input 9 (0x9) => 'J' (0x4A)
+    75, // input 10 (0xA) => 'K' (0x4B)
+    76, // input 11 (0xB) => 'L' (0x4C)
+    77, // input 12 (0xC) => 'M' (0x4D)
+    78, // input 13 (0xD) => 'N' (0x4E)
+    79, // input 14 (0xE) => 'O' (0x4F)
+    80, // input 15 (0xF) => 'P' (0x50)
+    81, // input 16 (0x10) => 'Q' (0x51)
+    82, // input 17 (0x11) => 'R' (0x52)
+    83, // input 18 (0x12) => 'S' (0x53)
+    84, // input 19 (0x13) => 'T' (0x54)
+    85, // input 20 (0x14) => 'U' (0x55)
+    86, // input 21 (0x15) => 'V' (0x56)
+    87, // input 22 (0x16) => 'W' (0x57)
+    88, // input 23 (0x17) => 'X' (0x58)
+    89, // input 24 (0x18) => 'Y' (0x59)
+    90, // input 25 (0x19) => 'Z' (0x5A)
+    97, // input 26 (0x1A) => 'a' (0x61)
+    98, // input 27 (0x1B) => 'b' (0x62)
+    99, // input 28 (0x1C) => 'c' (0x63)
+    100, // input 29 (0x1D) => 'd' (0x64)
+    101, // input 30 (0x1E) => 'e' (0x65)
+    102, // input 31 (0x1F) => 'f' (0x66)
+    103, // input 32 (0x20) => 'g' (0x67)
+    104, // input 33 (0x21) => 'h' (0x68)
+    105, // input 34 (0x22) => 'i' (0x69)
+    106, // input 35 (0x23) => 'j' (0x6A)
+    107, // input 36 (0x24) => 'k' (0x6B)
+    108, // input 37 (0x25) => 'l' (0x6C)
+    109, // input 38 (0x26) => 'm' (0x6D)
+    110, // input 39 (0x27) => 'n' (0x6E)
+    111, // input 40 (0x28) => 'o' (0x6F)
+    112, // input 41 (0x29) => 'p' (0x70)
+    113, // input 42 (0x2A) => 'q' (0x71)
+    114, // input 43 (0x2B) => 'r' (0x72)
+    115, // input 44 (0x2C) => 's' (0x73)
+    116, // input 45 (0x2D) => 't' (0x74)
+    117, // input 46 (0x2E) => 'u' (0x75)
+    118, // input 47 (0x2F) => 'v' (0x76)
+    119, // input 48 (0x30) => 'w' (0x77)
+    120, // input 49 (0x31) => 'x' (0x78)
+    121, // input 50 (0x32) => 'y' (0x79)
+    122, // input 51 (0x33) => 'z' (0x7A)
+    48, // input 52 (0x34) => '0' (0x30)
+    49, // input 53 (0x35) => '1' (0x31)
+    50, // input 54 (0x36) => '2' (0x32)
+    51, // input 55 (0x37) => '3' (0x33)
+    52, // input 56 (0x38) => '4' (0x34)
+    53, // input 57 (0x39) => '5' (0x35)
+    54, // input 58 (0x3A) => '6' (0x36)
+    55, // input 59 (0x3B) => '7' (0x37)
+    56, // input 60 (0x3C) => '8' (0x38)
+    57, // input 61 (0x3D) => '9' (0x39)
+    43, // input 62 (0x3E) => '+' (0x2B)
+    47, // input 63 (0x3F) => '/' (0x2F)
+];
+pub const STANDARD_DECODE: &'static [u8; 256] = &[
+    INVALID_VALUE, // input 0 (0x0)
+    INVALID_VALUE, // input 1 (0x1)
+    INVALID_VALUE, // input 2 (0x2)
+    INVALID_VALUE, // input 3 (0x3)
+    INVALID_VALUE, // input 4 (0x4)
+    INVALID_VALUE, // input 5 (0x5)
+    INVALID_VALUE, // input 6 (0x6)
+    INVALID_VALUE, // input 7 (0x7)
+    INVALID_VALUE, // input 8 (0x8)
+    INVALID_VALUE, // input 9 (0x9)
+    INVALID_VALUE, // input 10 (0xA)
+    INVALID_VALUE, // input 11 (0xB)
+    INVALID_VALUE, // input 12 (0xC)
+    INVALID_VALUE, // input 13 (0xD)
+    INVALID_VALUE, // input 14 (0xE)
+    INVALID_VALUE, // input 15 (0xF)
+    INVALID_VALUE, // input 16 (0x10)
+    INVALID_VALUE, // input 17 (0x11)
+    INVALID_VALUE, // input 18 (0x12)
+    INVALID_VALUE, // input 19 (0x13)
+    INVALID_VALUE, // input 20 (0x14)
+    INVALID_VALUE, // input 21 (0x15)
+    INVALID_VALUE, // input 22 (0x16)
+    INVALID_VALUE, // input 23 (0x17)
+    INVALID_VALUE, // input 24 (0x18)
+    INVALID_VALUE, // input 25 (0x19)
+    INVALID_VALUE, // input 26 (0x1A)
+    INVALID_VALUE, // input 27 (0x1B)
+    INVALID_VALUE, // input 28 (0x1C)
+    INVALID_VALUE, // input 29 (0x1D)
+    INVALID_VALUE, // input 30 (0x1E)
+    INVALID_VALUE, // input 31 (0x1F)
+    INVALID_VALUE, // input 32 (0x20)
+    INVALID_VALUE, // input 33 (0x21)
+    INVALID_VALUE, // input 34 (0x22)
+    INVALID_VALUE, // input 35 (0x23)
+    INVALID_VALUE, // input 36 (0x24)
+    INVALID_VALUE, // input 37 (0x25)
+    INVALID_VALUE, // input 38 (0x26)
+    INVALID_VALUE, // input 39 (0x27)
+    INVALID_VALUE, // input 40 (0x28)
+    INVALID_VALUE, // input 41 (0x29)
+    INVALID_VALUE, // input 42 (0x2A)
+    62, // input 43 (0x2B char '+') => 62 (0x3E)
+    INVALID_VALUE, // input 44 (0x2C)
+    INVALID_VALUE, // input 45 (0x2D)
+    INVALID_VALUE, // input 46 (0x2E)
+    63, // input 47 (0x2F char '/') => 63 (0x3F)
+    52, // input 48 (0x30 char '0') => 52 (0x34)
+    53, // input 49 (0x31 char '1') => 53 (0x35)
+    54, // input 50 (0x32 char '2') => 54 (0x36)
+    55, // input 51 (0x33 char '3') => 55 (0x37)
+    56, // input 52 (0x34 char '4') => 56 (0x38)
+    57, // input 53 (0x35 char '5') => 57 (0x39)
+    58, // input 54 (0x36 char '6') => 58 (0x3A)
+    59, // input 55 (0x37 char '7') => 59 (0x3B)
+    60, // input 56 (0x38 char '8') => 60 (0x3C)
+    61, // input 57 (0x39 char '9') => 61 (0x3D)
+    INVALID_VALUE, // input 58 (0x3A)
+    INVALID_VALUE, // input 59 (0x3B)
+    INVALID_VALUE, // input 60 (0x3C)
+    INVALID_VALUE, // input 61 (0x3D)
+    INVALID_VALUE, // input 62 (0x3E)
+    INVALID_VALUE, // input 63 (0x3F)
+    INVALID_VALUE, // input 64 (0x40)
+    0, // input 65 (0x41 char 'A') => 0 (0x0)
+    1, // input 66 (0x42 char 'B') => 1 (0x1)
+    2, // input 67 (0x43 char 'C') => 2 (0x2)
+    3, // input 68 (0x44 char 'D') => 3 (0x3)
+    4, // input 69 (0x45 char 'E') => 4 (0x4)
+    5, // input 70 (0x46 char 'F') => 5 (0x5)
+    6, // input 71 (0x47 char 'G') => 6 (0x6)
+    7, // input 72 (0x48 char 'H') => 7 (0x7)
+    8, // input 73 (0x49 char 'I') => 8 (0x8)
+    9, // input 74 (0x4A char 'J') => 9 (0x9)
+    10, // input 75 (0x4B char 'K') => 10 (0xA)
+    11, // input 76 (0x4C char 'L') => 11 (0xB)
+    12, // input 77 (0x4D char 'M') => 12 (0xC)
+    13, // input 78 (0x4E char 'N') => 13 (0xD)
+    14, // input 79 (0x4F char 'O') => 14 (0xE)
+    15, // input 80 (0x50 char 'P') => 15 (0xF)
+    16, // input 81 (0x51 char 'Q') => 16 (0x10)
+    17, // input 82 (0x52 char 'R') => 17 (0x11)
+    18, // input 83 (0x53 char 'S') => 18 (0x12)
+    19, // input 84 (0x54 char 'T') => 19 (0x13)
+    20, // input 85 (0x55 char 'U') => 20 (0x14)
+    21, // input 86 (0x56 char 'V') => 21 (0x15)
+    22, // input 87 (0x57 char 'W') => 22 (0x16)
+    23, // input 88 (0x58 char 'X') => 23 (0x17)
+    24, // input 89 (0x59 char 'Y') => 24 (0x18)
+    25, // input 90 (0x5A char 'Z') => 25 (0x19)
+    INVALID_VALUE, // input 91 (0x5B)
+    INVALID_VALUE, // input 92 (0x5C)
+    INVALID_VALUE, // input 93 (0x5D)
+    INVALID_VALUE, // input 94 (0x5E)
+    INVALID_VALUE, // input 95 (0x5F)
+    INVALID_VALUE, // input 96 (0x60)
+    26, // input 97 (0x61 char 'a') => 26 (0x1A)
+    27, // input 98 (0x62 char 'b') => 27 (0x1B)
+    28, // input 99 (0x63 char 'c') => 28 (0x1C)
+    29, // input 100 (0x64 char 'd') => 29 (0x1D)
+    30, // input 101 (0x65 char 'e') => 30 (0x1E)
+    31, // input 102 (0x66 char 'f') => 31 (0x1F)
+    32, // input 103 (0x67 char 'g') => 32 (0x20)
+    33, // input 104 (0x68 char 'h') => 33 (0x21)
+    34, // input 105 (0x69 char 'i') => 34 (0x22)
+    35, // input 106 (0x6A char 'j') => 35 (0x23)
+    36, // input 107 (0x6B char 'k') => 36 (0x24)
+    37, // input 108 (0x6C char 'l') => 37 (0x25)
+    38, // input 109 (0x6D char 'm') => 38 (0x26)
+    39, // input 110 (0x6E char 'n') => 39 (0x27)
+    40, // input 111 (0x6F char 'o') => 40 (0x28)
+    41, // input 112 (0x70 char 'p') => 41 (0x29)
+    42, // input 113 (0x71 char 'q') => 42 (0x2A)
+    43, // input 114 (0x72 char 'r') => 43 (0x2B)
+    44, // input 115 (0x73 char 's') => 44 (0x2C)
+    45, // input 116 (0x74 char 't') => 45 (0x2D)
+    46, // input 117 (0x75 char 'u') => 46 (0x2E)
+    47, // input 118 (0x76 char 'v') => 47 (0x2F)
+    48, // input 119 (0x77 char 'w') => 48 (0x30)
+    49, // input 120 (0x78 char 'x') => 49 (0x31)
+    50, // input 121 (0x79 char 'y') => 50 (0x32)
+    51, // input 122 (0x7A char 'z') => 51 (0x33)
+    INVALID_VALUE, // input 123 (0x7B)
+    INVALID_VALUE, // input 124 (0x7C)
+    INVALID_VALUE, // input 125 (0x7D)
+    INVALID_VALUE, // input 126 (0x7E)
+    INVALID_VALUE, // input 127 (0x7F)
+    INVALID_VALUE, // input 128 (0x80)
+    INVALID_VALUE, // input 129 (0x81)
+    INVALID_VALUE, // input 130 (0x82)
+    INVALID_VALUE, // input 131 (0x83)
+    INVALID_VALUE, // input 132 (0x84)
+    INVALID_VALUE, // input 133 (0x85)
+    INVALID_VALUE, // input 134 (0x86)
+    INVALID_VALUE, // input 135 (0x87)
+    INVALID_VALUE, // input 136 (0x88)
+    INVALID_VALUE, // input 137 (0x89)
+    INVALID_VALUE, // input 138 (0x8A)
+    INVALID_VALUE, // input 139 (0x8B)
+    INVALID_VALUE, // input 140 (0x8C)
+    INVALID_VALUE, // input 141 (0x8D)
+    INVALID_VALUE, // input 142 (0x8E)
+    INVALID_VALUE, // input 143 (0x8F)
+    INVALID_VALUE, // input 144 (0x90)
+    INVALID_VALUE, // input 145 (0x91)
+    INVALID_VALUE, // input 146 (0x92)
+    INVALID_VALUE, // input 147 (0x93)
+    INVALID_VALUE, // input 148 (0x94)
+    INVALID_VALUE, // input 149 (0x95)
+    INVALID_VALUE, // input 150 (0x96)
+    INVALID_VALUE, // input 151 (0x97)
+    INVALID_VALUE, // input 152 (0x98)
+    INVALID_VALUE, // input 153 (0x99)
+    INVALID_VALUE, // input 154 (0x9A)
+    INVALID_VALUE, // input 155 (0x9B)
+    INVALID_VALUE, // input 156 (0x9C)
+    INVALID_VALUE, // input 157 (0x9D)
+    INVALID_VALUE, // input 158 (0x9E)
+    INVALID_VALUE, // input 159 (0x9F)
+    INVALID_VALUE, // input 160 (0xA0)
+    INVALID_VALUE, // input 161 (0xA1)
+    INVALID_VALUE, // input 162 (0xA2)
+    INVALID_VALUE, // input 163 (0xA3)
+    INVALID_VALUE, // input 164 (0xA4)
+    INVALID_VALUE, // input 165 (0xA5)
+    INVALID_VALUE, // input 166 (0xA6)
+    INVALID_VALUE, // input 167 (0xA7)
+    INVALID_VALUE, // input 168 (0xA8)
+    INVALID_VALUE, // input 169 (0xA9)
+    INVALID_VALUE, // input 170 (0xAA)
+    INVALID_VALUE, // input 171 (0xAB)
+    INVALID_VALUE, // input 172 (0xAC)
+    INVALID_VALUE, // input 173 (0xAD)
+    INVALID_VALUE, // input 174 (0xAE)
+    INVALID_VALUE, // input 175 (0xAF)
+    INVALID_VALUE, // input 176 (0xB0)
+    INVALID_VALUE, // input 177 (0xB1)
+    INVALID_VALUE, // input 178 (0xB2)
+    INVALID_VALUE, // input 179 (0xB3)
+    INVALID_VALUE, // input 180 (0xB4)
+    INVALID_VALUE, // input 181 (0xB5)
+    INVALID_VALUE, // input 182 (0xB6)
+    INVALID_VALUE, // input 183 (0xB7)
+    INVALID_VALUE, // input 184 (0xB8)
+    INVALID_VALUE, // input 185 (0xB9)
+    INVALID_VALUE, // input 186 (0xBA)
+    INVALID_VALUE, // input 187 (0xBB)
+    INVALID_VALUE, // input 188 (0xBC)
+    INVALID_VALUE, // input 189 (0xBD)
+    INVALID_VALUE, // input 190 (0xBE)
+    INVALID_VALUE, // input 191 (0xBF)
+    INVALID_VALUE, // input 192 (0xC0)
+    INVALID_VALUE, // input 193 (0xC1)
+    INVALID_VALUE, // input 194 (0xC2)
+    INVALID_VALUE, // input 195 (0xC3)
+    INVALID_VALUE, // input 196 (0xC4)
+    INVALID_VALUE, // input 197 (0xC5)
+    INVALID_VALUE, // input 198 (0xC6)
+    INVALID_VALUE, // input 199 (0xC7)
+    INVALID_VALUE, // input 200 (0xC8)
+    INVALID_VALUE, // input 201 (0xC9)
+    INVALID_VALUE, // input 202 (0xCA)
+    INVALID_VALUE, // input 203 (0xCB)
+    INVALID_VALUE, // input 204 (0xCC)
+    INVALID_VALUE, // input 205 (0xCD)
+    INVALID_VALUE, // input 206 (0xCE)
+    INVALID_VALUE, // input 207 (0xCF)
+    INVALID_VALUE, // input 208 (0xD0)
+    INVALID_VALUE, // input 209 (0xD1)
+    INVALID_VALUE, // input 210 (0xD2)
+    INVALID_VALUE, // input 211 (0xD3)
+    INVALID_VALUE, // input 212 (0xD4)
+    INVALID_VALUE, // input 213 (0xD5)
+    INVALID_VALUE, // input 214 (0xD6)
+    INVALID_VALUE, // input 215 (0xD7)
+    INVALID_VALUE, // input 216 (0xD8)
+    INVALID_VALUE, // input 217 (0xD9)
+    INVALID_VALUE, // input 218 (0xDA)
+    INVALID_VALUE, // input 219 (0xDB)
+    INVALID_VALUE, // input 220 (0xDC)
+    INVALID_VALUE, // input 221 (0xDD)
+    INVALID_VALUE, // input 222 (0xDE)
+    INVALID_VALUE, // input 223 (0xDF)
+    INVALID_VALUE, // input 224 (0xE0)
+    INVALID_VALUE, // input 225 (0xE1)
+    INVALID_VALUE, // input 226 (0xE2)
+    INVALID_VALUE, // input 227 (0xE3)
+    INVALID_VALUE, // input 228 (0xE4)
+    INVALID_VALUE, // input 229 (0xE5)
+    INVALID_VALUE, // input 230 (0xE6)
+    INVALID_VALUE, // input 231 (0xE7)
+    INVALID_VALUE, // input 232 (0xE8)
+    INVALID_VALUE, // input 233 (0xE9)
+    INVALID_VALUE, // input 234 (0xEA)
+    INVALID_VALUE, // input 235 (0xEB)
+    INVALID_VALUE, // input 236 (0xEC)
+    INVALID_VALUE, // input 237 (0xED)
+    INVALID_VALUE, // input 238 (0xEE)
+    INVALID_VALUE, // input 239 (0xEF)
+    INVALID_VALUE, // input 240 (0xF0)
+    INVALID_VALUE, // input 241 (0xF1)
+    INVALID_VALUE, // input 242 (0xF2)
+    INVALID_VALUE, // input 243 (0xF3)
+    INVALID_VALUE, // input 244 (0xF4)
+    INVALID_VALUE, // input 245 (0xF5)
+    INVALID_VALUE, // input 246 (0xF6)
+    INVALID_VALUE, // input 247 (0xF7)
+    INVALID_VALUE, // input 248 (0xF8)
+    INVALID_VALUE, // input 249 (0xF9)
+    INVALID_VALUE, // input 250 (0xFA)
+    INVALID_VALUE, // input 251 (0xFB)
+    INVALID_VALUE, // input 252 (0xFC)
+    INVALID_VALUE, // input 253 (0xFD)
+    INVALID_VALUE, // input 254 (0xFE)
+    INVALID_VALUE, // input 255 (0xFF)
+];
+pub const URL_SAFE_ENCODE: &'static [u8; 64] = &[
+    65, // input 0 (0x0) => 'A' (0x41)
+    66, // input 1 (0x1) => 'B' (0x42)
+    67, // input 2 (0x2) => 'C' (0x43)
+    68, // input 3 (0x3) => 'D' (0x44)
+    69, // input 4 (0x4) => 'E' (0x45)
+    70, // input 5 (0x5) => 'F' (0x46)
+    71, // input 6 (0x6) => 'G' (0x47)
+    72, // input 7 (0x7) => 'H' (0x48)
+    73, // input 8 (0x8) => 'I' (0x49)
+    74, // input 9 (0x9) => 'J' (0x4A)
+    75, // input 10 (0xA) => 'K' (0x4B)
+    76, // input 11 (0xB) => 'L' (0x4C)
+    77, // input 12 (0xC) => 'M' (0x4D)
+    78, // input 13 (0xD) => 'N' (0x4E)
+    79, // input 14 (0xE) => 'O' (0x4F)
+    80, // input 15 (0xF) => 'P' (0x50)
+    81, // input 16 (0x10) => 'Q' (0x51)
+    82, // input 17 (0x11) => 'R' (0x52)
+    83, // input 18 (0x12) => 'S' (0x53)
+    84, // input 19 (0x13) => 'T' (0x54)
+    85, // input 20 (0x14) => 'U' (0x55)
+    86, // input 21 (0x15) => 'V' (0x56)
+    87, // input 22 (0x16) => 'W' (0x57)
+    88, // input 23 (0x17) => 'X' (0x58)
+    89, // input 24 (0x18) => 'Y' (0x59)
+    90, // input 25 (0x19) => 'Z' (0x5A)
+    97, // input 26 (0x1A) => 'a' (0x61)
+    98, // input 27 (0x1B) => 'b' (0x62)
+    99, // input 28 (0x1C) => 'c' (0x63)
+    100, // input 29 (0x1D) => 'd' (0x64)
+    101, // input 30 (0x1E) => 'e' (0x65)
+    102, // input 31 (0x1F) => 'f' (0x66)
+    103, // input 32 (0x20) => 'g' (0x67)
+    104, // input 33 (0x21) => 'h' (0x68)
+    105, // input 34 (0x22) => 'i' (0x69)
+    106, // input 35 (0x23) => 'j' (0x6A)
+    107, // input 36 (0x24) => 'k' (0x6B)
+    108, // input 37 (0x25) => 'l' (0x6C)
+    109, // input 38 (0x26) => 'm' (0x6D)
+    110, // input 39 (0x27) => 'n' (0x6E)
+    111, // input 40 (0x28) => 'o' (0x6F)
+    112, // input 41 (0x29) => 'p' (0x70)
+    113, // input 42 (0x2A) => 'q' (0x71)
+    114, // input 43 (0x2B) => 'r' (0x72)
+    115, // input 44 (0x2C) => 's' (0x73)
+    116, // input 45 (0x2D) => 't' (0x74)
+    117, // input 46 (0x2E) => 'u' (0x75)
+    118, // input 47 (0x2F) => 'v' (0x76)
+    119, // input 48 (0x30) => 'w' (0x77)
+    120, // input 49 (0x31) => 'x' (0x78)
+    121, // input 50 (0x32) => 'y' (0x79)
+    122, // input 51 (0x33) => 'z' (0x7A)
+    48, // input 52 (0x34) => '0' (0x30)
+    49, // input 53 (0x35) => '1' (0x31)
+    50, // input 54 (0x36) => '2' (0x32)
+    51, // input 55 (0x37) => '3' (0x33)
+    52, // input 56 (0x38) => '4' (0x34)
+    53, // input 57 (0x39) => '5' (0x35)
+    54, // input 58 (0x3A) => '6' (0x36)
+    55, // input 59 (0x3B) => '7' (0x37)
+    56, // input 60 (0x3C) => '8' (0x38)
+    57, // input 61 (0x3D) => '9' (0x39)
+    45, // input 62 (0x3E) => '-' (0x2D)
+    95, // input 63 (0x3F) => '_' (0x5F)
+];
+pub const URL_SAFE_DECODE: &'static [u8; 256] = &[
+    INVALID_VALUE, // input 0 (0x0)
+    INVALID_VALUE, // input 1 (0x1)
+    INVALID_VALUE, // input 2 (0x2)
+    INVALID_VALUE, // input 3 (0x3)
+    INVALID_VALUE, // input 4 (0x4)
+    INVALID_VALUE, // input 5 (0x5)
+    INVALID_VALUE, // input 6 (0x6)
+    INVALID_VALUE, // input 7 (0x7)
+    INVALID_VALUE, // input 8 (0x8)
+    INVALID_VALUE, // input 9 (0x9)
+    INVALID_VALUE, // input 10 (0xA)
+    INVALID_VALUE, // input 11 (0xB)
+    INVALID_VALUE, // input 12 (0xC)
+    INVALID_VALUE, // input 13 (0xD)
+    INVALID_VALUE, // input 14 (0xE)
+    INVALID_VALUE, // input 15 (0xF)
+    INVALID_VALUE, // input 16 (0x10)
+    INVALID_VALUE, // input 17 (0x11)
+    INVALID_VALUE, // input 18 (0x12)
+    INVALID_VALUE, // input 19 (0x13)
+    INVALID_VALUE, // input 20 (0x14)
+    INVALID_VALUE, // input 21 (0x15)
+    INVALID_VALUE, // input 22 (0x16)
+    INVALID_VALUE, // input 23 (0x17)
+    INVALID_VALUE, // input 24 (0x18)
+    INVALID_VALUE, // input 25 (0x19)
+    INVALID_VALUE, // input 26 (0x1A)
+    INVALID_VALUE, // input 27 (0x1B)
+    INVALID_VALUE, // input 28 (0x1C)
+    INVALID_VALUE, // input 29 (0x1D)
+    INVALID_VALUE, // input 30 (0x1E)
+    INVALID_VALUE, // input 31 (0x1F)
+    INVALID_VALUE, // input 32 (0x20)
+    INVALID_VALUE, // input 33 (0x21)
+    INVALID_VALUE, // input 34 (0x22)
+    INVALID_VALUE, // input 35 (0x23)
+    INVALID_VALUE, // input 36 (0x24)
+    INVALID_VALUE, // input 37 (0x25)
+    INVALID_VALUE, // input 38 (0x26)
+    INVALID_VALUE, // input 39 (0x27)
+    INVALID_VALUE, // input 40 (0x28)
+    INVALID_VALUE, // input 41 (0x29)
+    INVALID_VALUE, // input 42 (0x2A)
+    INVALID_VALUE, // input 43 (0x2B)
+    INVALID_VALUE, // input 44 (0x2C)
+    62, // input 45 (0x2D char '-') => 62 (0x3E)
+    INVALID_VALUE, // input 46 (0x2E)
+    INVALID_VALUE, // input 47 (0x2F)
+    52, // input 48 (0x30 char '0') => 52 (0x34)
+    53, // input 49 (0x31 char '1') => 53 (0x35)
+    54, // input 50 (0x32 char '2') => 54 (0x36)
+    55, // input 51 (0x33 char '3') => 55 (0x37)
+    56, // input 52 (0x34 char '4') => 56 (0x38)
+    57, // input 53 (0x35 char '5') => 57 (0x39)
+    58, // input 54 (0x36 char '6') => 58 (0x3A)
+    59, // input 55 (0x37 char '7') => 59 (0x3B)
+    60, // input 56 (0x38 char '8') => 60 (0x3C)
+    61, // input 57 (0x39 char '9') => 61 (0x3D)
+    INVALID_VALUE, // input 58 (0x3A)
+    INVALID_VALUE, // input 59 (0x3B)
+    INVALID_VALUE, // input 60 (0x3C)
+    INVALID_VALUE, // input 61 (0x3D)
+    INVALID_VALUE, // input 62 (0x3E)
+    INVALID_VALUE, // input 63 (0x3F)
+    INVALID_VALUE, // input 64 (0x40)
+    0, // input 65 (0x41 char 'A') => 0 (0x0)
+    1, // input 66 (0x42 char 'B') => 1 (0x1)
+    2, // input 67 (0x43 char 'C') => 2 (0x2)
+    3, // input 68 (0x44 char 'D') => 3 (0x3)
+    4, // input 69 (0x45 char 'E') => 4 (0x4)
+    5, // input 70 (0x46 char 'F') => 5 (0x5)
+    6, // input 71 (0x47 char 'G') => 6 (0x6)
+    7, // input 72 (0x48 char 'H') => 7 (0x7)
+    8, // input 73 (0x49 char 'I') => 8 (0x8)
+    9, // input 74 (0x4A char 'J') => 9 (0x9)
+    10, // input 75 (0x4B char 'K') => 10 (0xA)
+    11, // input 76 (0x4C char 'L') => 11 (0xB)
+    12, // input 77 (0x4D char 'M') => 12 (0xC)
+    13, // input 78 (0x4E char 'N') => 13 (0xD)
+    14, // input 79 (0x4F char 'O') => 14 (0xE)
+    15, // input 80 (0x50 char 'P') => 15 (0xF)
+    16, // input 81 (0x51 char 'Q') => 16 (0x10)
+    17, // input 82 (0x52 char 'R') => 17 (0x11)
+    18, // input 83 (0x53 char 'S') => 18 (0x12)
+    19, // input 84 (0x54 char 'T') => 19 (0x13)
+    20, // input 85 (0x55 char 'U') => 20 (0x14)
+    21, // input 86 (0x56 char 'V') => 21 (0x15)
+    22, // input 87 (0x57 char 'W') => 22 (0x16)
+    23, // input 88 (0x58 char 'X') => 23 (0x17)
+    24, // input 89 (0x59 char 'Y') => 24 (0x18)
+    25, // input 90 (0x5A char 'Z') => 25 (0x19)
+    INVALID_VALUE, // input 91 (0x5B)
+    INVALID_VALUE, // input 92 (0x5C)
+    INVALID_VALUE, // input 93 (0x5D)
+    INVALID_VALUE, // input 94 (0x5E)
+    63, // input 95 (0x5F char '_') => 63 (0x3F)
+    INVALID_VALUE, // input 96 (0x60)
+    26, // input 97 (0x61 char 'a') => 26 (0x1A)
+    27, // input 98 (0x62 char 'b') => 27 (0x1B)
+    28, // input 99 (0x63 char 'c') => 28 (0x1C)
+    29, // input 100 (0x64 char 'd') => 29 (0x1D)
+    30, // input 101 (0x65 char 'e') => 30 (0x1E)
+    31, // input 102 (0x66 char 'f') => 31 (0x1F)
+    32, // input 103 (0x67 char 'g') => 32 (0x20)
+    33, // input 104 (0x68 char 'h') => 33 (0x21)
+    34, // input 105 (0x69 char 'i') => 34 (0x22)
+    35, // input 106 (0x6A char 'j') => 35 (0x23)
+    36, // input 107 (0x6B char 'k') => 36 (0x24)
+    37, // input 108 (0x6C char 'l') => 37 (0x25)
+    38, // input 109 (0x6D char 'm') => 38 (0x26)
+    39, // input 110 (0x6E char 'n') => 39 (0x27)
+    40, // input 111 (0x6F char 'o') => 40 (0x28)
+    41, // input 112 (0x70 char 'p') => 41 (0x29)
+    42, // input 113 (0x71 char 'q') => 42 (0x2A)
+    43, // input 114 (0x72 char 'r') => 43 (0x2B)
+    44, // input 115 (0x73 char 's') => 44 (0x2C)
+    45, // input 116 (0x74 char 't') => 45 (0x2D)
+    46, // input 117 (0x75 char 'u') => 46 (0x2E)
+    47, // input 118 (0x76 char 'v') => 47 (0x2F)
+    48, // input 119 (0x77 char 'w') => 48 (0x30)
+    49, // input 120 (0x78 char 'x') => 49 (0x31)
+    50, // input 121 (0x79 char 'y') => 50 (0x32)
+    51, // input 122 (0x7A char 'z') => 51 (0x33)
+    INVALID_VALUE, // input 123 (0x7B)
+    INVALID_VALUE, // input 124 (0x7C)
+    INVALID_VALUE, // input 125 (0x7D)
+    INVALID_VALUE, // input 126 (0x7E)
+    INVALID_VALUE, // input 127 (0x7F)
+    INVALID_VALUE, // input 128 (0x80)
+    INVALID_VALUE, // input 129 (0x81)
+    INVALID_VALUE, // input 130 (0x82)
+    INVALID_VALUE, // input 131 (0x83)
+    INVALID_VALUE, // input 132 (0x84)
+    INVALID_VALUE, // input 133 (0x85)
+    INVALID_VALUE, // input 134 (0x86)
+    INVALID_VALUE, // input 135 (0x87)
+    INVALID_VALUE, // input 136 (0x88)
+    INVALID_VALUE, // input 137 (0x89)
+    INVALID_VALUE, // input 138 (0x8A)
+    INVALID_VALUE, // input 139 (0x8B)
+    INVALID_VALUE, // input 140 (0x8C)
+    INVALID_VALUE, // input 141 (0x8D)
+    INVALID_VALUE, // input 142 (0x8E)
+    INVALID_VALUE, // input 143 (0x8F)
+    INVALID_VALUE, // input 144 (0x90)
+    INVALID_VALUE, // input 145 (0x91)
+    INVALID_VALUE, // input 146 (0x92)
+    INVALID_VALUE, // input 147 (0x93)
+    INVALID_VALUE, // input 148 (0x94)
+    INVALID_VALUE, // input 149 (0x95)
+    INVALID_VALUE, // input 150 (0x96)
+    INVALID_VALUE, // input 151 (0x97)
+    INVALID_VALUE, // input 152 (0x98)
+    INVALID_VALUE, // input 153 (0x99)
+    INVALID_VALUE, // input 154 (0x9A)
+    INVALID_VALUE, // input 155 (0x9B)
+    INVALID_VALUE, // input 156 (0x9C)
+    INVALID_VALUE, // input 157 (0x9D)
+    INVALID_VALUE, // input 158 (0x9E)
+    INVALID_VALUE, // input 159 (0x9F)
+    INVALID_VALUE, // input 160 (0xA0)
+    INVALID_VALUE, // input 161 (0xA1)
+    INVALID_VALUE, // input 162 (0xA2)
+    INVALID_VALUE, // input 163 (0xA3)
+    INVALID_VALUE, // input 164 (0xA4)
+    INVALID_VALUE, // input 165 (0xA5)
+    INVALID_VALUE, // input 166 (0xA6)
+    INVALID_VALUE, // input 167 (0xA7)
+    INVALID_VALUE, // input 168 (0xA8)
+    INVALID_VALUE, // input 169 (0xA9)
+    INVALID_VALUE, // input 170 (0xAA)
+    INVALID_VALUE, // input 171 (0xAB)
+    INVALID_VALUE, // input 172 (0xAC)
+    INVALID_VALUE, // input 173 (0xAD)
+    INVALID_VALUE, // input 174 (0xAE)
+    INVALID_VALUE, // input 175 (0xAF)
+    INVALID_VALUE, // input 176 (0xB0)
+    INVALID_VALUE, // input 177 (0xB1)
+    INVALID_VALUE, // input 178 (0xB2)
+    INVALID_VALUE, // input 179 (0xB3)
+    INVALID_VALUE, // input 180 (0xB4)
+    INVALID_VALUE, // input 181 (0xB5)
+    INVALID_VALUE, // input 182 (0xB6)
+    INVALID_VALUE, // input 183 (0xB7)
+    INVALID_VALUE, // input 184 (0xB8)
+    INVALID_VALUE, // input 185 (0xB9)
+    INVALID_VALUE, // input 186 (0xBA)
+    INVALID_VALUE, // input 187 (0xBB)
+    INVALID_VALUE, // input 188 (0xBC)
+    INVALID_VALUE, // input 189 (0xBD)
+    INVALID_VALUE, // input 190 (0xBE)
+    INVALID_VALUE, // input 191 (0xBF)
+    INVALID_VALUE, // input 192 (0xC0)
+    INVALID_VALUE, // input 193 (0xC1)
+    INVALID_VALUE, // input 194 (0xC2)
+    INVALID_VALUE, // input 195 (0xC3)
+    INVALID_VALUE, // input 196 (0xC4)
+    INVALID_VALUE, // input 197 (0xC5)
+    INVALID_VALUE, // input 198 (0xC6)
+    INVALID_VALUE, // input 199 (0xC7)
+    INVALID_VALUE, // input 200 (0xC8)
+    INVALID_VALUE, // input 201 (0xC9)
+    INVALID_VALUE, // input 202 (0xCA)
+    INVALID_VALUE, // input 203 (0xCB)
+    INVALID_VALUE, // input 204 (0xCC)
+    INVALID_VALUE, // input 205 (0xCD)
+    INVALID_VALUE, // input 206 (0xCE)
+    INVALID_VALUE, // input 207 (0xCF)
+    INVALID_VALUE, // input 208 (0xD0)
+    INVALID_VALUE, // input 209 (0xD1)
+    INVALID_VALUE, // input 210 (0xD2)
+    INVALID_VALUE, // input 211 (0xD3)
+    INVALID_VALUE, // input 212 (0xD4)
+    INVALID_VALUE, // input 213 (0xD5)
+    INVALID_VALUE, // input 214 (0xD6)
+    INVALID_VALUE, // input 215 (0xD7)
+    INVALID_VALUE, // input 216 (0xD8)
+    INVALID_VALUE, // input 217 (0xD9)
+    INVALID_VALUE, // input 218 (0xDA)
+    INVALID_VALUE, // input 219 (0xDB)
+    INVALID_VALUE, // input 220 (0xDC)
+    INVALID_VALUE, // input 221 (0xDD)
+    INVALID_VALUE, // input 222 (0xDE)
+    INVALID_VALUE, // input 223 (0xDF)
+    INVALID_VALUE, // input 224 (0xE0)
+    INVALID_VALUE, // input 225 (0xE1)
+    INVALID_VALUE, // input 226 (0xE2)
+    INVALID_VALUE, // input 227 (0xE3)
+    INVALID_VALUE, // input 228 (0xE4)
+    INVALID_VALUE, // input 229 (0xE5)
+    INVALID_VALUE, // input 230 (0xE6)
+    INVALID_VALUE, // input 231 (0xE7)
+    INVALID_VALUE, // input 232 (0xE8)
+    INVALID_VALUE, // input 233 (0xE9)
+    INVALID_VALUE, // input 234 (0xEA)
+    INVALID_VALUE, // input 235 (0xEB)
+    INVALID_VALUE, // input 236 (0xEC)
+    INVALID_VALUE, // input 237 (0xED)
+    INVALID_VALUE, // input 238 (0xEE)
+    INVALID_VALUE, // input 239 (0xEF)
+    INVALID_VALUE, // input 240 (0xF0)
+    INVALID_VALUE, // input 241 (0xF1)
+    INVALID_VALUE, // input 242 (0xF2)
+    INVALID_VALUE, // input 243 (0xF3)
+    INVALID_VALUE, // input 244 (0xF4)
+    INVALID_VALUE, // input 245 (0xF5)
+    INVALID_VALUE, // input 246 (0xF6)
+    INVALID_VALUE, // input 247 (0xF7)
+    INVALID_VALUE, // input 248 (0xF8)
+    INVALID_VALUE, // input 249 (0xF9)
+    INVALID_VALUE, // input 250 (0xFA)
+    INVALID_VALUE, // input 251 (0xFB)
+    INVALID_VALUE, // input 252 (0xFC)
+    INVALID_VALUE, // input 253 (0xFD)
+    INVALID_VALUE, // input 254 (0xFE)
+    INVALID_VALUE, // input 255 (0xFF)
+];
new file mode 100644
--- /dev/null
+++ b/third_party/rust/base64/tests/tests.rs
@@ -0,0 +1,696 @@
+extern crate base64;
+extern crate rand;
+
+use rand::Rng;
+
+use base64::*;
+
+fn compare_encode(expected: &str, target: &[u8]) {
+    assert_eq!(expected, encode(target));
+}
+
+fn compare_decode(expected: &str, target: &str) {
+    assert_eq!(expected, String::from_utf8(decode(target).unwrap()).unwrap());
+    assert_eq!(expected, String::from_utf8(decode(target.as_bytes()).unwrap()).unwrap());
+}
+
+fn compare_decode_mime(expected: &str, target: &str) {
+    assert_eq!(expected, String::from_utf8(decode_config(target, MIME).unwrap()).unwrap());
+}
+
+fn push_rand(buf: &mut Vec<u8>, len: usize) {
+    let mut r = rand::weak_rng();
+
+    for _ in 0..len {
+        buf.push(r.gen::<u8>());
+    }
+}
+
+// generate every possible byte string recursively and test encode/decode roundtrip
+fn roundtrip_append_recurse(byte_buf: &mut Vec<u8>, str_buf: &mut String, remaining_bytes: usize) {
+    let orig_length = byte_buf.len();
+    for b in 0..256 {
+        byte_buf.push(b as u8);
+
+        if remaining_bytes > 1 {
+            roundtrip_append_recurse(byte_buf, str_buf, remaining_bytes - 1)
+        } else {
+            encode_config_buf(&byte_buf, STANDARD, str_buf);
+            let roundtrip_bytes = decode_config(&str_buf, STANDARD).unwrap();
+            assert_eq!(*byte_buf, roundtrip_bytes);
+
+            str_buf.clear();
+
+        }
+
+        byte_buf.truncate(orig_length);
+    }
+}
+
+// generate every possible byte string recursively and test encode/decode roundtrip with
+// padding removed
+fn roundtrip_append_recurse_strip_padding(byte_buf: &mut Vec<u8>, str_buf: &mut String,
+                                          remaining_bytes: usize) {
+    let orig_length = byte_buf.len();
+    for b in 0..256 {
+        byte_buf.push(b as u8);
+
+        if remaining_bytes > 1 {
+            roundtrip_append_recurse_strip_padding(byte_buf, str_buf, remaining_bytes - 1)
+        } else {
+            encode_config_buf(&byte_buf, STANDARD, str_buf);
+            {
+                let trimmed = str_buf.trim_right_matches('=');
+                let roundtrip_bytes = decode_config(&trimmed, STANDARD).unwrap();
+                assert_eq!(*byte_buf, roundtrip_bytes);
+            }
+            str_buf.clear();
+        }
+
+        byte_buf.truncate(orig_length);
+    }
+}
+
+// generate random contents of the specified length and test encode/decode roundtrip
+fn roundtrip_random(byte_buf: &mut Vec<u8>, str_buf: &mut String, byte_len: usize,
+                    approx_values_per_byte: u8, max_rounds: u64) {
+    let num_rounds = calculate_number_of_rounds(byte_len, approx_values_per_byte, max_rounds);
+    let mut r = rand::weak_rng();
+
+    for _ in 0..num_rounds {
+        byte_buf.clear();
+        str_buf.clear();
+        while byte_buf.len() < byte_len {
+            byte_buf.push(r.gen::<u8>());
+        }
+
+        encode_config_buf(&byte_buf, STANDARD, str_buf);
+        let roundtrip_bytes = decode_config(&str_buf, STANDARD).unwrap();
+
+        assert_eq!(*byte_buf, roundtrip_bytes);
+    }
+}
+
+// generate random contents of the specified length and test encode/decode roundtrip
+fn roundtrip_random_strip_padding(byte_buf: &mut Vec<u8>, str_buf: &mut String, byte_len: usize,
+                    approx_values_per_byte: u8, max_rounds: u64) {
+    // let the short ones be short but don't let it get too crazy large
+    let num_rounds = calculate_number_of_rounds(byte_len, approx_values_per_byte, max_rounds);
+    let mut r = rand::weak_rng();
+
+    for _ in 0..num_rounds {
+        byte_buf.clear();
+        str_buf.clear();
+        while byte_buf.len() < byte_len {
+            byte_buf.push(r.gen::<u8>());
+        }
+
+        encode_config_buf(&byte_buf, STANDARD, str_buf);
+        let trimmed = str_buf.trim_right_matches('=');
+        let roundtrip_bytes = decode_config(&trimmed, STANDARD).unwrap();
+
+        assert_eq!(*byte_buf, roundtrip_bytes);
+    }
+}
+
+fn calculate_number_of_rounds(byte_len: usize, approx_values_per_byte: u8, max: u64) -> u64 {
+    // don't overflow
+    let mut prod = approx_values_per_byte as u64;
+
+    for _ in 0..byte_len {
+        if prod > max {
+            return max;
+        }
+
+        prod = prod.saturating_mul(prod);
+    }
+
+    return prod;
+}
+
+//-------
+//decode
+
+#[test]
+fn decode_rfc4648_0() {
+    compare_decode("", "");
+}
+
+#[test]
+fn decode_rfc4648_1() {
+    compare_decode("f", "Zg==");
+}
+#[test]
+fn decode_rfc4648_1_just_a_bit_of_padding() {
+    // allows less padding than required
+    compare_decode("f", "Zg=");
+}
+
+#[test]
+fn decode_rfc4648_1_no_padding() {
+    compare_decode("f", "Zg");
+}
+
+#[test]
+fn decode_rfc4648_2() {
+    compare_decode("fo", "Zm8=");
+}
+
+#[test]
+fn decode_rfc4648_2_no_padding() {
+    compare_decode("fo", "Zm8");
+}
+
+#[test]
+fn decode_rfc4648_3() {
+    compare_decode("foo", "Zm9v");
+}
+
+#[test]
+fn decode_rfc4648_4() {
+    compare_decode("foob", "Zm9vYg==");
+}
+
+#[test]
+fn decode_rfc4648_4_no_padding() {
+    compare_decode("foob", "Zm9vYg");
+}
+
+#[test]
+fn decode_rfc4648_5() {
+    compare_decode("fooba", "Zm9vYmE=");
+}
+
+#[test]
+fn decode_rfc4648_5_no_padding() {
+    compare_decode("fooba", "Zm9vYmE");
+}
+
+#[test]
+fn decode_rfc4648_6() {
+    compare_decode("foobar", "Zm9vYmFy");
+}
+
+//this is a MAY in the rfc: https://tools.ietf.org/html/rfc4648#section-3.3
+#[test]
+fn decode_pad_inside_fast_loop_chunk_error() {
+    // can't PartialEq Base64Error, so we do this the hard way
+    match decode("YWxpY2U=====").unwrap_err() {
+        DecodeError::InvalidByte(offset, byte) => {
+            // since the first 8 bytes are handled in the fast loop, the
+            // padding is an error. Could argue that the *next* padding
+            // byte is technically the first erroneous one, but reporting
+            // that accurately is more complex and probably nobody cares
+            assert_eq!(7, offset);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_extra_pad_after_fast_loop_chunk_error() {
+    match decode("YWxpY2UABB===").unwrap_err() {
+        DecodeError::InvalidByte(offset, byte) => {
+            // extraneous third padding byte
+            assert_eq!(12, offset);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    };
+}
+
+
+//same
+#[test]
+fn decode_absurd_pad_error() {
+    match decode("==Y=Wx===pY=2U=====").unwrap_err() {
+        DecodeError::InvalidByte(size, byte) => {
+            assert_eq!(0, size);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_starts_with_padding_single_quad_error() {
+    match decode("====").unwrap_err() {
+        DecodeError::InvalidByte(offset, byte) => {
+            // with no real input, first padding byte is bogus
+            assert_eq!(0, offset);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_extra_padding_in_trailing_quad_returns_error() {
+    match decode("zzz==").unwrap_err() {
+        DecodeError::InvalidByte(size, byte) => {
+            // first unneeded padding byte
+            assert_eq!(4, size);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_extra_padding_in_trailing_quad_2_returns_error() {
+    match decode("zz===").unwrap_err() {
+        DecodeError::InvalidByte(size, byte) => {
+            // first unneeded padding byte
+            assert_eq!(4, size);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+
+#[test]
+fn decode_start_second_quad_with_padding_returns_error() {
+    match decode("zzzz=").unwrap_err() {
+        DecodeError::InvalidByte(size, byte) => {
+            // first unneeded padding byte
+            assert_eq!(4, size);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_padding_in_last_quad_followed_by_non_padding_returns_error() {
+    match decode("zzzz==z").unwrap_err() {
+        DecodeError::InvalidByte(size, byte) => {
+            assert_eq!(4, size);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_too_short_with_padding_error() {
+    match decode("z==").unwrap_err() {
+        DecodeError::InvalidByte(size, byte) => {
+            // first unneeded padding byte
+            assert_eq!(1, size);
+            assert_eq!(0x3D, byte);
+        }
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_too_short_without_padding_error() {
+    match decode("z").unwrap_err() {
+        DecodeError::InvalidLength => {}
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_too_short_second_quad_without_padding_error() {
+    match decode("zzzzX").unwrap_err() {
+        DecodeError::InvalidLength => {}
+        _ => assert!(false)
+    }
+}
+
+#[test]
+fn decode_error_for_bogus_char_in_right_position() {
+    for length in 1..25 {
+        for error_position in 0_usize..length {
+            let prefix: String = std::iter::repeat("A").take(error_position).collect();
+            let suffix: String = std::iter::repeat("B").take(length - error_position - 1).collect();
+
+            let input = prefix + "%" + &suffix;
+            assert_eq!(length, input.len(),
+                "length {} error position {}", length, error_position);
+
+            match decode(&input).unwrap_err() {
+                DecodeError::InvalidByte(size, byte) => {
+                    assert_eq!(error_position, size,
+                        "length {} error position {}", length, error_position);
+                    assert_eq!(0x25, byte);
+                }
+                _ => assert!(false)
+            }
+        }
+    }
+}
+
+#[test]
+fn decode_into_nonempty_buffer_doesnt_clobber_existing_contents() {
+    let mut orig_data = Vec::new();
+    let mut encoded_data = String::new();
+    let mut decoded_with_prefix = Vec::new();
+    let mut decoded_without_prefix = Vec::new();
+    let mut prefix = Vec::new();
+    for encoded_length in 0_usize..26 {
+        if encoded_length % 4 == 1 {
+            // can't have a lone byte in a quad of input
+            continue;
+        };
+
+        let raw_data_byte_triples = encoded_length / 4;
+        // 4 base64 bytes -> 3 input bytes, 3 -> 2, 2 -> 1, 0 -> 0
+        let raw_data_byte_leftovers = (encoded_length % 4).saturating_sub(1);
+
+        // we'll borrow buf to make some data to encode
+        orig_data.clear();
+        push_rand(&mut orig_data, raw_data_byte_triples * 3 + raw_data_byte_leftovers);
+
+        encoded_data.clear();
+        encode_config_buf(&orig_data, STANDARD, &mut encoded_data);
+
+        assert_eq!(encoded_length, encoded_data.trim_right_matches('=').len());
+
+        for prefix_length in 1..26 {
+            decoded_with_prefix.clear();
+            decoded_without_prefix.clear();
+            prefix.clear();
+
+            // fill the buf with a prefix
+            push_rand(&mut prefix, prefix_length);
+            decoded_with_prefix.resize(prefix_length, 0);
+            decoded_with_prefix.copy_from_slice(&prefix);
+
+            // decode into the non-empty buf
+            decode_config_buf(&encoded_data, STANDARD, &mut decoded_with_prefix).unwrap();
+            // also decode into the empty buf
+            decode_config_buf(&encoded_data, STANDARD, &mut decoded_without_prefix).unwrap();
+
+            assert_eq!(prefix_length + decoded_without_prefix.len(), decoded_with_prefix.len());
+
+            // append plain decode onto prefix
+            prefix.append(&mut decoded_without_prefix);
+
+            assert_eq!(prefix, decoded_with_prefix);
+        }
+    }
+}
+
+#[test]
+fn roundtrip_random_no_fast_loop() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+
+    for input_len in 0..9 {
+        roundtrip_random(&mut byte_buf, &mut str_buf, input_len, 4, 10000);
+    }
+}
+
+#[test]
+fn roundtrip_random_with_fast_loop() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+
+    for input_len in 9..26 {
+        roundtrip_random(&mut byte_buf, &mut str_buf, input_len, 4, 100000);
+    }
+}
+
+#[test]
+fn roundtrip_random_no_fast_loop_no_padding() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+
+    for input_len in 0..9 {
+        roundtrip_random_strip_padding(&mut byte_buf, &mut str_buf, input_len, 4, 10000);
+    }
+}
+
+#[test]
+fn roundtrip_random_with_fast_loop_no_padding() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+
+    for input_len in 9..26 {
+        roundtrip_random_strip_padding(&mut byte_buf, &mut str_buf, input_len, 4, 100000);
+    }
+}
+
+#[test]
+fn roundtrip_all_1_byte() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+    roundtrip_append_recurse(&mut byte_buf, &mut str_buf, 1);
+}
+
+#[test]
+fn roundtrip_all_1_byte_no_padding() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+    roundtrip_append_recurse_strip_padding(&mut byte_buf, &mut str_buf, 1);
+}
+
+#[test]
+fn roundtrip_all_2_byte() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+    roundtrip_append_recurse(&mut byte_buf, &mut str_buf, 2);
+}
+
+#[test]
+fn roundtrip_all_2_byte_no_padding() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+    roundtrip_append_recurse_strip_padding(&mut byte_buf, &mut str_buf, 2);
+}
+
+#[test]
+fn roundtrip_all_3_byte() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+    roundtrip_append_recurse(&mut byte_buf, &mut str_buf, 3);
+}
+
+#[test]
+fn roundtrip_random_4_byte() {
+    let mut byte_buf: Vec<u8> = Vec::new();
+    let mut str_buf = String::new();
+
+    roundtrip_random(&mut byte_buf, &mut str_buf, 4, 48, 10000);
+}
+
+//TODO like, write a thing to test every ascii val lol
+//prolly just yankput the 64 array and a 256 one later
+//is there a way to like, not have to write a fn every time
+//"hi test harness this should panic 192 times" would be nice
+//oh well whatever this is better done by a fuzzer
+
+//strip yr whitespace kids
+#[test]
+#[should_panic]
+fn decode_reject_space() {
+    assert!(decode("YWx pY2U=").is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_reject_tab() {
+    assert!(decode("YWx\tpY2U=").is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_reject_ff() {
+    assert!(decode("YWx\x0cpY2U=").is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_reject_vtab() {
+    assert!(decode("YWx\x0bpY2U=").is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_reject_nl() {
+    assert!(decode("YWx\npY2U=").is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_reject_crnl() {
+    assert!(decode("YWx\r\npY2U=").is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_reject_null() {
+    assert!(decode("YWx\0pY2U=").is_ok());
+}
+
+#[test]
+fn decode_mime_allow_space() {
+    assert!(decode_config("YWx pY2U=", MIME).is_ok());
+}
+
+#[test]
+fn decode_mime_allow_tab() {
+    assert!(decode_config("YWx\tpY2U=", MIME).is_ok());
+}
+
+#[test]
+fn decode_mime_allow_ff() {
+    assert!(decode_config("YWx\x0cpY2U=", MIME).is_ok());
+}
+
+#[test]
+fn decode_mime_allow_vtab() {
+    assert!(decode_config("YWx\x0bpY2U=", MIME).is_ok());
+}
+
+#[test]
+fn decode_mime_allow_nl() {
+    assert!(decode_config("YWx\npY2U=", MIME).is_ok());
+}
+
+#[test]
+fn decode_mime_allow_crnl() {
+    assert!(decode_config("YWx\r\npY2U=", MIME).is_ok());
+}
+
+#[test]
+#[should_panic]
+fn decode_mime_reject_null() {
+    assert!(decode_config("YWx\0pY2U=", MIME).is_ok());
+}
+
+#[test]
+fn decode_mime_absurd_whitespace() {
+    compare_decode_mime("how could you let this happen",
+        "\n aG93I\n\nG\x0bNvd\r\nWxkI HlvdSB \tsZXQgdGh\rpcyBo\x0cYXBwZW4 =   ");
+}
+
+//-------
+//encode
+
+#[test]
+fn encode_rfc4648_0() {
+    compare_encode("", b"");
+}
+
+#[test]
+fn encode_rfc4648_1() {
+    compare_encode("Zg==", b"f");
+}
+
+#[test]
+fn encode_rfc4648_2() {
+    compare_encode("Zm8=", b"fo");
+}
+
+#[test]
+fn encode_rfc4648_3() {
+    compare_encode("Zm9v", b"foo");
+}
+
+#[test]
+fn encode_rfc4648_4() {
+    compare_encode("Zm9vYg==", b"foob");
+}
+
+#[test]
+fn encode_rfc4648_5() {
+    compare_encode("Zm9vYmE=", b"fooba");
+}
+
+#[test]
+fn encode_rfc4648_6() {
+    compare_encode("Zm9vYmFy", b"foobar");
+}
+
+#[test]
+fn encode_all_ascii() {
+    let mut ascii = Vec::<u8>::with_capacity(128);
+
+    for i in 0..128 {
+        ascii.push(i);
+    }
+
+    compare_encode("AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8=", &ascii);
+}
+
+#[test]
+fn encode_all_bytes() {
+    let mut bytes = Vec::<u8>::with_capacity(256);
+
+    for i in 0..255 {
+        bytes.push(i);
+    }
+    bytes.push(255); //bug with "overflowing" ranges?
+
+    compare_encode("AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", &bytes);
+}
+
+#[test]
+fn encode_all_bytes_url() {
+    let mut bytes = Vec::<u8>::with_capacity(256);
+
+    for i in 0..255 {
+        bytes.push(i);
+    }
+    bytes.push(255); //bug with "overflowing" ranges?
+
+    assert_eq!("AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0-P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn-AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq-wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy8_T19vf4-fr7_P3-_w==", encode_config(&bytes, URL_SAFE));
+}
+
+#[test]
+fn encode_into_nonempty_buffer_doesnt_clobber_existing_contents() {
+    let mut orig_data = Vec::new();
+    let mut encoded_with_prefix = String::new();
+    let mut encoded_without_prefix = String::new();
+    let mut prefix = String::new();
+    for orig_data_length in 0_usize..26 {
+        // we'll borrow buf to make some data to encode
+        orig_data.clear();
+        push_rand(&mut orig_data, orig_data_length);
+
+        for prefix_length in 1..26 {
+            encoded_with_prefix.clear();
+            encoded_without_prefix.clear();
+            prefix.clear();
+
+            for _ in 0..prefix_length {
+                prefix.push('~');
+            }
+
+            encoded_with_prefix.push_str(&prefix);
+
+            // encode into the non-empty buf
+            encode_config_buf(&orig_data, STANDARD, &mut encoded_with_prefix);
+            // also encode into the empty buf
+            encode_config_buf(&orig_data, STANDARD, &mut encoded_without_prefix);
+
+            assert_eq!(prefix_length + encoded_without_prefix.len(), encoded_with_prefix.len());
+
+            // append plain decode onto prefix
+            prefix.push_str(&mut encoded_without_prefix);
+
+            assert_eq!(prefix, encoded_with_prefix);
+        }
+    }
+}
+
+
+#[test]
+fn because_we_can() {
+    compare_decode("alice", "YWxpY2U=");
+    compare_decode("alice", &encode(b"alice"));
+    compare_decode("alice", &encode(&decode(&encode(b"alice")).unwrap()));
+}
+
+
+#[test]
+fn encode_url_safe_without_padding() {
+    let encoded = encode_config(b"alice", URL_SAFE_NO_PAD);
+    assert_eq!(&encoded, "YWxpY2U");
+    assert_eq!(String::from_utf8(decode(&encoded).unwrap()).unwrap(), "alice");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"6cbb5d3024e3efa72fd131b6f7c7cc46c3d91f50b945235153d865dfc1b4e874","build.rs":"20e799fb7820cd52352f77bd5d92c0d78a71bcba984eda1ddb1f68e615d8d242","bzip2-1.0.6/CHANGES":"cf9ea36ed7161f90be08940164de30d5426c236dabab5f396ae6fbf19bdb2b7b","bzip2-1.0.6/LICENSE":"4919cfb14a73cd64fcef67b107613970cf1659a09aa675dba31314f373bc7204","bzip2-1.0.6/Makefile":"5e5818994b515c1c930cdcafa1c551b7f43789c2b98e3a66a55c67a911f14075","bzip2-1.0.6/Makefile-libbz2_so":"959b4743758c96b1dc2978d15304f16aca0f49263abd4c590245fa3f82779349","bzip2-1.0.6/README":"52ba29d974c085ac7f33603b30aea9d5aed09c6eef0e4a5f6f53747cba22b079","bzip2-1.0.6/README.COMPILATION.PROBLEMS":"1b98d5e0a695949072bad62a55638bb8baf3f7caa840dbecb2c3aab249e18606","bzip2-1.0.6/README.XML.STUFF":"bfee8553918aec485e93a2f1df29275332f662110619f1c47ac020c926adf5ec","bzip2-1.0.6/blocksort.c":"5a87cc2624b4c676fdb595a3caad22cfe4f667e347c7dcc22ad39c64bc243471","bzip2-1.0.6/bz-common.xsl":"cceeb48f5ddf2bcac9cd196f67413466e70c9f801e1c508aaa1de574cbe71cbc","bzip2-1.0.6/bz-fo.xsl":"a25683b9893709d92ab61fb91c3bc6b1892498d9f43fd0c22b3917a3789cdc2d","bzip2-1.0.6/bz-html.xsl":"d45f09d996c464af6dabd9e8cb8a45799637c8f8562c8d6cad283896771ce455","bzip2-1.0.6/bzdiff":"ca96220d7df823031c028dbb32183e6a8e9e05737eda10b97ec9c3e01724d6cf","bzip2-1.0.6/bzdiff.1":"32d1a7cd115430398e58537532584ef2ab76343c9f094dcd1253d9c4c0f705bf","bzip2-1.0.6/bzgrep":"2855f1850e1281747d70d1409084ff156cd42eb07872ffadab610a59e90df869","bzip2-1.0.6/bzgrep.1":"924aa4a7c7c1467400181e4c0ee1b527db142b6399a717171f2351b72b5899df","bzip2-1.0.6/bzip.css":"2af2624c4d0d861d4ebb915a3e4e5b1dcd87adf289d389d5eb2507d08f71acc2","bzip2-1.0.6/bzip2.1":"ffbfa089a0576074cbc78957151587e2bb6a8f00ebadd56763db954dc7c1ebf9","bzip2-1.0.6/bzip2.1.preformatted":"49014439a6c5741fadba0473680bd75545aea9d089fe62024b4ccaba261ea390","bzip2-1.0.6/bzip2.c":"87aff50026000cbab8d7e7314bab83a980fd481c96005d8650f3df1c748d9fcf","bzip2-1.0.6/bzip2.txt":"89a673a8ae1caca7aece10e4ef66feb735b5f00642f0126fa97525402d47fb21","bzip2-1.0.6/bzip2recover.c":"9a55818d0984b7a23934e6dc760f653076b25a1ae5adcc8038828a44883688b9","bzip2-1.0.6/bzlib.c":"2ff7ee75f54a48632ce7200555d6064397c134e13d1cece200131bbc8f81a94b","bzip2-1.0.6/bzlib.h":"b360bfe8e0769adaa8ee6ae26324e26c40ccbdb557677a6b8ad506214984d2e8","bzip2-1.0.6/bzlib_private.h":"0cdc41a109e5f003a691a3b541c7c75ea44b5da82f91605b197124a598a79741","bzip2-1.0.6/bzmore":"836536d4c7469788c730355d59f8ae8d16ba07cb0754174878d99ed90f04448d","bzip2-1.0.6/bzmore.1":"ccfcf3f995e11adae3035e287252091bb72d165da21e0c385a4965d17c9051c7","bzip2-1.0.6/compress.c":"eaa8b0d57e61aa259938e5023e0afa33bf88146a6797c38409d1c6e72ae8ccbf","bzip2-1.0.6/crctable.c":"12cde199e167a5d48a8a463d1234d6ec345f77df2b11dcd025fe137da6eb53da","bzip2-1.0.6/decompress.c":"e703faddf69686cb5664be628da2e3c8c443acc16e2a137a0d546d4ededbf72e","bzip2-1.0.6/dlltest.c":"1568b2dd44d3007dd52bfb1bdf9f31ffc90706d260ec5a3504bc47dc32a040a1","bzip2-1.0.6/dlltest.dsp":"5073bbf71a35876e8f82e34c66ccc578552713d0798576d944d9ec7ab61070c8","bzip2-1.0.6/entities.xml":"a6c4afd00b4eefd58f20283126ef2ad8409088d0a9ac1c21c0fdbecefab2cc61","bzip2-1.0.6/format.pl":"2d6b195aa9071819c91774d1645d9529cce8dcc7284bd3dba6d45f5eca772f6d","bzip2-1.0.6/huffman.c":"faa54732e6148d5c5832c5cd7c1986c1ba25b6917354c42e0cd6a7370ca25056","bzip2-1.0.6/libbz2.def":"7c72d18c550afbf464c92aeb3869eb559c9faba5c7828546d1ec8620e9d5c7a3","bzip2-1.0.6/libbz2.dsp":"e92bc39a2fc6a8c7e095971a55e5779d4c255b4484d259914614ab49bf09db8f","bzip2-1.0.6/makefile.msc":"aa4179750a47298dd61dd296937735afb04cff81957852eaf491819c20e1f406","bzip2-1.0.6/manual.html":"1095e3779cdc417f99b8a5098ce3ec3e3ebf90f4871c3b07b91c151fd62735f0","bzip2-1.0.6/manual.ps":"739359fef76687f7ac4c82b2c7faceda08f1a3eb8c87c12196a36343a65a1884","bzip2-1.0.6/manual.xml":"762d5a25470181cee670025ee6b11b6ee23bc50344301b9a422771051c52963b","bzip2-1.0.6/mk251.c":"844eb2e4acb4de272927bd5b9ee1ad802458cbacb85ad249723b79fa383be79f","bzip2-1.0.6/randtable.c":"46d27493aa8f64bed44495e3fa30233a2938056b2b274410bd67aaf40b8ef5f6","bzip2-1.0.6/sample1.bz2":"d4b442283e085497c528c0122c7ec64bf12aac422b3faff57b97de3378b7a7a4","bzip2-1.0.6/sample1.ref":"af423164ec87f495f7d450fee9bdd418c12114cd305de2384fd20b91ba7994c2","bzip2-1.0.6/sample2.bz2":"c74d44033766ea66171f51bd2ce6e3ad9ce4e0749e03ee4bee3074ab2a4b9c7f","bzip2-1.0.6/sample2.ref":"316ad6713f2c05413e0b9eac132840d092674e7de4138251d3552f98671fcf9a","bzip2-1.0.6/sample3.bz2":"fc60721da6329daa4bfe5ef3b32d2de0bebac626ce8522ae033dc3a9296c7779","bzip2-1.0.6/sample3.ref":"6be9c2bd214924b18db0d57b9a14d6f4eeb0b276cd3a980aed91521cca3199dd","bzip2-1.0.6/spewG.c":"b6be093348cdb8c396dc71c0cd853370778690c2ca99cb84e54285c496fe1779","bzip2-1.0.6/unzcrash.c":"a2d7d39bbe2c2ec2515aafa99ef54ea3844cd3e9acfac6ce2247cc58e7a19ac9","bzip2-1.0.6/words0":"cb3ad1756ad30df2b53e4abc0cc5fa19f120de5582bee32481460cb6991d4b24","bzip2-1.0.6/words1":"199303545d9a074b351c9d58fe41032a65840eb9638a8a1be9aea6b63ce55a19","bzip2-1.0.6/words2":"953e874cc77023c5a61c16d71a27e789209c56996c943fb55dcc8092ca39259b","bzip2-1.0.6/words3":"6c9b45d0f7a9d5a1aee52016b48bef8171be2cda23cf18144ef1d5d36eceb260","bzip2-1.0.6/xmlproc.sh":"bb4ce53b6a94f89e72f8b8fcdc48f1499e6fab2b3d59384c693942cf55a579b6","lib.rs":"7ec965dd2e93f091d93e6e5a1c9034757f84fc6c35c886ea9328ecd834c52b6b"},"package":"98ce3fff84d4e90011f464bbdf48e3428f04270439f703868fd489d2aaedfc30"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/Cargo.toml
@@ -0,0 +1,26 @@
+[package]
+
+name = "bzip2-sys"
+version = "0.1.5"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+links = "bzip2"
+build = "build.rs"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/alexcrichton/bzip2-rs"
+homepage = "https://github.com/alexcrichton/bzip2-rs"
+documentation = "https://docs.rs/bzip2-sys"
+description = """
+Bindings to libbzip2 for bzip2 compression and decompression exposed as
+Reader/Writer streams.
+"""
+categories = ["external-ffi-bindings"]
+
+[lib]
+name = "bzip2_sys"
+path = "lib.rs"
+
+[dependencies]
+libc = "0.2"
+
+[build-dependencies]
+gcc = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/build.rs
@@ -0,0 +1,23 @@
+extern crate gcc;
+
+use std::env;
+
+fn main() {
+    let mut cfg = gcc::Config::new();
+
+    if env::var("TARGET").unwrap().contains("windows") {
+        cfg.define("_WIN32", None);
+        cfg.define("BZ_EXPORT", None);
+    }
+
+    cfg.include("bzip2-1.0.6")
+       .define("BZ_NO_STDIO", None)
+       .file("bzip2-1.0.6/blocksort.c")
+       .file("bzip2-1.0.6/huffman.c")
+       .file("bzip2-1.0.6/crctable.c")
+       .file("bzip2-1.0.6/randtable.c")
+       .file("bzip2-1.0.6/compress.c")
+       .file("bzip2-1.0.6/decompress.c")
+       .file("bzip2-1.0.6/bzlib.c")
+       .compile("libbz2.a");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/CHANGES
@@ -0,0 +1,327 @@
+ ------------------------------------------------------------------
+ This file is part of bzip2/libbzip2, a program and library for
+ lossless, block-sorting data compression.
+
+ bzip2/libbzip2 version 1.0.6 of 6 September 2010
+ Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+ Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+ README file.
+
+ This program is released under the terms of the license contained
+ in the file LICENSE.
+ ------------------------------------------------------------------
+
+
+0.9.0
+~~~~~
+First version.
+
+
+0.9.0a
+~~~~~~
+Removed 'ranlib' from Makefile, since most modern Unix-es 
+don't need it, or even know about it.
+
+
+0.9.0b
+~~~~~~
+Fixed a problem with error reporting in bzip2.c.  This does not effect
+the library in any way.  Problem is: versions 0.9.0 and 0.9.0a (of the
+program proper) compress and decompress correctly, but give misleading
+error messages (internal panics) when an I/O error occurs, instead of
+reporting the problem correctly.  This shouldn't give any data loss
+(as far as I can see), but is confusing.
+
+Made the inline declarations disappear for non-GCC compilers.
+
+
+0.9.0c
+~~~~~~
+Fixed some problems in the library pertaining to some boundary cases.
+This makes the library behave more correctly in those situations.  The
+fixes apply only to features (calls and parameters) not used by
+bzip2.c, so the non-fixedness of them in previous versions has no
+effect on reliability of bzip2.c.
+
+In bzlib.c:
+   * made zero-length BZ_FLUSH work correctly in bzCompress().
+   * fixed bzWrite/bzRead to ignore zero-length requests.
+   * fixed bzread to correctly handle read requests after EOF.
+   * wrong parameter order in call to bzDecompressInit in
+     bzBuffToBuffDecompress.  Fixed.
+
+In compress.c:
+   * changed setting of nGroups in sendMTFValues() so as to 
+     do a bit better on small files.  This _does_ effect
+     bzip2.c.
+
+
+0.9.5a
+~~~~~~
+Major change: add a fallback sorting algorithm (blocksort.c)
+to give reasonable behaviour even for very repetitive inputs.
+Nuked --repetitive-best and --repetitive-fast since they are
+no longer useful.
+
+Minor changes: mostly a whole bunch of small changes/
+bugfixes in the driver (bzip2.c).  Changes pertaining to the
+user interface are:
+
+   allow decompression of symlink'd files to stdout
+   decompress/test files even without .bz2 extension
+   give more accurate error messages for I/O errors
+   when compressing/decompressing to stdout, don't catch control-C
+   read flags from BZIP2 and BZIP environment variables
+   decline to break hard links to a file unless forced with -f
+   allow -c flag even with no filenames
+   preserve file ownerships as far as possible
+   make -s -1 give the expected block size (100k)
+   add a flag -q --quiet to suppress nonessential warnings
+   stop decoding flags after --, so files beginning in - can be handled
+   resolved inconsistent naming: bzcat or bz2cat ?
+   bzip2 --help now returns 0
+
+Programming-level changes are:
+
+   fixed syntax error in GET_LL4 for Borland C++ 5.02
+   let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC}
+   fix overshoot of mode-string end in bzopen_or_bzdopen
+   wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... }
+   close file handles under all error conditions
+   added minor mods so it compiles with DJGPP out of the box
+   fixed Makefile so it doesn't give problems with BSD make
+   fix uninitialised memory reads in dlltest.c
+
+0.9.5b
+~~~~~~
+Open stdin/stdout in binary mode for DJGPP.
+
+0.9.5c
+~~~~~~
+Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1.  The + 1
+version could cause the sorted order to be wrong in some extremely
+obscure cases.  Also changed setting of quadrant in blocksort.c.
+
+0.9.5d
+~~~~~~
+The only functional change is to make bzlibVersion() in the library
+return the correct string.  This has no effect whatsoever on the
+functioning of the bzip2 program or library.  Added a couple of casts
+so the library compiles without warnings at level 3 in MS Visual
+Studio 6.0.  Included a Y2K statement in the file Y2K_INFO.  All other
+changes are minor documentation changes.
+
+1.0
+~~~
+Several minor bugfixes and enhancements:
+
+* Large file support.  The library uses 64-bit counters to
+  count the volume of data passing through it.  bzip2.c 
+  is now compiled with -D_FILE_OFFSET_BITS=64 to get large
+  file support from the C library.  -v correctly prints out
+  file sizes greater than 4 gigabytes.  All these changes have
+  been made without assuming a 64-bit platform or a C compiler
+  which supports 64-bit ints, so, except for the C library
+  aspect, they are fully portable.
+
+* Decompression robustness.  The library/program should be
+  robust to any corruption of compressed data, detecting and
+  handling _all_ corruption, instead of merely relying on
+  the CRCs.  What this means is that the program should 
+  never crash, given corrupted data, and the library should
+  always return BZ_DATA_ERROR.
+
+* Fixed an obscure race-condition bug only ever observed on
+  Solaris, in which, if you were very unlucky and issued
+  control-C at exactly the wrong time, both input and output
+  files would be deleted.
+
+* Don't run out of file handles on test/decompression when
+  large numbers of files have invalid magic numbers.
+
+* Avoid library namespace pollution.  Prefix all exported 
+  symbols with BZ2_.
+
+* Minor sorting enhancements from my DCC2000 paper.
+
+* Advance the version number to 1.0, so as to counteract the
+  (false-in-this-case) impression some people have that programs 
+  with version numbers less than 1.0 are in some way, experimental,
+  pre-release versions.
+
+* Create an initial Makefile-libbz2_so to build a shared library.
+  Yes, I know I should really use libtool et al ...
+
+* Make the program exit with 2 instead of 0 when decompression
+  fails due to a bad magic number (ie, an invalid bzip2 header).
+  Also exit with 1 (as the manual claims :-) whenever a diagnostic
+  message would have been printed AND the corresponding operation 
+  is aborted, for example
+     bzip2: Output file xx already exists.
+  When a diagnostic message is printed but the operation is not 
+  aborted, for example
+     bzip2: Can't guess original name for wurble -- using wurble.out
+  then the exit value 0 is returned, unless some other problem is
+  also detected.
+
+  I think it corresponds more closely to what the manual claims now.
+
+
+1.0.1
+~~~~~
+* Modified dlltest.c so it uses the new BZ2_ naming scheme.
+* Modified makefile-msc to fix minor build probs on Win2k.
+* Updated README.COMPILATION.PROBLEMS.
+
+There are no functionality changes or bug fixes relative to version
+1.0.0.  This is just a documentation update + a fix for minor Win32
+build problems.  For almost everyone, upgrading from 1.0.0 to 1.0.1 is
+utterly pointless.  Don't bother.
+
+
+1.0.2
+~~~~~
+A bug fix release, addressing various minor issues which have appeared
+in the 18 or so months since 1.0.1 was released.  Most of the fixes
+are to do with file-handling or documentation bugs.  To the best of my
+knowledge, there have been no data-loss-causing bugs reported in the
+compression/decompression engine of 1.0.0 or 1.0.1.
+
+Note that this release does not improve the rather crude build system
+for Unix platforms.  The general plan here is to autoconfiscate/
+libtoolise 1.0.2 soon after release, and release the result as 1.1.0
+or perhaps 1.2.0.  That, however, is still just a plan at this point.
+
+Here are the changes in 1.0.2.  Bug-reporters and/or patch-senders in
+parentheses.
+
+* Fix an infinite segfault loop in 1.0.1 when a directory is
+  encountered in -f (force) mode.
+     (Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt)
+
+* Avoid double fclose() of output file on certain I/O error paths.
+     (Solar Designer)
+
+* Don't fail with internal error 1007 when fed a long stream (> 48MB)
+  of byte 251.  Also print useful message suggesting that 1007s may be
+  caused by bad memory.
+     (noticed by Juan Pedro Vallejo, fixed by me)
+
+* Fix uninitialised variable silly bug in demo prog dlltest.c.
+     (Jorj Bauer)
+
+* Remove 512-MB limitation on recovered file size for bzip2recover
+  on selected platforms which support 64-bit ints.  At the moment
+  all GCC supported platforms, and Win32.
+     (me, Alson van der Meulen)
+
+* Hard-code header byte values, to give correct operation on platforms
+  using EBCDIC as their native character set (IBM's OS/390).
+     (Leland Lucius)
+
+* Copy file access times correctly.
+     (Marty Leisner)
+
+* Add distclean and check targets to Makefile.
+     (Michael Carmack)
+
+* Parameterise use of ar and ranlib in Makefile.  Also add $(LDFLAGS).
+     (Rich Ireland, Bo Thorsen)
+
+* Pass -p (create parent dirs as needed) to mkdir during make install.
+     (Jeremy Fusco)
+
+* Dereference symlinks when copying file permissions in -f mode.
+     (Volker Schmidt)
+
+* Majorly simplify implementation of uInt64_qrm10.
+     (Bo Lindbergh)
+
+* Check the input file still exists before deleting the output one,
+  when aborting in cleanUpAndFail().
+     (Joerg Prante, Robert Linden, Matthias Krings)
+
+Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer
+of bzip2:
+
+* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore.
+
+* Spelling changes and minor enhancements in bzip2.1.
+
+* Avoid race condition between creating the output file and setting its
+  interim permissions safely, by using fopen_output_safely().
+  No changes to bzip2recover since there is no issue with file
+  permissions there.
+
+* do not print senseless report with -v when compressing an empty
+  file.
+
+* bzcat -f works on non-bzip2 files.
+
+* do not try to escape shell meta-characters on unix (the shell takes
+  care of these).
+
+* added --fast and --best aliases for -1 -9 for gzip compatibility.
+
+
+1.0.3 (15 Feb 05)
+~~~~~~~~~~~~~~~~~
+Fixes some minor bugs since the last version, 1.0.2.
+
+* Further robustification against corrupted compressed data.
+  There are currently no known bitstreams which can cause the
+  decompressor to crash, loop or access memory which does not
+  belong to it.  If you are using bzip2 or the library to 
+  decompress bitstreams from untrusted sources, an upgrade
+  to 1.0.3 is recommended.  This fixes CAN-2005-1260.
+
+* The documentation has been converted to XML, from which html
+  and pdf can be derived.
+
+* Various minor bugs in the documentation have been fixed.
+
+* Fixes for various compilation warnings with newer versions of
+  gcc, and on 64-bit platforms.
+
+* The BZ_NO_STDIO cpp symbol was not properly observed in 1.0.2.
+  This has been fixed.
+
+
+1.0.4 (20 Dec 06)
+~~~~~~~~~~~~~~~~~
+Fixes some minor bugs since the last version, 1.0.3.
+
+* Fix file permissions race problem (CAN-2005-0953).
+
+* Avoid possible segfault in BZ2_bzclose.  From Coverity's NetBSD
+  scan.
+
+* 'const'/prototype cleanups in the C code.
+
+* Change default install location to /usr/local, and handle multiple
+  'make install's without error.
+
+* Sanitise file names more carefully in bzgrep.  Fixes CAN-2005-0758
+  to the extent that applies to bzgrep.
+
+* Use 'mktemp' rather than 'tempfile' in bzdiff.
+
+* Tighten up a couple of assertions in blocksort.c following automated
+  analysis.
+
+* Fix minor doc/comment bugs.
+
+
+1.0.5 (10 Dec 07)
+~~~~~~~~~~~~~~~~~
+Security fix only.  Fixes CERT-FI 20469 as it applies to bzip2.
+
+
+1.0.6 (6 Sept 10)
+~~~~~~~~~~~~~~~~~
+
+* Security fix for CVE-2010-0405.  This was reported by Mikolaj
+  Izdebski.
+
+* Make the documentation build on Ubuntu 10.04
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/LICENSE
@@ -0,0 +1,42 @@
+
+--------------------------------------------------------------------------
+
+This program, "bzip2", the associated library "libbzip2", and all
+documentation, are copyright (C) 1996-2010 Julian R Seward.  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. The origin of this software must not be misrepresented; you must 
+   not claim that you wrote the original software.  If you use this 
+   software in a product, an acknowledgment in the product 
+   documentation would be appreciated but is not required.
+
+3. Altered source versions must be plainly marked as such, and must
+   not be misrepresented as being the original software.
+
+4. The name of the author may not be used to endorse or promote 
+   products derived from this software without specific prior written 
+   permission.
+
+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.
+
+Julian Seward, jseward@bzip.org
+bzip2/libbzip2 version 1.0.6 of 6 September 2010
+
+--------------------------------------------------------------------------
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/Makefile
@@ -0,0 +1,217 @@
+# ------------------------------------------------------------------
+# This file is part of bzip2/libbzip2, a program and library for
+# lossless, block-sorting data compression.
+#
+# bzip2/libbzip2 version 1.0.6 of 6 September 2010
+# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+#
+# Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+# README file.
+#
+# This program is released under the terms of the license contained
+# in the file LICENSE.
+# ------------------------------------------------------------------
+
+SHELL=/bin/sh
+
+# To assist in cross-compiling
+CC=gcc
+AR=ar
+RANLIB=ranlib
+LDFLAGS=
+
+BIGFILES=-D_FILE_OFFSET_BITS=64
+CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
+
+# Where you want it installed when you do 'make install'
+PREFIX=/usr/local
+
+
+OBJS= blocksort.o  \
+      huffman.o    \
+      crctable.o   \
+      randtable.o  \
+      compress.o   \
+      decompress.o \
+      bzlib.o
+
+all: libbz2.a bzip2 bzip2recover test
+
+bzip2: libbz2.a bzip2.o
+	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
+
+bzip2recover: bzip2recover.o
+	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
+
+libbz2.a: $(OBJS)
+	rm -f libbz2.a
+	$(AR) cq libbz2.a $(OBJS)
+	@if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \
+		-f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \
+		echo $(RANLIB) libbz2.a ; \
+		$(RANLIB) libbz2.a ; \
+	fi
+
+check: test
+test: bzip2
+	@cat words1
+	./bzip2 -1  < sample1.ref > sample1.rb2
+	./bzip2 -2  < sample2.ref > sample2.rb2
+	./bzip2 -3  < sample3.ref > sample3.rb2
+	./bzip2 -d  < sample1.bz2 > sample1.tst
+	./bzip2 -d  < sample2.bz2 > sample2.tst
+	./bzip2 -ds < sample3.bz2 > sample3.tst
+	cmp sample1.bz2 sample1.rb2 
+	cmp sample2.bz2 sample2.rb2
+	cmp sample3.bz2 sample3.rb2
+	cmp sample1.tst sample1.ref
+	cmp sample2.tst sample2.ref
+	cmp sample3.tst sample3.ref
+	@cat words3
+
+install: bzip2 bzip2recover
+	if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
+	if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
+	if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
+	if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
+	if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
+	cp -f bzip2 $(PREFIX)/bin/bzip2
+	cp -f bzip2 $(PREFIX)/bin/bunzip2
+	cp -f bzip2 $(PREFIX)/bin/bzcat
+	cp -f bzip2recover $(PREFIX)/bin/bzip2recover
+	chmod a+x $(PREFIX)/bin/bzip2
+	chmod a+x $(PREFIX)/bin/bunzip2
+	chmod a+x $(PREFIX)/bin/bzcat
+	chmod a+x $(PREFIX)/bin/bzip2recover
+	cp -f bzip2.1 $(PREFIX)/man/man1
+	chmod a+r $(PREFIX)/man/man1/bzip2.1
+	cp -f bzlib.h $(PREFIX)/include
+	chmod a+r $(PREFIX)/include/bzlib.h
+	cp -f libbz2.a $(PREFIX)/lib
+	chmod a+r $(PREFIX)/lib/libbz2.a
+	cp -f bzgrep $(PREFIX)/bin/bzgrep
+	ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep
+	ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep
+	chmod a+x $(PREFIX)/bin/bzgrep
+	cp -f bzmore $(PREFIX)/bin/bzmore
+	ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless
+	chmod a+x $(PREFIX)/bin/bzmore
+	cp -f bzdiff $(PREFIX)/bin/bzdiff
+	ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp
+	chmod a+x $(PREFIX)/bin/bzdiff
+	cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1
+	chmod a+r $(PREFIX)/man/man1/bzgrep.1
+	chmod a+r $(PREFIX)/man/man1/bzmore.1
+	chmod a+r $(PREFIX)/man/man1/bzdiff.1
+	echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1
+	echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1
+	echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1
+	echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
+
+clean: 
+	rm -f *.o libbz2.a bzip2 bzip2recover \
+	sample1.rb2 sample2.rb2 sample3.rb2 \
+	sample1.tst sample2.tst sample3.tst
+
+blocksort.o: blocksort.c
+	@cat words0
+	$(CC) $(CFLAGS) -c blocksort.c
+huffman.o: huffman.c
+	$(CC) $(CFLAGS) -c huffman.c
+crctable.o: crctable.c
+	$(CC) $(CFLAGS) -c crctable.c
+randtable.o: randtable.c
+	$(CC) $(CFLAGS) -c randtable.c
+compress.o: compress.c
+	$(CC) $(CFLAGS) -c compress.c
+decompress.o: decompress.c
+	$(CC) $(CFLAGS) -c decompress.c
+bzlib.o: bzlib.c
+	$(CC) $(CFLAGS) -c bzlib.c
+bzip2.o: bzip2.c
+	$(CC) $(CFLAGS) -c bzip2.c
+bzip2recover.o: bzip2recover.c
+	$(CC) $(CFLAGS) -c bzip2recover.c
+
+
+distclean: clean
+	rm -f manual.ps manual.html manual.pdf
+
+DISTNAME=bzip2-1.0.6
+dist: check manual
+	rm -f $(DISTNAME)
+	ln -s -f . $(DISTNAME)
+	tar cvf $(DISTNAME).tar \
+	   $(DISTNAME)/blocksort.c \
+	   $(DISTNAME)/huffman.c \
+	   $(DISTNAME)/crctable.c \
+	   $(DISTNAME)/randtable.c \
+	   $(DISTNAME)/compress.c \
+	   $(DISTNAME)/decompress.c \
+	   $(DISTNAME)/bzlib.c \
+	   $(DISTNAME)/bzip2.c \
+	   $(DISTNAME)/bzip2recover.c \
+	   $(DISTNAME)/bzlib.h \
+	   $(DISTNAME)/bzlib_private.h \
+	   $(DISTNAME)/Makefile \
+	   $(DISTNAME)/LICENSE \
+	   $(DISTNAME)/bzip2.1 \
+	   $(DISTNAME)/bzip2.1.preformatted \
+	   $(DISTNAME)/bzip2.txt \
+	   $(DISTNAME)/words0 \
+	   $(DISTNAME)/words1 \
+	   $(DISTNAME)/words2 \
+	   $(DISTNAME)/words3 \
+	   $(DISTNAME)/sample1.ref \
+	   $(DISTNAME)/sample2.ref \
+	   $(DISTNAME)/sample3.ref \
+	   $(DISTNAME)/sample1.bz2 \
+	   $(DISTNAME)/sample2.bz2 \
+	   $(DISTNAME)/sample3.bz2 \
+	   $(DISTNAME)/dlltest.c \
+	   $(DISTNAME)/manual.html \
+	   $(DISTNAME)/manual.pdf \
+	   $(DISTNAME)/manual.ps \
+	   $(DISTNAME)/README \
+	   $(DISTNAME)/README.COMPILATION.PROBLEMS \
+	   $(DISTNAME)/README.XML.STUFF \
+	   $(DISTNAME)/CHANGES \
+	   $(DISTNAME)/libbz2.def \
+	   $(DISTNAME)/libbz2.dsp \
+	   $(DISTNAME)/dlltest.dsp \
+	   $(DISTNAME)/makefile.msc \
+	   $(DISTNAME)/unzcrash.c \
+	   $(DISTNAME)/spewG.c \
+	   $(DISTNAME)/mk251.c \
+	   $(DISTNAME)/bzdiff \
+	   $(DISTNAME)/bzdiff.1 \
+	   $(DISTNAME)/bzmore \
+	   $(DISTNAME)/bzmore.1 \
+	   $(DISTNAME)/bzgrep \
+	   $(DISTNAME)/bzgrep.1 \
+	   $(DISTNAME)/Makefile-libbz2_so \
+	   $(DISTNAME)/bz-common.xsl \
+	   $(DISTNAME)/bz-fo.xsl \
+	   $(DISTNAME)/bz-html.xsl \
+	   $(DISTNAME)/bzip.css \
+	   $(DISTNAME)/entities.xml \
+	   $(DISTNAME)/manual.xml \
+	   $(DISTNAME)/format.pl \
+	   $(DISTNAME)/xmlproc.sh
+	gzip -v $(DISTNAME).tar
+
+# For rebuilding the manual from sources on my SuSE 9.1 box
+
+MANUAL_SRCS= 	bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \
+		entities.xml manual.xml 
+
+manual: manual.html manual.ps manual.pdf
+
+manual.ps: $(MANUAL_SRCS)
+	./xmlproc.sh -ps manual.xml
+
+manual.pdf: $(MANUAL_SRCS)
+	./xmlproc.sh -pdf manual.xml
+
+manual.html: $(MANUAL_SRCS)
+	./xmlproc.sh -html manual.xml
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/Makefile-libbz2_so
@@ -0,0 +1,59 @@
+
+# This Makefile builds a shared version of the library, 
+# libbz2.so.1.0.6, with soname libbz2.so.1.0,
+# at least on x86-Linux (RedHat 7.2), 
+# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98).  
+# Please see the README file for some important info 
+# about building the library like this.
+
+# ------------------------------------------------------------------
+# This file is part of bzip2/libbzip2, a program and library for
+# lossless, block-sorting data compression.
+#
+# bzip2/libbzip2 version 1.0.6 of 6 September 2010
+# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+#
+# Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+# README file.
+#
+# This program is released under the terms of the license contained
+# in the file LICENSE.
+# ------------------------------------------------------------------
+
+
+SHELL=/bin/sh
+CC=gcc
+BIGFILES=-D_FILE_OFFSET_BITS=64
+CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES)
+
+OBJS= blocksort.o  \
+      huffman.o    \
+      crctable.o   \
+      randtable.o  \
+      compress.o   \
+      decompress.o \
+      bzlib.o
+
+all: $(OBJS)
+	$(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.6 $(OBJS)
+	$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.6
+	rm -f libbz2.so.1.0
+	ln -s libbz2.so.1.0.6 libbz2.so.1.0
+
+clean: 
+	rm -f $(OBJS) bzip2.o libbz2.so.1.0.6 libbz2.so.1.0 bzip2-shared
+
+blocksort.o: blocksort.c
+	$(CC) $(CFLAGS) -c blocksort.c
+huffman.o: huffman.c
+	$(CC) $(CFLAGS) -c huffman.c
+crctable.o: crctable.c
+	$(CC) $(CFLAGS) -c crctable.c
+randtable.o: randtable.c
+	$(CC) $(CFLAGS) -c randtable.c
+compress.o: compress.c
+	$(CC) $(CFLAGS) -c compress.c
+decompress.o: decompress.c
+	$(CC) $(CFLAGS) -c decompress.c
+bzlib.o: bzlib.c
+	$(CC) $(CFLAGS) -c bzlib.c
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/README
@@ -0,0 +1,215 @@
+
+This is the README for bzip2/libzip2.
+This version is fully compatible with the previous public releases.
+
+------------------------------------------------------------------
+This file is part of bzip2/libbzip2, a program and library for
+lossless, block-sorting data compression.
+
+bzip2/libbzip2 version 1.0.6 of 6 September 2010
+Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+Please read the WARNING, DISCLAIMER and PATENTS sections in this file.
+
+This program is released under the terms of the license contained
+in the file LICENSE.
+------------------------------------------------------------------
+
+Complete documentation is available in Postscript form (manual.ps),
+PDF (manual.pdf) or html (manual.html).  A plain-text version of the
+manual page is available as bzip2.txt.
+
+
+HOW TO BUILD -- UNIX
+
+Type 'make'.  This builds the library libbz2.a and then the programs
+bzip2 and bzip2recover.  Six self-tests are run.  If the self-tests
+complete ok, carry on to installation:
+
+To install in /usr/local/bin, /usr/local/lib, /usr/local/man and
+/usr/local/include, type
+
+   make install
+
+To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type
+
+   make install PREFIX=/xxx/yyy
+
+If you are (justifiably) paranoid and want to see what 'make install'
+is going to do, you can first do
+
+   make -n install                      or
+   make -n install PREFIX=/xxx/yyy      respectively.
+
+The -n instructs make to show the commands it would execute, but not
+actually execute them.
+
+
+HOW TO BUILD -- UNIX, shared library libbz2.so.
+
+Do 'make -f Makefile-libbz2_so'.  This Makefile seems to work for
+Linux-ELF (RedHat 7.2 on an x86 box), with gcc.  I make no claims
+that it works for any other platform, though I suspect it probably
+will work for most platforms employing both ELF and gcc.
+
+bzip2-shared, a client of the shared library, is also built, but not
+self-tested.  So I suggest you also build using the normal Makefile,
+since that conducts a self-test.  A second reason to prefer the
+version statically linked to the library is that, on x86 platforms,
+building shared objects makes a valuable register (%ebx) unavailable
+to gcc, resulting in a slowdown of 10%-20%, at least for bzip2.
+
+Important note for people upgrading .so's from 0.9.0/0.9.5 to version
+1.0.X.  All the functions in the library have been renamed, from (eg)
+bzCompress to BZ2_bzCompress, to avoid namespace pollution.
+Unfortunately this means that the libbz2.so created by
+Makefile-libbz2_so will not work with any program which used an older
+version of the library.  I do encourage library clients to make the
+effort to upgrade to use version 1.0, since it is both faster and more
+robust than previous versions.
+
+
+HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc.
+
+It's difficult for me to support compilation on all these platforms.
+My approach is to collect binaries for these platforms, and put them
+on the master web site (http://www.bzip.org).  Look there.  However
+(FWIW), bzip2-1.0.X is very standard ANSI C and should compile
+unmodified with MS Visual C.  If you have difficulties building, you
+might want to read README.COMPILATION.PROBLEMS.
+
+At least using MS Visual C++ 6, you can build from the unmodified
+sources by issuing, in a command shell: 
+
+   nmake -f makefile.msc
+
+(you may need to first run the MSVC-provided script VCVARS32.BAT
+ so as to set up paths to the MSVC tools correctly).
+
+
+VALIDATION
+
+Correct operation, in the sense that a compressed file can always be
+decompressed to reproduce the original, is obviously of paramount
+importance.  To validate bzip2, I used a modified version of Mark
+Nelson's churn program.  Churn is an automated test driver which
+recursively traverses a directory structure, using bzip2 to compress
+and then decompress each file it encounters, and checking that the
+decompressed data is the same as the original.
+
+
+
+Please read and be aware of the following:
+
+WARNING:
+
+   This program and library (attempts to) compress data by 
+   performing several non-trivial transformations on it.  
+   Unless you are 100% familiar with *all* the algorithms 
+   contained herein, and with the consequences of modifying them, 
+   you should NOT meddle with the compression or decompression 
+   machinery.  Incorrect changes can and very likely *will* 
+   lead to disastrous loss of data.
+
+
+DISCLAIMER:
+
+   I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE
+   USE OF THIS PROGRAM/LIBRARY, HOWSOEVER CAUSED.
+
+   Every compression of a file implies an assumption that the
+   compressed file can be decompressed to reproduce the original.
+   Great efforts in design, coding and testing have been made to
+   ensure that this program works correctly.  However, the complexity
+   of the algorithms, and, in particular, the presence of various
+   special cases in the code which occur with very low but non-zero
+   probability make it impossible to rule out the possibility of bugs
+   remaining in the program.  DO NOT COMPRESS ANY DATA WITH THIS
+   PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER
+   SMALL, THAT THE DATA WILL NOT BE RECOVERABLE.
+
+   That is not to say this program is inherently unreliable.  
+   Indeed, I very much hope the opposite is true.  bzip2/libbzip2 
+   has been carefully constructed and extensively tested.
+
+
+PATENTS:
+
+   To the best of my knowledge, bzip2/libbzip2 does not use any 
+   patented algorithms.  However, I do not have the resources 
+   to carry out a patent search.  Therefore I cannot give any 
+   guarantee of the above statement.
+
+
+
+WHAT'S NEW IN 0.9.0 (as compared to 0.1pl2) ?
+
+   * Approx 10% faster compression, 30% faster decompression
+   * -t (test mode) is a lot quicker
+   * Can decompress concatenated compressed files
+   * Programming interface, so programs can directly read/write .bz2 files
+   * Less restrictive (BSD-style) licensing
+   * Flag handling more compatible with GNU gzip
+   * Much more documentation, i.e., a proper user manual
+   * Hopefully, improved portability (at least of the library)
+
+WHAT'S NEW IN 0.9.5 ?
+
+   * Compression speed is much less sensitive to the input
+     data than in previous versions.  Specifically, the very
+     slow performance caused by repetitive data is fixed.
+   * Many small improvements in file and flag handling.
+   * A Y2K statement.
+
+WHAT'S NEW IN 1.0.0 ?
+
+   See the CHANGES file.
+
+WHAT'S NEW IN 1.0.2 ?
+
+   See the CHANGES file.
+
+WHAT'S NEW IN 1.0.3 ?
+
+   See the CHANGES file.
+
+WHAT'S NEW IN 1.0.4 ?
+
+   See the CHANGES file.
+
+WHAT'S NEW IN 1.0.5 ?
+
+   See the CHANGES file.
+
+WHAT'S NEW IN 1.0.6 ?
+
+   See the CHANGES file.
+
+
+I hope you find bzip2 useful.  Feel free to contact me at
+   jseward@bzip.org
+if you have any suggestions or queries.  Many people mailed me with
+comments, suggestions and patches after the releases of bzip-0.15,
+bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
+1.0.2 and 1.0.3, and the changes in bzip2 are largely a result of this
+feedback.  I thank you for your comments.
+
+bzip2's "home" is http://www.bzip.org/
+
+Julian Seward
+jseward@bzip.org
+Cambridge, UK.
+
+18     July 1996 (version 0.15)
+25   August 1996 (version 0.21)
+ 7   August 1997 (bzip2, version 0.1)
+29   August 1997 (bzip2, version 0.1pl2)
+23   August 1998 (bzip2, version 0.9.0)
+ 8     June 1999 (bzip2, version 0.9.5)
+ 4     Sept 1999 (bzip2, version 0.9.5d)
+ 5      May 2000 (bzip2, version 1.0pre8)
+30 December 2001 (bzip2, version 1.0.2pre1)
+15 February 2005 (bzip2, version 1.0.3)
+20 December 2006 (bzip2, version 1.0.4)
+10 December 2007 (bzip2, version 1.0.5)
+ 6     Sept 2010 (bzip2, version 1.0.6)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/README.COMPILATION.PROBLEMS
@@ -0,0 +1,58 @@
+------------------------------------------------------------------
+This file is part of bzip2/libbzip2, a program and library for
+lossless, block-sorting data compression.
+
+bzip2/libbzip2 version 1.0.6 of 6 September 2010
+Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+README file.
+
+This program is released under the terms of the license contained
+in the file LICENSE.
+------------------------------------------------------------------
+
+bzip2-1.0.6 should compile without problems on the vast majority of
+platforms.  Using the supplied Makefile, I've built and tested it
+myself for x86-linux and amd64-linux.  With makefile.msc, Visual C++
+6.0 and nmake, you can build a native Win32 version too.  Large file
+support seems to work correctly on at least on amd64-linux.
+
+When I say "large file" I mean a file of size 2,147,483,648 (2^31)
+bytes or above.  Many older OSs can't handle files above this size,
+but many newer ones can.  Large files are pretty huge -- most files
+you'll encounter are not Large Files.
+
+Early versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide variety
+of platforms without difficulty, and I hope this version will continue
+in that tradition.  However, in order to support large files, I've had
+to include the define -D_FILE_OFFSET_BITS=64 in the Makefile.  This
+can cause problems.
+
+The technique of adding -D_FILE_OFFSET_BITS=64 to get large file
+support is, as far as I know, the Recommended Way to get correct large
+file support.  For more details, see the Large File Support
+Specification, published by the Large File Summit, at
+
+   http://ftp.sas.com/standards/large.file
+
+As a general comment, if you get compilation errors which you think
+are related to large file support, try removing the above define from
+the Makefile, ie, delete the line
+
+   BIGFILES=-D_FILE_OFFSET_BITS=64 
+
+from the Makefile, and do 'make clean ; make'.  This will give you a
+version of bzip2 without large file support, which, for most
+applications, is probably not a problem.  
+
+Alternatively, try some of the platform-specific hints listed below.
+
+You can use the spewG.c program to generate huge files to test bzip2's
+large file support, if you are feeling paranoid.  Be aware though that
+any compilation problems which affect bzip2 will also affect spewG.c,
+alas.
+
+AIX: I have reports that for large file support, you need to specify
+-D_LARGE_FILES rather than -D_FILE_OFFSET_BITS=64.  I have not tested
+this myself.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/README.XML.STUFF
@@ -0,0 +1,45 @@
+  ----------------------------------------------------------------
+  This file is part of bzip2/libbzip2, a program and library for
+  lossless, block-sorting data compression.
+
+  bzip2/libbzip2 version 1.0.6 of 6 September 2010
+  Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+  Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+  README file.
+
+  This program is released under the terms of the license contained
+  in the file LICENSE.
+  ----------------------------------------------------------------
+
+The script xmlproc.sh takes an xml file as input,
+and processes it to create .pdf, .html or .ps output.
+It uses format.pl, a perl script to format <pre> blocks nicely,
+ and add CDATA tags so writers do not have to use eg. &lt; 
+
+The file "entities.xml" must be edited to reflect current
+version, year, etc.
+
+
+Usage:
+
+  ./xmlproc.sh -v manual.xml
+  Validates an xml file to ensure no dtd-compliance errors
+
+  ./xmlproc.sh -html manual.xml
+  Output: manual.html
+
+  ./xmlproc.sh -pdf manual.xml
+  Output: manual.pdf
+
+  ./xmlproc.sh -ps manual.xml
+  Output: manual.ps
+
+
+Notum bene: 
+- pdfxmltex barfs if given a filename with an underscore in it
+
+- xmltex won't work yet - there's a bug in passivetex
+    which we are all waiting for Sebastian to fix.
+  So we are going the xml -> pdf -> ps route for the time being,
+    using pdfxmltex.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/blocksort.c
@@ -0,0 +1,1094 @@
+
+/*-------------------------------------------------------------*/
+/*--- Block sorting machinery                               ---*/
+/*---                                           blocksort.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------*/
+/*--- Fallback O(N log(N)^2) sorting        ---*/
+/*--- algorithm, for repetitive blocks      ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+__inline__
+void fallbackSimpleSort ( UInt32* fmap, 
+                          UInt32* eclass, 
+                          Int32   lo, 
+                          Int32   hi )
+{
+   Int32 i, j, tmp;
+   UInt32 ec_tmp;
+
+   if (lo == hi) return;
+
+   if (hi - lo > 3) {
+      for ( i = hi-4; i >= lo; i-- ) {
+         tmp = fmap[i];
+         ec_tmp = eclass[tmp];
+         for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 )
+            fmap[j-4] = fmap[j];
+         fmap[j-4] = tmp;
+      }
+   }
+
+   for ( i = hi-1; i >= lo; i-- ) {
+      tmp = fmap[i];
+      ec_tmp = eclass[tmp];
+      for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ )
+         fmap[j-1] = fmap[j];
+      fmap[j-1] = tmp;
+   }
+}
+
+
+/*---------------------------------------------*/
+#define fswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define fvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      fswap(fmap[yyp1], fmap[yyp2]);  \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+
+#define fmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define fpush(lz,hz) { stackLo[sp] = lz; \
+                       stackHi[sp] = hz; \
+                       sp++; }
+
+#define fpop(lz,hz) { sp--;              \
+                      lz = stackLo[sp];  \
+                      hz = stackHi[sp]; }
+
+#define FALLBACK_QSORT_SMALL_THRESH 10
+#define FALLBACK_QSORT_STACK_SIZE   100
+
+
+static
+void fallbackQSort3 ( UInt32* fmap, 
+                      UInt32* eclass,
+                      Int32   loSt, 
+                      Int32   hiSt )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m;
+   Int32 sp, lo, hi;
+   UInt32 med, r, r3;
+   Int32 stackLo[FALLBACK_QSORT_STACK_SIZE];
+   Int32 stackHi[FALLBACK_QSORT_STACK_SIZE];
+
+   r = 0;
+
+   sp = 0;
+   fpush ( loSt, hiSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 );
+
+      fpop ( lo, hi );
+      if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) {
+         fallbackSimpleSort ( fmap, eclass, lo, hi );
+         continue;
+      }
+
+      /* Random partitioning.  Median of 3 sometimes fails to
+         avoid bad cases.  Median of 9 seems to help but 
+         looks rather expensive.  This too seems to work but
+         is cheaper.  Guidance for the magic constants 
+         7621 and 32768 is taken from Sedgewick's algorithms
+         book, chapter 35.
+      */
+      r = ((r * 7621) + 1) % 32768;
+      r3 = r % 3;
+      if (r3 == 0) med = eclass[fmap[lo]]; else
+      if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else
+                   med = eclass[fmap[hi]];
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (1) {
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unLo]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unLo], fmap[ltLo]); 
+               ltLo++; unLo++; 
+               continue; 
+            };
+            if (n > 0) break;
+            unLo++;
+         }
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unHi]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unHi], fmap[gtHi]); 
+               gtHi--; unHi--; 
+               continue; 
+            };
+            if (n < 0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "fallbackQSort3(2)" );
+
+      if (gtHi < ltLo) continue;
+
+      n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n);
+      m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      if (n - lo > hi - m) {
+         fpush ( lo, n );
+         fpush ( m, hi );
+      } else {
+         fpush ( m, hi );
+         fpush ( lo, n );
+      }
+   }
+}
+
+#undef fmin
+#undef fpush
+#undef fpop
+#undef fswap
+#undef fvswap
+#undef FALLBACK_QSORT_SMALL_THRESH
+#undef FALLBACK_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      eclass exists for [0 .. nblock-1]
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      All other areas of eclass destroyed
+      fmap [0 .. nblock-1] holds sorted order
+      bhtab [ 0 .. 2+(nblock/32) ] destroyed
+*/
+
+#define       SET_BH(zz)  bhtab[(zz) >> 5] |= (1 << ((zz) & 31))
+#define     CLEAR_BH(zz)  bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31))
+#define     ISSET_BH(zz)  (bhtab[(zz) >> 5] & (1 << ((zz) & 31)))
+#define      WORD_BH(zz)  bhtab[(zz) >> 5]
+#define UNALIGNED_BH(zz)  ((zz) & 0x01f)
+
+static
+void fallbackSort ( UInt32* fmap, 
+                    UInt32* eclass, 
+                    UInt32* bhtab,
+                    Int32   nblock,
+                    Int32   verb )
+{
+   Int32 ftab[257];
+   Int32 ftabCopy[256];
+   Int32 H, i, j, k, l, r, cc, cc1;
+   Int32 nNotDone;
+   Int32 nBhtab;
+   UChar* eclass8 = (UChar*)eclass;
+
+   /*--
+      Initial 1-char radix sort to generate
+      initial fmap and initial BH bits.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        bucket sorting ...\n" );
+   for (i = 0; i < 257;    i++) ftab[i] = 0;
+   for (i = 0; i < nblock; i++) ftab[eclass8[i]]++;
+   for (i = 0; i < 256;    i++) ftabCopy[i] = ftab[i];
+   for (i = 1; i < 257;    i++) ftab[i] += ftab[i-1];
+
+   for (i = 0; i < nblock; i++) {
+      j = eclass8[i];
+      k = ftab[j] - 1;
+      ftab[j] = k;
+      fmap[k] = i;
+   }
+
+   nBhtab = 2 + (nblock / 32);
+   for (i = 0; i < nBhtab; i++) bhtab[i] = 0;
+   for (i = 0; i < 256; i++) SET_BH(ftab[i]);
+
+   /*--
+      Inductively refine the buckets.  Kind-of an
+      "exponential radix sort" (!), inspired by the
+      Manber-Myers suffix array construction algorithm.
+   --*/
+
+   /*-- set sentinel bits for block-end detection --*/
+   for (i = 0; i < 32; i++) { 
+      SET_BH(nblock + 2*i);
+      CLEAR_BH(nblock + 2*i + 1);
+   }
+
+   /*-- the log(N) loop --*/
+   H = 1;
+   while (1) {
+
+      if (verb >= 4) 
+         VPrintf1 ( "        depth %6d has ", H );
+
+      j = 0;
+      for (i = 0; i < nblock; i++) {
+         if (ISSET_BH(i)) j = i;
+         k = fmap[i] - H; if (k < 0) k += nblock;
+         eclass[k] = j;
+      }
+
+      nNotDone = 0;
+      r = -1;
+      while (1) {
+
+	 /*-- find the next non-singleton bucket --*/
+         k = r + 1;
+         while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (ISSET_BH(k)) {
+            while (WORD_BH(k) == 0xffffffff) k += 32;
+            while (ISSET_BH(k)) k++;
+         }
+         l = k - 1;
+         if (l >= nblock) break;
+         while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (!ISSET_BH(k)) {
+            while (WORD_BH(k) == 0x00000000) k += 32;
+            while (!ISSET_BH(k)) k++;
+         }
+         r = k - 1;
+         if (r >= nblock) break;
+
+         /*-- now [l, r] bracket current bucket --*/
+         if (r > l) {
+            nNotDone += (r - l + 1);
+            fallbackQSort3 ( fmap, eclass, l, r );
+
+            /*-- scan bucket and generate header bits-- */
+            cc = -1;
+            for (i = l; i <= r; i++) {
+               cc1 = eclass[fmap[i]];
+               if (cc != cc1) { SET_BH(i); cc = cc1; };
+            }
+         }
+      }
+
+      if (verb >= 4) 
+         VPrintf1 ( "%6d unresolved strings\n", nNotDone );
+
+      H *= 2;
+      if (H > nblock || nNotDone == 0) break;
+   }
+
+   /*-- 
+      Reconstruct the original block in
+      eclass8 [0 .. nblock-1], since the
+      previous phase destroyed it.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        reconstructing block ...\n" );
+   j = 0;
+   for (i = 0; i < nblock; i++) {
+      while (ftabCopy[j] == 0) j++;
+      ftabCopy[j]--;
+      eclass8[fmap[i]] = (UChar)j;
+   }
+   AssertH ( j < 256, 1005 );
+}
+
+#undef       SET_BH
+#undef     CLEAR_BH
+#undef     ISSET_BH
+#undef      WORD_BH
+#undef UNALIGNED_BH
+
+
+/*---------------------------------------------*/
+/*--- The main, O(N^2 log(N)) sorting       ---*/
+/*--- algorithm.  Faster for "normal"       ---*/
+/*--- non-repetitive blocks.                ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+__inline__
+Bool mainGtU ( UInt32  i1, 
+               UInt32  i2,
+               UChar*  block, 
+               UInt16* quadrant,
+               UInt32  nblock,
+               Int32*  budget )
+{
+   Int32  k;
+   UChar  c1, c2;
+   UInt16 s1, s2;
+
+   AssertD ( i1 != i2, "mainGtU" );
+   /* 1 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 2 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 3 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 4 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 5 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 6 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 7 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 8 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 9 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 10 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 11 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 12 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+
+   k = nblock + 8;
+
+   do {
+      /* 1 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 2 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 3 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 4 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 5 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 6 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 7 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 8 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+
+      if (i1 >= nblock) i1 -= nblock;
+      if (i2 >= nblock) i2 -= nblock;
+
+      k -= 8;
+      (*budget)--;
+   }
+      while (k >= 0);
+
+   return False;
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Knuth's increments seem to work better
+   than Incerpi-Sedgewick here.  Possibly
+   because the number of elems to sort is
+   usually small, typically <= 20.
+--*/
+static
+Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
+                   9841, 29524, 88573, 265720,
+                   797161, 2391484 };
+
+static
+void mainSimpleSort ( UInt32* ptr,
+                      UChar*  block,
+                      UInt16* quadrant,
+                      Int32   nblock,
+                      Int32   lo, 
+                      Int32   hi, 
+                      Int32   d,
+                      Int32*  budget )
+{
+   Int32 i, j, h, bigN, hp;
+   UInt32 v;
+
+   bigN = hi - lo + 1;
+   if (bigN < 2) return;
+
+   hp = 0;
+   while (incs[hp] < bigN) hp++;
+   hp--;
+
+   for (; hp >= 0; hp--) {
+      h = incs[hp];
+
+      i = lo + h;
+      while (True) {
+
+         /*-- copy 1 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 2 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 3 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         if (*budget < 0) return;
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+/*--
+   The following is an implementation of
+   an elegant 3-way quicksort for strings,
+   described in a paper "Fast Algorithms for
+   Sorting and Searching Strings", by Robert
+   Sedgewick and Jon L. Bentley.
+--*/
+
+#define mswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define mvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      mswap(ptr[yyp1], ptr[yyp2]);    \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+static 
+__inline__
+UChar mmed3 ( UChar a, UChar b, UChar c )
+{
+   UChar t;
+   if (a > b) { t = a; a = b; b = t; };
+   if (b > c) { 
+      b = c;
+      if (a > b) b = a;
+   }
+   return b;
+}
+
+#define mmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define mpush(lz,hz,dz) { stackLo[sp] = lz; \
+                          stackHi[sp] = hz; \
+                          stackD [sp] = dz; \
+                          sp++; }
+
+#define mpop(lz,hz,dz) { sp--;             \
+                         lz = stackLo[sp]; \
+                         hz = stackHi[sp]; \
+                         dz = stackD [sp]; }
+
+
+#define mnextsize(az) (nextHi[az]-nextLo[az])
+
+#define mnextswap(az,bz)                                        \
+   { Int32 tz;                                                  \
+     tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \
+     tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \
+     tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; }
+
+
+#define MAIN_QSORT_SMALL_THRESH 20
+#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
+#define MAIN_QSORT_STACK_SIZE 100
+
+static
+void mainQSort3 ( UInt32* ptr,
+                  UChar*  block,
+                  UInt16* quadrant,
+                  Int32   nblock,
+                  Int32   loSt, 
+                  Int32   hiSt, 
+                  Int32   dSt,
+                  Int32*  budget )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m, med;
+   Int32 sp, lo, hi, d;
+
+   Int32 stackLo[MAIN_QSORT_STACK_SIZE];
+   Int32 stackHi[MAIN_QSORT_STACK_SIZE];
+   Int32 stackD [MAIN_QSORT_STACK_SIZE];
+
+   Int32 nextLo[3];
+   Int32 nextHi[3];
+   Int32 nextD [3];
+
+   sp = 0;
+   mpush ( loSt, hiSt, dSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 );
+
+      mpop ( lo, hi, d );
+      if (hi - lo < MAIN_QSORT_SMALL_THRESH || 
+          d > MAIN_QSORT_DEPTH_THRESH) {
+         mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
+         if (*budget < 0) return;
+         continue;
+      }
+
+      med = (Int32) 
+            mmed3 ( block[ptr[ lo         ]+d],
+                    block[ptr[ hi         ]+d],
+                    block[ptr[ (lo+hi)>>1 ]+d] );
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (True) {
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unLo]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unLo], ptr[ltLo]); 
+               ltLo++; unLo++; continue; 
+            };
+            if (n >  0) break;
+            unLo++;
+         }
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unHi]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unHi], ptr[gtHi]); 
+               gtHi--; unHi--; continue; 
+            };
+            if (n <  0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "mainQSort3(2)" );
+
+      if (gtHi < ltLo) {
+         mpush(lo, hi, d+1 );
+         continue;
+      }
+
+      n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n);
+      m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      nextLo[0] = lo;  nextHi[0] = n;   nextD[0] = d;
+      nextLo[1] = m;   nextHi[1] = hi;  nextD[1] = d;
+      nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1;
+
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+      if (mnextsize(1) < mnextsize(2)) mnextswap(1,2);
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+
+      AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" );
+      AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" );
+
+      mpush (nextLo[0], nextHi[0], nextD[0]);
+      mpush (nextLo[1], nextHi[1], nextD[1]);
+      mpush (nextLo[2], nextHi[2], nextD[2]);
+   }
+}
+
+#undef mswap
+#undef mvswap
+#undef mpush
+#undef mpop
+#undef mmin
+#undef mnextsize
+#undef mnextswap
+#undef MAIN_QSORT_SMALL_THRESH
+#undef MAIN_QSORT_DEPTH_THRESH
+#undef MAIN_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > N_OVERSHOOT
+      block32 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      All other areas of block32 destroyed
+      ftab [0 .. 65536 ] destroyed
+      ptr [0 .. nblock-1] holds sorted order
+      if (*budget < 0), sorting was abandoned
+*/
+
+#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8])
+#define SETMASK (1 << 21)
+#define CLEARMASK (~(SETMASK))
+
+static
+void mainSort ( UInt32* ptr, 
+                UChar*  block,
+                UInt16* quadrant, 
+                UInt32* ftab,
+                Int32   nblock,
+                Int32   verb,
+                Int32*  budget )
+{
+   Int32  i, j, k, ss, sb;
+   Int32  runningOrder[256];
+   Bool   bigDone[256];
+   Int32  copyStart[256];
+   Int32  copyEnd  [256];
+   UChar  c1;
+   Int32  numQSorted;
+   UInt16 s;
+   if (verb >= 4) VPrintf0 ( "        main sort initialise ...\n" );
+
+   /*-- set up the 2-byte frequency table --*/
+   for (i = 65536; i >= 0; i--) ftab[i] = 0;
+
+   j = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+      quadrant[i-1] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-1]) << 8);
+      ftab[j]++;
+      quadrant[i-2] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-2]) << 8);
+      ftab[j]++;
+      quadrant[i-3] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-3]) << 8);
+      ftab[j]++;
+   }
+   for (; i >= 0; i--) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+   }
+
+   /*-- (emphasises close relationship of block & quadrant) --*/
+   for (i = 0; i < BZ_N_OVERSHOOT; i++) {
+      block   [nblock+i] = block[i];
+      quadrant[nblock+i] = 0;
+   }
+
+   if (verb >= 4) VPrintf0 ( "        bucket sorting ...\n" );
+
+   /*-- Complete the initial radix sort --*/
+   for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1];
+
+   s = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+      s = (s >> 8) | (block[i-1] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-1;
+      s = (s >> 8) | (block[i-2] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-2;
+      s = (s >> 8) | (block[i-3] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-3;
+   }
+   for (; i >= 0; i--) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+   }
+
+   /*--
+      Now ftab contains the first loc of every small bucket.
+      Calculate the running order, from smallest to largest
+      big bucket.
+   --*/
+   for (i = 0; i <= 255; i++) {
+      bigDone     [i] = False;
+      runningOrder[i] = i;
+   }
+
+   {
+      Int32 vv;
+      Int32 h = 1;
+      do h = 3 * h + 1; while (h <= 256);
+      do {
+         h = h / 3;
+         for (i = h; i <= 255; i++) {
+            vv = runningOrder[i];
+            j = i;
+            while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) {
+               runningOrder[j] = runningOrder[j-h];
+               j = j - h;
+               if (j <= (h - 1)) goto zero;
+            }
+            zero:
+            runningOrder[j] = vv;
+         }
+      } while (h != 1);
+   }
+
+   /*--
+      The main sorting loop.
+   --*/
+
+   numQSorted = 0;
+
+   for (i = 0; i <= 255; i++) {
+
+      /*--
+         Process big buckets, starting with the least full.
+         Basically this is a 3-step process in which we call
+         mainQSort3 to sort the small buckets [ss, j], but
+         also make a big effort to avoid the calls if we can.
+      --*/
+      ss = runningOrder[i];
+
+      /*--
+         Step 1:
+         Complete the big bucket [ss] by quicksorting
+         any unsorted small buckets [ss, j], for j != ss.  
+         Hopefully previous pointer-scanning phases have already
+         completed many of the small buckets [ss, j], so
+         we don't have to sort them at all.
+      --*/
+      for (j = 0; j <= 255; j++) {
+         if (j != ss) {
+            sb = (ss << 8) + j;
+            if ( ! (ftab[sb] & SETMASK) ) {
+               Int32 lo = ftab[sb]   & CLEARMASK;
+               Int32 hi = (ftab[sb+1] & CLEARMASK) - 1;
+               if (hi > lo) {
+                  if (verb >= 4)
+                     VPrintf4 ( "        qsort [0x%x, 0x%x]   "
+                                "done %d   this %d\n",
+                                ss, j, numQSorted, hi - lo + 1 );
+                  mainQSort3 ( 
+                     ptr, block, quadrant, nblock, 
+                     lo, hi, BZ_N_RADIX, budget 
+                  );   
+                  numQSorted += (hi - lo + 1);
+                  if (*budget < 0) return;
+               }
+            }
+            ftab[sb] |= SETMASK;
+         }
+      }
+
+      AssertH ( !bigDone[ss], 1006 );
+
+      /*--
+         Step 2:
+         Now scan this big bucket [ss] so as to synthesise the
+         sorted order for small buckets [t, ss] for all t,
+         including, magically, the bucket [ss,ss] too.
+         This will avoid doing Real Work in subsequent Step 1's.
+      --*/
+      {
+         for (j = 0; j <= 255; j++) {
+            copyStart[j] =  ftab[(j << 8) + ss]     & CLEARMASK;
+            copyEnd  [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1;
+         }
+         for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1])
+               ptr[ copyStart[c1]++ ] = k;
+         }
+         for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1]) 
+               ptr[ copyEnd[c1]-- ] = k;
+         }
+      }
+
+      AssertH ( (copyStart[ss]-1 == copyEnd[ss])
+                || 
+                /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
+                   Necessity for this case is demonstrated by compressing 
+                   a sequence of approximately 48.5 million of character 
+                   251; 1.0.0/1.0.1 will then die here. */
+                (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
+                1007 )
+
+      for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
+
+      /*--
+         Step 3:
+         The [ss] big bucket is now done.  Record this fact,
+         and update the quadrant descriptors.  Remember to
+         update quadrants in the overshoot area too, if
+         necessary.  The "if (i < 255)" test merely skips
+         this updating for the last bucket processed, since
+         updating for the last bucket is pointless.
+
+         The quadrant array provides a way to incrementally
+         cache sort orderings, as they appear, so as to 
+         make subsequent comparisons in fullGtU() complete
+         faster.  For repetitive blocks this makes a big
+         difference (but not big enough to be able to avoid
+         the fallback sorting mechanism, exponential radix sort).
+
+         The precise meaning is: at all times:
+
+            for 0 <= i < nblock and 0 <= j <= nblock
+
+            if block[i] != block[j], 
+
+               then the relative values of quadrant[i] and 
+                    quadrant[j] are meaningless.
+
+               else {
+                  if quadrant[i] < quadrant[j]
+                     then the string starting at i lexicographically
+                     precedes the string starting at j
+
+                  else if quadrant[i] > quadrant[j]
+                     then the string starting at j lexicographically
+                     precedes the string starting at i
+
+                  else
+                     the relative ordering of the strings starting
+                     at i and j has not yet been determined.
+               }
+      --*/
+      bigDone[ss] = True;
+
+      if (i < 255) {
+         Int32 bbStart  = ftab[ss << 8] & CLEARMASK;
+         Int32 bbSize   = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart;
+         Int32 shifts   = 0;
+
+         while ((bbSize >> shifts) > 65534) shifts++;
+
+         for (j = bbSize-1; j >= 0; j--) {
+            Int32 a2update     = ptr[bbStart + j];
+            UInt16 qVal        = (UInt16)(j >> shifts);
+            quadrant[a2update] = qVal;
+            if (a2update < BZ_N_OVERSHOOT)
+               quadrant[a2update + nblock] = qVal;
+         }
+         AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 );
+      }
+
+   }
+
+   if (verb >= 4)
+      VPrintf3 ( "        %d pointers, %d sorted, %d scanned\n",
+                 nblock, numQSorted, nblock - numQSorted );
+}
+
+#undef BIGFREQ
+#undef SETMASK
+#undef CLEARMASK
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      arr2 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)arr2)  [0 .. nblock-1] holds block
+      arr1 exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)arr2) [0 .. nblock-1] holds block
+      All other areas of block destroyed
+      ftab [ 0 .. 65536 ] destroyed
+      arr1 [0 .. nblock-1] holds sorted order
+*/
+void BZ2_blockSort ( EState* s )
+{
+   UInt32* ptr    = s->ptr; 
+   UChar*  block  = s->block;
+   UInt32* ftab   = s->ftab;
+   Int32   nblock = s->nblock;
+   Int32   verb   = s->verbosity;
+   Int32   wfact  = s->workFactor;
+   UInt16* quadrant;
+   Int32   budget;
+   Int32   budgetInit;
+   Int32   i;
+
+   if (nblock < 10000) {
+      fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+   } else {
+      /* Calculate the location for quadrant, remembering to get
+         the alignment right.  Assumes that &(block[0]) is at least
+         2-byte aligned -- this should be ok since block is really
+         the first section of arr2.
+      */
+      i = nblock+BZ_N_OVERSHOOT;
+      if (i & 1) i++;
+      quadrant = (UInt16*)(&(block[i]));
+
+      /* (wfact-1) / 3 puts the default-factor-30
+         transition point at very roughly the same place as 
+         with v0.1 and v0.9.0.  
+         Not that it particularly matters any more, since the
+         resulting compressed stream is now the same regardless
+         of whether or not we use the main sort or fallback sort.
+      */
+      if (wfact < 1  ) wfact = 1;
+      if (wfact > 100) wfact = 100;
+      budgetInit = nblock * ((wfact-1) / 3);
+      budget = budgetInit;
+
+      mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
+      if (verb >= 3) 
+         VPrintf3 ( "      %d work, %d block, ratio %5.2f\n",
+                    budgetInit - budget,
+                    nblock, 
+                    (float)(budgetInit - budget) /
+                    (float)(nblock==0 ? 1 : nblock) ); 
+      if (budget < 0) {
+         if (verb >= 2) 
+            VPrintf0 ( "    too repetitive; using fallback"
+                       " sorting algorithm\n" );
+         fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+      }
+   }
+
+   s->origPtr = -1;
+   for (i = 0; i < s->nblock; i++)
+      if (ptr[i] == 0)
+         { s->origPtr = i; break; };
+
+   AssertH( s->origPtr != -1, 1003 );
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                       blocksort.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bz-common.xsl
@@ -0,0 +1,39 @@
+<?xml version="1.0"?> <!-- -*- sgml -*- -->
+<xsl:stylesheet 
+     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- we like '1.2 Title' -->
+<xsl:param name="section.autolabel" select="'1'"/> 
+<xsl:param name="section.label.includes.component.label" select="'1'"/>
+
+<!-- Do not put 'Chapter' at the start of eg 'Chapter 1. Doing This' -->
+<xsl:param name="local.l10n.xml" select="document('')"/> 
+<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"> 
+  <l:l10n language="en"> 
+    <l:context name="title-numbered">
+      <l:template name="chapter" text="%n.&#160;%t"/>
+    </l:context> 
+  </l:l10n>
+</l:i18n>
+
+<!-- don't generate sub-tocs for qanda sets -->
+<xsl:param name="generate.toc">
+set       toc,title
+book      toc,title,figure,table,example,equation
+chapter   toc,title
+section   toc
+sect1     toc
+sect2     toc
+sect3     toc
+sect4     nop
+sect5     nop
+qandaset  toc
+qandadiv  nop
+appendix  toc,title
+article/appendix  nop
+article   toc,title
+preface   toc,title
+reference toc,title
+</xsl:param>
+
+</xsl:stylesheet>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bz-fo.xsl
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- sgml -*- -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+     xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
+
+<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
+<xsl:import href="bz-common.xsl"/>
+
+<!-- set indent = yes while debugging, then change to NO -->
+<xsl:output method="xml" indent="yes"/>
+
+<!-- ensure only passivetex extensions are on -->
+<xsl:param name="stylesheet.result.type" select="'fo'"/>
+<!-- fo extensions: PDF bookmarks and index terms -->
+<xsl:param name="use.extensions" select="'1'"/>
+<xsl:param name="xep.extensions" select="0"/>      
+<xsl:param name="fop.extensions" select="0"/>     
+<xsl:param name="saxon.extensions" select="0"/>   
+<xsl:param name="passivetex.extensions" select="1"/>
+<xsl:param name="tablecolumns.extension" select="'1'"/>
+
+<!-- ensure we are using single sided -->
+<xsl:param name="double.sided" select="'0'"/> 
+
+<!-- insert cross references to page numbers -->
+<xsl:param name="insert.xref.page.number" select="1"/>
+
+<!-- <?custom-pagebreak?> inserts a page break at this point -->
+<xsl:template match="processing-instruction('custom-pagebreak')">
+  <fo:block break-before='page'/>
+</xsl:template>
+
+<!-- show links in color -->
+<xsl:attribute-set name="xref.properties">
+  <xsl:attribute name="color">blue</xsl:attribute>
+</xsl:attribute-set>
+
+<!-- make pre listings indented a bit + a bg colour -->
+<xsl:template match="programlisting | screen">
+  <fo:block start-indent="0.25in" wrap-option="no-wrap" 
+            white-space-collapse="false" text-align="start" 
+            font-family="monospace" background-color="#f2f2f9"
+            linefeed-treatment="preserve" 
+            xsl:use-attribute-sets="normal.para.spacing">
+    <xsl:apply-templates/>
+  </fo:block>
+</xsl:template>
+<!-- make verbatim output prettier -->
+<xsl:template match="literallayout">
+  <fo:block start-indent="0.25in" wrap-option="no-wrap" 
+            white-space-collapse="false" text-align="start" 
+            font-family="monospace" background-color="#edf7f4"
+            linefeed-treatment="preserve" 
+            space-before="0em" space-after="0em">
+    <xsl:apply-templates/>
+  </fo:block>
+</xsl:template>
+
+<!-- workaround bug in passivetex fo output for itemizedlist -->
+<xsl:template match="itemizedlist/listitem">
+  <xsl:variable name="id">
+  <xsl:call-template name="object.id"/></xsl:variable>
+  <xsl:variable name="itemsymbol">
+    <xsl:call-template name="list.itemsymbol">
+      <xsl:with-param name="node" select="parent::itemizedlist"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:variable name="item.contents">
+    <fo:list-item-label end-indent="label-end()">
+      <fo:block>
+        <xsl:choose>
+          <xsl:when test="$itemsymbol='disc'">&#x2022;</xsl:when>
+          <xsl:when test="$itemsymbol='bullet'">&#x2022;</xsl:when>
+          <xsl:otherwise>&#x2022;</xsl:otherwise>
+        </xsl:choose>
+      </fo:block>
+    </fo:list-item-label>
+    <fo:list-item-body start-indent="body-start()">
+      <xsl:apply-templates/>    <!-- removed extra block wrapper -->
+    </fo:list-item-body>
+  </xsl:variable>
+  <xsl:choose>
+    <xsl:when test="parent::*/@spacing = 'compact'">
+      <fo:list-item id="{$id}" 
+          xsl:use-attribute-sets="compact.list.item.spacing">
+        <xsl:copy-of select="$item.contents"/>
+      </fo:list-item>
+    </xsl:when>
+    <xsl:otherwise>
+      <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
+        <xsl:copy-of select="$item.contents"/>
+      </fo:list-item>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<!-- workaround bug in passivetex fo output for orderedlist -->
+<xsl:template match="orderedlist/listitem">
+  <xsl:variable name="id">
+  <xsl:call-template name="object.id"/></xsl:variable>
+  <xsl:variable name="item.contents">
+    <fo:list-item-label end-indent="label-end()">
+      <fo:block>
+        <xsl:apply-templates select="." mode="item-number"/>
+      </fo:block>
+    </fo:list-item-label>
+    <fo:list-item-body start-indent="body-start()">
+      <xsl:apply-templates/>    <!-- removed extra block wrapper -->
+    </fo:list-item-body>
+  </xsl:variable>
+  <xsl:choose>
+    <xsl:when test="parent::*/@spacing = 'compact'">
+      <fo:list-item id="{$id}" 
+          xsl:use-attribute-sets="compact.list.item.spacing">
+        <xsl:copy-of select="$item.contents"/>
+      </fo:list-item>
+    </xsl:when>
+    <xsl:otherwise>
+      <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
+        <xsl:copy-of select="$item.contents"/>
+      </fo:list-item>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<!-- workaround bug in passivetex fo output for variablelist -->
+<xsl:param name="variablelist.as.blocks" select="1"/>
+<xsl:template match="varlistentry" mode="vl.as.blocks">
+  <xsl:variable name="id">
+    <xsl:call-template name="object.id"/></xsl:variable>
+  <fo:block id="{$id}" xsl:use-attribute-sets="list.item.spacing"  
+      keep-together.within-column="always" 
+      keep-with-next.within-column="always">
+    <xsl:apply-templates select="term"/>
+  </fo:block>
+  <fo:block start-indent="0.5in" end-indent="0in" 
+            space-after.minimum="0.2em" 
+            space-after.optimum="0.4em" 
+            space-after.maximum="0.6em">
+    <fo:block>
+      <xsl:apply-templates select="listitem"/>
+    </fo:block>
+  </fo:block>
+</xsl:template>
+
+
+<!-- workaround bug in footers: force right-align w/two 80|30 cols -->
+<xsl:template name="footer.table">
+  <xsl:param name="pageclass" select="''"/>
+  <xsl:param name="sequence" select="''"/>
+  <xsl:param name="gentext-key" select="''"/>
+  <xsl:choose>
+    <xsl:when test="$pageclass = 'index'">
+      <xsl:attribute name="margin-left">0pt</xsl:attribute>
+    </xsl:when>
+  </xsl:choose>
+  <xsl:variable name="candidate">
+    <fo:table table-layout="fixed" width="100%">
+      <fo:table-column column-number="1" column-width="80%"/>
+      <fo:table-column column-number="2" column-width="20%"/>
+      <fo:table-body>
+        <fo:table-row height="14pt">
+          <fo:table-cell text-align="left" display-align="after">
+            <xsl:attribute name="relative-align">baseline</xsl:attribute>
+            <fo:block> 
+              <fo:block> </fo:block><!-- empty cell -->
+            </fo:block>
+          </fo:table-cell>
+          <fo:table-cell text-align="center" display-align="after">
+            <xsl:attribute name="relative-align">baseline</xsl:attribute>
+            <fo:block>
+              <xsl:call-template name="footer.content">
+                <xsl:with-param name="pageclass" select="$pageclass"/>
+                <xsl:with-param name="sequence" select="$sequence"/>
+                <xsl:with-param name="position" select="'center'"/>
+                <xsl:with-param name="gentext-key" select="$gentext-key"/>
+              </xsl:call-template>
+            </fo:block>
+          </fo:table-cell>
+        </fo:table-row>
+      </fo:table-body>
+    </fo:table>
+  </xsl:variable>
+  <!-- Really output a footer? -->
+  <xsl:choose>
+    <xsl:when test="$pageclass='titlepage' and $gentext-key='book'
+                    and $sequence='first'">
+      <!-- no, book titlepages have no footers at all -->
+    </xsl:when>
+    <xsl:when test="$sequence = 'blank' and $footers.on.blank.pages = 0">
+      <!-- no output -->
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:copy-of select="$candidate"/>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+
+<!-- fix bug in headers: force right-align w/two 40|60 cols -->
+<xsl:template name="header.table">
+  <xsl:param name="pageclass" select="''"/>
+  <xsl:param name="sequence" select="''"/>
+  <xsl:param name="gentext-key" select="''"/>
+  <xsl:choose>
+    <xsl:when test="$pageclass = 'index'">
+      <xsl:attribute name="margin-left">0pt</xsl:attribute>
+    </xsl:when>
+  </xsl:choose>
+  <xsl:variable name="candidate">
+    <fo:table table-layout="fixed" width="100%">
+      <xsl:call-template name="head.sep.rule">
+        <xsl:with-param name="pageclass" select="$pageclass"/>
+        <xsl:with-param name="sequence" select="$sequence"/>
+        <xsl:with-param name="gentext-key" select="$gentext-key"/>
+      </xsl:call-template>
+      <fo:table-column column-number="1" column-width="40%"/>
+      <fo:table-column column-number="2" column-width="60%"/>
+      <fo:table-body>
+        <fo:table-row height="14pt">
+          <fo:table-cell text-align="left" display-align="before">
+            <xsl:attribute name="relative-align">baseline</xsl:attribute>
+            <fo:block>
+              <fo:block> </fo:block><!-- empty cell -->
+            </fo:block>
+          </fo:table-cell>
+          <fo:table-cell text-align="center" display-align="before">
+            <xsl:attribute name="relative-align">baseline</xsl:attribute>
+            <fo:block>
+              <xsl:call-template name="header.content">
+                <xsl:with-param name="pageclass" select="$pageclass"/>
+                <xsl:with-param name="sequence" select="$sequence"/>
+                <xsl:with-param name="position" select="'center'"/>
+                <xsl:with-param name="gentext-key" select="$gentext-key"/>
+              </xsl:call-template>
+            </fo:block>
+          </fo:table-cell>
+        </fo:table-row>
+      </fo:table-body>
+    </fo:table>
+  </xsl:variable>
+  <!-- Really output a header? -->
+  <xsl:choose>
+    <xsl:when test="$pageclass = 'titlepage' and $gentext-key = 'book'
+                    and $sequence='first'">
+      <!-- no, book titlepages have no headers at all -->
+    </xsl:when>
+    <xsl:when test="$sequence = 'blank' and $headers.on.blank.pages = 0">
+      <!-- no output -->
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:copy-of select="$candidate"/>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+
+<!-- Bug-fix for Suse 10 PassiveTex version -->
+<!-- Precompute attribute values 'cos PassiveTex is too stupid: -->
+<xsl:attribute-set name="component.title.properties">
+  <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+  <xsl:attribute name="space-before.optimum">
+    <xsl:value-of select="concat($body.font.master, 'pt')"/>
+  </xsl:attribute>
+  <xsl:attribute name="space-before.minimum">
+    <xsl:value-of select="$body.font.master * 0.8"/>
+    <xsl:text>pt</xsl:text>
+  </xsl:attribute>
+  <xsl:attribute name="space-before.maximum">
+    <xsl:value-of select="$body.font.master * 1.2"/>
+    <xsl:text>pt</xsl:text>
+  </xsl:attribute>
+  <xsl:attribute name="hyphenate">false</xsl:attribute>
+</xsl:attribute-set>
+
+
+</xsl:stylesheet>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bz-html.xsl
@@ -0,0 +1,20 @@
+<?xml version="1.0"?> <!-- -*- sgml -*- -->
+<!DOCTYPE xsl:stylesheet [ <!ENTITY bz-css SYSTEM "./bzip.css"> ]>
+
+<xsl:stylesheet 
+   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/>
+<xsl:import href="bz-common.xsl"/>
+
+<!-- use 8859-1 encoding -->
+<xsl:output method="html" encoding="ISO-8859-1" indent="yes"/>
+
+<!-- we include the css directly when generating one large file -->
+<xsl:template name="user.head.content">  
+  <style type="text/css" media="screen">
+    <xsl:text>&bz-css;</xsl:text>
+  </style>
+</xsl:template>
+
+</xsl:stylesheet>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzdiff
@@ -0,0 +1,76 @@
+#!/bin/sh
+# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
+
+# Bzcmp/diff wrapped for bzip2, 
+# adapted from zdiff by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
+
+# Bzcmp and bzdiff are used to invoke the cmp or the  diff  pro-
+# gram  on compressed files.  All options specified are passed
+# directly to cmp or diff.  If only 1 file is specified,  then
+# the  files  compared  are file1 and an uncompressed file1.gz.
+# If two files are specified, then they are  uncompressed  (if
+# necessary) and fed to cmp or diff.  The exit status from cmp
+# or diff is preserved.
+
+PATH="/usr/bin:/bin:$PATH"; export PATH
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+  *cmp) comp=${CMP-cmp}   ;;
+  *)    comp=${DIFF-diff} ;;
+esac
+
+OPTIONS=
+FILES=
+for ARG
+do
+    case "$ARG" in
+    -*)	OPTIONS="$OPTIONS $ARG";;
+     *)	if test -f "$ARG"; then
+            FILES="$FILES $ARG"
+        else
+            echo "${prog}: $ARG not found or not a regular file"
+	    exit 1
+        fi ;;
+    esac
+done
+if test -z "$FILES"; then
+	echo "Usage: $prog [${comp}_options] file [file]"
+	exit 1
+fi
+tmp=`mktemp ${TMPDIR:-/tmp}/bzdiff.XXXXXXXXXX` || {
+      echo 'cannot create a temporary file' >&2
+      exit 1
+}
+set $FILES
+if test $# -eq 1; then
+	FILE=`echo "$1" | sed 's/.bz2$//'`
+	bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
+	STAT="$?"
+
+elif test $# -eq 2; then
+	case "$1" in
+        *.bz2)
+                case "$2" in
+	        *.bz2)
+			F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
+                        bzip2 -cdfq "$2" > $tmp
+                        bzip2 -cdfq "$1" | $comp $OPTIONS - $tmp
+                        STAT="$?"
+			/bin/rm -f $tmp;;
+
+                *)      bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
+                        STAT="$?";;
+                esac;;
+        *)      case "$2" in
+	        *.bz2)
+                        bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
+                        STAT="$?";;
+                *)      $comp $OPTIONS "$1" "$2"
+                        STAT="$?";;
+                esac;;
+	esac
+        exit "$STAT"
+else
+	echo "Usage: $prog [${comp}_options] file [file]"
+	exit 1
+fi
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzdiff.1
@@ -0,0 +1,47 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
+\"for Debian GNU/Linux
+.TH BZDIFF 1
+.SH NAME
+bzcmp, bzdiff \- compare bzip2 compressed files
+.SH SYNOPSIS
+.B bzcmp
+[ cmp_options ] file1
+[ file2 ]
+.br
+.B bzdiff
+[ diff_options ] file1
+[ file2 ]
+.SH DESCRIPTION
+.I  Bzcmp
+and 
+.I bzdiff
+are used to invoke the
+.I cmp
+or the
+.I diff
+program on bzip2 compressed files.  All options specified are passed
+directly to
+.I cmp
+or
+.IR diff "."
+If only 1 file is specified, then the files compared are
+.I file1
+and an uncompressed
+.IR file1 ".bz2."
+If two files are specified, then they are uncompressed if necessary and fed to
+.I cmp
+or
+.IR diff "."
+The exit status from 
+.I cmp
+or
+.I diff
+is preserved.
+.SH "SEE ALSO"
+cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
+.SH BUGS
+Messages from the
+.I cmp
+or
+.I diff
+programs refer to temporary filenames instead of those specified.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzgrep
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+# Bzgrep wrapped for bzip2, 
+# adapted from zgrep by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
+## zgrep notice:
+## zgrep -- a wrapper around a grep program that decompresses files as needed
+## Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+	*egrep)	grep=${EGREP-egrep}	;;
+	*fgrep)	grep=${FGREP-fgrep}	;;
+	*)	grep=${GREP-grep}	;;
+esac
+pat=""
+while test $# -ne 0; do
+  case "$1" in
+  -e | -f) opt="$opt $1"; shift; pat="$1"
+           if test "$grep" = grep; then  # grep is buggy with -e on SVR4
+             grep=egrep
+           fi;;
+  -A | -B) opt="$opt $1 $2"; shift;;
+  -*)	   opt="$opt $1";;
+   *)      if test -z "$pat"; then
+	     pat="$1"
+	   else
+	     break;
+           fi;;
+  esac
+  shift
+done
+
+if test -z "$pat"; then
+  echo "grep through bzip2 files"
+  echo "usage: $prog [grep_options] pattern [files]"
+  exit 1
+fi
+
+list=0
+silent=0
+op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$op" in
+  *l*) list=1
+esac
+case "$op" in
+  *h*) silent=1
+esac
+
+if test $# -eq 0; then
+  bzip2 -cdfq | $grep $opt "$pat"
+  exit $?
+fi
+
+res=0
+for i do
+  if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
+  if test $list -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
+    r=$?
+  elif test $# -eq 1 -o $silent -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat"
+    r=$?
+  else
+    j=${i//\\/\\\\}
+    j=${j//|/\\|}
+    j=${j//&/\\&}
+    j=`printf "%s" "$j" | tr '\n' ' '`
+    bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
+    r=$?
+  fi
+  test "$r" -ne 0 && res="$r"
+done
+exit $res
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzgrep.1
@@ -0,0 +1,56 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
+\"for Debian GNU/Linux
+.TH BZGREP 1
+.SH NAME
+bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
+.SH SYNOPSIS
+.B bzgrep
+[ grep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzegrep
+[ egrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzfgrep
+[ fgrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.SH DESCRIPTION
+.IR  Bzgrep
+is used to invoke the
+.I grep
+on bzip2-compressed files. All options specified are passed directly to
+.I grep.
+If no file is specified, then the standard input is decompressed
+if necessary and fed to grep.
+Otherwise the given files are uncompressed if necessary and fed to
+.I grep.
+.PP
+If
+.I bzgrep
+is invoked as
+.I bzegrep
+or
+.I bzfgrep
+then
+.I egrep
+or
+.I fgrep
+is used instead of
+.I grep.
+If the GREP environment variable is set,
+.I bzgrep
+uses it as the
+.I grep
+program to be invoked. For example:
+
+    for sh:  GREP=fgrep  bzgrep string files
+    for csh: (setenv GREP fgrep; bzgrep string files)
+.SH AUTHOR
+Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
+Troin <phil@fifi.org> for Debian GNU/Linux.
+.SH "SEE ALSO"
+grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzip.css
@@ -0,0 +1,74 @@
+/* Colours:
+#74240f  dark brown      h1, h2, h3, h4
+#336699  medium blue     links
+#339999  turquoise       link hover colour
+#202020  almost black    general text
+#761596  purple          md5sum text
+#626262  dark gray       pre border
+#eeeeee  very light gray pre background
+#f2f2f9  very light blue nav table background
+#3366cc  medium blue     nav table border
+*/
+
+a, a:link, a:visited, a:active { color: #336699; }
+a:hover { color: #339999; }
+
+body { font: 80%/126% sans-serif; }
+h1, h2, h3, h4 { color: #74240f; }
+
+dt { color: #336699; font-weight: bold }
+dd { 
+ margin-left: 1.5em; 
+ padding-bottom: 0.8em;
+}
+
+/* -- ruler -- */
+div.hr_blue { 
+  height:  3px; 
+  background:#ffffff url("/images/hr_blue.png") repeat-x; }
+div.hr_blue hr { display:none; }
+
+/* release styles */
+#release p { margin-top: 0.4em; }
+#release .md5sum { color: #761596; }
+
+
+/* ------ styles for docs|manuals|howto ------ */
+/* -- lists -- */
+ul  { 
+ margin:     0px 4px 16px 16px;
+ padding:    0px;
+ list-style: url("/images/li-blue.png"); 
+}
+ul li { 
+ margin-bottom: 10px;
+}
+ul ul	{ 
+ list-style-type:  none; 
+ list-style-image: none; 
+ margin-left:      0px; 
+}
+
+/* header / footer nav tables */
+table.nav {
+ border:     solid 1px #3366cc;
+ background: #f2f2f9;
+ background-color: #f2f2f9;
+ margin-bottom: 0.5em;
+}
+/* don't have underlined links in chunked nav menus */
+table.nav a { text-decoration: none; }
+table.nav a:hover { text-decoration: underline; }
+table.nav td { font-size: 85%; }
+
+code, tt, pre { font-size: 120%; }
+code, tt { color: #761596; }
+
+div.literallayout, pre.programlisting, pre.screen {
+ color:      #000000;
+ padding:    0.5em;
+ background: #eeeeee;
+ border:     1px solid #626262;
+ background-color: #eeeeee;
+ margin: 4px 0px 4px 0px; 
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.1
@@ -0,0 +1,454 @@
+.PU
+.TH bzip2 1
+.SH NAME
+bzip2, bunzip2 \- a block-sorting file compressor, v1.0.6
+.br
+bzcat \- decompresses files to stdout
+.br
+bzip2recover \- recovers data from damaged bzip2 files
+
+.SH SYNOPSIS
+.ll +8
+.B bzip2
+.RB [ " \-cdfkqstvzVL123456789 " ]
+[
+.I "filenames \&..."
+]
+.ll -8
+.br
+.B bunzip2
+.RB [ " \-fkvsVL " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzcat
+.RB [ " \-s " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzip2recover
+.I "filename"
+
+.SH DESCRIPTION
+.I bzip2
+compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding.  Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+
+The command-line options are deliberately very similar to 
+those of 
+.I GNU gzip, 
+but they are not identical.
+
+.I bzip2
+expects a list of file names to accompany the
+command-line flags.  Each file is replaced by a compressed version of
+itself, with the name "original_name.bz2".  
+Each compressed file
+has the same modification date, permissions, and, when possible,
+ownership as the corresponding original, so that these properties can
+be correctly restored at decompression time.  File name handling is
+naive in the sense that there is no mechanism for preserving original
+file names, permissions, ownerships or dates in filesystems which lack
+these concepts, or have serious file name length restrictions, such as
+MS-DOS.
+
+.I bzip2
+and
+.I bunzip2
+will by default not overwrite existing
+files.  If you want this to happen, specify the \-f flag.
+
+If no file names are specified,
+.I bzip2
+compresses from standard
+input to standard output.  In this case,
+.I bzip2
+will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+.I bunzip2
+(or
+.I bzip2 \-d) 
+decompresses all
+specified files.  Files which were not created by 
+.I bzip2
+will be detected and ignored, and a warning issued.  
+.I bzip2
+attempts to guess the filename for the decompressed file 
+from that of the compressed file as follows:
+
+       filename.bz2    becomes   filename
+       filename.bz     becomes   filename
+       filename.tbz2   becomes   filename.tar
+       filename.tbz    becomes   filename.tar
+       anyothername    becomes   anyothername.out
+
+If the file does not end in one of the recognised endings, 
+.I .bz2, 
+.I .bz, 
+.I .tbz2
+or
+.I .tbz, 
+.I bzip2 
+complains that it cannot
+guess the name of the original file, and uses the original name
+with
+.I .out
+appended.
+
+As with compression, supplying no
+filenames causes decompression from 
+standard input to standard output.
+
+.I bunzip2 
+will correctly decompress a file which is the
+concatenation of two or more compressed files.  The result is the
+concatenation of the corresponding uncompressed files.  Integrity
+testing (\-t) 
+of concatenated 
+compressed files is also supported.
+
+You can also compress or decompress files to the standard output by
+giving the \-c flag.  Multiple files may be compressed and
+decompressed like this.  The resulting outputs are fed sequentially to
+stdout.  Compression of multiple files 
+in this manner generates a stream
+containing multiple compressed file representations.  Such a stream
+can be decompressed correctly only by
+.I bzip2 
+version 0.9.0 or
+later.  Earlier versions of
+.I bzip2
+will stop after decompressing
+the first file in the stream.
+
+.I bzcat
+(or
+.I bzip2 -dc) 
+decompresses all specified files to
+the standard output.
+
+.I bzip2
+will read arguments from the environment variables
+.I BZIP2
+and
+.I BZIP,
+in that order, and will process them
+before any arguments read from the command line.  This gives a 
+convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed 
+file is slightly
+larger than the original.  Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes.  Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+
+As a self-check for your protection, 
+.I 
+bzip2
+uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data, and
+against undetected bugs in
+.I bzip2
+(hopefully very unlikely).  The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed.  Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong.  It can't help you 
+recover the original uncompressed
+data.  You can use 
+.I bzip2recover
+to try to recover data from
+damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused
+.I bzip2
+to panic.
+
+.SH OPTIONS
+.TP
+.B \-c --stdout
+Compress or decompress to standard output.
+.TP
+.B \-d --decompress
+Force decompression.  
+.I bzip2, 
+.I bunzip2 
+and
+.I bzcat 
+are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used.  This flag overrides that
+mechanism, and forces 
+.I bzip2
+to decompress.
+.TP
+.B \-z --compress
+The complement to \-d: forces compression, regardless of the
+invocation name.
+.TP
+.B \-t --test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+.TP
+.B \-f --force
+Force overwrite of output files.  Normally,
+.I bzip2 
+will not overwrite
+existing output files.  Also forces 
+.I bzip2 
+to break hard links
+to files, which it otherwise wouldn't do.
+
+bzip2 normally declines to decompress files which don't have the
+correct magic header bytes.  If forced (-f), however, it will pass
+such files through unmodified.  This is how GNU gzip behaves.
+.TP
+.B \-k --keep
+Keep (don't delete) input files during compression
+or decompression.
+.TP
+.B \-s --small
+Reduce memory usage, for compression, decompression and testing.  Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte.  This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+
+During compression, \-s selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio.  In short, if your machine is low on memory (8 megabytes or
+less), use \-s for everything.  See MEMORY MANAGEMENT below.
+.TP
+.B \-q --quiet
+Suppress non-essential warning messages.  Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+.TP
+.B \-v --verbose
+Verbose mode -- show the compression ratio for each file processed.
+Further \-v's increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+.TP
+.B \-L --license -V --version
+Display the software version, license terms and conditions.
+.TP
+.B \-1 (or \-\-fast) to \-9 (or \-\-best)
+Set the block size to 100 k, 200 k ..  900 k when compressing.  Has no
+effect when decompressing.  See MEMORY MANAGEMENT below.
+The \-\-fast and \-\-best aliases are primarily for GNU gzip 
+compatibility.  In particular, \-\-fast doesn't make things
+significantly faster.  
+And \-\-best merely selects the default behaviour.
+.TP
+.B \--
+Treats all subsequent arguments as file names, even if they start
+with a dash.  This is so you can handle files with names beginning
+with a dash, for example: bzip2 \-- \-myfilename.
+.TP
+.B \--repetitive-fast --repetitive-best
+These flags are redundant in versions 0.9.5 and above.  They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful.  0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+
+.SH MEMORY MANAGEMENT
+.I bzip2 
+compresses large files in blocks.  The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression.  The flags \-1 through \-9
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+.I bunzip2
+then allocates itself just enough memory to decompress
+the file.  Since block sizes are stored in compressed files, it follows
+that the flags \-1 to \-9 are irrelevant to and so ignored
+during decompression.
+
+Compression and decompression requirements, 
+in bytes, can be estimated as:
+
+       Compression:   400k + ( 8 x block size )
+
+       Decompression: 100k + ( 4 x block size ), or
+                      100k + ( 2.5 x block size )
+
+Larger block sizes give rapidly diminishing marginal returns.  Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using
+.I bzip2
+on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+
+For files compressed with the default 900k block size,
+.I bunzip2
+will require about 3700 kbytes to decompress.  To support decompression
+of any file on a 4 megabyte machine, 
+.I bunzip2
+has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes.  Decompression speed is also halved, so you should use this
+option only where necessary.  The relevant flag is -s.
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved.  Compression and
+decompression speed are virtually unaffected by block size.
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size.  The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block.  For example, compressing a file
+20,000 bytes long with the flag -9 will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it.  Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+
+Here is a table which summarises the maximum memory usage for different
+block sizes.  Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes.  This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+
+           Compress   Decompress   Decompress   Corpus
+    Flag     usage      usage       -s usage     Size
+
+     -1      1200k       500k         350k      914704
+     -2      2000k       900k         600k      877703
+     -3      2800k      1300k         850k      860338
+     -4      3600k      1700k        1100k      846899
+     -5      4400k      2100k        1350k      845160
+     -6      5200k      2500k        1600k      838626
+     -7      6100k      2900k        1850k      834096
+     -8      6800k      3300k        2100k      828642
+     -9      7600k      3700k        2350k      828642
+
+.SH RECOVERING DATA FROM DAMAGED FILES
+.I bzip2
+compresses files in blocks, usually 900kbytes long.  Each
+block is handled independently.  If a media or transmission error causes
+a multi-block .bz2
+file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty.  Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+
+.I bzip2recover
+is a simple program whose purpose is to search for
+blocks in .bz2 files, and write each block out into its own .bz2 
+file.  You can then use
+.I bzip2 
+\-t
+to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+
+.I bzip2recover
+takes a single argument, the name of the damaged file, 
+and writes a number of files "rec00001file.bz2",
+"rec00002file.bz2", etc, containing the  extracted  blocks.
+The  output  filenames  are  designed  so  that the use of
+wildcards in subsequent processing -- for example,  
+"bzip2 -dc  rec*file.bz2 > recovered_data" -- processes the files in
+the correct order.
+
+.I bzip2recover
+should be of most use dealing with large .bz2
+files,  as  these will contain many blocks.  It is clearly
+futile to use it on damaged single-block  files,  since  a
+damaged  block  cannot  be recovered.  If you wish to minimise 
+any potential data loss through media  or  transmission errors, 
+you might consider compressing with a smaller
+block size.
+
+.SH PERFORMANCE NOTES
+The sorting phase of compression gathers together similar strings in the
+file.  Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..."  (repeated several hundred times) may
+compress more slowly than normal.  Versions 0.9.5 and above fare much
+better than previous versions in this respect.  The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1.  You can use the
+\-vvvv option to monitor progress in great detail, if you want.
+
+Decompression speed is unaffected by these phenomena.
+
+.I bzip2
+usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion.  This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine 
+.I bzip2
+will perform best on machines with very large caches.
+
+.SH CAVEATS
+I/O error messages are not as helpful as they could be.
+.I bzip2
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+
+This manual page pertains to version 1.0.6 of
+.I bzip2.  
+Compressed data created by this version is entirely forwards and
+backwards compatible with the previous public releases, versions
+0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and above, but with the following
+exception: 0.9.0 and above can correctly decompress multiple
+concatenated compressed files.  0.1pl2 cannot do this; it will stop
+after decompressing just the first file in the stream.
+
+.I bzip2recover
+versions prior to 1.0.2 used 32-bit integers to represent
+bit positions in compressed files, so they could not handle compressed
+files more than 512 megabytes long.  Versions 1.0.2 and above use
+64-bit ints on some platforms which support them (GNU supported
+targets, and Windows).  To establish whether or not bzip2recover was
+built with such a limitation, run it without arguments.  In any event
+you can build yourself an unlimited version if you can recompile it
+with MaybeUInt64 set to be an unsigned 64-bit integer.
+
+
+
+.SH AUTHOR
+Julian Seward, jsewardbzip.org.
+
+http://www.bzip.org
+
+The ideas embodied in
+.I bzip2
+are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original
+.I bzip,
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+.I bzip).  
+I am much
+indebted for their help, support and advice.  See the manual in the
+source distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression.  Bela Lubkin encouraged me to improve the
+worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+The bz* scripts are derived from those of GNU gzip.
+Many people sent patches, helped
+with portability problems, lent machines, gave advice and were generally
+helpful.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.1.preformatted
@@ -0,0 +1,399 @@
+bzip2(1)                                                 bzip2(1)
+
+
+
+NNAAMMEE
+       bzip2, bunzip2 − a blockâ€sorting file compressor, v1.0.6
+       bzcat − decompresses files to stdout
+       bzip2recover − recovers data from damaged bzip2 files
+
+
+SSYYNNOOPPSSIISS
+       bbzziipp22 [ −−ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbuunnzziipp22 [ −−ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzzccaatt [ −−ss ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
+
+
+DDEESSCCRRIIPPTTIIOONN
+       _b_z_i_p_2  compresses  files  using  the Burrowsâ€Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78â€based compressors,
+       and  approaches  the performance of the PPM family of sta­
+       tistical compressors.
+
+       The commandâ€line options are deliberately very similar  to
+       those of _G_N_U _g_z_i_p_, but they are not identical.
+
+       _b_z_i_p_2  expects  a list of file names to accompany the com­
+       mandâ€line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per­
+       missions, and, when possible, ownership as the correspond­
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv­
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MSâ€DOS.
+
+       _b_z_i_p_2  and  _b_u_n_z_i_p_2 will by default not overwrite existing
+       files.  If you want this to happen, specify the −f flag.
+
+       If no file names  are  specified,  _b_z_i_p_2  compresses  from
+       standard  input  to  standard output.  In this case, _b_z_i_p_2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       _b_u_n_z_i_p_2 (or _b_z_i_p_2 _−_d_) decompresses  all  specified  files.
+       Files which were not created by _b_z_i_p_2 will be detected and
+       ignored, and a warning issued.  _b_z_i_p_2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       _._b_z_2_,  _._b_z_,  _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with _._o_u_t appended.
+
+       As  with compression, supplying no filenames causes decom­
+       pression from standard input to standard output.
+
+       _b_u_n_z_i_p_2 will correctly decompress a file which is the con­
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (−t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the −c flag.  Multiple files may be com­
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi­
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  _b_z_i_p_2  version  0.9.0  or
+       later.   Earlier  versions of _b_z_i_p_2 will stop after decom­
+       pressing the first file in the stream.
+
+       _b_z_c_a_t (or _b_z_i_p_2 _â€_d_c_) decompresses all specified  files  to
+       the standard output.
+
+       _b_z_i_p_2  will  read arguments from the environment variables
+       _B_Z_I_P_2 and _B_Z_I_P_, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a selfâ€check for your  protection,  _b_z_i_p_2  uses  32â€bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup­
+       tion  of  the compressed data, and against undetected bugs
+       in _b_z_i_p_2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can’t  help
+       you  recover  the original uncompressed data.  You can use
+       _b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
+
+
+OOPPTTIIOONNSS
+       −−cc â€â€â€â€ssttddoouutt
+              Compress or decompress to standard output.
+
+       −−dd â€â€â€â€ddeeccoommpprreessss
+              Force  decompression.  _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces _b_z_i_p_2 to decompress.
+
+       −−zz â€â€â€â€ccoommpprreessss
+              The   complement   to   −d:   forces   compression,
+              regardless of the invocation name.
+
+       −−tt â€â€â€â€tteesstt
+              Check integrity of the specified file(s), but don’t
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       −−ff â€â€â€â€ffoorrccee
+              Force overwrite of output files.   Normally,  _b_z_i_p_2
+              will  not  overwrite  existing  output files.  Also
+              forces _b_z_i_p_2 to break hard links to files, which it
+              otherwise wouldn’t do.
+
+              bzip2  normally  declines to decompress files which
+              don’t have the  correct  magic  header  bytes.   If
+              forced  (â€f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       −−kk â€â€â€â€kkeeeepp
+              Keep  (don’t delete) input files during compression
+              or decompression.
+
+       −−ss â€â€â€â€ssmmaallll
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  −s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  −s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       −−qq â€â€â€â€qquuiieett
+              Suppress nonâ€essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       −−vv â€â€â€â€vveerrbboossee
+              Verbose mode â€â€ show the compression ratio for each
+              file  processed.   Further  −v’s  increase the ver­
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       −−LL â€â€â€â€lliicceennssee â€â€VV â€â€â€â€vveerrssiioonn
+              Display  the  software  version,  license terms and
+              conditions.
+
+       −−11 ((oorr −−−−ffaasstt)) ttoo −−99 ((oorr −−−−bbeesstt))
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The −−fast and −−best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, −−fast doesn’t make things  signifi­
+              cantly  faster.   And  −−best  merely  selects  the
+              default behaviour.
+
+       −−     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han­
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 −†−myfilename.
+
+       −−â€â€rreeppeettiittiivveeâ€â€ffaasstt â€â€â€â€rreeppeettiittiivveeâ€â€bbeesstt
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver­
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
+       _b_z_i_p_2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  −1  through  −9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec­
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags −1 to −9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using _b_z_i_p_2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       _b_u_n_z_i_p_2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       _b_u_n_z_i_p_2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres­
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is â€s.
+
+       In general, try and use the largest block size memory con­
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu­
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  â€â€  that  means  most files you’d encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag â€9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres­
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi­
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       â€s usage     Size
+
+            â€1      1200k       500k         350k      914704
+            â€2      2000k       900k         600k      877703
+            â€3      2800k      1300k         850k      860338
+            â€4      3600k      1700k        1100k      846899
+            â€5      4400k      2100k        1350k      845160
+            â€6      5200k      2500k        1600k      838626
+            â€7      6100k      2900k        1850k      834096
+            â€8      6800k      3300k        2100k      828642
+            â€9      7600k      3700k        2350k      828642
+
+
+RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
+       _b_z_i_p_2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans­
+       mission error causes a multiâ€block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48â€bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32â€bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use _b_z_i_p_2 −t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam­
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro­
+       cessing  â€â€ for example, "bzip2 â€dc  rec*file.bz2 > recov­
+       ered_data" â€â€ processes the files in the correct order.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged singleâ€block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min­
+       imise any potential data loss through media  or  transmis­
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PPEERRFFOORRMMAANNCCEE NNOOTTEESS
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worstâ€case and averageâ€case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the −vvvv option to mon­
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       _b_z_i_p_2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran­
+       dom  fashion.   This means that performance, both for com­
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine _b_z_i_p_2 will per­
+       form best on machines with very large caches.
+
+
+CCAAVVEEAATTSS
+       I/O  error  messages  are not as helpful as they could be.
+       _b_z_i_p_2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.6 of _b_z_i_p_2_.  Com­
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1, 
+       1.0.2 and above, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop 
+       after  decompressing just the first file in the stream.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r  versions prior to 1.0.2 used 32â€bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64â€bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64â€bit integer.
+
+
+
+
+AAUUTTHHOORR
+       Julian Seward, jsewardbzip.org.
+
+       http://www.bzip.org
+
+       The ideas embodied in _b_z_i_p_2 are due to (at least) the fol­
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod­
+       ing model in the original _b_z_i_p_, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  _b_z_i_p_)_.   I  am  much
+       indebted for their help, support and advice.  See the man­
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres­
+       sion.  Bela Lubkin encouraged me to improve the worstâ€case
+       compression performance.  Donna Robinson XMLised the docu­
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
+
+
+                                                         bzip2(1)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.c
@@ -0,0 +1,2034 @@
+
+/*-----------------------------------------------------------*/
+/*--- A block-sorting, lossless compressor        bzip2.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* Place a 1 beside your platform, and 0 elsewhere.
+   Generic 32-bit Unix.
+   Also works on 64-bit Unix boxes.
+   This is the default.
+*/
+#define BZ_UNIX      1
+
+/*--
+  Win32, as seen by Jacob Navia's excellent
+  port of (Chris Fraser & David Hanson)'s excellent
+  lcc compiler.  Or with MS Visual C.
+  This is selected automatically if compiled by a compiler which
+  defines _WIN32, not including the Cygwin GCC.
+--*/
+#define BZ_LCCWIN32  0
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#undef  BZ_LCCWIN32
+#define BZ_LCCWIN32 1
+#undef  BZ_UNIX
+#define BZ_UNIX 0
+#endif
+
+
+/*---------------------------------------------*/
+/*--
+  Some stuff for all platforms.
+--*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <math.h>
+#include <errno.h>
+#include <ctype.h>
+#include "bzlib.h"
+
+#define ERROR_IF_EOF(i)       { if ((i) == EOF)  ioError(); }
+#define ERROR_IF_NOT_ZERO(i)  { if ((i) != 0)    ioError(); }
+#define ERROR_IF_MINUS_ONE(i) { if ((i) == (-1)) ioError(); }
+
+
+/*---------------------------------------------*/
+/*--
+   Platform-specific stuff.
+--*/
+
+#if BZ_UNIX
+#   include <fcntl.h>
+#   include <sys/types.h>
+#   include <utime.h>
+#   include <unistd.h>
+#   include <sys/stat.h>
+#   include <sys/times.h>
+
+#   define PATH_SEP    '/'
+#   define MY_LSTAT    lstat
+#   define MY_STAT     stat
+#   define MY_S_ISREG  S_ISREG
+#   define MY_S_ISDIR  S_ISDIR
+
+#   define APPEND_FILESPEC(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define SET_BINARY_MODE(fd) /**/
+
+#   ifdef __GNUC__
+#      define NORETURN __attribute__ ((noreturn))
+#   else
+#      define NORETURN /**/
+#   endif
+
+#   ifdef __DJGPP__
+#     include <io.h>
+#     include <fcntl.h>
+#     undef MY_LSTAT
+#     undef MY_STAT
+#     define MY_LSTAT stat
+#     define MY_STAT stat
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+
+#   ifdef __CYGWIN__
+#     include <io.h>
+#     include <fcntl.h>
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+#endif /* BZ_UNIX */
+
+
+
+#if BZ_LCCWIN32
+#   include <io.h>
+#   include <fcntl.h>
+#   include <sys\stat.h>
+
+#   define NORETURN       /**/
+#   define PATH_SEP       '\\'
+#   define MY_LSTAT       _stat
+#   define MY_STAT        _stat
+#   define MY_S_ISREG(x)  ((x) & _S_IFREG)
+#   define MY_S_ISDIR(x)  ((x) & _S_IFDIR)
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FILESPEC(root, name)                \
+      root = snocString ((root), (name))
+
+#   define SET_BINARY_MODE(fd)                        \
+      do {                                            \
+         int retVal = setmode ( fileno ( fd ),        \
+                                O_BINARY );           \
+         ERROR_IF_MINUS_ONE ( retVal );               \
+      } while ( 0 )
+
+#endif /* BZ_LCCWIN32 */
+
+
+/*---------------------------------------------*/
+/*--
+  Some more stuff for all platforms :-)
+--*/
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+                                       
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+/*--
+  IntNative is your platform's `native' int size.
+  Only here to avoid probs with 64-bit platforms.
+--*/
+typedef int IntNative;
+
+
+/*---------------------------------------------------*/
+/*--- Misc (file handling) data decls             ---*/
+/*---------------------------------------------------*/
+
+Int32   verbosity;
+Bool    keepInputFiles, smallMode, deleteOutputOnInterrupt;
+Bool    forceOverwrite, testFailsExist, unzFailsExist, noisy;
+Int32   numFileNames, numFilesProcessed, blockSize100k;
+Int32   exitValue;
+
+/*-- source modes; F==file, I==stdin, O==stdout --*/
+#define SM_I2O           1
+#define SM_F2O           2
+#define SM_F2F           3
+
+/*-- operation modes --*/
+#define OM_Z             1
+#define OM_UNZ           2
+#define OM_TEST          3
+
+Int32   opMode;
+Int32   srcMode;
+
+#define FILE_NAME_LEN 1034
+
+Int32   longestFileName;
+Char    inName [FILE_NAME_LEN];
+Char    outName[FILE_NAME_LEN];
+Char    tmpName[FILE_NAME_LEN];
+Char    *progName;
+Char    progNameReally[FILE_NAME_LEN];
+FILE    *outputHandleJustInCase;
+Int32   workFactor;
+
+static void    panic                 ( const Char* ) NORETURN;
+static void    ioError               ( void )        NORETURN;
+static void    outOfMemory           ( void )        NORETURN;
+static void    configError           ( void )        NORETURN;
+static void    crcError              ( void )        NORETURN;
+static void    cleanUpAndFail        ( Int32 )       NORETURN;
+static void    compressedStreamEOF   ( void )        NORETURN;
+
+static void    copyFileName ( Char*, Char* );
+static void*   myMalloc     ( Int32 );
+static void    applySavedFileAttrToOutputFile ( IntNative fd );
+
+
+
+/*---------------------------------------------------*/
+/*--- An implementation of 64-bit ints.  Sigh.    ---*/
+/*--- Roll on widespread deployment of ANSI C9X ! ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct { UChar b[8]; } 
+   UInt64;
+
+
+static
+void uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
+{
+   n->b[7] = (UChar)((hi32 >> 24) & 0xFF);
+   n->b[6] = (UChar)((hi32 >> 16) & 0xFF);
+   n->b[5] = (UChar)((hi32 >> 8)  & 0xFF);
+   n->b[4] = (UChar) (hi32        & 0xFF);
+   n->b[3] = (UChar)((lo32 >> 24) & 0xFF);
+   n->b[2] = (UChar)((lo32 >> 16) & 0xFF);
+   n->b[1] = (UChar)((lo32 >> 8)  & 0xFF);
+   n->b[0] = (UChar) (lo32        & 0xFF);
+}
+
+
+static
+double uInt64_to_double ( UInt64* n )
+{
+   Int32  i;
+   double base = 1.0;
+   double sum  = 0.0;
+   for (i = 0; i < 8; i++) {
+      sum  += base * (double)(n->b[i]);
+      base *= 256.0;
+   }
+   return sum;
+}
+
+
+static
+Bool uInt64_isZero ( UInt64* n )
+{
+   Int32 i;
+   for (i = 0; i < 8; i++)
+      if (n->b[i] != 0) return 0;
+   return 1;
+}
+
+
+/* Divide *n by 10, and return the remainder.  */
+static 
+Int32 uInt64_qrm10 ( UInt64* n )
+{
+   UInt32 rem, tmp;
+   Int32  i;
+   rem = 0;
+   for (i = 7; i >= 0; i--) {
+      tmp = rem * 256 + n->b[i];
+      n->b[i] = tmp / 10;
+      rem = tmp % 10;
+   }
+   return rem;
+}
+
+
+/* ... and the Whole Entire Point of all this UInt64 stuff is
+   so that we can supply the following function.
+*/
+static
+void uInt64_toAscii ( char* outbuf, UInt64* n )
+{
+   Int32  i, q;
+   UChar  buf[32];
+   Int32  nBuf   = 0;
+   UInt64 n_copy = *n;
+   do {
+      q = uInt64_qrm10 ( &n_copy );
+      buf[nBuf] = q + '0';
+      nBuf++;
+   } while (!uInt64_isZero(&n_copy));
+   outbuf[nBuf] = 0;
+   for (i = 0; i < nBuf; i++) 
+      outbuf[i] = buf[nBuf-i-1];
+}
+
+
+/*---------------------------------------------------*/
+/*--- Processing of complete files and streams    ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressStream ( FILE *stream, FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   UChar   ibuf[5000];
+   Int32   nIbuf;
+   UInt32  nbytes_in_lo32, nbytes_in_hi32;
+   UInt32  nbytes_out_lo32, nbytes_out_hi32;
+   Int32   bzerr, bzerr_dummy, ret;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   bzf = BZ2_bzWriteOpen ( &bzerr, zStream, 
+                           blockSize100k, verbosity, workFactor );   
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n" );
+
+   while (True) {
+
+      if (myfeof(stream)) break;
+      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
+      if (ferror(stream)) goto errhandler_io;
+      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
+      if (bzerr != BZ_OK) goto errhandler;
+
+   }
+
+   BZ2_bzWriteClose64 ( &bzerr, bzf, 0, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fflush ( zStream );
+   if (ret == EOF) goto errhandler_io;
+   if (zStream != stdout) {
+      Int32 fd = fileno ( zStream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+      ret = fclose ( zStream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (ferror(stream)) goto errhandler_io;
+   ret = fclose ( stream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 1) {
+      if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
+	 fprintf ( stderr, " no data compressed.\n");
+      } else {
+	 Char   buf_nin[32], buf_nout[32];
+	 UInt64 nbytes_in,   nbytes_out;
+	 double nbytes_in_d, nbytes_out_d;
+	 uInt64_from_UInt32s ( &nbytes_in, 
+			       nbytes_in_lo32, nbytes_in_hi32 );
+	 uInt64_from_UInt32s ( &nbytes_out, 
+			       nbytes_out_lo32, nbytes_out_hi32 );
+	 nbytes_in_d  = uInt64_to_double ( &nbytes_in );
+	 nbytes_out_d = uInt64_to_double ( &nbytes_out );
+	 uInt64_toAscii ( buf_nin, &nbytes_in );
+	 uInt64_toAscii ( buf_nout, &nbytes_out );
+	 fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+		   "%5.2f%% saved, %s in, %s out.\n",
+		   nbytes_in_d / nbytes_out_d,
+		   (8.0 * nbytes_out_d) / nbytes_in_d,
+		   100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+		   buf_nin,
+		   buf_nout
+		 );
+      }
+   }
+
+   return;
+
+   errhandler:
+   BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_MEM_ERROR:
+         outOfMemory (); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      default:
+         panic ( "compress:unexpected error" );
+   }
+
+   panic ( "compress:end" );
+   /*notreached*/
+}
+
+
+
+/*---------------------------------------------*/
+static 
+Bool uncompressStream ( FILE *zStream, FILE *stream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
+         if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
+            fwrite ( obuf, sizeof(UChar), nread, stream );
+         if (ferror(stream)) goto errhandler_io;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      if (nUnused == 0 && myfeof(zStream)) break;
+   }
+
+   closeok:
+   if (ferror(zStream)) goto errhandler_io;
+   if (stream != stdout) {
+      Int32 fd = fileno ( stream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+   }
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (ferror(stream)) goto errhandler_io;
+   ret = fflush ( stream );
+   if (ret != 0) goto errhandler_io;
+   if (stream != stdout) {
+      ret = fclose ( stream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   trycat: 
+   if (forceOverwrite) {
+      rewind(zStream);
+      while (True) {
+      	 if (myfeof(zStream)) break;
+      	 nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+      	 if (ferror(zStream)) goto errhandler_io;
+      	 if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+      	 if (ferror(stream)) goto errhandler_io;
+      }
+      goto closeok;
+   }
+  
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         crcError();
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         compressedStreamEOF();
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (stream != stdout) fclose(stream);
+         if (streamNo == 1) {
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "\n%s: %s: trailing garbage after EOF ignored\n",
+                      progName, inName );
+            return True;       
+         }
+      default:
+         panic ( "decompress:unexpected error" );
+   }
+
+   panic ( "decompress:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool testStream ( FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(zStream);
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+      if (nUnused == 0 && myfeof(zStream)) break;
+
+   }
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   if (verbosity == 0) 
+      fprintf ( stderr, "%s: %s: ", progName, inName );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         fprintf ( stderr,
+                   "data integrity (CRC) error in data\n" );
+         return False;
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         fprintf ( stderr,
+                   "file ends unexpectedly\n" );
+         return False;
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (streamNo == 1) {
+          fprintf ( stderr, 
+                    "bad magic number (file not created by bzip2)\n" );
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "trailing garbage after EOF ignored\n" );
+            return True;       
+         }
+      default:
+         panic ( "test:unexpected error" );
+   }
+
+   panic ( "test:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------------*/
+/*--- Error [non-] handling grunge                ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+void setExit ( Int32 v )
+{
+   if (v > exitValue) exitValue = v;
+}
+
+
+/*---------------------------------------------*/
+static 
+void cadvise ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\nIt is possible that the compressed file(s) have become corrupted.\n"
+        "You can use the -tvv option to test integrity of such files.\n\n"
+        "You can use the `bzip2recover' program to attempt to recover\n"
+        "data from undamaged sections of corrupted files.\n\n"
+    );
+}
+
+
+/*---------------------------------------------*/
+static 
+void showFileNames ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\tInput file = %s, output file = %s\n",
+      inName, outName 
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void cleanUpAndFail ( Int32 ec )
+{
+   IntNative      retVal;
+   struct MY_STAT statBuf;
+
+   if ( srcMode == SM_F2F 
+        && opMode != OM_TEST
+        && deleteOutputOnInterrupt ) {
+
+      /* Check whether input file still exists.  Delete output file
+         only if input exists to avoid loss of data.  Joerg Prante, 5
+         January 2002.  (JRS 06-Jan-2002: other changes in 1.0.2 mean
+         this is less likely to happen.  But to be ultra-paranoid, we
+         do the check anyway.)  */
+      retVal = MY_STAT ( inName, &statBuf );
+      if (retVal == 0) {
+         if (noisy)
+            fprintf ( stderr, 
+                      "%s: Deleting output file %s, if it exists.\n",
+                      progName, outName );
+         if (outputHandleJustInCase != NULL)
+            fclose ( outputHandleJustInCase );
+         retVal = remove ( outName );
+         if (retVal != 0)
+            fprintf ( stderr,
+                      "%s: WARNING: deletion of output file "
+                      "(apparently) failed.\n",
+                      progName );
+      } else {
+         fprintf ( stderr,
+                   "%s: WARNING: deletion of output file suppressed\n",
+                    progName );
+         fprintf ( stderr,
+                   "%s:    since input file no longer exists.  Output file\n",
+                   progName );
+         fprintf ( stderr,
+                   "%s:    `%s' may be incomplete.\n",
+                   progName, outName );
+         fprintf ( stderr, 
+                   "%s:    I suggest doing an integrity test (bzip2 -tv)"
+                   " of it.\n",
+                   progName );
+      }
+   }
+
+   if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
+      fprintf ( stderr, 
+                "%s: WARNING: some files have not been processed:\n"
+                "%s:    %d specified on command line, %d not processed yet.\n\n",
+                progName, progName,
+                numFileNames, numFileNames - numFilesProcessed );
+   }
+   setExit(ec);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------*/
+static 
+void panic ( const Char* s )
+{
+   fprintf ( stderr,
+             "\n%s: PANIC -- internal consistency error:\n"
+             "\t%s\n"
+             "\tThis is a BUG.  Please report it to me at:\n"
+             "\tjseward@bzip.org\n",
+             progName, s );
+   showFileNames();
+   cleanUpAndFail( 3 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void crcError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: Data integrity error when decompressing.\n",
+             progName );
+   showFileNames();
+   cadvise();
+   cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressedStreamEOF ( void )
+{
+  if (noisy) {
+    fprintf ( stderr,
+	      "\n%s: Compressed file ends unexpectedly;\n\t"
+	      "perhaps it is corrupted?  *Possible* reason follows.\n",
+	      progName );
+    perror ( progName );
+    showFileNames();
+    cadvise();
+  }
+  cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void ioError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: I/O or other error, bailing out.  "
+             "Possible reason follows.\n",
+             progName );
+   perror ( progName );
+   showFileNames();
+   cleanUpAndFail( 1 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySignalCatcher ( IntNative n )
+{
+   fprintf ( stderr,
+             "\n%s: Control-C or similar caught, quitting.\n",
+             progName );
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySIGSEGVorSIGBUScatcher ( IntNative n )
+{
+   if (opMode == OM_Z)
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (2) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (3) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (1) and (2).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (1)\n"
+      "   or (2), feel free to report it to me at: jseward@bzip.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+      else
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) The compressed data is corrupted, and bzip2's usual checks\n"
+      "       failed to detect this.  Try bzip2 -tvv my_file.bz2.\n"
+      "   (2) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (3) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (4) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (2) and (3).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (2)\n"
+      "   or (3), feel free to report it to me at: jseward@bzip.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+
+   showFileNames();
+   if (opMode == OM_Z)
+      cleanUpAndFail( 3 ); else
+      { cadvise(); cleanUpAndFail( 2 ); }
+}
+
+
+/*---------------------------------------------*/
+static 
+void outOfMemory ( void )
+{
+   fprintf ( stderr,
+             "\n%s: couldn't allocate enough memory\n",
+             progName );
+   showFileNames();
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void configError ( void )
+{
+   fprintf ( stderr,
+             "bzip2: I'm not configured correctly for this platform!\n"
+             "\tI require Int32, Int16 and Char to have sizes\n"
+             "\tof 4, 2 and 1 bytes to run properly, and they don't.\n"
+             "\tProbably you can fix this by defining them correctly,\n"
+             "\tand recompiling.  Bye!\n" );
+   setExit(3);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------------*/
+/*--- The main driver machinery                   ---*/
+/*---------------------------------------------------*/
+
+/* All rather crufty.  The main problem is that input files
+   are stat()d multiple times before use.  This should be
+   cleaned up. 
+*/
+
+/*---------------------------------------------*/
+static 
+void pad ( Char *s )
+{
+   Int32 i;
+   if ( (Int32)strlen(s) >= longestFileName ) return;
+   for (i = 1; i <= longestFileName - (Int32)strlen(s); i++)
+      fprintf ( stderr, " " );
+}
+
+
+/*---------------------------------------------*/
+static 
+void copyFileName ( Char* to, Char* from ) 
+{
+   if ( strlen(from) > FILE_NAME_LEN-10 )  {
+      fprintf (
+         stderr,
+         "bzip2: file name\n`%s'\n"
+         "is suspiciously (more than %d chars) long.\n"
+         "Try using a reasonable file name instead.  Sorry! :-)\n",
+         from, FILE_NAME_LEN-10
+      );
+      setExit(1);
+      exit(exitValue);
+   }
+
+  strncpy(to,from,FILE_NAME_LEN-10);
+  to[FILE_NAME_LEN-10]='\0';
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool fileExists ( Char* name )
+{
+   FILE *tmp   = fopen ( name, "rb" );
+   Bool exists = (tmp != NULL);
+   if (tmp != NULL) fclose ( tmp );
+   return exists;
+}
+
+
+/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions.
+   This avoids a race condition in versions < 1.0.2, in which
+   the file was first opened and then had its interim permissions
+   set safely.  We instead use open() to create the file with
+   the interim permissions required. (--- --- rw-).
+
+   For non-Unix platforms, if we are not worrying about
+   security issues, simple this simply behaves like fopen.
+*/
+static
+FILE* fopen_output_safely ( Char* name, const char* mode )
+{
+#  if BZ_UNIX
+   FILE*     fp;
+   IntNative fh;
+   fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
+   if (fh == -1) return NULL;
+   fp = fdopen(fh, mode);
+   if (fp == NULL) close(fh);
+   return fp;
+#  else
+   return fopen(name, mode);
+#  endif
+}
+
+
+/*---------------------------------------------*/
+/*--
+  if in doubt, return True
+--*/
+static 
+Bool notAStandardFile ( Char* name )
+{
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return True;
+   if (MY_S_ISREG(statBuf.st_mode)) return False;
+   return True;
+}
+
+
+/*---------------------------------------------*/
+/*--
+  rac 11/21/98 see if file has hard links to it
+--*/
+static 
+Int32 countHardLinks ( Char* name )
+{  
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return 0;
+   return (statBuf.st_nlink - 1);
+}
+
+
+/*---------------------------------------------*/
+/* Copy modification date, access date, permissions and owner from the
+   source to destination file.  We have to copy this meta-info off
+   into fileMetaInfo before starting to compress / decompress it,
+   because doing it afterwards means we get the wrong access time.
+
+   To complicate matters, in compress() and decompress() below, the
+   sequence of tests preceding the call to saveInputFileMetaInfo()
+   involves calling fileExists(), which in turn establishes its result
+   by attempting to fopen() the file, and if successful, immediately
+   fclose()ing it again.  So we have to assume that the fopen() call
+   does not cause the access time field to be updated.
+
+   Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
+   to imply that merely doing open() will not affect the access time.
+   Therefore we merely need to hope that the C library only does
+   open() as a result of fopen(), and not any kind of read()-ahead
+   cleverness.
+
+   It sounds pretty fragile to me.  Whether this carries across
+   robustly to arbitrary Unix-like platforms (or even works robustly
+   on this one, RedHat 7.2) is unknown to me.  Nevertheless ...  
+*/
+#if BZ_UNIX
+static 
+struct MY_STAT fileMetaInfo;
+#endif
+
+static 
+void saveInputFileMetaInfo ( Char *srcName )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+   /* Note use of stat here, not lstat. */
+   retVal = MY_STAT( srcName, &fileMetaInfo );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+
+static 
+void applySavedTimeInfoToOutputFile ( Char *dstName )
+{
+#  if BZ_UNIX
+   IntNative      retVal;
+   struct utimbuf uTimBuf;
+
+   uTimBuf.actime = fileMetaInfo.st_atime;
+   uTimBuf.modtime = fileMetaInfo.st_mtime;
+
+   retVal = utime ( dstName, &uTimBuf );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+static 
+void applySavedFileAttrToOutputFile ( IntNative fd )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+
+   retVal = fchmod ( fd, fileMetaInfo.st_mode );
+   ERROR_IF_NOT_ZERO ( retVal );
+
+   (void) fchown ( fd, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
+   /* chown() will in many cases return with EPERM, which can
+      be safely ignored.
+   */
+#  endif
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool containsDubiousChars ( Char* name )
+{
+#  if BZ_UNIX
+   /* On unix, files can contain any characters and the file expansion
+    * is performed by the shell.
+    */
+   return False;
+#  else /* ! BZ_UNIX */
+   /* On non-unix (Win* platforms), wildcard characters are not allowed in 
+    * filenames.
+    */
+   for (; *name != '\0'; name++)
+      if (*name == '?' || *name == '*') return True;
+   return False;
+#  endif /* BZ_UNIX */
+}
+
+
+/*---------------------------------------------*/
+#define BZ_N_SUFFIX_PAIRS 4
+
+const Char* zSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { ".bz2", ".bz", ".tbz2", ".tbz" };
+const Char* unzSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { "", "", ".tar", ".tar" };
+
+static 
+Bool hasSuffix ( Char* s, const Char* suffix )
+{
+   Int32 ns = strlen(s);
+   Int32 nx = strlen(suffix);
+   if (ns < nx) return False;
+   if (strcmp(s + ns - nx, suffix) == 0) return True;
+   return False;
+}
+
+static 
+Bool mapSuffix ( Char* name, 
+                 const Char* oldSuffix, 
+                 const Char* newSuffix )
+{
+   if (!hasSuffix(name,oldSuffix)) return False;
+   name[strlen(name)-strlen(oldSuffix)] = 0;
+   strcat ( name, newSuffix );
+   return True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "compress: bad modes\n" );
+
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         strcat ( outName, ".bz2" ); 
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++) {
+      if (hasSuffix(inName, zSuffix[i])) {
+         if (noisy)
+         fprintf ( stderr, 
+                   "%s: Input file %s already has %s suffix.\n",
+                   progName, inName, zSuffix[i] );
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+	 remove(outName);
+      } else {
+	 fprintf ( stderr, "%s: Output file %s already exists.\n",
+		   progName, outName );
+	 setExit(1);
+	 return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName )) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "compress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr,  "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   compressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( srcMode == SM_F2F ) {
+      applySavedTimeInfoToOutputFile ( outName );
+      deleteOutputOnInterrupt = False;
+      if ( !keepInputFiles ) {
+         IntNative retVal = remove ( inName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+
+   deleteOutputOnInterrupt = False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void uncompress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   Bool  magicNumberOK;
+   Bool  cantGuess;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "uncompress: bad modes\n" );
+
+   cantGuess = False;
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++)
+            if (mapSuffix(outName,zSuffix[i],unzSuffix[i]))
+               goto zzz; 
+         cantGuess = True;
+         strcat ( outName, ".out" );
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   zzz:
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( /* srcMode == SM_F2F implied && */ cantGuess ) {
+      if (noisy)
+      fprintf ( stderr, 
+                "%s: Can't guess original name for %s -- using %s\n",
+                progName, inName, outName );
+      /* just a warning, no return */
+   }   
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+	remove(outName);
+      } else {
+        fprintf ( stderr, "%s: Output file %s already exists.\n",
+                  progName, outName );
+        setExit(1);
+        return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName ) ) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "uncompress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   magicNumberOK = uncompressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( magicNumberOK ) {
+      if ( srcMode == SM_F2F ) {
+         applySavedTimeInfoToOutputFile ( outName );
+         deleteOutputOnInterrupt = False;
+         if ( !keepInputFiles ) {
+            IntNative retVal = remove ( inName );
+            ERROR_IF_NOT_ZERO ( retVal );
+         }
+      }
+   } else {
+      unzFailsExist = True;
+      deleteOutputOnInterrupt = False;
+      if ( srcMode == SM_F2F ) {
+         IntNative retVal = remove ( outName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+   deleteOutputOnInterrupt = False;
+
+   if ( magicNumberOK ) {
+      if (verbosity >= 1)
+         fprintf ( stderr, "done\n" );
+   } else {
+      setExit(2);
+      if (verbosity >= 1)
+         fprintf ( stderr, "not a bzip2 file.\n" ); else
+         fprintf ( stderr,
+                   "%s: %s is not a bzip2 file.\n",
+                   progName, inName );
+   }
+
+}
+
+
+/*---------------------------------------------*/
+static 
+void testf ( Char *name )
+{
+   FILE *inStr;
+   Bool allOK;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "testf: bad modes\n" );
+
+   copyFileName ( outName, (Char*)"(none)" );
+   switch (srcMode) {
+      case SM_I2O: copyFileName ( inName, (Char*)"(stdin)" ); break;
+      case SM_F2F: copyFileName ( inName, name ); break;
+      case SM_F2O: copyFileName ( inName, name ); break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         inStr = stdin;
+         break;
+
+      case SM_F2O: case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "testf: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input handle is sane.  Do the Biz. ---*/
+   outputHandleJustInCase = NULL;
+   allOK = testStream ( inStr );
+
+   if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
+   if (!allOK) testFailsExist = True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void license ( void )
+{
+   fprintf ( stderr,
+
+    "bzip2, a block-sorting file compressor.  "
+    "Version %s.\n"
+    "   \n"
+    "   Copyright (C) 1996-2010 by Julian Seward.\n"
+    "   \n"
+    "   This program is free software; you can redistribute it and/or modify\n"
+    "   it under the terms set out in the LICENSE file, which is included\n"
+    "   in the bzip2-1.0.6 source distribution.\n"
+    "   \n"
+    "   This program is distributed in the hope that it will be useful,\n"
+    "   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+    "   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+    "   LICENSE file for more details.\n"
+    "   \n",
+    BZ2_bzlibVersion()
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void usage ( Char *fullProgName )
+{
+   fprintf (
+      stderr,
+      "bzip2, a block-sorting file compressor.  "
+      "Version %s.\n"
+      "\n   usage: %s [flags and input files in any order]\n"
+      "\n"
+      "   -h --help           print this message\n"
+      "   -d --decompress     force decompression\n"
+      "   -z --compress       force compression\n"
+      "   -k --keep           keep (don't delete) input files\n"
+      "   -f --force          overwrite existing output files\n"
+      "   -t --test           test compressed file integrity\n"
+      "   -c --stdout         output to standard out\n"
+      "   -q --quiet          suppress noncritical error messages\n"
+      "   -v --verbose        be verbose (a 2nd -v gives more)\n"
+      "   -L --license        display software version & license\n"
+      "   -V --version        display software version & license\n"
+      "   -s --small          use less memory (at most 2500k)\n"
+      "   -1 .. -9            set block size to 100k .. 900k\n"
+      "   --fast              alias for -1\n"
+      "   --best              alias for -9\n"
+      "\n"
+      "   If invoked as `bzip2', default action is to compress.\n"
+      "              as `bunzip2',  default action is to decompress.\n"
+      "              as `bzcat', default action is to decompress to stdout.\n"
+      "\n"
+      "   If no file names are given, bzip2 compresses or decompresses\n"
+      "   from standard input to standard output.  You can combine\n"
+      "   short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
+#     if BZ_UNIX
+      "\n"
+#     endif
+      ,
+
+      BZ2_bzlibVersion(),
+      fullProgName
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void redundant ( Char* flag )
+{
+   fprintf ( 
+      stderr, 
+      "%s: %s is redundant in versions 0.9.5 and above\n",
+      progName, flag );
+}
+
+
+/*---------------------------------------------*/
+/*--
+  All the garbage from here to main() is purely to
+  implement a linked list of command-line arguments,
+  into which main() copies argv[1 .. argc-1].
+
+  The purpose of this exercise is to facilitate 
+  the expansion of wildcard characters * and ? in 
+  filenames for OSs which don't know how to do it
+  themselves, like MSDOS, Windows 95 and NT.
+
+  The actual Dirty Work is done by the platform-
+  specific macro APPEND_FILESPEC.
+--*/
+
+typedef
+   struct zzzz {
+      Char        *name;
+      struct zzzz *link;
+   }
+   Cell;
+
+
+/*---------------------------------------------*/
+static 
+void *myMalloc ( Int32 n )
+{
+   void* p;
+
+   p = malloc ( (size_t)n );
+   if (p == NULL) outOfMemory ();
+   return p;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *mkCell ( void )
+{
+   Cell *c;
+
+   c = (Cell*) myMalloc ( sizeof ( Cell ) );
+   c->name = NULL;
+   c->link = NULL;
+   return c;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *snocString ( Cell *root, Char *name )
+{
+   if (root == NULL) {
+      Cell *tmp = mkCell();
+      tmp->name = (Char*) myMalloc ( 5 + strlen(name) );
+      strcpy ( tmp->name, name );
+      return tmp;
+   } else {
+      Cell *tmp = root;
+      while (tmp->link != NULL) tmp = tmp->link;
+      tmp->link = snocString ( tmp->link, name );
+      return root;
+   }
+}
+
+
+/*---------------------------------------------*/
+static 
+void addFlagsFromEnvVar ( Cell** argList, Char* varName ) 
+{
+   Int32 i, j, k;
+   Char *envbase, *p;
+
+   envbase = getenv(varName);
+   if (envbase != NULL) {
+      p = envbase;
+      i = 0;
+      while (True) {
+         if (p[i] == 0) break;
+         p += i;
+         i = 0;
+         while (isspace((Int32)(p[0]))) p++;
+         while (p[i] != 0 && !isspace((Int32)(p[i]))) i++;
+         if (i > 0) {
+            k = i; if (k > FILE_NAME_LEN-10) k = FILE_NAME_LEN-10;
+            for (j = 0; j < k; j++) tmpName[j] = p[j];
+            tmpName[k] = 0;
+            APPEND_FLAG(*argList, tmpName);
+         }
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+#define ISFLAG(s) (strcmp(aa->name, (s))==0)
+
+IntNative main ( IntNative argc, Char *argv[] )
+{
+   Int32  i, j;
+   Char   *tmp;
+   Cell   *argList;
+   Cell   *aa;
+   Bool   decode;
+
+   /*-- Be really really really paranoid :-) --*/
+   if (sizeof(Int32) != 4 || sizeof(UInt32) != 4  ||
+       sizeof(Int16) != 2 || sizeof(UInt16) != 2  ||
+       sizeof(Char)  != 1 || sizeof(UChar)  != 1)
+      configError();
+
+   /*-- Initialise --*/
+   outputHandleJustInCase  = NULL;
+   smallMode               = False;
+   keepInputFiles          = False;
+   forceOverwrite          = False;
+   noisy                   = True;
+   verbosity               = 0;
+   blockSize100k           = 9;
+   testFailsExist          = False;
+   unzFailsExist           = False;
+   numFileNames            = 0;
+   numFilesProcessed       = 0;
+   workFactor              = 30;
+   deleteOutputOnInterrupt = False;
+   exitValue               = 0;
+   i = j = 0; /* avoid bogus warning from egcs-1.1.X */
+
+   /*-- Set up signal handlers for mem access errors --*/
+   signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
+#  if BZ_UNIX
+#  ifndef __DJGPP__
+   signal (SIGBUS,  mySIGSEGVorSIGBUScatcher);
+#  endif
+#  endif
+
+   copyFileName ( inName,  (Char*)"(none)" );
+   copyFileName ( outName, (Char*)"(none)" );
+
+   copyFileName ( progNameReally, argv[0] );
+   progName = &progNameReally[0];
+   for (tmp = &progNameReally[0]; *tmp != '\0'; tmp++)
+      if (*tmp == PATH_SEP) progName = tmp + 1;
+
+
+   /*-- Copy flags from env var BZIP2, and 
+        expand filename wildcards in arg list.
+   --*/
+   argList = NULL;
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP2" );
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP" );
+   for (i = 1; i <= argc-1; i++)
+      APPEND_FILESPEC(argList, argv[i]);
+
+
+   /*-- Find the length of the longest filename --*/
+   longestFileName = 7;
+   numFileNames    = 0;
+   decode          = True;
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) { decode = False; continue; }
+      if (aa->name[0] == '-' && decode) continue;
+      numFileNames++;
+      if (longestFileName < (Int32)strlen(aa->name) )
+         longestFileName = (Int32)strlen(aa->name);
+   }
+
+
+   /*-- Determine source modes; flag handling may change this too. --*/
+   if (numFileNames == 0)
+      srcMode = SM_I2O; else srcMode = SM_F2F;
+
+
+   /*-- Determine what to do (compress/uncompress/test/cat). --*/
+   /*-- Note that subsequent flag handling may change this. --*/
+   opMode = OM_Z;
+
+   if ( (strstr ( progName, "unzip" ) != 0) ||
+        (strstr ( progName, "UNZIP" ) != 0) )
+      opMode = OM_UNZ;
+
+   if ( (strstr ( progName, "z2cat" ) != 0) ||
+        (strstr ( progName, "Z2CAT" ) != 0) ||
+        (strstr ( progName, "zcat" ) != 0)  ||
+        (strstr ( progName, "ZCAT" ) != 0) )  {
+      opMode = OM_UNZ;
+      srcMode = (numFileNames == 0) ? SM_I2O : SM_F2O;
+   }
+
+
+   /*-- Look at the flags. --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (aa->name[0] == '-' && aa->name[1] != '-') {
+         for (j = 1; aa->name[j] != '\0'; j++) {
+            switch (aa->name[j]) {
+               case 'c': srcMode          = SM_F2O; break;
+               case 'd': opMode           = OM_UNZ; break;
+               case 'z': opMode           = OM_Z; break;
+               case 'f': forceOverwrite   = True; break;
+               case 't': opMode           = OM_TEST; break;
+               case 'k': keepInputFiles   = True; break;
+               case 's': smallMode        = True; break;
+               case 'q': noisy            = False; break;
+               case '1': blockSize100k    = 1; break;
+               case '2': blockSize100k    = 2; break;
+               case '3': blockSize100k    = 3; break;
+               case '4': blockSize100k    = 4; break;
+               case '5': blockSize100k    = 5; break;
+               case '6': blockSize100k    = 6; break;
+               case '7': blockSize100k    = 7; break;
+               case '8': blockSize100k    = 8; break;
+               case '9': blockSize100k    = 9; break;
+               case 'V':
+               case 'L': license();            break;
+               case 'v': verbosity++; break;
+               case 'h': usage ( progName );
+                         exit ( 0 );
+                         break;
+               default:  fprintf ( stderr, "%s: Bad flag `%s'\n",
+                                   progName, aa->name );
+                         usage ( progName );
+                         exit ( 1 );
+                         break;
+            }
+         }
+      }
+   }
+   
+   /*-- And again ... --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (ISFLAG("--stdout"))            srcMode          = SM_F2O;  else
+      if (ISFLAG("--decompress"))        opMode           = OM_UNZ;  else
+      if (ISFLAG("--compress"))          opMode           = OM_Z;    else
+      if (ISFLAG("--force"))             forceOverwrite   = True;    else
+      if (ISFLAG("--test"))              opMode           = OM_TEST; else
+      if (ISFLAG("--keep"))              keepInputFiles   = True;    else
+      if (ISFLAG("--small"))             smallMode        = True;    else
+      if (ISFLAG("--quiet"))             noisy            = False;   else
+      if (ISFLAG("--version"))           license();                  else
+      if (ISFLAG("--license"))           license();                  else
+      if (ISFLAG("--exponential"))       workFactor = 1;             else 
+      if (ISFLAG("--repetitive-best"))   redundant(aa->name);        else
+      if (ISFLAG("--repetitive-fast"))   redundant(aa->name);        else
+      if (ISFLAG("--fast"))              blockSize100k = 1;          else
+      if (ISFLAG("--best"))              blockSize100k = 9;          else
+      if (ISFLAG("--verbose"))           verbosity++;                else
+      if (ISFLAG("--help"))              { usage ( progName ); exit ( 0 ); }
+         else
+         if (strncmp ( aa->name, "--", 2) == 0) {
+            fprintf ( stderr, "%s: Bad flag `%s'\n", progName, aa->name );
+            usage ( progName );
+            exit ( 1 );
+         }
+   }
+
+   if (verbosity > 4) verbosity = 4;
+   if (opMode == OM_Z && smallMode && blockSize100k > 2) 
+      blockSize100k = 2;
+
+   if (opMode == OM_TEST && srcMode == SM_F2O) {
+      fprintf ( stderr, "%s: -c and -t cannot be used together.\n",
+                progName );
+      exit ( 1 );
+   }
+
+   if (srcMode == SM_F2O && numFileNames == 0)
+      srcMode = SM_I2O;
+
+   if (opMode != OM_Z) blockSize100k = 0;
+
+   if (srcMode == SM_F2F) {
+      signal (SIGINT,  mySignalCatcher);
+      signal (SIGTERM, mySignalCatcher);
+#     if BZ_UNIX
+      signal (SIGHUP,  mySignalCatcher);
+#     endif
+   }
+
+   if (opMode == OM_Z) {
+     if (srcMode == SM_I2O) {
+        compress ( NULL );
+     } else {
+        decode = True;
+        for (aa = argList; aa != NULL; aa = aa->link) {
+           if (ISFLAG("--")) { decode = False; continue; }
+           if (aa->name[0] == '-' && decode) continue;
+           numFilesProcessed++;
+           compress ( aa->name );
+        }
+     }
+   } 
+   else
+
+   if (opMode == OM_UNZ) {
+      unzFailsExist = False;
+      if (srcMode == SM_I2O) {
+         uncompress ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+            if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            uncompress ( aa->name );
+         }      
+      }
+      if (unzFailsExist) { 
+         setExit(2); 
+         exit(exitValue);
+      }
+   } 
+
+   else {
+      testFailsExist = False;
+      if (srcMode == SM_I2O) {
+         testf ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+	    if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            testf ( aa->name );
+	 }
+      }
+      if (testFailsExist && noisy) {
+         fprintf ( stderr,
+           "\n"
+           "You can use the `bzip2recover' program to attempt to recover\n"
+           "data from undamaged sections of corrupted files.\n\n"
+         );
+         setExit(2);
+         exit(exitValue);
+      }
+   }
+
+   /* Free the argument list memory to mollify leak detectors 
+      (eg) Purify, Checker.  Serves no other useful purpose.
+   */
+   aa = argList;
+   while (aa != NULL) {
+      Cell* aa2 = aa->link;
+      if (aa->name != NULL) free(aa->name);
+      free(aa);
+      aa = aa2;
+   }
+
+   return exitValue;
+}
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                         bzip2.c ---*/
+/*-----------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2.txt
@@ -0,0 +1,391 @@
+
+NAME
+       bzip2, bunzip2 - a block-sorting file compressor, v1.0.6
+       bzcat - decompresses files to stdout
+       bzip2recover - recovers data from damaged bzip2 files
+
+
+SYNOPSIS
+       bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ...  ]
+       bunzip2 [ -fkvsVL ] [ filenames ...  ]
+       bzcat [ -s ] [ filenames ...  ]
+       bzip2recover filename
+
+
+DESCRIPTION
+       bzip2  compresses  files  using  the Burrows-Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78-based compressors,
+       and  approaches  the performance of the PPM family of sta-
+       tistical compressors.
+
+       The command-line options are deliberately very similar  to
+       those of GNU gzip, but they are not identical.
+
+       bzip2  expects  a list of file names to accompany the com-
+       mand-line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per-
+       missions, and, when possible, ownership as the correspond-
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv-
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MS-DOS.
+
+       bzip2  and  bunzip2 will by default not overwrite existing
+       files.  If you want this to happen, specify the -f flag.
+
+       If no file names  are  specified,  bzip2  compresses  from
+       standard  input  to  standard output.  In this case, bzip2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       bunzip2 (or bzip2 -d) decompresses  all  specified  files.
+       Files which were not created by bzip2 will be detected and
+       ignored, and a warning issued.  bzip2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       .bz2,  .bz,  .tbz2 or .tbz, bzip2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with .out appended.
+
+       As  with compression, supplying no filenames causes decom-
+       pression from standard input to standard output.
+
+       bunzip2 will correctly decompress a file which is the con-
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (-t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the -c flag.  Multiple files may be com-
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi-
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  bzip2  version  0.9.0  or
+       later.   Earlier  versions of bzip2 will stop after decom-
+       pressing the first file in the stream.
+
+       bzcat (or bzip2 -dc) decompresses all specified  files  to
+       the standard output.
+
+       bzip2  will  read arguments from the environment variables
+       BZIP2 and BZIP, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a self-check for your  protection,  bzip2  uses  32-bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup-
+       tion  of  the compressed data, and against undetected bugs
+       in bzip2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can't  help
+       you  recover  the original uncompressed data.  You can use
+       bzip2recover to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused bzip2 to panic.
+
+
+OPTIONS
+       -c --stdout
+              Compress or decompress to standard output.
+
+       -d --decompress
+              Force  decompression.  bzip2, bunzip2 and bzcat are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces bzip2 to decompress.
+
+       -z --compress
+              The   complement   to   -d:   forces   compression,
+              regardless of the invocation name.
+
+       -t --test
+              Check integrity of the specified file(s), but don't
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       -f --force
+              Force overwrite of output files.   Normally,  bzip2
+              will  not  overwrite  existing  output files.  Also
+              forces bzip2 to break hard links to files, which it
+              otherwise wouldn't do.
+
+              bzip2  normally  declines to decompress files which
+              don't have the  correct  magic  header  bytes.   If
+              forced  (-f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       -k --keep
+              Keep  (don't delete) input files during compression
+              or decompression.
+
+       -s --small
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  -s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  -s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       -q --quiet
+              Suppress non-essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       -v --verbose
+              Verbose mode -- show the compression ratio for each
+              file  processed.   Further  -v's  increase the ver-
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       -L --license -V --version
+              Display  the  software  version,  license terms and
+              conditions.
+
+       -1 (or --fast) to -9 (or --best)
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The --fast and --best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, --fast doesn't make things  signifi-
+              cantly  faster.   And  --best  merely  selects  the
+              default behaviour.
+
+       --     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han-
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 -- -myfilename.
+
+       --repetitive-fast --repetitive-best
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver-
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MEMORY MANAGEMENT
+       bzip2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  -1  through  -9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec-
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and bunzip2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags -1 to -9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using bzip2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       bunzip2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       bunzip2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres-
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is -s.
+
+       In general, try and use the largest block size memory con-
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu-
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  --  that  means  most files you'd encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag -9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres-
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi-
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       -s usage     Size
+
+            -1      1200k       500k         350k      914704
+            -2      2000k       900k         600k      877703
+            -3      2800k      1300k         850k      860338
+            -4      3600k      1700k        1100k      846899
+            -5      4400k      2100k        1350k      845160
+            -6      5200k      2500k        1600k      838626
+            -7      6100k      2900k        1850k      834096
+            -8      6800k      3300k        2100k      828642
+            -9      7600k      3700k        2350k      828642
+
+
+RECOVERING DATA FROM DAMAGED FILES
+       bzip2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans-
+       mission error causes a multi-block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48-bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32-bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       bzip2recover is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use bzip2 -t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       bzip2recover takes a single argument, the name of the dam-
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro-
+       cessing  -- for example, "bzip2 -dc  rec*file.bz2 > recov-
+       ered_data" -- processes the files in the correct order.
+
+       bzip2recover should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged single-block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min-
+       imise any potential data loss through media  or  transmis-
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PERFORMANCE NOTES
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worst-case and average-case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the -vvvv option to mon-
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       bzip2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran-
+       dom  fashion.   This means that performance, both for com-
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine bzip2 will per-
+       form best on machines with very large caches.
+
+
+CAVEATS
+       I/O  error  messages  are not as helpful as they could be.
+       bzip2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.6 of bzip2.  Com-
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1,
+       1.0.2 and above, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop
+       after  decompressing just the first file in the stream.
+
+       bzip2recover  versions prior to 1.0.2 used 32-bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64-bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64-bit integer.
+
+
+AUTHOR
+       Julian Seward, jsewardbzip.org.
+
+       http://www.bzip.org
+
+       The ideas embodied in bzip2 are due to (at least) the fol-
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod-
+       ing model in the original bzip, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  bzip).   I  am  much
+       indebted for their help, support and advice.  See the man-
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres-
+       sion.  Bela Lubkin encouraged me to improve the worst-case
+       compression performance.  Donna Robinson XMLised the docu-
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzip2recover.c
@@ -0,0 +1,514 @@
+/*-----------------------------------------------------------*/
+/*--- Block recoverer program for bzip2                   ---*/
+/*---                                      bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* This program is a complete hack and should be rewritten properly.
+	 It isn't very complicated. */
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* This program records bit locations in the file to be recovered.
+   That means that if 64-bit ints are not supported, we will not
+   be able to recover .bz2 files over 512MB (2^32 bits) long.
+   On GNU supported platforms, we take advantage of the 64-bit
+   int support to circumvent this problem.  Ditto MSVC.
+
+   This change occurred in version 1.0.2; all prior versions have
+   the 512MB limitation.
+*/
+#ifdef __GNUC__
+   typedef  unsigned long long int  MaybeUInt64;
+#  define MaybeUInt64_FMT "%Lu"
+#else
+#ifdef _MSC_VER
+   typedef  unsigned __int64  MaybeUInt64;
+#  define MaybeUInt64_FMT "%I64u"
+#else
+   typedef  unsigned int   MaybeUInt64;
+#  define MaybeUInt64_FMT "%u"
+#endif
+#endif
+
+typedef  unsigned int   UInt32;
+typedef  int            Int32;
+typedef  unsigned char  UChar;
+typedef  char           Char;
+typedef  unsigned char  Bool;
+#define True    ((Bool)1)
+#define False   ((Bool)0)
+
+
+#define BZ_MAX_FILENAME 2000
+
+Char inFileName[BZ_MAX_FILENAME];
+Char outFileName[BZ_MAX_FILENAME];
+Char progName[BZ_MAX_FILENAME];
+
+MaybeUInt64 bytesOut = 0;
+MaybeUInt64 bytesIn  = 0;
+
+
+/*---------------------------------------------------*/
+/*--- Header bytes                                ---*/
+/*---------------------------------------------------*/
+
+#define BZ_HDR_B 0x42                         /* 'B' */
+#define BZ_HDR_Z 0x5a                         /* 'Z' */
+#define BZ_HDR_h 0x68                         /* 'h' */
+#define BZ_HDR_0 0x30                         /* '0' */
+ 
+
+/*---------------------------------------------------*/
+/*--- I/O errors                                  ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static void readError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void writeError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void mallocFail ( Int32 n )
+{
+   fprintf ( stderr,
+             "%s: malloc failed on request for %d bytes.\n",
+            progName, n );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void tooManyBlocks ( Int32 max_handled_blocks )
+{
+   fprintf ( stderr,
+             "%s: `%s' appears to contain more than %d blocks\n",
+            progName, inFileName, max_handled_blocks );
+   fprintf ( stderr,
+             "%s: and cannot be handled.  To fix, increase\n",
+             progName );
+   fprintf ( stderr, 
+             "%s: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct {
+      FILE*  handle;
+      Int32  buffer;
+      Int32  buffLive;
+      Char   mode;
+   }
+   BitStream;
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenReadStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'r';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenWriteStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'w';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static void bsPutBit ( BitStream* bs, Int32 bit )
+{
+   if (bs->buffLive == 8) {
+      Int32 retVal = putc ( (UChar) bs->buffer, bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      bs->buffLive = 1;
+      bs->buffer = bit & 0x1;
+   } else {
+      bs->buffer = ( (bs->buffer << 1) | (bit & 0x1) );
+      bs->buffLive++;
+   };
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Returns 0 or 1, or 2 to indicate EOF.
+--*/
+static Int32 bsGetBit ( BitStream* bs )
+{
+   if (bs->buffLive > 0) {
+      bs->buffLive --;
+      return ( ((bs->buffer) >> (bs->buffLive)) & 0x1 );
+   } else {
+      Int32 retVal = getc ( bs->handle );
+      if ( retVal == EOF ) {
+         if (errno != 0) readError();
+         return 2;
+      }
+      bs->buffLive = 7;
+      bs->buffer = retVal;
+      return ( ((bs->buffer) >> 7) & 0x1 );
+   }
+}
+
+
+/*---------------------------------------------*/
+static void bsClose ( BitStream* bs )
+{
+   Int32 retVal;
+
+   if ( bs->mode == 'w' ) {
+      while ( bs->buffLive < 8 ) {
+         bs->buffLive++;
+         bs->buffer <<= 1;
+      };
+      retVal = putc ( (UChar) (bs->buffer), bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      retVal = fflush ( bs->handle );
+      if (retVal == EOF) writeError();
+   }
+   retVal = fclose ( bs->handle );
+   if (retVal == EOF) {
+      if (bs->mode == 'w') writeError(); else readError();
+   }
+   free ( bs );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUChar ( BitStream* bs, UChar c )
+{
+   Int32 i;
+   for (i = 7; i >= 0; i--)
+      bsPutBit ( bs, (((UInt32) c) >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUInt32 ( BitStream* bs, UInt32 c )
+{
+   Int32 i;
+
+   for (i = 31; i >= 0; i--)
+      bsPutBit ( bs, (c >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static Bool endsInBz2 ( Char* name )
+{
+   Int32 n = strlen ( name );
+   if (n <= 4) return False;
+   return
+      (name[n-4] == '.' &&
+       name[n-3] == 'b' &&
+       name[n-2] == 'z' &&
+       name[n-1] == '2');
+}
+
+
+/*---------------------------------------------------*/
+/*---                                             ---*/
+/*---------------------------------------------------*/
+
+/* This logic isn't really right when it comes to Cygwin. */
+#ifdef _WIN32
+#  define  BZ_SPLIT_SYM  '\\'  /* path splitter on Windows platform */
+#else
+#  define  BZ_SPLIT_SYM  '/'   /* path splitter on Unix platform */
+#endif
+
+#define BLOCK_HEADER_HI  0x00003141UL
+#define BLOCK_HEADER_LO  0x59265359UL
+
+#define BLOCK_ENDMARK_HI 0x00001772UL
+#define BLOCK_ENDMARK_LO 0x45385090UL
+
+/* Increase if necessary.  However, a .bz2 file with > 50000 blocks
+   would have an uncompressed size of at least 40GB, so the chances
+   are low you'll need to up this.
+*/
+#define BZ_MAX_HANDLED_BLOCKS 50000
+
+MaybeUInt64 bStart [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 bEnd   [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbStart[BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbEnd  [BZ_MAX_HANDLED_BLOCKS];
+
+Int32 main ( Int32 argc, Char** argv )
+{
+   FILE*       inFile;
+   FILE*       outFile;
+   BitStream*  bsIn, *bsWr;
+   Int32       b, wrBlock, currBlock, rbCtr;
+   MaybeUInt64 bitsRead;
+
+   UInt32      buffHi, buffLo, blockCRC;
+   Char*       p;
+
+   strcpy ( progName, argv[0] );
+   inFileName[0] = outFileName[0] = 0;
+
+   fprintf ( stderr, 
+             "bzip2recover 1.0.6: extracts blocks from damaged .bz2 files.\n" );
+
+   if (argc != 2) {
+      fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
+                        progName, progName );
+      switch (sizeof(MaybeUInt64)) {
+         case 8:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: None\n");
+            break;
+         case 4:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: 512 MB\n");
+            fprintf(stderr, 
+                    "\tto circumvent, recompile with MaybeUInt64 as an\n"
+                    "\tunsigned 64-bit int.\n");
+            break;
+         default:
+            fprintf(stderr, 
+                    "\tsizeof(MaybeUInt64) is not 4 or 8 -- "
+                    "configuration error.\n");
+            break;
+      }
+      exit(1);
+   }
+
+   if (strlen(argv[1]) >= BZ_MAX_FILENAME-20) {
+      fprintf ( stderr, 
+                "%s: supplied filename is suspiciously (>= %d chars) long.  Bye!\n",
+                progName, (int)strlen(argv[1]) );
+      exit(1);
+   }
+
+   strcpy ( inFileName, argv[1] );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't read `%s'\n", progName, inFileName );
+      exit(1);
+   }
+
+   bsIn = bsOpenReadStream ( inFile );
+   fprintf ( stderr, "%s: searching for block boundaries ...\n", progName );
+
+   bitsRead = 0;
+   buffHi = buffLo = 0;
+   currBlock = 0;
+   bStart[currBlock] = 0;
+
+   rbCtr = 0;
+
+   while (True) {
+      b = bsGetBit ( bsIn );
+      bitsRead++;
+      if (b == 2) {
+         if (bitsRead >= bStart[currBlock] &&
+            (bitsRead - bStart[currBlock]) >= 40) {
+            bEnd[currBlock] = bitsRead-1;
+            if (currBlock > 0)
+               fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                                 " to " MaybeUInt64_FMT " (incomplete)\n",
+                         currBlock,  bStart[currBlock], bEnd[currBlock] );
+         } else
+            currBlock--;
+         break;
+      }
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if ( ( (buffHi & 0x0000ffff) == BLOCK_HEADER_HI 
+             && buffLo == BLOCK_HEADER_LO)
+           || 
+           ( (buffHi & 0x0000ffff) == BLOCK_ENDMARK_HI 
+             && buffLo == BLOCK_ENDMARK_LO)
+         ) {
+         if (bitsRead > 49) {
+            bEnd[currBlock] = bitsRead-49;
+         } else {
+            bEnd[currBlock] = 0;
+         }
+         if (currBlock > 0 &&
+	     (bEnd[currBlock] - bStart[currBlock]) >= 130) {
+            fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                              " to " MaybeUInt64_FMT "\n",
+                      rbCtr+1,  bStart[currBlock], bEnd[currBlock] );
+            rbStart[rbCtr] = bStart[currBlock];
+            rbEnd[rbCtr] = bEnd[currBlock];
+            rbCtr++;
+         }
+         if (currBlock >= BZ_MAX_HANDLED_BLOCKS)
+            tooManyBlocks(BZ_MAX_HANDLED_BLOCKS);
+         currBlock++;
+
+         bStart[currBlock] = bitsRead;
+      }
+   }
+
+   bsClose ( bsIn );
+
+   /*-- identified blocks run from 1 to rbCtr inclusive. --*/
+
+   if (rbCtr < 1) {
+      fprintf ( stderr,
+                "%s: sorry, I couldn't find any block boundaries.\n",
+                progName );
+      exit(1);
+   };
+
+   fprintf ( stderr, "%s: splitting into blocks\n", progName );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't open `%s'\n", progName, inFileName );
+      exit(1);
+   }
+   bsIn = bsOpenReadStream ( inFile );
+
+   /*-- placate gcc's dataflow analyser --*/
+   blockCRC = 0; bsWr = 0;
+
+   bitsRead = 0;
+   outFile = NULL;
+   wrBlock = 0;
+   while (True) {
+      b = bsGetBit(bsIn);
+      if (b == 2) break;
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if (bitsRead == 47+rbStart[wrBlock]) 
+         blockCRC = (buffHi << 16) | (buffLo >> 16);
+
+      if (outFile != NULL && bitsRead >= rbStart[wrBlock]
+                          && bitsRead <= rbEnd[wrBlock]) {
+         bsPutBit ( bsWr, b );
+      }
+
+      bitsRead++;
+
+      if (bitsRead == rbEnd[wrBlock]+1) {
+         if (outFile != NULL) {
+            bsPutUChar ( bsWr, 0x17 ); bsPutUChar ( bsWr, 0x72 );
+            bsPutUChar ( bsWr, 0x45 ); bsPutUChar ( bsWr, 0x38 );
+            bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
+            bsPutUInt32 ( bsWr, blockCRC );
+            bsClose ( bsWr );
+         }
+         if (wrBlock >= rbCtr) break;
+         wrBlock++;
+      } else
+      if (bitsRead == rbStart[wrBlock]) {
+         /* Create the output file name, correctly handling leading paths. 
+            (31.10.2001 by Sergey E. Kusikov) */
+         Char* split;
+         Int32 ofs, k;
+         for (k = 0; k < BZ_MAX_FILENAME; k++) 
+            outFileName[k] = 0;
+         strcpy (outFileName, inFileName);
+         split = strrchr (outFileName, BZ_SPLIT_SYM);
+         if (split == NULL) {
+            split = outFileName;
+         } else {
+            ++split;
+	 }
+	 /* Now split points to the start of the basename. */
+         ofs  = split - outFileName;
+         sprintf (split, "rec%5d", wrBlock+1);
+         for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
+         strcat (outFileName, inFileName + ofs);
+
+         if ( !endsInBz2(outFileName)) strcat ( outFileName, ".bz2" );
+
+         fprintf ( stderr, "   writing block %d to `%s' ...\n",
+                           wrBlock+1, outFileName );
+
+         outFile = fopen ( outFileName, "wb" );
+         if (outFile == NULL) {
+            fprintf ( stderr, "%s: can't write `%s'\n",
+                      progName, outFileName );
+            exit(1);
+         }
+         bsWr = bsOpenWriteStream ( outFile );
+         bsPutUChar ( bsWr, BZ_HDR_B );    
+         bsPutUChar ( bsWr, BZ_HDR_Z );    
+         bsPutUChar ( bsWr, BZ_HDR_h );    
+         bsPutUChar ( bsWr, BZ_HDR_0 + 9 );
+         bsPutUChar ( bsWr, 0x31 ); bsPutUChar ( bsWr, 0x41 );
+         bsPutUChar ( bsWr, 0x59 ); bsPutUChar ( bsWr, 0x26 );
+         bsPutUChar ( bsWr, 0x53 ); bsPutUChar ( bsWr, 0x59 );
+      }
+   }
+
+   fprintf ( stderr, "%s: finished\n", progName );
+   return 0;
+}
+
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                  bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzlib.c
@@ -0,0 +1,1572 @@
+
+/*-------------------------------------------------------------*/
+/*--- Library top-level functions.                          ---*/
+/*---                                               bzlib.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* CHANGES
+   0.9.0    -- original version.
+   0.9.0a/b -- no changes in this file.
+   0.9.0c   -- made zero-length BZ_FLUSH work correctly in bzCompress().
+     fixed bzWrite/bzRead to ignore zero-length requests.
+     fixed bzread to correctly handle read requests after EOF.
+     wrong parameter order in call to bzDecompressInit in
+     bzBuffToBuffDecompress.  Fixed.
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Compression stuff                           ---*/
+/*---------------------------------------------------*/
+
+
+/*---------------------------------------------------*/
+#ifndef BZ_NO_STDIO
+void BZ2_bz__AssertH__fail ( int errcode )
+{
+   fprintf(stderr, 
+      "\n\nbzip2/libbzip2: internal error number %d.\n"
+      "This is a bug in bzip2/libbzip2, %s.\n"
+      "Please report it to me at: jseward@bzip.org.  If this happened\n"
+      "when you were using some program which uses libbzip2 as a\n"
+      "component, you should also report this bug to the author(s)\n"
+      "of that program.  Please make an effort to report this bug;\n"
+      "timely and accurate bug reports eventually lead to higher\n"
+      "quality software.  Thanks.  Julian Seward, 10 December 2007.\n\n",
+      errcode,
+      BZ2_bzlibVersion()
+   );
+
+   if (errcode == 1007) {
+   fprintf(stderr,
+      "\n*** A special note about internal error number 1007 ***\n"
+      "\n"
+      "Experience suggests that a common cause of i.e. 1007\n"
+      "is unreliable memory or other hardware.  The 1007 assertion\n"
+      "just happens to cross-check the results of huge numbers of\n"
+      "memory reads/writes, and so acts (unintendedly) as a stress\n"
+      "test of your memory system.\n"
+      "\n"
+      "I suggest the following: try compressing the file again,\n"
+      "possibly monitoring progress in detail with the -vv flag.\n"
+      "\n"
+      "* If the error cannot be reproduced, and/or happens at different\n"
+      "  points in compression, you may have a flaky memory system.\n"
+      "  Try a memory-test program.  I have used Memtest86\n"
+      "  (www.memtest86.com).  At the time of writing it is free (GPLd).\n"
+      "  Memtest86 tests memory much more thorougly than your BIOSs\n"
+      "  power-on test, and may find failures that the BIOS doesn't.\n"
+      "\n"
+      "* If the error can be repeatably reproduced, this is a bug in\n"
+      "  bzip2, and I would very much like to hear about it.  Please\n"
+      "  let me know, and, ideally, save a copy of the file causing the\n"
+      "  problem -- without which I will be unable to investigate it.\n"
+      "\n"
+   );
+   }
+
+   exit(3);
+}
+#endif
+
+
+/*---------------------------------------------------*/
+static
+int bz_config_ok ( void )
+{
+   if (sizeof(int)   != 4) return 0;
+   if (sizeof(short) != 2) return 0;
+   if (sizeof(char)  != 1) return 0;
+   return 1;
+}
+
+
+/*---------------------------------------------------*/
+static
+void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
+{
+   void* v = malloc ( items * size );
+   return v;
+}
+
+static
+void default_bzfree ( void* opaque, void* addr )
+{
+   if (addr != NULL) free ( addr );
+}
+
+
+/*---------------------------------------------------*/
+static
+void prepare_new_block ( EState* s )
+{
+   Int32 i;
+   s->nblock = 0;
+   s->numZ = 0;
+   s->state_out_pos = 0;
+   BZ_INITIALISE_CRC ( s->blockCRC );
+   for (i = 0; i < 256; i++) s->inUse[i] = False;
+   s->blockNo++;
+}
+
+
+/*---------------------------------------------------*/
+static
+void init_RL ( EState* s )
+{
+   s->state_in_ch  = 256;
+   s->state_in_len = 0;
+}
+
+
+static
+Bool isempty_RL ( EState* s )
+{
+   if (s->state_in_ch < 256 && s->state_in_len > 0)
+      return False; else
+      return True;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressInit) 
+                    ( bz_stream* strm, 
+                     int        blockSize100k,
+                     int        verbosity,
+                     int        workFactor )
+{
+   Int32   n;
+   EState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL || 
+       blockSize100k < 1 || blockSize100k > 9 ||
+       workFactor < 0 || workFactor > 250)
+     return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(EState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm = strm;
+
+   s->arr1 = NULL;
+   s->arr2 = NULL;
+   s->ftab = NULL;
+
+   n       = 100000 * blockSize100k;
+   s->arr1 = BZALLOC( n                  * sizeof(UInt32) );
+   s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
+   s->ftab = BZALLOC( 65537              * sizeof(UInt32) );
+
+   if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
+      if (s->arr1 != NULL) BZFREE(s->arr1);
+      if (s->arr2 != NULL) BZFREE(s->arr2);
+      if (s->ftab != NULL) BZFREE(s->ftab);
+      if (s       != NULL) BZFREE(s);
+      return BZ_MEM_ERROR;
+   }
+
+   s->blockNo           = 0;
+   s->state             = BZ_S_INPUT;
+   s->mode              = BZ_M_RUNNING;
+   s->combinedCRC       = 0;
+   s->blockSize100k     = blockSize100k;
+   s->nblockMAX         = 100000 * blockSize100k - 19;
+   s->verbosity         = verbosity;
+   s->workFactor        = workFactor;
+
+   s->block             = (UChar*)s->arr2;
+   s->mtfv              = (UInt16*)s->arr1;
+   s->zbits             = NULL;
+   s->ptr               = (UInt32*)s->arr1;
+
+   strm->state          = s;
+   strm->total_in_lo32  = 0;
+   strm->total_in_hi32  = 0;
+   strm->total_out_lo32 = 0;
+   strm->total_out_hi32 = 0;
+   init_RL ( s );
+   prepare_new_block ( s );
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+static
+void add_pair_to_block ( EState* s )
+{
+   Int32 i;
+   UChar ch = (UChar)(s->state_in_ch);
+   for (i = 0; i < s->state_in_len; i++) {
+      BZ_UPDATE_CRC( s->blockCRC, ch );
+   }
+   s->inUse[s->state_in_ch] = True;
+   switch (s->state_in_len) {
+      case 1:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 2:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 3:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      default:
+         s->inUse[s->state_in_len-4] = True;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = ((UChar)(s->state_in_len-4));
+         s->nblock++;
+         break;
+   }
+}
+
+
+/*---------------------------------------------------*/
+static
+void flush_RL ( EState* s )
+{
+   if (s->state_in_ch < 256) add_pair_to_block ( s );
+   init_RL ( s );
+}
+
+
+/*---------------------------------------------------*/
+#define ADD_CHAR_TO_BLOCK(zs,zchh0)               \
+{                                                 \
+   UInt32 zchh = (UInt32)(zchh0);                 \
+   /*-- fast track the common case --*/           \
+   if (zchh != zs->state_in_ch &&                 \
+       zs->state_in_len == 1) {                   \
+      UChar ch = (UChar)(zs->state_in_ch);        \
+      BZ_UPDATE_CRC( zs->blockCRC, ch );          \
+      zs->inUse[zs->state_in_ch] = True;          \
+      zs->block[zs->nblock] = (UChar)ch;          \
+      zs->nblock++;                               \
+      zs->state_in_ch = zchh;                     \
+   }                                              \
+   else                                           \
+   /*-- general, uncommon cases --*/              \
+   if (zchh != zs->state_in_ch ||                 \
+      zs->state_in_len == 255) {                  \
+      if (zs->state_in_ch < 256)                  \
+         add_pair_to_block ( zs );                \
+      zs->state_in_ch = zchh;                     \
+      zs->state_in_len = 1;                       \
+   } else {                                       \
+      zs->state_in_len++;                         \
+   }                                              \
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_input_until_stop ( EState* s )
+{
+   Bool progress_in = False;
+
+   if (s->mode == BZ_M_RUNNING) {
+
+      /*-- fast track the common case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         s->strm->next_in++;
+         s->strm->avail_in--;
+         s->strm->total_in_lo32++;
+         if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+      }
+
+   } else {
+
+      /*-- general, uncommon case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         /*-- flush/finish end? --*/
+         if (s->avail_in_expect == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         s->strm->next_in++;
+         s->strm->avail_in--;
+         s->strm->total_in_lo32++;
+         if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+         s->avail_in_expect--;
+      }
+   }
+   return progress_in;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_output_until_stop ( EState* s )
+{
+   Bool progress_out = False;
+
+   while (True) {
+
+      /*-- no output space? --*/
+      if (s->strm->avail_out == 0) break;
+
+      /*-- block done? --*/
+      if (s->state_out_pos >= s->numZ) break;
+
+      progress_out = True;
+      *(s->strm->next_out) = s->zbits[s->state_out_pos];
+      s->state_out_pos++;
+      s->strm->avail_out--;
+      s->strm->next_out++;
+      s->strm->total_out_lo32++;
+      if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+   }
+
+   return progress_out;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool handle_compress ( bz_stream* strm )
+{
+   Bool progress_in  = False;
+   Bool progress_out = False;
+   EState* s = strm->state;
+   
+   while (True) {
+
+      if (s->state == BZ_S_OUTPUT) {
+         progress_out |= copy_output_until_stop ( s );
+         if (s->state_out_pos < s->numZ) break;
+         if (s->mode == BZ_M_FINISHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+         prepare_new_block ( s );
+         s->state = BZ_S_INPUT;
+         if (s->mode == BZ_M_FLUSHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+      }
+
+      if (s->state == BZ_S_INPUT) {
+         progress_in |= copy_input_until_stop ( s );
+         if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
+            flush_RL ( s );
+            BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->nblock >= s->nblockMAX) {
+            BZ2_compressBlock ( s, False );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->strm->avail_in == 0) {
+            break;
+         }
+      }
+
+   }
+
+   return progress_in || progress_out;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
+{
+   Bool progress;
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   preswitch:
+   switch (s->mode) {
+
+      case BZ_M_IDLE:
+         return BZ_SEQUENCE_ERROR;
+
+      case BZ_M_RUNNING:
+         if (action == BZ_RUN) {
+            progress = handle_compress ( strm );
+            return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
+         } 
+         else
+	 if (action == BZ_FLUSH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FLUSHING;
+            goto preswitch;
+         }
+         else
+         if (action == BZ_FINISH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FINISHING;
+            goto preswitch;
+         }
+         else 
+            return BZ_PARAM_ERROR;
+
+      case BZ_M_FLUSHING:
+         if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
+         s->mode = BZ_M_RUNNING;
+         return BZ_RUN_OK;
+
+      case BZ_M_FINISHING:
+         if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (!progress) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FINISH_OK;
+         s->mode = BZ_M_IDLE;
+         return BZ_STREAM_END;
+   }
+   return BZ_OK; /*--not reached--*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressEnd)  ( bz_stream *strm )
+{
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->arr1 != NULL) BZFREE(s->arr1);
+   if (s->arr2 != NULL) BZFREE(s->arr2);
+   if (s->ftab != NULL) BZFREE(s->ftab);
+   BZFREE(strm->state);
+
+   strm->state = NULL;   
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/*--- Decompression stuff                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressInit) 
+                     ( bz_stream* strm, 
+                       int        verbosity,
+                       int        small )
+{
+   DState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   if (small != 0 && small != 1) return BZ_PARAM_ERROR;
+   if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
+
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(DState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm                  = strm;
+   strm->state              = s;
+   s->state                 = BZ_X_MAGIC_1;
+   s->bsLive                = 0;
+   s->bsBuff                = 0;
+   s->calculatedCombinedCRC = 0;
+   strm->total_in_lo32      = 0;
+   strm->total_in_hi32      = 0;
+   strm->total_out_lo32     = 0;
+   strm->total_out_hi32     = 0;
+   s->smallDecompress       = (Bool)small;
+   s->ll4                   = NULL;
+   s->ll16                  = NULL;
+   s->tt                    = NULL;
+   s->currBlockNo           = 0;
+   s->verbosity             = verbosity;
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_FAST ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+               
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      /* restore */
+      UInt32        c_calculatedBlockCRC = s->calculatedBlockCRC;
+      UChar         c_state_out_ch       = s->state_out_ch;
+      Int32         c_state_out_len      = s->state_out_len;
+      Int32         c_nblock_used        = s->nblock_used;
+      Int32         c_k0                 = s->k0;
+      UInt32*       c_tt                 = s->tt;
+      UInt32        c_tPos               = s->tPos;
+      char*         cs_next_out          = s->strm->next_out;
+      unsigned int  cs_avail_out         = s->strm->avail_out;
+      Int32         ro_blockSize100k     = s->blockSize100k;
+      /* end restore */
+
+      UInt32       avail_out_INIT = cs_avail_out;
+      Int32        s_save_nblockPP = s->save_nblock+1;
+      unsigned int total_out_lo32_old;
+
+      while (True) {
+
+         /* try to finish existing run */
+         if (c_state_out_len > 0) {
+            while (True) {
+               if (cs_avail_out == 0) goto return_notr;
+               if (c_state_out_len == 1) break;
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               c_state_out_len--;
+               cs_next_out++;
+               cs_avail_out--;
+            }
+            s_state_out_len_eq_one:
+            {
+               if (cs_avail_out == 0) { 
+                  c_state_out_len = 1; goto return_notr;
+               };
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               cs_next_out++;
+               cs_avail_out--;
+            }
+         }   
+         /* Only caused by corrupt data stream? */
+         if (c_nblock_used > s_save_nblockPP)
+            return True;
+
+         /* can a new run be started? */
+         if (c_nblock_used == s_save_nblockPP) {
+            c_state_out_len = 0; goto return_notr;
+         };   
+         c_state_out_ch = c_k0;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (k1 != c_k0) { 
+            c_k0 = k1; goto s_state_out_len_eq_one; 
+         };
+         if (c_nblock_used == s_save_nblockPP) 
+            goto s_state_out_len_eq_one;
+   
+         c_state_out_len = 2;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         c_state_out_len = 3;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         c_state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST_C(c_k0); c_nblock_used++;
+      }
+
+      return_notr:
+      total_out_lo32_old = s->strm->total_out_lo32;
+      s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
+      if (s->strm->total_out_lo32 < total_out_lo32_old)
+         s->strm->total_out_hi32++;
+
+      /* save */
+      s->calculatedBlockCRC = c_calculatedBlockCRC;
+      s->state_out_ch       = c_state_out_ch;
+      s->state_out_len      = c_state_out_len;
+      s->nblock_used        = c_nblock_used;
+      s->k0                 = c_k0;
+      s->tt                 = c_tt;
+      s->tPos               = c_tPos;
+      s->strm->next_out     = cs_next_out;
+      s->strm->avail_out    = cs_avail_out;
+      /* end save */
+   }
+   return False;
+}
+
+
+
+/*---------------------------------------------------*/
+__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
+{
+   Int32 nb, na, mid;
+   nb = 0;
+   na = 256;
+   do {
+      mid = (nb + na) >> 1;
+      if (indx >= cftab[mid]) nb = mid; else na = mid;
+   }
+   while (na - nb != 1);
+   return nb;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_SMALL ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); s->nblock_used++;
+      }
+
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
+{
+   Bool    corrupt;
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   while (True) {
+      if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
+      if (s->state == BZ_X_OUTPUT) {
+         if (s->smallDecompress)
+            corrupt = unRLE_obuf_to_output_SMALL ( s ); else
+            corrupt = unRLE_obuf_to_output_FAST  ( s );
+         if (corrupt) return BZ_DATA_ERROR;
+         if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
+            BZ_FINALISE_CRC ( s->calculatedBlockCRC );
+            if (s->verbosity >= 3) 
+               VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, 
+                          s->calculatedBlockCRC );
+            if (s->verbosity >= 2) VPrintf0 ( "]" );
+            if (s->calculatedBlockCRC != s->storedBlockCRC)
+               return BZ_DATA_ERROR;
+            s->calculatedCombinedCRC 
+               = (s->calculatedCombinedCRC << 1) | 
+                    (s->calculatedCombinedCRC >> 31);
+            s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
+            s->state = BZ_X_BLKHDR_1;
+         } else {
+            return BZ_OK;
+         }
+      }
+      if (s->state >= BZ_X_MAGIC_1) {
+         Int32 r = BZ2_decompress ( s );
+         if (r == BZ_STREAM_END) {
+            if (s->verbosity >= 3)
+               VPrintf2 ( "\n    combined CRCs: stored = 0x%08x, computed = 0x%08x", 
+                          s->storedCombinedCRC, s->calculatedCombinedCRC );
+            if (s->calculatedCombinedCRC != s->storedCombinedCRC)
+               return BZ_DATA_ERROR;
+            return r;
+         }
+         if (s->state != BZ_X_OUTPUT) return r;
+      }
+   }
+
+   AssertH ( 0, 6001 );
+
+   return 0;  /*NOTREACHED*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressEnd)  ( bz_stream *strm )
+{
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->tt   != NULL) BZFREE(s->tt);
+   if (s->ll16 != NULL) BZFREE(s->ll16);
+   if (s->ll4  != NULL) BZFREE(s->ll4);
+
+   BZFREE(strm->state);
+   strm->state = NULL;
+
+   return BZ_OK;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+/*--- File I/O stuff                              ---*/
+/*---------------------------------------------------*/
+
+#define BZ_SETERR(eee)                    \
+{                                         \
+   if (bzerror != NULL) *bzerror = eee;   \
+   if (bzf != NULL) bzf->lastErr = eee;   \
+}
+
+typedef 
+   struct {
+      FILE*     handle;
+      Char      buf[BZ_MAX_UNUSED];
+      Int32     bufN;
+      Bool      writing;
+      bz_stream strm;
+      Int32     lastErr;
+      Bool      initialisedOk;
+   }
+   bzFile;
+
+
+/*---------------------------------------------*/
+static Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzWriteOpen) 
+                    ( int*  bzerror,      
+                      FILE* f, 
+                      int   blockSize100k, 
+                      int   verbosity,
+                      int   workFactor )
+{
+   Int32   ret;
+   bzFile* bzf = NULL;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL ||
+       (blockSize100k < 1 || blockSize100k > 9) ||
+       (workFactor < 0 || workFactor > 250) ||
+       (verbosity < 0 || verbosity > 4))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+   bzf->initialisedOk = False;
+   bzf->bufN          = 0;
+   bzf->handle        = f;
+   bzf->writing       = True;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+
+   if (workFactor == 0) workFactor = 30;
+   ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = 0;
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWrite)
+             ( int*    bzerror, 
+               BZFILE* b, 
+               void*   buf, 
+               int     len )
+{
+   Int32 n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return; };
+
+   bzf->strm.avail_in = len;
+   bzf->strm.next_in  = buf;
+
+   while (True) {
+      bzf->strm.avail_out = BZ_MAX_UNUSED;
+      bzf->strm.next_out = bzf->buf;
+      ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
+      if (ret != BZ_RUN_OK)
+         { BZ_SETERR(ret); return; };
+
+      if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+         n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+         n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                       n, bzf->handle );
+         if (n != n2 || ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return; };
+      }
+
+      if (bzf->strm.avail_in == 0)
+         { BZ_SETERR(BZ_OK); return; };
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWriteClose)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in,
+                    unsigned int* nbytes_out )
+{
+   BZ2_bzWriteClose64 ( bzerror, b, abandon, 
+                        nbytes_in, NULL, nbytes_out, NULL );
+}
+
+
+void BZ_API(BZ2_bzWriteClose64)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in_lo32,
+                    unsigned int* nbytes_in_hi32,
+                    unsigned int* nbytes_out_lo32,
+                    unsigned int* nbytes_out_hi32 )
+{
+   Int32   n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
+   if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
+   if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
+   if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
+
+   if ((!abandon) && bzf->lastErr == BZ_OK) {
+      while (True) {
+         bzf->strm.avail_out = BZ_MAX_UNUSED;
+         bzf->strm.next_out = bzf->buf;
+         ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
+         if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
+            { BZ_SETERR(ret); return; };
+
+         if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+            n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+            n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                          n, bzf->handle );
+            if (n != n2 || ferror(bzf->handle))
+               { BZ_SETERR(BZ_IO_ERROR); return; };
+         }
+
+         if (ret == BZ_STREAM_END) break;
+      }
+   }
+
+   if ( !abandon && !ferror ( bzf->handle ) ) {
+      fflush ( bzf->handle );
+      if (ferror(bzf->handle))
+         { BZ_SETERR(BZ_IO_ERROR); return; };
+   }
+
+   if (nbytes_in_lo32 != NULL)
+      *nbytes_in_lo32 = bzf->strm.total_in_lo32;
+   if (nbytes_in_hi32 != NULL)
+      *nbytes_in_hi32 = bzf->strm.total_in_hi32;
+   if (nbytes_out_lo32 != NULL)
+      *nbytes_out_lo32 = bzf->strm.total_out_lo32;
+   if (nbytes_out_hi32 != NULL)
+      *nbytes_out_hi32 = bzf->strm.total_out_hi32;
+
+   BZ_SETERR(BZ_OK);
+   BZ2_bzCompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzReadOpen) 
+                   ( int*  bzerror, 
+                     FILE* f, 
+                     int   verbosity,
+                     int   small,
+                     void* unused,
+                     int   nUnused )
+{
+   bzFile* bzf = NULL;
+   int     ret;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL || 
+       (small != 0 && small != 1) ||
+       (verbosity < 0 || verbosity > 4) ||
+       (unused == NULL && nUnused != 0) ||
+       (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL) 
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+
+   bzf->initialisedOk = False;
+   bzf->handle        = f;
+   bzf->bufN          = 0;
+   bzf->writing       = False;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+   
+   while (nUnused > 0) {
+      bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
+      unused = ((void*)( 1 + ((UChar*)(unused))  ));
+      nUnused--;
+   }
+
+   ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = bzf->bufN;
+   bzf->strm.next_in  = bzf->buf;
+
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
+{
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+
+   if (bzf->initialisedOk)
+      (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzRead) 
+           ( int*    bzerror, 
+             BZFILE* b, 
+             void*   buf, 
+             int     len )
+{
+   Int32   n, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return 0; };
+
+   bzf->strm.avail_out = len;
+   bzf->strm.next_out = buf;
+
+   while (True) {
+
+      if (ferror(bzf->handle)) 
+         { BZ_SETERR(BZ_IO_ERROR); return 0; };
+
+      if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) {
+         n = fread ( bzf->buf, sizeof(UChar), 
+                     BZ_MAX_UNUSED, bzf->handle );
+         if (ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return 0; };
+         bzf->bufN = n;
+         bzf->strm.avail_in = bzf->bufN;
+         bzf->strm.next_in = bzf->buf;
+      }
+
+      ret = BZ2_bzDecompress ( &(bzf->strm) );
+
+      if (ret != BZ_OK && ret != BZ_STREAM_END)
+         { BZ_SETERR(ret); return 0; };
+
+      if (ret == BZ_OK && myfeof(bzf->handle) && 
+          bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
+         { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
+
+      if (ret == BZ_STREAM_END)
+         { BZ_SETERR(BZ_STREAM_END);
+           return len - bzf->strm.avail_out; };
+      if (bzf->strm.avail_out == 0)
+         { BZ_SETERR(BZ_OK); return len; };
+      
+   }
+
+   return 0; /*not reached*/
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadGetUnused) 
+                     ( int*    bzerror, 
+                       BZFILE* b, 
+                       void**  unused, 
+                       int*    nUnused )
+{
+   bzFile* bzf = (bzFile*)b;
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (bzf->lastErr != BZ_STREAM_END)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (unused == NULL || nUnused == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+
+   BZ_SETERR(BZ_OK);
+   *nUnused = bzf->strm.avail_in;
+   *unused = bzf->strm.next_in;
+}
+#endif
+
+
+/*---------------------------------------------------*/
+/*--- Misc convenience stuff                      ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffCompress) 
+                         ( char*         dest, 
+                           unsigned int* destLen,
+                           char*         source, 
+                           unsigned int  sourceLen,
+                           int           blockSize100k, 
+                           int           verbosity, 
+                           int           workFactor )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       blockSize100k < 1 || blockSize100k > 9 ||
+       verbosity < 0 || verbosity > 4 ||
+       workFactor < 0 || workFactor > 250) 
+      return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzCompressInit ( &strm, blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzCompress ( &strm, BZ_FINISH );
+   if (ret == BZ_FINISH_OK) goto output_overflow;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;   
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow:
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OUTBUFF_FULL;
+
+   errhandler:
+   BZ2_bzCompressEnd ( &strm );
+   return ret;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffDecompress) 
+                           ( char*         dest, 
+                             unsigned int* destLen,
+                             char*         source, 
+                             unsigned int  sourceLen,
+                             int           small,
+                             int           verbosity )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       (small != 0 && small != 1) ||
+       verbosity < 0 || verbosity > 4) 
+          return BZ_PARAM_ERROR;
+
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzDecompressInit ( &strm, verbosity, small );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzDecompress ( &strm );
+   if (ret == BZ_OK) goto output_overflow_or_eof;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;
+   BZ2_bzDecompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow_or_eof:
+   if (strm.avail_out > 0) {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_UNEXPECTED_EOF;
+   } else {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_OUTBUFF_FULL;
+   };      
+
+   errhandler:
+   BZ2_bzDecompressEnd ( &strm );
+   return ret; 
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+/*--
+   return version like "0.9.5d, 4-Sept-1999".
+--*/
+const char * BZ_API(BZ2_bzlibVersion)(void)
+{
+   return BZ_VERSION;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+
+#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
+#   include <fcntl.h>
+#   include <io.h>
+#   define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
+#else
+#   define SET_BINARY_MODE(file)
+#endif
+static
+BZFILE * bzopen_or_bzdopen
+               ( const char *path,   /* no use when bzdopen */
+                 int fd,             /* no use when bzdopen */
+                 const char *mode,
+                 int open_mode)      /* bzopen: 0, bzdopen:1 */
+{
+   int    bzerr;
+   char   unused[BZ_MAX_UNUSED];
+   int    blockSize100k = 9;
+   int    writing       = 0;
+   char   mode2[10]     = "";
+   FILE   *fp           = NULL;
+   BZFILE *bzfp         = NULL;
+   int    verbosity     = 0;
+   int    workFactor    = 30;
+   int    smallMode     = 0;
+   int    nUnused       = 0; 
+
+   if (mode == NULL) return NULL;
+   while (*mode) {
+      switch (*mode) {
+      case 'r':
+         writing = 0; break;
+      case 'w':
+         writing = 1; break;
+      case 's':
+         smallMode = 1; break;
+      default:
+         if (isdigit((int)(*mode))) {
+            blockSize100k = *mode-BZ_HDR_0;
+         }
+      }
+      mode++;
+   }
+   strcat(mode2, writing ? "w" : "r" );
+   strcat(mode2,"b");   /* binary mode */
+
+   if (open_mode==0) {
+      if (path==NULL || strcmp(path,"")==0) {
+        fp = (writing ? stdout : stdin);
+        SET_BINARY_MODE(fp);
+      } else {
+        fp = fopen(path,mode2);
+      }
+   } else {
+#ifdef BZ_STRICT_ANSI
+      fp = NULL;
+#else
+      fp = fdopen(fd,mode2);
+#endif
+   }
+   if (fp == NULL) return NULL;
+
+   if (writing) {
+      /* Guard against total chaos and anarchy -- JRS */
+      if (blockSize100k < 1) blockSize100k = 1;
+      if (blockSize100k > 9) blockSize100k = 9; 
+      bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
+                             verbosity,workFactor);
+   } else {
+      bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
+                            unused,nUnused);
+   }
+   if (bzfp == NULL) {
+      if (fp != stdin && fp != stdout) fclose(fp);
+      return NULL;
+   }
+   return bzfp;
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   open file for read or write.
+      ex) bzopen("file","w9")
+      case path="" or NULL => use stdin or stdout.
+--*/
+BZFILE * BZ_API(BZ2_bzopen)
+               ( const char *path,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
+}
+
+
+/*---------------------------------------------------*/
+BZFILE * BZ_API(BZ2_bzdopen)
+               ( int fd,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
+{
+   int bzerr, nread;
+   if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
+   nread = BZ2_bzRead(&bzerr,b,buf,len);
+   if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
+      return nread;
+   } else {
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
+{
+   int bzerr;
+
+   BZ2_bzWrite(&bzerr,b,buf,len);
+   if(bzerr == BZ_OK){
+      return len;
+   }else{
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzflush) (BZFILE *b)
+{
+   /* do nothing now... */
+   return 0;
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzclose) (BZFILE* b)
+{
+   int bzerr;
+   FILE *fp;
+   
+   if (b==NULL) {return;}
+   fp = ((bzFile *)b)->handle;
+   if(((bzFile*)b)->writing){
+      BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
+      if(bzerr != BZ_OK){
+         BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
+      }
+   }else{
+      BZ2_bzReadClose(&bzerr,b);
+   }
+   if(fp!=stdin && fp!=stdout){
+      fclose(fp);
+   }
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   return last error code 
+--*/
+static const char *bzerrorstrings[] = {
+       "OK"
+      ,"SEQUENCE_ERROR"
+      ,"PARAM_ERROR"
+      ,"MEM_ERROR"
+      ,"DATA_ERROR"
+      ,"DATA_ERROR_MAGIC"
+      ,"IO_ERROR"
+      ,"UNEXPECTED_EOF"
+      ,"OUTBUFF_FULL"
+      ,"CONFIG_ERROR"
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+};
+
+
+const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
+{
+   int err = ((bzFile *)b)->lastErr;
+
+   if(err>0) err = 0;
+   *errnum = err;
+   return bzerrorstrings[err*-1];
+}
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzlib.h
@@ -0,0 +1,282 @@
+
+/*-------------------------------------------------------------*/
+/*--- Public header file for the library.                   ---*/
+/*---                                               bzlib.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_H
+#define _BZLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BZ_RUN               0
+#define BZ_FLUSH             1
+#define BZ_FINISH            2
+
+#define BZ_OK                0
+#define BZ_RUN_OK            1
+#define BZ_FLUSH_OK          2
+#define BZ_FINISH_OK         3
+#define BZ_STREAM_END        4
+#define BZ_SEQUENCE_ERROR    (-1)
+#define BZ_PARAM_ERROR       (-2)
+#define BZ_MEM_ERROR         (-3)
+#define BZ_DATA_ERROR        (-4)
+#define BZ_DATA_ERROR_MAGIC  (-5)
+#define BZ_IO_ERROR          (-6)
+#define BZ_UNEXPECTED_EOF    (-7)
+#define BZ_OUTBUFF_FULL      (-8)
+#define BZ_CONFIG_ERROR      (-9)
+
+typedef 
+   struct {
+      char *next_in;
+      unsigned int avail_in;
+      unsigned int total_in_lo32;
+      unsigned int total_in_hi32;
+
+      char *next_out;
+      unsigned int avail_out;
+      unsigned int total_out_lo32;
+      unsigned int total_out_hi32;
+
+      void *state;
+
+      void *(*bzalloc)(void *,int,int);
+      void (*bzfree)(void *,void *);
+      void *opaque;
+   } 
+   bz_stream;
+
+
+#ifndef BZ_IMPORT
+#define BZ_EXPORT
+#endif
+
+#ifndef BZ_NO_STDIO
+/* Need a definitition for FILE */
+#include <stdio.h>
+#endif
+
+#ifdef _WIN32
+#   include <windows.h>
+#   ifdef small
+      /* windows.h define small to char */
+#      undef small
+#   endif
+#   ifdef BZ_EXPORT
+#   define BZ_API(func) WINAPI func
+#   define BZ_EXTERN extern
+#   else
+   /* import windows dll dynamically */
+#   define BZ_API(func) (WINAPI * func)
+#   define BZ_EXTERN
+#   endif
+#else
+#   define BZ_API(func) func
+#   define BZ_EXTERN extern
+#endif
+
+
+/*-- Core (low-level) library functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( 
+      bz_stream* strm, 
+      int        blockSize100k, 
+      int        verbosity, 
+      int        workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompress) ( 
+      bz_stream* strm, 
+      int action 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( 
+      bz_stream *strm, 
+      int       verbosity, 
+      int       small
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( 
+      bz_stream *strm 
+   );
+
+
+
+/*-- High(er) level library functions --*/
+
+#ifndef BZ_NO_STDIO
+#define BZ_MAX_UNUSED 5000
+
+typedef void BZFILE;
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( 
+      int*  bzerror,   
+      FILE* f, 
+      int   verbosity, 
+      int   small,
+      void* unused,    
+      int   nUnused 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( 
+      int*    bzerror, 
+      BZFILE* b 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void**  unused,  
+      int*    nUnused 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzRead) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( 
+      int*  bzerror,      
+      FILE* f, 
+      int   blockSize100k, 
+      int   verbosity, 
+      int   workFactor 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWrite) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in, 
+      unsigned int* nbytes_out 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in_lo32, 
+      unsigned int* nbytes_in_hi32, 
+      unsigned int* nbytes_out_lo32, 
+      unsigned int* nbytes_out_hi32
+   );
+#endif
+
+
+/*-- Utility functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           blockSize100k, 
+      int           verbosity, 
+      int           workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           small, 
+      int           verbosity 
+   );
+
+
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+
+BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
+      void
+   );
+
+#ifndef BZ_NO_STDIO
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
+      const char *path,
+      const char *mode
+   );
+
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
+      int        fd,
+      const char *mode
+   );
+         
+BZ_EXTERN int BZ_API(BZ2_bzread) (
+      BZFILE* b, 
+      void* buf, 
+      int len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzwrite) (
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzflush) (
+      BZFILE* b
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzclose) (
+      BZFILE* b
+   );
+
+BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
+      BZFILE *b, 
+      int    *errnum
+   );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.h ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzlib_private.h
@@ -0,0 +1,509 @@
+
+/*-------------------------------------------------------------*/
+/*--- Private header file for the library.                  ---*/
+/*---                                       bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_PRIVATE_H
+#define _BZLIB_PRIVATE_H
+
+#include <stdlib.h>
+
+#ifndef BZ_NO_STDIO
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#endif
+
+#include "bzlib.h"
+
+
+
+/*-- General stuff. --*/
+
+#define BZ_VERSION  "1.0.6, 6-Sept-2010"
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+#ifndef __GNUC__
+#define __inline__  /* */
+#endif 
+
+#ifndef BZ_NO_STDIO
+
+extern void BZ2_bz__AssertH__fail ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
+
+#if BZ_DEBUG
+#define AssertD(cond,msg) \
+   { if (!(cond)) {       \
+      fprintf ( stderr,   \
+        "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
+      exit(1); \
+   }}
+#else
+#define AssertD(cond,msg) /* */
+#endif
+
+#define VPrintf0(zf) \
+   fprintf(stderr,zf)
+#define VPrintf1(zf,za1) \
+   fprintf(stderr,zf,za1)
+#define VPrintf2(zf,za1,za2) \
+   fprintf(stderr,zf,za1,za2)
+#define VPrintf3(zf,za1,za2,za3) \
+   fprintf(stderr,zf,za1,za2,za3)
+#define VPrintf4(zf,za1,za2,za3,za4) \
+   fprintf(stderr,zf,za1,za2,za3,za4)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) \
+   fprintf(stderr,zf,za1,za2,za3,za4,za5)
+
+#else
+
+extern void bz_internal_error ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) bz_internal_error ( errcode ); }
+#define AssertD(cond,msg)                do { } while (0)
+#define VPrintf0(zf)                     do { } while (0)
+#define VPrintf1(zf,za1)                 do { } while (0)
+#define VPrintf2(zf,za1,za2)             do { } while (0)
+#define VPrintf3(zf,za1,za2,za3)         do { } while (0)
+#define VPrintf4(zf,za1,za2,za3,za4)     do { } while (0)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0)
+
+#endif
+
+
+#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
+#define BZFREE(ppp)  (strm->bzfree)(strm->opaque,(ppp))
+
+
+/*-- Header bytes. --*/
+
+#define BZ_HDR_B 0x42   /* 'B' */
+#define BZ_HDR_Z 0x5a   /* 'Z' */
+#define BZ_HDR_h 0x68   /* 'h' */
+#define BZ_HDR_0 0x30   /* '0' */
+  
+/*-- Constants for the back end. --*/
+
+#define BZ_MAX_ALPHA_SIZE 258
+#define BZ_MAX_CODE_LEN    23
+
+#define BZ_RUNA 0
+#define BZ_RUNB 1
+
+#define BZ_N_GROUPS 6
+#define BZ_G_SIZE   50
+#define BZ_N_ITERS  4
+
+#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
+
+
+
+/*-- Stuff for randomising repetitive blocks. --*/
+
+extern Int32 BZ2_rNums[512];
+
+#define BZ_RAND_DECLS                          \
+   Int32 rNToGo;                               \
+   Int32 rTPos                                 \
+
+#define BZ_RAND_INIT_MASK                      \
+   s->rNToGo = 0;                              \
+   s->rTPos  = 0                               \
+
+#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
+
+#define BZ_RAND_UPD_MASK                       \
+   if (s->rNToGo == 0) {                       \
+      s->rNToGo = BZ2_rNums[s->rTPos];         \
+      s->rTPos++;                              \
+      if (s->rTPos == 512) s->rTPos = 0;       \
+   }                                           \
+   s->rNToGo--;
+
+
+
+/*-- Stuff for doing CRCs. --*/
+
+extern UInt32 BZ2_crc32Table[256];
+
+#define BZ_INITIALISE_CRC(crcVar)              \
+{                                              \
+   crcVar = 0xffffffffL;                       \
+}
+
+#define BZ_FINALISE_CRC(crcVar)                \
+{                                              \
+   crcVar = ~(crcVar);                         \
+}
+
+#define BZ_UPDATE_CRC(crcVar,cha)              \
+{                                              \
+   crcVar = (crcVar << 8) ^                    \
+            BZ2_crc32Table[(crcVar >> 24) ^    \
+                           ((UChar)cha)];      \
+}
+
+
+
+/*-- States and modes for compression. --*/
+
+#define BZ_M_IDLE      1
+#define BZ_M_RUNNING   2
+#define BZ_M_FLUSHING  3
+#define BZ_M_FINISHING 4
+
+#define BZ_S_OUTPUT    1
+#define BZ_S_INPUT     2
+
+#define BZ_N_RADIX 2
+#define BZ_N_QSORT 12
+#define BZ_N_SHELL 18
+#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
+
+
+
+
+/*-- Structure holding all the compression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* mode this stream is in, and whether inputting */
+      /* or outputting data */
+      Int32    mode;
+      Int32    state;
+
+      /* remembers avail_in when flush/finish requested */
+      UInt32   avail_in_expect;
+
+      /* for doing the block sorting */
+      UInt32*  arr1;
+      UInt32*  arr2;
+      UInt32*  ftab;
+      Int32    origPtr;
+
+      /* aliases for arr1 and arr2 */
+      UInt32*  ptr;
+      UChar*   block;
+      UInt16*  mtfv;
+      UChar*   zbits;
+
+      /* for deciding when to use the fallback sorting algorithm */
+      Int32    workFactor;
+
+      /* run-length-encoding of the input */
+      UInt32   state_in_ch;
+      Int32    state_in_len;
+      BZ_RAND_DECLS;
+
+      /* input and output limits and current posns */
+      Int32    nblock;
+      Int32    nblockMAX;
+      Int32    numZ;
+      Int32    state_out_pos;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      UChar    unseqToSeq[256];
+
+      /* the buffer for bit stream creation */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* block and combined CRCs */
+      UInt32   blockCRC;
+      UInt32   combinedCRC;
+
+      /* misc administratium */
+      Int32    verbosity;
+      Int32    blockNo;
+      Int32    blockSize100k;
+
+      /* stuff for coding the MTF values */
+      Int32    nMTF;
+      Int32    mtfFreq    [BZ_MAX_ALPHA_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+
+      UChar    len     [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    code    [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    rfreq   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      /* second dimension: only 3 needed; 4 makes index calculations faster */
+      UInt32   len_pack[BZ_MAX_ALPHA_SIZE][4];
+
+   }
+   EState;
+
+
+
+/*-- externs for compression. --*/
+
+extern void 
+BZ2_blockSort ( EState* );
+
+extern void 
+BZ2_compressBlock ( EState*, Bool );
+
+extern void 
+BZ2_bsInitWrite ( EState* );
+
+extern void 
+BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
+
+extern void 
+BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
+
+
+
+/*-- states for decompression. --*/
+
+#define BZ_X_IDLE        1
+#define BZ_X_OUTPUT      2
+
+#define BZ_X_MAGIC_1     10
+#define BZ_X_MAGIC_2     11
+#define BZ_X_MAGIC_3     12
+#define BZ_X_MAGIC_4     13
+#define BZ_X_BLKHDR_1    14
+#define BZ_X_BLKHDR_2    15
+#define BZ_X_BLKHDR_3    16
+#define BZ_X_BLKHDR_4    17
+#define BZ_X_BLKHDR_5    18
+#define BZ_X_BLKHDR_6    19
+#define BZ_X_BCRC_1      20
+#define BZ_X_BCRC_2      21
+#define BZ_X_BCRC_3      22
+#define BZ_X_BCRC_4      23
+#define BZ_X_RANDBIT     24
+#define BZ_X_ORIGPTR_1   25
+#define BZ_X_ORIGPTR_2   26
+#define BZ_X_ORIGPTR_3   27
+#define BZ_X_MAPPING_1   28
+#define BZ_X_MAPPING_2   29
+#define BZ_X_SELECTOR_1  30
+#define BZ_X_SELECTOR_2  31
+#define BZ_X_SELECTOR_3  32
+#define BZ_X_CODING_1    33
+#define BZ_X_CODING_2    34
+#define BZ_X_CODING_3    35
+#define BZ_X_MTF_1       36
+#define BZ_X_MTF_2       37
+#define BZ_X_MTF_3       38
+#define BZ_X_MTF_4       39
+#define BZ_X_MTF_5       40
+#define BZ_X_MTF_6       41
+#define BZ_X_ENDHDR_2    42
+#define BZ_X_ENDHDR_3    43
+#define BZ_X_ENDHDR_4    44
+#define BZ_X_ENDHDR_5    45
+#define BZ_X_ENDHDR_6    46
+#define BZ_X_CCRC_1      47
+#define BZ_X_CCRC_2      48
+#define BZ_X_CCRC_3      49
+#define BZ_X_CCRC_4      50
+
+
+
+/*-- Constants for the fast MTF decoder. --*/
+
+#define MTFA_SIZE 4096
+#define MTFL_SIZE 16
+
+
+
+/*-- Structure holding all the decompression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* state indicator for this stream */
+      Int32    state;
+
+      /* for doing the final run-length decoding */
+      UChar    state_out_ch;
+      Int32    state_out_len;
+      Bool     blockRandomised;
+      BZ_RAND_DECLS;
+
+      /* the buffer for bit stream reading */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* misc administratium */
+      Int32    blockSize100k;
+      Bool     smallDecompress;
+      Int32    currBlockNo;
+      Int32    verbosity;
+
+      /* for undoing the Burrows-Wheeler transform */
+      Int32    origPtr;
+      UInt32   tPos;
+      Int32    k0;
+      Int32    unzftab[256];
+      Int32    nblock_used;
+      Int32    cftab[257];
+      Int32    cftabCopy[257];
+
+      /* for undoing the Burrows-Wheeler transform (FAST) */
+      UInt32   *tt;
+
+      /* for undoing the Burrows-Wheeler transform (SMALL) */
+      UInt16   *ll16;
+      UChar    *ll4;
+
+      /* stored and calculated CRCs */
+      UInt32   storedBlockCRC;
+      UInt32   storedCombinedCRC;
+      UInt32   calculatedBlockCRC;
+      UInt32   calculatedCombinedCRC;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      Bool     inUse16[16];
+      UChar    seqToUnseq[256];
+
+      /* for decoding the MTF values */
+      UChar    mtfa   [MTFA_SIZE];
+      Int32    mtfbase[256 / MTFL_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+      UChar    len  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+
+      Int32    limit  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    base   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    perm   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    minLens[BZ_N_GROUPS];
+
+      /* save area for scalars in the main decompress code */
+      Int32    save_i;
+      Int32    save_j;
+      Int32    save_t;
+      Int32    save_alphaSize;
+      Int32    save_nGroups;
+      Int32    save_nSelectors;
+      Int32    save_EOB;
+      Int32    save_groupNo;
+      Int32    save_groupPos;
+      Int32    save_nextSym;
+      Int32    save_nblockMAX;
+      Int32    save_nblock;
+      Int32    save_es;
+      Int32    save_N;
+      Int32    save_curr;
+      Int32    save_zt;
+      Int32    save_zn; 
+      Int32    save_zvec;
+      Int32    save_zj;
+      Int32    save_gSel;
+      Int32    save_gMinlen;
+      Int32*   save_gLimit;
+      Int32*   save_gBase;
+      Int32*   save_gPerm;
+
+   }
+   DState;
+
+
+
+/*-- Macros for decompression. --*/
+
+#define BZ_GET_FAST(cccc)                     \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    s->tPos = s->tt[s->tPos];                 \
+    cccc = (UChar)(s->tPos & 0xff);           \
+    s->tPos >>= 8;
+
+#define BZ_GET_FAST_C(cccc)                   \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \
+    c_tPos = c_tt[c_tPos];                    \
+    cccc = (UChar)(c_tPos & 0xff);            \
+    c_tPos >>= 8;
+
+#define SET_LL4(i,n)                                          \
+   { if (((i) & 0x1) == 0)                                    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4);  \
+   }
+
+#define GET_LL4(i)                             \
+   ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
+
+#define SET_LL(i,n)                          \
+   { s->ll16[i] = (UInt16)(n & 0x0000ffff);  \
+     SET_LL4(i, n >> 16);                    \
+   }
+
+#define GET_LL(i) \
+   (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
+
+#define BZ_GET_SMALL(cccc)                            \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    cccc = BZ2_indexIntoF ( s->tPos, s->cftab );    \
+    s->tPos = GET_LL(s->tPos);
+
+
+/*-- externs for decompression. --*/
+
+extern Int32 
+BZ2_indexIntoF ( Int32, Int32* );
+
+extern Int32 
+BZ2_decompress ( DState* );
+
+extern void 
+BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
+                           Int32,  Int32, Int32 );
+
+
+#endif
+
+
+/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
+
+#ifdef BZ_NO_STDIO
+#ifndef NULL
+#define NULL 0
+#endif
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                   bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzmore
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+# Bzmore wrapped for bzip2, 
+# adapted from zmore by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+	*less)	more=less	;;
+	*)	more=more       ;;
+esac
+
+if test "`echo -n a`" = "-n a"; then
+  # looks like a SysV system:
+  n1=''; n2='\c'
+else
+  n1='-n'; n2=''
+fi
+oldtty=`stty -g 2>/dev/null`
+if stty -cbreak 2>/dev/null; then
+  cb='cbreak'; ncb='-cbreak'
+else
+  # 'stty min 1' resets eof to ^a on both SunOS and SysV!
+  cb='min 1 -icanon'; ncb='icanon eof ^d'
+fi
+if test $? -eq 0 -a -n "$oldtty"; then
+   trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
+else
+   trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
+fi
+
+if test $# = 0; then
+    if test -t 0; then
+	echo usage: $prog files...
+    else
+	bzip2 -cdfq | eval $more
+    fi
+else
+    FIRST=1
+    for FILE
+    do
+	if test $FIRST -eq 0; then
+		echo $n1 "--More--(Next file: $FILE)$n2"
+		stty $cb -echo 2>/dev/null
+		ANS=`dd bs=1 count=1 2>/dev/null` 
+		stty $ncb echo 2>/dev/null
+		echo " "
+		if test "$ANS" = 'e' -o "$ANS" = 'q'; then
+			exit
+		fi
+	fi
+	if test "$ANS" != 's'; then
+		echo "------> $FILE <------"
+		bzip2 -cdfq "$FILE" | eval $more
+	fi
+	if test -t; then
+		FIRST=0
+	fi
+    done
+fi
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/bzmore.1
@@ -0,0 +1,152 @@
+.\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
+.\"for Debian GNU/Linux
+.TH BZMORE 1
+.SH NAME
+bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
+.SH SYNOPSIS
+.B bzmore
+[ name ...  ]
+.br
+.B bzless
+[ name ...  ]
+.SH NOTE
+In the following description,
+.I bzless
+and
+.I less
+can be used interchangeably with
+.I bzmore
+and
+.I more.
+.SH DESCRIPTION
+.I  Bzmore
+is a filter which allows examination of compressed or plain text files
+one screenful at a time on a soft-copy terminal.
+.I bzmore
+works on files compressed with
+.I bzip2
+and also on uncompressed files.
+If a file does not exist,
+.I bzmore
+looks for a file of the same name with the addition of a .bz2 suffix.
+.PP
+.I Bzmore
+normally pauses after each screenful, printing --More--
+at the bottom of the screen.
+If the user then types a carriage return, one more line is displayed.
+If the user hits a space,
+another screenful is displayed.  Other possibilities are enumerated later.
+.PP
+.I Bzmore
+looks in the file
+.I /etc/termcap
+to determine terminal characteristics,
+and to determine the default window size.
+On a terminal capable of displaying 24 lines,
+the default window size is 22 lines.
+Other sequences which may be typed when
+.I bzmore
+pauses, and their effects, are as follows (\fIi\fP is an optional integer
+argument, defaulting to 1) :
+.PP
+.IP \fIi\|\fP<space>
+display
+.I i
+more lines, (or another screenful if no argument is given)
+.PP
+.IP ^D
+display 11 more lines (a ``scroll'').
+If
+.I i
+is given, then the scroll size is set to \fIi\|\fP.
+.PP
+.IP d
+same as ^D (control-D)
+.PP
+.IP \fIi\|\fPz
+same as typing a space except that \fIi\|\fP, if present, becomes the new
+window size.  Note that the window size reverts back to the default at the
+end of the current file.
+.PP
+.IP \fIi\|\fPs
+skip \fIi\|\fP lines and print a screenful of lines
+.PP
+.IP \fIi\|\fPf
+skip \fIi\fP screenfuls and print a screenful of lines
+.PP
+.IP "q or Q"
+quit reading the current file; go on to the next (if any)
+.PP
+.IP "e or q"
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to exit.
+.PP
+.IP s
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to skip the next file and continue.
+.PP 
+.IP =
+Display the current line number.
+.PP
+.IP \fIi\|\fP/expr
+search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
+If the pattern is not found,
+.I bzmore
+goes on to the next file (if any).
+Otherwise, a screenful is displayed, starting two lines before the place
+where the expression was found.
+The user's erase and kill characters may be used to edit the regular
+expression.
+Erasing back past the first column cancels the search command.
+.PP
+.IP \fIi\|\fPn
+search for the \fIi\|\fP-th occurrence of the last regular expression entered.
+.PP
+.IP !command
+invoke a shell with \fIcommand\|\fP. 
+The character `!' in "command" are replaced with the
+previous shell command.  The sequence "\\!" is replaced by "!".
+.PP
+.IP ":q or :Q"
+quit reading the current file; go on to the next (if any)
+(same as q or Q).
+.PP
+.IP .
+(dot) repeat the previous command.
+.PP
+The commands take effect immediately, i.e., it is not necessary to
+type a carriage return.
+Up to the time when the command character itself is given,
+the user may hit the line kill character to cancel the numerical
+argument being formed.
+In addition, the user may hit the erase character to redisplay the
+--More-- message.
+.PP
+At any time when output is being sent to the terminal, the user can
+hit the quit key (normally control\-\\).
+.I Bzmore
+will stop sending output, and will display the usual --More--
+prompt.
+The user may then enter one of the above commands in the normal manner.
+Unfortunately, some output is lost when this is done, due to the
+fact that any characters waiting in the terminal's output queue
+are flushed when the quit signal occurs.
+.PP
+The terminal is set to
+.I noecho
+mode by this program so that the output can be continuous.
+What you type will thus not show on your terminal, except for the / and !
+commands.
+.PP
+If the standard output is not a teletype, then
+.I bzmore
+acts just like
+.I bzcat,
+except that a header is printed before each file.
+.SH FILES
+.DT
+/etc/termcap		Terminal data base
+.SH "SEE ALSO"
+more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/compress.c
@@ -0,0 +1,672 @@
+
+/*-------------------------------------------------------------*/
+/*--- Compression machinery (not incl block sorting)        ---*/
+/*---                                            compress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* CHANGES
+    0.9.0    -- original version.
+    0.9.0a/b -- no changes in this file.
+    0.9.0c   -- changed setting of nGroups in sendMTFValues() 
+                so as to do a bit better on small files
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+void BZ2_bsInitWrite ( EState* s )
+{
+   s->bsLive = 0;
+   s->bsBuff = 0;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsFinishWrite ( EState* s )
+{
+   while (s->bsLive > 0) {
+      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
+      s->numZ++;
+      s->bsBuff <<= 8;
+      s->bsLive -= 8;
+   }
+}
+
+
+/*---------------------------------------------------*/
+#define bsNEEDW(nz)                           \
+{                                             \
+   while (s->bsLive >= 8) {                   \
+      s->zbits[s->numZ]                       \
+         = (UChar)(s->bsBuff >> 24);          \
+      s->numZ++;                              \
+      s->bsBuff <<= 8;                        \
+      s->bsLive -= 8;                         \
+   }                                          \
+}
+
+
+/*---------------------------------------------------*/
+static
+__inline__
+void bsW ( EState* s, Int32 n, UInt32 v )
+{
+   bsNEEDW ( n );
+   s->bsBuff |= (v << (32 - s->bsLive - n));
+   s->bsLive += n;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUInt32 ( EState* s, UInt32 u )
+{
+   bsW ( s, 8, (u >> 24) & 0xffL );
+   bsW ( s, 8, (u >> 16) & 0xffL );
+   bsW ( s, 8, (u >>  8) & 0xffL );
+   bsW ( s, 8,  u        & 0xffL );
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUChar ( EState* s, UChar c )
+{
+   bsW( s, 8, (UInt32)c );
+}
+
+
+/*---------------------------------------------------*/
+/*--- The back end proper                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+static
+void makeMaps_e ( EState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->unseqToSeq[i] = s->nInUse;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+static
+void generateMTFValues ( EState* s )
+{
+   UChar   yy[256];
+   Int32   i, j;
+   Int32   zPend;
+   Int32   wr;
+   Int32   EOB;
+
+   /* 
+      After sorting (eg, here),
+         s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
+         and
+         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 
+         holds the original block data.
+
+      The first thing to do is generate the MTF values,
+      and put them in
+         ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
+      Because there are strictly fewer or equal MTF values
+      than block values, ptr values in this area are overwritten
+      with MTF values only when they are no longer needed.
+
+      The final compressed bitstream is generated into the
+      area starting at
+         (UChar*) (&((UChar*)s->arr2)[s->nblock])
+
+      These storage aliases are set up in bzCompressInit(),
+      except for the last one, which is arranged in 
+      compressBlock().
+   */
+   UInt32* ptr   = s->ptr;
+   UChar* block  = s->block;
+   UInt16* mtfv  = s->mtfv;
+
+   makeMaps_e ( s );
+   EOB = s->nInUse+1;
+
+   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
+
+   wr = 0;
+   zPend = 0;
+   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
+
+   for (i = 0; i < s->nblock; i++) {
+      UChar ll_i;
+      AssertD ( wr <= i, "generateMTFValues(1)" );
+      j = ptr[i]-1; if (j < 0) j += s->nblock;
+      ll_i = s->unseqToSeq[block[j]];
+      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
+
+      if (yy[0] == ll_i) { 
+         zPend++;
+      } else {
+
+         if (zPend > 0) {
+            zPend--;
+            while (True) {
+               if (zPend & 1) {
+                  mtfv[wr] = BZ_RUNB; wr++; 
+                  s->mtfFreq[BZ_RUNB]++; 
+               } else {
+                  mtfv[wr] = BZ_RUNA; wr++; 
+                  s->mtfFreq[BZ_RUNA]++; 
+               }
+               if (zPend < 2) break;
+               zPend = (zPend - 2) / 2;
+            };
+            zPend = 0;
+         }
+         {
+            register UChar  rtmp;
+            register UChar* ryy_j;
+            register UChar  rll_i;
+            rtmp  = yy[1];
+            yy[1] = yy[0];
+            ryy_j = &(yy[1]);
+            rll_i = ll_i;
+            while ( rll_i != rtmp ) {
+               register UChar rtmp2;
+               ryy_j++;
+               rtmp2  = rtmp;
+               rtmp   = *ryy_j;
+               *ryy_j = rtmp2;
+            };
+            yy[0] = rtmp;
+            j = ryy_j - &(yy[0]);
+            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
+         }
+
+      }
+   }
+
+   if (zPend > 0) {
+      zPend--;
+      while (True) {
+         if (zPend & 1) {
+            mtfv[wr] = BZ_RUNB; wr++; 
+            s->mtfFreq[BZ_RUNB]++; 
+         } else {
+            mtfv[wr] = BZ_RUNA; wr++; 
+            s->mtfFreq[BZ_RUNA]++; 
+         }
+         if (zPend < 2) break;
+         zPend = (zPend - 2) / 2;
+      };
+      zPend = 0;
+   }
+
+   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
+
+   s->nMTF = wr;
+}
+
+
+/*---------------------------------------------------*/
+#define BZ_LESSER_ICOST  0
+#define BZ_GREATER_ICOST 15
+
+static
+void sendMTFValues ( EState* s )
+{
+   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
+   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
+   Int32 nGroups, nBytes;
+
+   /*--
+   UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   is a global since the decoder also needs it.
+
+   Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   are also globals only used in this proc.
+   Made global to keep stack frame size small.
+   --*/
+
+
+   UInt16 cost[BZ_N_GROUPS];
+   Int32  fave[BZ_N_GROUPS];
+
+   UInt16* mtfv = s->mtfv;
+
+   if (s->verbosity >= 3)
+      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
+                "%d+2 syms in use\n", 
+                s->nblock, s->nMTF, s->nInUse );
+
+   alphaSize = s->nInUse+2;
+   for (t = 0; t < BZ_N_GROUPS; t++)
+      for (v = 0; v < alphaSize; v++)
+         s->len[t][v] = BZ_GREATER_ICOST;
+
+   /*--- Decide how many coding tables to use ---*/
+   AssertH ( s->nMTF > 0, 3001 );
+   if (s->nMTF < 200)  nGroups = 2; else
+   if (s->nMTF < 600)  nGroups = 3; else
+   if (s->nMTF < 1200) nGroups = 4; else
+   if (s->nMTF < 2400) nGroups = 5; else
+                       nGroups = 6;
+
+   /*--- Generate an initial set of coding tables ---*/
+   { 
+      Int32 nPart, remF, tFreq, aFreq;
+
+      nPart = nGroups;
+      remF  = s->nMTF;
+      gs = 0;
+      while (nPart > 0) {
+         tFreq = remF / nPart;
+         ge = gs-1;
+         aFreq = 0;
+         while (aFreq < tFreq && ge < alphaSize-1) {
+            ge++;
+            aFreq += s->mtfFreq[ge];
+         }
+
+         if (ge > gs 
+             && nPart != nGroups && nPart != 1 
+             && ((nGroups-nPart) % 2 == 1)) {
+            aFreq -= s->mtfFreq[ge];
+            ge--;
+         }
+
+         if (s->verbosity >= 3)
+            VPrintf5( "      initial group %d, [%d .. %d], "
+                      "has %d syms (%4.1f%%)\n",
+                      nPart, gs, ge, aFreq, 
+                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
+ 
+         for (v = 0; v < alphaSize; v++)
+            if (v >= gs && v <= ge) 
+               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
+               s->len[nPart-1][v] = BZ_GREATER_ICOST;
+ 
+         nPart--;
+         gs = ge+1;
+         remF -= aFreq;
+      }
+   }
+
+   /*--- 
+      Iterate up to BZ_N_ITERS times to improve the tables.
+   ---*/
+   for (iter = 0; iter < BZ_N_ITERS; iter++) {
+
+      for (t = 0; t < nGroups; t++) fave[t] = 0;
+
+      for (t = 0; t < nGroups; t++)
+         for (v = 0; v < alphaSize; v++)
+            s->rfreq[t][v] = 0;
+
+      /*---
+        Set up an auxiliary length table which is used to fast-track
+	the common case (nGroups == 6). 
+      ---*/
+      if (nGroups == 6) {
+         for (v = 0; v < alphaSize; v++) {
+            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
+            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
+            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
+	 }
+      }
+
+      nSelectors = 0;
+      totc = 0;
+      gs = 0;
+      while (True) {
+
+         /*--- Set group start & end marks. --*/
+         if (gs >= s->nMTF) break;
+         ge = gs + BZ_G_SIZE - 1; 
+         if (ge >= s->nMTF) ge = s->nMTF-1;
+
+         /*-- 
+            Calculate the cost of this group as coded
+            by each of the coding tables.
+         --*/
+         for (t = 0; t < nGroups; t++) cost[t] = 0;
+
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            register UInt32 cost01, cost23, cost45;
+            register UInt16 icv;
+            cost01 = cost23 = cost45 = 0;
+
+#           define BZ_ITER(nn)                \
+               icv = mtfv[gs+(nn)];           \
+               cost01 += s->len_pack[icv][0]; \
+               cost23 += s->len_pack[icv][1]; \
+               cost45 += s->len_pack[icv][2]; \
+
+            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
+            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
+            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
+            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
+            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
+            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
+            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
+            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
+            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
+            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
+
+#           undef BZ_ITER
+
+            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
+            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
+            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
+
+         } else {
+	    /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++) { 
+               UInt16 icv = mtfv[i];
+               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
+            }
+         }
+ 
+         /*-- 
+            Find the coding table which is best for this group,
+            and record its identity in the selector table.
+         --*/
+         bc = 999999999; bt = -1;
+         for (t = 0; t < nGroups; t++)
+            if (cost[t] < bc) { bc = cost[t]; bt = t; };
+         totc += bc;
+         fave[bt]++;
+         s->selector[nSelectors] = bt;
+         nSelectors++;
+
+         /*-- 
+            Increment the symbol frequencies for the selected table.
+          --*/
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+
+#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
+
+            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
+            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
+            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
+            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
+            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
+            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
+            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
+            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
+            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
+            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
+
+#           undef BZ_ITUR
+
+         } else {
+	    /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++)
+               s->rfreq[bt][ mtfv[i] ]++;
+         }
+
+         gs = ge+1;
+      }
+      if (s->verbosity >= 3) {
+         VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
+                   iter+1, totc/8 );
+         for (t = 0; t < nGroups; t++)
+            VPrintf1 ( "%d ", fave[t] );
+         VPrintf0 ( "\n" );
+      }
+
+      /*--
+        Recompute the tables based on the accumulated frequencies.
+      --*/
+      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See 
+         comment in huffman.c for details. */
+      for (t = 0; t < nGroups; t++)
+         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
+                                 alphaSize, 17 /*20*/ );
+   }
+
+
+   AssertH( nGroups < 8, 3002 );
+   AssertH( nSelectors < 32768 &&
+            nSelectors <= (2 + (900000 / BZ_G_SIZE)),
+            3003 );
+
+
+   /*--- Compute MTF values for the selectors. ---*/
+   {
+      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
+      for (i = 0; i < nGroups; i++) pos[i] = i;
+      for (i = 0; i < nSelectors; i++) {
+         ll_i = s->selector[i];
+         j = 0;
+         tmp = pos[j];
+         while ( ll_i != tmp ) {
+            j++;
+            tmp2 = tmp;
+            tmp = pos[j];
+            pos[j] = tmp2;
+         };
+         pos[0] = tmp;
+         s->selectorMtf[i] = j;
+      }
+   };
+
+   /*--- Assign actual codes for the tables. --*/
+   for (t = 0; t < nGroups; t++) {
+      minLen = 32;
+      maxLen = 0;
+      for (i = 0; i < alphaSize; i++) {
+         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+         if (s->len[t][i] < minLen) minLen = s->len[t][i];
+      }
+      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
+      AssertH ( !(minLen < 1),  3005 );
+      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
+                          minLen, maxLen, alphaSize );
+   }
+
+   /*--- Transmit the mapping table. ---*/
+   { 
+      Bool inUse16[16];
+      for (i = 0; i < 16; i++) {
+          inUse16[i] = False;
+          for (j = 0; j < 16; j++)
+             if (s->inUse[i * 16 + j]) inUse16[i] = True;
+      }
+     
+      nBytes = s->numZ;
+      for (i = 0; i < 16; i++)
+         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
+
+      for (i = 0; i < 16; i++)
+         if (inUse16[i])
+            for (j = 0; j < 16; j++) {
+               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
+            }
+
+      if (s->verbosity >= 3) 
+         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
+   }
+
+   /*--- Now the selectors. ---*/
+   nBytes = s->numZ;
+   bsW ( s, 3, nGroups );
+   bsW ( s, 15, nSelectors );
+   for (i = 0; i < nSelectors; i++) { 
+      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
+      bsW(s,1,0);
+   }
+   if (s->verbosity >= 3)
+      VPrintf1( "selectors %d, ", s->numZ-nBytes );
+
+   /*--- Now the coding tables. ---*/
+   nBytes = s->numZ;
+
+   for (t = 0; t < nGroups; t++) {
+      Int32 curr = s->len[t][0];
+      bsW ( s, 5, curr );
+      for (i = 0; i < alphaSize; i++) {
+         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
+         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
+         bsW ( s, 1, 0 );
+      }
+   }
+
+   if (s->verbosity >= 3)
+      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
+
+   /*--- And finally, the block data proper ---*/
+   nBytes = s->numZ;
+   selCtr = 0;
+   gs = 0;
+   while (True) {
+      if (gs >= s->nMTF) break;
+      ge = gs + BZ_G_SIZE - 1; 
+      if (ge >= s->nMTF) ge = s->nMTF-1;
+      AssertH ( s->selector[selCtr] < nGroups, 3006 );
+
+      if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            UInt16 mtfv_i;
+            UChar* s_len_sel_selCtr 
+               = &(s->len[s->selector[selCtr]][0]);
+            Int32* s_code_sel_selCtr
+               = &(s->code[s->selector[selCtr]][0]);
+
+#           define BZ_ITAH(nn)                      \
+               mtfv_i = mtfv[gs+(nn)];              \
+               bsW ( s,                             \
+                     s_len_sel_selCtr[mtfv_i],      \
+                     s_code_sel_selCtr[mtfv_i] )
+
+            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
+            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
+            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
+            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
+            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
+            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
+            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
+            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
+            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
+            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
+
+#           undef BZ_ITAH
+
+      } else {
+	 /*--- slow version which correctly handles all situations ---*/
+         for (i = gs; i <= ge; i++) {
+            bsW ( s, 
+                  s->len  [s->selector[selCtr]] [mtfv[i]],
+                  s->code [s->selector[selCtr]] [mtfv[i]] );
+         }
+      }
+
+
+      gs = ge+1;
+      selCtr++;
+   }
+   AssertH( selCtr == nSelectors, 3007 );
+
+   if (s->verbosity >= 3)
+      VPrintf1( "codes %d\n", s->numZ-nBytes );
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_compressBlock ( EState* s, Bool is_last_block )
+{
+   if (s->nblock > 0) {
+
+      BZ_FINALISE_CRC ( s->blockCRC );
+      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
+      s->combinedCRC ^= s->blockCRC;
+      if (s->blockNo > 1) s->numZ = 0;
+
+      if (s->verbosity >= 2)
+         VPrintf4( "    block %d: crc = 0x%08x, "
+                   "combined CRC = 0x%08x, size = %d\n",
+                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
+
+      BZ2_blockSort ( s );
+   }
+
+   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
+
+   /*-- If this is the first block, create the stream header. --*/
+   if (s->blockNo == 1) {
+      BZ2_bsInitWrite ( s );
+      bsPutUChar ( s, BZ_HDR_B );
+      bsPutUChar ( s, BZ_HDR_Z );
+      bsPutUChar ( s, BZ_HDR_h );
+      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
+   }
+
+   if (s->nblock > 0) {
+
+      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
+      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
+      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
+
+      /*-- Now the block's CRC, so it is in a known place. --*/
+      bsPutUInt32 ( s, s->blockCRC );
+
+      /*-- 
+         Now a single bit indicating (non-)randomisation. 
+         As of version 0.9.5, we use a better sorting algorithm
+         which makes randomisation unnecessary.  So always set
+         the randomised bit to 'no'.  Of course, the decoder
+         still needs to be able to handle randomised blocks
+         so as to maintain backwards compatibility with
+         older versions of bzip2.
+      --*/
+      bsW(s,1,0);
+
+      bsW ( s, 24, s->origPtr );
+      generateMTFValues ( s );
+      sendMTFValues ( s );
+   }
+
+
+   /*-- If this is the last block, add the stream trailer. --*/
+   if (is_last_block) {
+
+      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
+      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
+      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
+      bsPutUInt32 ( s, s->combinedCRC );
+      if (s->verbosity >= 2)
+         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
+      bsFinishWrite ( s );
+   }
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        compress.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/crctable.c
@@ -0,0 +1,104 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for doing CRCs                                  ---*/
+/*---                                            crctable.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*--
+  I think this is an implementation of the AUTODIN-II,
+  Ethernet & FDDI 32-bit CRC standard.  Vaguely derived
+  from code by Rob Warnock, in Section 51 of the
+  comp.compression FAQ.
+--*/
+
+UInt32 BZ2_crc32Table[256] = {
+
+   /*-- Ugly, innit? --*/
+
+   0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
+   0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
+   0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
+   0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
+   0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
+   0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
+   0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
+   0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
+   0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
+   0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
+   0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
+   0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
+   0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
+   0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
+   0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
+   0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
+   0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
+   0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
+   0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
+   0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
+   0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
+   0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
+   0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
+   0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
+   0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
+   0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
+   0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
+   0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
+   0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
+   0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
+   0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
+   0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
+   0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
+   0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
+   0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
+   0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
+   0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
+   0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
+   0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
+   0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
+   0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
+   0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
+   0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
+   0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
+   0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
+   0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
+   0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
+   0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
+   0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
+   0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
+   0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
+   0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
+   0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
+   0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
+   0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
+   0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
+   0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
+   0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
+   0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
+   0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
+   0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
+   0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
+   0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
+   0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        crctable.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/decompress.c
@@ -0,0 +1,646 @@
+
+/*-------------------------------------------------------------*/
+/*--- Decompression machinery                               ---*/
+/*---                                          decompress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+static
+void makeMaps_d ( DState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->seqToUnseq[s->nInUse] = i;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+#define RETURN(rrr)                               \
+   { retVal = rrr; goto save_state_and_return; };
+
+#define GET_BITS(lll,vvv,nnn)                     \
+   case lll: s->state = lll;                      \
+   while (True) {                                 \
+      if (s->bsLive >= nnn) {                     \
+         UInt32 v;                                \
+         v = (s->bsBuff >>                        \
+             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
+         s->bsLive -= nnn;                        \
+         vvv = v;                                 \
+         break;                                   \
+      }                                           \
+      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
+      s->bsBuff                                   \
+         = (s->bsBuff << 8) |                     \
+           ((UInt32)                              \
+              (*((UChar*)(s->strm->next_in))));   \
+      s->bsLive += 8;                             \
+      s->strm->next_in++;                         \
+      s->strm->avail_in--;                        \
+      s->strm->total_in_lo32++;                   \
+      if (s->strm->total_in_lo32 == 0)            \
+         s->strm->total_in_hi32++;                \
+   }
+
+#define GET_UCHAR(lll,uuu)                        \
+   GET_BITS(lll,uuu,8)
+
+#define GET_BIT(lll,uuu)                          \
+   GET_BITS(lll,uuu,1)
+
+/*---------------------------------------------------*/
+#define GET_MTF_VAL(label1,label2,lval)           \
+{                                                 \
+   if (groupPos == 0) {                           \
+      groupNo++;                                  \
+      if (groupNo >= nSelectors)                  \
+         RETURN(BZ_DATA_ERROR);                   \
+      groupPos = BZ_G_SIZE;                       \
+      gSel = s->selector[groupNo];                \
+      gMinlen = s->minLens[gSel];                 \
+      gLimit = &(s->limit[gSel][0]);              \
+      gPerm = &(s->perm[gSel][0]);                \
+      gBase = &(s->base[gSel][0]);                \
+   }                                              \
+   groupPos--;                                    \
+   zn = gMinlen;                                  \
+   GET_BITS(label1, zvec, zn);                    \
+   while (1) {                                    \
+      if (zn > 20 /* the longest code */)         \
+         RETURN(BZ_DATA_ERROR);                   \
+      if (zvec <= gLimit[zn]) break;              \
+      zn++;                                       \
+      GET_BIT(label2, zj);                        \
+      zvec = (zvec << 1) | zj;                    \
+   };                                             \
+   if (zvec - gBase[zn] < 0                       \
+       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
+      RETURN(BZ_DATA_ERROR);                      \
+   lval = gPerm[zvec - gBase[zn]];                \
+}
+
+
+/*---------------------------------------------------*/
+Int32 BZ2_decompress ( DState* s )
+{
+   UChar      uc;
+   Int32      retVal;
+   Int32      minLen, maxLen;
+   bz_stream* strm = s->strm;
+
+   /* stuff that needs to be saved/restored */
+   Int32  i;
+   Int32  j;
+   Int32  t;
+   Int32  alphaSize;
+   Int32  nGroups;
+   Int32  nSelectors;
+   Int32  EOB;
+   Int32  groupNo;
+   Int32  groupPos;
+   Int32  nextSym;
+   Int32  nblockMAX;
+   Int32  nblock;
+   Int32  es;
+   Int32  N;
+   Int32  curr;
+   Int32  zt;
+   Int32  zn; 
+   Int32  zvec;
+   Int32  zj;
+   Int32  gSel;
+   Int32  gMinlen;
+   Int32* gLimit;
+   Int32* gBase;
+   Int32* gPerm;
+
+   if (s->state == BZ_X_MAGIC_1) {
+      /*initialise the save area*/
+      s->save_i           = 0;
+      s->save_j           = 0;
+      s->save_t           = 0;
+      s->save_alphaSize   = 0;
+      s->save_nGroups     = 0;
+      s->save_nSelectors  = 0;
+      s->save_EOB         = 0;
+      s->save_groupNo     = 0;
+      s->save_groupPos    = 0;
+      s->save_nextSym     = 0;
+      s->save_nblockMAX   = 0;
+      s->save_nblock      = 0;
+      s->save_es          = 0;
+      s->save_N           = 0;
+      s->save_curr        = 0;
+      s->save_zt          = 0;
+      s->save_zn          = 0;
+      s->save_zvec        = 0;
+      s->save_zj          = 0;
+      s->save_gSel        = 0;
+      s->save_gMinlen     = 0;
+      s->save_gLimit      = NULL;
+      s->save_gBase       = NULL;
+      s->save_gPerm       = NULL;
+   }
+
+   /*restore from the save area*/
+   i           = s->save_i;
+   j           = s->save_j;
+   t           = s->save_t;
+   alphaSize   = s->save_alphaSize;
+   nGroups     = s->save_nGroups;
+   nSelectors  = s->save_nSelectors;
+   EOB         = s->save_EOB;
+   groupNo     = s->save_groupNo;
+   groupPos    = s->save_groupPos;
+   nextSym     = s->save_nextSym;
+   nblockMAX   = s->save_nblockMAX;
+   nblock      = s->save_nblock;
+   es          = s->save_es;
+   N           = s->save_N;
+   curr        = s->save_curr;
+   zt          = s->save_zt;
+   zn          = s->save_zn; 
+   zvec        = s->save_zvec;
+   zj          = s->save_zj;
+   gSel        = s->save_gSel;
+   gMinlen     = s->save_gMinlen;
+   gLimit      = s->save_gLimit;
+   gBase       = s->save_gBase;
+   gPerm       = s->save_gPerm;
+
+   retVal = BZ_OK;
+
+   switch (s->state) {
+
+      GET_UCHAR(BZ_X_MAGIC_1, uc);
+      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_2, uc);
+      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_3, uc)
+      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
+      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
+          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
+      s->blockSize100k -= BZ_HDR_0;
+
+      if (s->smallDecompress) {
+         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
+         s->ll4  = BZALLOC( 
+                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
+                   );
+         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
+      } else {
+         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
+         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
+      }
+
+      GET_UCHAR(BZ_X_BLKHDR_1, uc);
+
+      if (uc == 0x17) goto endhdr_2;
+      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_2, uc);
+      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_3, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_4, uc);
+      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_5, uc);
+      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_6, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+
+      s->currBlockNo++;
+      if (s->verbosity >= 2)
+         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
+ 
+      s->storedBlockCRC = 0;
+      GET_UCHAR(BZ_X_BCRC_1, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_2, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_3, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_4, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+
+      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
+
+      s->origPtr = 0;
+      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+
+      if (s->origPtr < 0)
+         RETURN(BZ_DATA_ERROR);
+      if (s->origPtr > 10 + 100000*s->blockSize100k) 
+         RETURN(BZ_DATA_ERROR);
+
+      /*--- Receive the mapping table ---*/
+      for (i = 0; i < 16; i++) {
+         GET_BIT(BZ_X_MAPPING_1, uc);
+         if (uc == 1) 
+            s->inUse16[i] = True; else 
+            s->inUse16[i] = False;
+      }
+
+      for (i = 0; i < 256; i++) s->inUse[i] = False;
+
+      for (i = 0; i < 16; i++)
+         if (s->inUse16[i])
+            for (j = 0; j < 16; j++) {
+               GET_BIT(BZ_X_MAPPING_2, uc);
+               if (uc == 1) s->inUse[i * 16 + j] = True;
+            }
+      makeMaps_d ( s );
+      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
+      alphaSize = s->nInUse+2;
+
+      /*--- Now the selectors ---*/
+      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
+      if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
+      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
+      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
+      for (i = 0; i < nSelectors; i++) {
+         j = 0;
+         while (True) {
+            GET_BIT(BZ_X_SELECTOR_3, uc);
+            if (uc == 0) break;
+            j++;
+            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
+         }
+         s->selectorMtf[i] = j;
+      }
+
+      /*--- Undo the MTF values for the selectors. ---*/
+      {
+         UChar pos[BZ_N_GROUPS], tmp, v;
+         for (v = 0; v < nGroups; v++) pos[v] = v;
+   
+         for (i = 0; i < nSelectors; i++) {
+            v = s->selectorMtf[i];
+            tmp = pos[v];
+            while (v > 0) { pos[v] = pos[v-1]; v--; }
+            pos[0] = tmp;
+            s->selector[i] = tmp;
+         }
+      }
+
+      /*--- Now the coding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         GET_BITS(BZ_X_CODING_1, curr, 5);
+         for (i = 0; i < alphaSize; i++) {
+            while (True) {
+               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
+               GET_BIT(BZ_X_CODING_2, uc);
+               if (uc == 0) break;
+               GET_BIT(BZ_X_CODING_3, uc);
+               if (uc == 0) curr++; else curr--;
+            }
+            s->len[t][i] = curr;
+         }
+      }
+
+      /*--- Create the Huffman decoding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         minLen = 32;
+         maxLen = 0;
+         for (i = 0; i < alphaSize; i++) {
+            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+            if (s->len[t][i] < minLen) minLen = s->len[t][i];
+         }
+         BZ2_hbCreateDecodeTables ( 
+            &(s->limit[t][0]), 
+            &(s->base[t][0]), 
+            &(s->perm[t][0]), 
+            &(s->len[t][0]),
+            minLen, maxLen, alphaSize
+         );
+         s->minLens[t] = minLen;
+      }
+
+      /*--- Now the MTF values ---*/
+
+      EOB      = s->nInUse+1;
+      nblockMAX = 100000 * s->blockSize100k;
+      groupNo  = -1;
+      groupPos = 0;
+
+      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
+
+      /*-- MTF init --*/
+      {
+         Int32 ii, jj, kk;
+         kk = MTFA_SIZE-1;
+         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
+            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
+               kk--;
+            }
+            s->mtfbase[ii] = kk + 1;
+         }
+      }
+      /*-- end MTF init --*/
+
+      nblock = 0;
+      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
+
+      while (True) {
+
+         if (nextSym == EOB) break;
+
+         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
+
+            es = -1;
+            N = 1;
+            do {
+               /* Check that N doesn't get too big, so that es doesn't
+                  go negative.  The maximum value that can be
+                  RUNA/RUNB encoded is equal to the block size (post
+                  the initial RLE), viz, 900k, so bounding N at 2
+                  million should guard against overflow without
+                  rejecting any legitimate inputs. */
+               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
+               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
+               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
+               N = N * 2;
+               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
+            }
+               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
+
+            es++;
+            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
+            s->unzftab[uc] += es;
+
+            if (s->smallDecompress)
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->ll16[nblock] = (UInt16)uc;
+                  nblock++;
+                  es--;
+               }
+            else
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->tt[nblock] = (UInt32)uc;
+                  nblock++;
+                  es--;
+               };
+
+            continue;
+
+         } else {
+
+            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+
+            /*-- uc = MTF ( nextSym-1 ) --*/
+            {
+               Int32 ii, jj, kk, pp, lno, off;
+               UInt32 nn;
+               nn = (UInt32)(nextSym - 1);
+
+               if (nn < MTFL_SIZE) {
+                  /* avoid general-case expense */
+                  pp = s->mtfbase[0];
+                  uc = s->mtfa[pp+nn];
+                  while (nn > 3) {
+                     Int32 z = pp+nn;
+                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
+                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
+                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
+                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
+                     nn -= 4;
+                  }
+                  while (nn > 0) { 
+                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
+                  };
+                  s->mtfa[pp] = uc;
+               } else { 
+                  /* general case */
+                  lno = nn / MTFL_SIZE;
+                  off = nn % MTFL_SIZE;
+                  pp = s->mtfbase[lno] + off;
+                  uc = s->mtfa[pp];
+                  while (pp > s->mtfbase[lno]) { 
+                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
+                  };
+                  s->mtfbase[lno]++;
+                  while (lno > 0) {
+                     s->mtfbase[lno]--;
+                     s->mtfa[s->mtfbase[lno]] 
+                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
+                     lno--;
+                  }
+                  s->mtfbase[0]--;
+                  s->mtfa[s->mtfbase[0]] = uc;
+                  if (s->mtfbase[0] == 0) {
+                     kk = MTFA_SIZE-1;
+                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
+                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
+                           kk--;
+                        }
+                        s->mtfbase[ii] = kk + 1;
+                     }
+                  }
+               }
+            }
+            /*-- end uc = MTF ( nextSym-1 ) --*/
+
+            s->unzftab[s->seqToUnseq[uc]]++;
+            if (s->smallDecompress)
+               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
+               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
+            nblock++;
+
+            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
+            continue;
+         }
+      }
+
+      /* Now we know what nblock is, we can do a better sanity
+         check on s->origPtr.
+      */
+      if (s->origPtr < 0 || s->origPtr >= nblock)
+         RETURN(BZ_DATA_ERROR);
+
+      /*-- Set up cftab to facilitate generation of T^(-1) --*/
+      /* Check: unzftab entries in range. */
+      for (i = 0; i <= 255; i++) {
+         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
+            RETURN(BZ_DATA_ERROR);
+      }
+      /* Actually generate cftab. */
+      s->cftab[0] = 0;
+      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
+      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
+      /* Check: cftab entries in range. */
+      for (i = 0; i <= 256; i++) {
+         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
+            /* s->cftab[i] can legitimately be == nblock */
+            RETURN(BZ_DATA_ERROR);
+         }
+      }
+      /* Check: cftab entries non-descending. */
+      for (i = 1; i <= 256; i++) {
+         if (s->cftab[i-1] > s->cftab[i]) {
+            RETURN(BZ_DATA_ERROR);
+         }
+      }
+
+      s->state_out_len = 0;
+      s->state_out_ch  = 0;
+      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
+      s->state = BZ_X_OUTPUT;
+      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
+
+      if (s->smallDecompress) {
+
+         /*-- Make a copy of cftab, used in generation of T --*/
+         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
+
+         /*-- compute the T vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->ll16[i]);
+            SET_LL(i, s->cftabCopy[uc]);
+            s->cftabCopy[uc]++;
+         }
+
+         /*-- Compute T^(-1) by pointer reversal on T --*/
+         i = s->origPtr;
+         j = GET_LL(i);
+         do {
+            Int32 tmp = GET_LL(j);
+            SET_LL(j, i);
+            i = j;
+            j = tmp;
+         }
+            while (i != s->origPtr);
+
+         s->tPos = s->origPtr;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+         }
+
+      } else {
+
+         /*-- compute the T^(-1) vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->tt[i] & 0xff);
+            s->tt[s->cftab[uc]] |= (i << 8);
+            s->cftab[uc]++;
+         }
+
+         s->tPos = s->tt[s->origPtr] >> 8;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+         }
+
+      }
+
+      RETURN(BZ_OK);
+
+
+
+    endhdr_2:
+
+      GET_UCHAR(BZ_X_ENDHDR_2, uc);
+      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_3, uc);
+      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_4, uc);
+      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_5, uc);
+      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_6, uc);
+      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
+
+      s->storedCombinedCRC = 0;
+      GET_UCHAR(BZ_X_CCRC_1, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_2, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_3, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_4, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+
+      s->state = BZ_X_IDLE;
+      RETURN(BZ_STREAM_END);
+
+      default: AssertH ( False, 4001 );
+   }
+
+   AssertH ( False, 4002 );
+
+   save_state_and_return:
+
+   s->save_i           = i;
+   s->save_j           = j;
+   s->save_t           = t;
+   s->save_alphaSize   = alphaSize;
+   s->save_nGroups     = nGroups;
+   s->save_nSelectors  = nSelectors;
+   s->save_EOB         = EOB;
+   s->save_groupNo     = groupNo;
+   s->save_groupPos    = groupPos;
+   s->save_nextSym     = nextSym;
+   s->save_nblockMAX   = nblockMAX;
+   s->save_nblock      = nblock;
+   s->save_es          = es;
+   s->save_N           = N;
+   s->save_curr        = curr;
+   s->save_zt          = zt;
+   s->save_zn          = zn;
+   s->save_zvec        = zvec;
+   s->save_zj          = zj;
+   s->save_gSel        = gSel;
+   s->save_gMinlen     = gMinlen;
+   s->save_gLimit      = gLimit;
+   s->save_gBase       = gBase;
+   s->save_gPerm       = gPerm;
+
+   return retVal;   
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                      decompress.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/dlltest.c
@@ -0,0 +1,175 @@
+/*
+   minibz2
+      libbz2.dll test program.
+      by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+      This file is Public Domain.  Welcome any email to me.
+
+   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
+*/
+
+#define BZ_IMPORT
+#include <stdio.h>
+#include <stdlib.h>
+#include "bzlib.h"
+#ifdef _WIN32
+#include <io.h>
+#endif
+
+
+#ifdef _WIN32
+
+#define BZ2_LIBNAME "libbz2-1.0.2.DLL" 
+
+#include <windows.h>
+static int BZ2DLLLoaded = 0;
+static HINSTANCE BZ2DLLhLib;
+int BZ2DLLLoadLibrary(void)
+{
+   HINSTANCE hLib;
+
+   if(BZ2DLLLoaded==1){return 0;}
+   hLib=LoadLibrary(BZ2_LIBNAME);
+   if(hLib == NULL){
+      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
+      return -1;
+   }
+   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
+   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
+   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
+   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
+   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
+   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
+   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
+   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
+
+   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
+       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
+       || !BZ2_bzclose || !BZ2_bzerror) {
+      fprintf(stderr,"GetProcAddress failed.\n");
+      return -1;
+   }
+   BZ2DLLLoaded=1;
+   BZ2DLLhLib=hLib;
+   return 0;
+
+}
+int BZ2DLLFreeLibrary(void)
+{
+   if(BZ2DLLLoaded==0){return 0;}
+   FreeLibrary(BZ2DLLhLib);
+   BZ2DLLLoaded=0;
+}
+#endif /* WIN32 */
+
+void usage(void)
+{
+   puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
+}
+
+int main(int argc,char *argv[])
+{
+   int decompress = 0;
+   int level = 9;
+   char *fn_r = NULL;
+   char *fn_w = NULL;
+
+#ifdef _WIN32
+   if(BZ2DLLLoadLibrary()<0){
+      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
+      exit(1);
+   }
+   printf("Loading of %s succeeded.  Library version is %s.\n",
+          BZ2_LIBNAME, BZ2_bzlibVersion() );
+#endif
+   while(++argv,--argc){
+      if(**argv =='-' || **argv=='/'){
+         char *p;
+
+         for(p=*argv+1;*p;p++){
+            if(*p=='d'){
+               decompress = 1;
+            }else if('1'<=*p && *p<='9'){
+               level = *p - '0';
+            }else{
+               usage();
+               exit(1);
+            }
+         }
+      }else{
+         break;
+      }
+   }
+   if(argc>=1){
+      fn_r = *argv;
+      argc--;argv++;
+   }else{
+      fn_r = NULL;
+   }
+   if(argc>=1){
+      fn_w = *argv;
+      argc--;argv++;
+   }else{
+      fn_w = NULL;
+   }
+   {
+      int len;
+      char buff[0x1000];
+      char mode[10];
+
+      if(decompress){
+         BZFILE *BZ2fp_r = NULL;
+         FILE *fp_w = NULL;
+
+         if(fn_w){
+            if((fp_w = fopen(fn_w,"wb"))==NULL){
+               printf("can't open [%s]\n",fn_w);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_w = stdout;
+         }
+         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
+            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
+            fwrite(buff,1,len,fp_w);
+         }
+         BZ2_bzclose(BZ2fp_r);
+         if(fp_w != stdout) fclose(fp_w);
+      }else{
+         BZFILE *BZ2fp_w = NULL;
+         FILE *fp_r = NULL;
+
+         if(fn_r){
+            if((fp_r = fopen(fn_r,"rb"))==NULL){
+               printf("can't open [%s]\n",fn_r);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_r = stdin;
+         }
+         mode[0]='w';
+         mode[1] = '0' + level;
+         mode[2] = '\0';
+
+         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
+            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=fread(buff,1,0x1000,fp_r))>0){
+            BZ2_bzwrite(BZ2fp_w,buff,len);
+         }
+         BZ2_bzclose(BZ2fp_w);
+         if(fp_r!=stdin)fclose(fp_r);
+      }
+   }
+#ifdef _WIN32
+   BZ2DLLFreeLibrary();
+#endif
+   return 0;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/dlltest.dsp
@@ -0,0 +1,93 @@
+# Microsoft Developer Studio Project File - Name="dlltest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ÒW‚µ‚È‚¢‚Å‚­‚¾‚³‚¢ **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=dlltest - Win32 Debug
+!MESSAGE ‚±‚ê‚Í—LŒø‚ÈÒ²¸Ì§²Ù‚Å‚Í‚ ‚è‚Ü‚¹‚ñB ‚±‚ÌÌßÛ¼Þª¸Ä‚ðËÞÙÄÞ‚·‚邽‚ß‚É‚Í NMAKE ‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+!MESSAGE [Ò²¸Ì§²Ù‚Ì´¸½Îß°Ä] ºÏÝÄÞ‚ðŽg—p‚µ‚ÄŽÀs‚µ‚Ä‚­‚¾‚³‚¢
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak".
+!MESSAGE 
+!MESSAGE NMAKE ‚ÌŽÀsŽž‚É\¬‚ðŽw’è‚Å‚«‚Ü‚·
+!MESSAGE ºÏÝÄÞ ×²Ýã‚ÅϸۂÌÝ’è‚ð’è‹`‚µ‚Ü‚·B—á:
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak" CFG="dlltest - Win32 Debug"
+!MESSAGE 
+!MESSAGE ‘I‘ð‰Â”\‚ÈËÞÙÄÞ Ó°ÄÞ:
+!MESSAGE 
+!MESSAGE "dlltest - Win32 Release" ("Win32 (x86) Console Application" —p)
+!MESSAGE "dlltest - Win32 Debug" ("Win32 (x86) Console Application" —p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "dlltest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"minibz2.exe"
+
+!ELSEIF  "$(CFG)" == "dlltest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "dlltest_"
+# PROP BASE Intermediate_Dir "dlltest_"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "dlltest_"
+# PROP Intermediate_Dir "dlltest_"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"minibz2.exe" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "dlltest - Win32 Release"
+# Name "dlltest - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dlltest.c
+# End Source File
+# End Target
+# End Project
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/entities.xml
@@ -0,0 +1,9 @@
+<!-- misc. strings -->
+<!ENTITY bz-url "http://www.bzip.org">
+<!ENTITY bz-email "jseward@bzip.org">
+<!ENTITY bz-lifespan "1996-2010">
+
+<!ENTITY bz-version "1.0.6">
+<!ENTITY bz-date "6 September 2010">
+
+<!ENTITY manual-title "bzip2 Manual">
new file mode 100755
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/format.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+#
+# ------------------------------------------------------------------
+# This file is part of bzip2/libbzip2, a program and library for
+# lossless, block-sorting data compression.
+#
+# bzip2/libbzip2 version 1.0.6 of 6 September 2010
+# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+#
+# Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+# README file.
+#
+# This program is released under the terms of the license contained
+# in the file LICENSE.
+# ------------------------------------------------------------------
+#
+use strict;
+
+# get command line values:
+if ( $#ARGV !=1 ) {
+    die "Usage:  $0 xml_infile xml_outfile\n";
+}
+
+my $infile = shift;
+# check infile exists
+die "Can't find file \"$infile\""
+  unless -f $infile;
+# check we can read infile
+if (! -r $infile) {
+    die "Can't read input $infile\n";
+}
+# check we can open infile
+open( INFILE,"<$infile" ) or 
+    die "Can't input $infile $!";
+
+#my $outfile = 'fmt-manual.xml';
+my $outfile = shift;
+#print "Infile: $infile, Outfile: $outfile\n";
+# check we can write to outfile
+open( OUTFILE,">$outfile" ) or 
+    die "Can't output $outfile $! for writing";
+
+my ($prev, $curr, $str);
+$prev = ''; $curr = '';
+while ( <INFILE> ) {
+
+		print OUTFILE $prev;
+    $prev = $curr;
+    $curr = $_;
+    $str = '';
+
+    if ( $prev =~ /<programlisting>$|<screen>$/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "<![CDATA[", $curr );
+				$prev = '';
+        next;
+    }
+    elsif ( $curr =~ /<\/programlisting>|<\/screen>/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "]]>", $curr );
+				$prev = '';
+        next;
+    }
+}
+print OUTFILE $curr;
+close INFILE;
+close OUTFILE;
+exit;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/huffman.c
@@ -0,0 +1,205 @@
+
+/*-------------------------------------------------------------*/
+/*--- Huffman coding low-level stuff                        ---*/
+/*---                                             huffman.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------------*/
+#define WEIGHTOF(zz0)  ((zz0) & 0xffffff00)
+#define DEPTHOF(zz1)   ((zz1) & 0x000000ff)
+#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
+
+#define ADDWEIGHTS(zw1,zw2)                           \
+   (WEIGHTOF(zw1)+WEIGHTOF(zw2)) |                    \
+   (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
+
+#define UPHEAP(z)                                     \
+{                                                     \
+   Int32 zz, tmp;                                     \
+   zz = z; tmp = heap[zz];                            \
+   while (weight[tmp] < weight[heap[zz >> 1]]) {      \
+      heap[zz] = heap[zz >> 1];                       \
+      zz >>= 1;                                       \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+#define DOWNHEAP(z)                                   \
+{                                                     \
+   Int32 zz, yy, tmp;                                 \
+   zz = z; tmp = heap[zz];                            \
+   while (True) {                                     \
+      yy = zz << 1;                                   \
+      if (yy > nHeap) break;                          \
+      if (yy < nHeap &&                               \
+          weight[heap[yy+1]] < weight[heap[yy]])      \
+         yy++;                                        \
+      if (weight[tmp] < weight[heap[yy]]) break;      \
+      heap[zz] = heap[yy];                            \
+      zz = yy;                                        \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbMakeCodeLengths ( UChar *len, 
+                             Int32 *freq,
+                             Int32 alphaSize,
+                             Int32 maxLen )
+{
+   /*--
+      Nodes and heap entries run from 1.  Entry 0
+      for both the heap and nodes is a sentinel.
+   --*/
+   Int32 nNodes, nHeap, n1, n2, i, j, k;
+   Bool  tooLong;
+
+   Int32 heap   [ BZ_MAX_ALPHA_SIZE + 2 ];
+   Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
+   Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; 
+
+   for (i = 0; i < alphaSize; i++)
+      weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
+
+   while (True) {
+
+      nNodes = alphaSize;
+      nHeap = 0;
+
+      heap[0] = 0;
+      weight[0] = 0;
+      parent[0] = -2;
+
+      for (i = 1; i <= alphaSize; i++) {
+         parent[i] = -1;
+         nHeap++;
+         heap[nHeap] = i;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
+   
+      while (nHeap > 1) {
+         n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         nNodes++;
+         parent[n1] = parent[n2] = nNodes;
+         weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
+         parent[nNodes] = -1;
+         nHeap++;
+         heap[nHeap] = nNodes;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
+
+      tooLong = False;
+      for (i = 1; i <= alphaSize; i++) {
+         j = 0;
+         k = i;
+         while (parent[k] >= 0) { k = parent[k]; j++; }
+         len[i-1] = j;
+         if (j > maxLen) tooLong = True;
+      }
+      
+      if (! tooLong) break;
+
+      /* 17 Oct 04: keep-going condition for the following loop used
+         to be 'i < alphaSize', which missed the last element,
+         theoretically leading to the possibility of the compressor
+         looping.  However, this count-scaling step is only needed if
+         one of the generated Huffman code words is longer than
+         maxLen, which up to and including version 1.0.2 was 20 bits,
+         which is extremely unlikely.  In version 1.0.3 maxLen was
+         changed to 17 bits, which has minimal effect on compression
+         ratio, but does mean this scaling step is used from time to
+         time, enough to verify that it works.
+
+         This means that bzip2-1.0.3 and later will only produce
+         Huffman codes with a maximum length of 17 bits.  However, in
+         order to preserve backwards compatibility with bitstreams
+         produced by versions pre-1.0.3, the decompressor must still
+         handle lengths of up to 20. */
+
+      for (i = 1; i <= alphaSize; i++) {
+         j = weight[i] >> 8;
+         j = 1 + (j / 2);
+         weight[i] = j << 8;
+      }
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbAssignCodes ( Int32 *code,
+                         UChar *length,
+                         Int32 minLen,
+                         Int32 maxLen,
+                         Int32 alphaSize )
+{
+   Int32 n, vec, i;
+
+   vec = 0;
+   for (n = minLen; n <= maxLen; n++) {
+      for (i = 0; i < alphaSize; i++)
+         if (length[i] == n) { code[i] = vec; vec++; };
+      vec <<= 1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbCreateDecodeTables ( Int32 *limit,
+                                Int32 *base,
+                                Int32 *perm,
+                                UChar *length,
+                                Int32 minLen,
+                                Int32 maxLen,
+                                Int32 alphaSize )
+{
+   Int32 pp, i, j, vec;
+
+   pp = 0;
+   for (i = minLen; i <= maxLen; i++)
+      for (j = 0; j < alphaSize; j++)
+         if (length[j] == i) { perm[pp] = j; pp++; };
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
+   for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
+
+   for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
+   vec = 0;
+
+   for (i = minLen; i <= maxLen; i++) {
+      vec += (base[i+1] - base[i]);
+      limit[i] = vec-1;
+      vec <<= 1;
+   }
+   for (i = minLen + 1; i <= maxLen; i++)
+      base[i] = ((limit[i-1] + 1) << 1) - base[i];
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                         huffman.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/libbz2.def
@@ -0,0 +1,27 @@
+LIBRARY			LIBBZ2
+DESCRIPTION		"libbzip2: library for data compression"
+EXPORTS
+	BZ2_bzCompressInit
+	BZ2_bzCompress
+	BZ2_bzCompressEnd
+	BZ2_bzDecompressInit
+	BZ2_bzDecompress
+	BZ2_bzDecompressEnd
+	BZ2_bzReadOpen
+	BZ2_bzReadClose
+	BZ2_bzReadGetUnused
+	BZ2_bzRead
+	BZ2_bzWriteOpen
+	BZ2_bzWrite
+	BZ2_bzWriteClose
+	BZ2_bzWriteClose64
+	BZ2_bzBuffToBuffCompress
+	BZ2_bzBuffToBuffDecompress
+	BZ2_bzlibVersion
+	BZ2_bzopen
+	BZ2_bzdopen
+	BZ2_bzread
+	BZ2_bzwrite
+	BZ2_bzflush
+	BZ2_bzclose
+	BZ2_bzerror
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/libbz2.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="libbz2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ÒW‚µ‚È‚¢‚Å‚­‚¾‚³‚¢ **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libbz2 - Win32 Debug
+!MESSAGE ‚±‚ê‚Í—LŒø‚ÈÒ²¸Ì§²Ù‚Å‚Í‚ ‚è‚Ü‚¹‚ñB ‚±‚ÌÌßÛ¼Þª¸Ä‚ðËÞÙÄÞ‚·‚邽‚ß‚É‚Í NMAKE ‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+!MESSAGE [Ò²¸Ì§²Ù‚Ì´¸½Îß°Ä] ºÏÝÄÞ‚ðŽg—p‚µ‚ÄŽÀs‚µ‚Ä‚­‚¾‚³‚¢
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak".
+!MESSAGE 
+!MESSAGE NMAKE ‚ÌŽÀsŽž‚É\¬‚ðŽw’è‚Å‚«‚Ü‚·
+!MESSAGE ºÏÝÄÞ ×²Ýã‚ÅϸۂÌÝ’è‚ð’è‹`‚µ‚Ü‚·B—á:
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak" CFG="libbz2 - Win32 Debug"
+!MESSAGE 
+!MESSAGE ‘I‘ð‰Â”\‚ÈËÞÙÄÞ Ó°ÄÞ:
+!MESSAGE 
+!MESSAGE "libbz2 - Win32 Release" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE "libbz2 - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libbz2 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"libbz2.dll"
+
+!ELSEIF  "$(CFG)" == "libbz2 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"libbz2.dll" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libbz2 - Win32 Release"
+# Name "libbz2 - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\blocksort.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib_private.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\crctable.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\decompress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\libbz2.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\randtable.c
+# End Source File
+# End Target
+# End Project
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/makefile.msc
@@ -0,0 +1,63 @@
+# Makefile for Microsoft Visual C++ 6.0
+# usage: nmake -f makefile.msc
+# K.M. Syring (syring@gsf.de)
+# Fixed up by JRS for bzip2-0.9.5d release.
+
+CC=cl
+CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo
+
+OBJS= blocksort.obj  \
+      huffman.obj    \
+      crctable.obj   \
+      randtable.obj  \
+      compress.obj   \
+      decompress.obj \
+      bzlib.obj
+
+all: lib bzip2 test
+
+bzip2: lib
+	$(CC) $(CFLAGS) -o bzip2 bzip2.c libbz2.lib setargv.obj
+	$(CC) $(CFLAGS) -o bzip2recover bzip2recover.c
+
+lib: $(OBJS)
+	lib /out:libbz2.lib $(OBJS)
+
+test: bzip2
+	type words1
+	.\\bzip2 -1  < sample1.ref > sample1.rb2
+	.\\bzip2 -2  < sample2.ref > sample2.rb2
+	.\\bzip2 -3  < sample3.ref > sample3.rb2
+	.\\bzip2 -d  < sample1.bz2 > sample1.tst
+	.\\bzip2 -d  < sample2.bz2 > sample2.tst
+	.\\bzip2 -ds < sample3.bz2 > sample3.tst
+	@echo All six of the fc's should find no differences.
+	@echo If fc finds an error on sample3.bz2, this could be
+	@echo because WinZip's 'TAR file smart CR/LF conversion'
+	@echo is too clever for its own good.  Disable this option.
+	@echo The correct size for sample3.ref is 120,244.  If it
+	@echo is 150,251, WinZip has messed it up.
+	fc sample1.bz2 sample1.rb2 
+	fc sample2.bz2 sample2.rb2
+	fc sample3.bz2 sample3.rb2
+	fc sample1.tst sample1.ref
+	fc sample2.tst sample2.ref
+	fc sample3.tst sample3.ref
+
+
+
+clean: 
+	del *.obj
+	del libbz2.lib 
+	del bzip2.exe
+	del bzip2recover.exe
+	del sample1.rb2 
+	del sample2.rb2 
+	del sample3.rb2
+	del sample1.tst 
+	del sample2.tst
+	del sample3.tst
+
+.c.obj: 
+	$(CC) $(CFLAGS) -c $*.c -o $*.obj
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/manual.html
@@ -0,0 +1,2540 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>bzip2 and libbzip2, version 1.0.6</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<style type="text/css" media="screen">/* Colours:
+#74240f  dark brown      h1, h2, h3, h4
+#336699  medium blue     links
+#339999  turquoise       link hover colour
+#202020  almost black    general text
+#761596  purple          md5sum text
+#626262  dark gray       pre border
+#eeeeee  very light gray pre background
+#f2f2f9  very light blue nav table background
+#3366cc  medium blue     nav table border
+*/
+
+a, a:link, a:visited, a:active { color: #336699; }
+a:hover { color: #339999; }
+
+body { font: 80%/126% sans-serif; }
+h1, h2, h3, h4 { color: #74240f; }
+
+dt { color: #336699; font-weight: bold }
+dd { 
+ margin-left: 1.5em; 
+ padding-bottom: 0.8em;
+}
+
+/* -- ruler -- */
+div.hr_blue { 
+  height:  3px; 
+  background:#ffffff url("/images/hr_blue.png") repeat-x; }
+div.hr_blue hr { display:none; }
+
+/* release styles */
+#release p { margin-top: 0.4em; }
+#release .md5sum { color: #761596; }
+
+
+/* ------ styles for docs|manuals|howto ------ */
+/* -- lists -- */
+ul  { 
+ margin:     0px 4px 16px 16px;
+ padding:    0px;
+ list-style: url("/images/li-blue.png"); 
+}
+ul li { 
+ margin-bottom: 10px;
+}
+ul ul	{ 
+ list-style-type:  none; 
+ list-style-image: none; 
+ margin-left:      0px; 
+}
+
+/* header / footer nav tables */
+table.nav {
+ border:     solid 1px #3366cc;
+ background: #f2f2f9;
+ background-color: #f2f2f9;
+ margin-bottom: 0.5em;
+}
+/* don't have underlined links in chunked nav menus */
+table.nav a { text-decoration: none; }
+table.nav a:hover { text-decoration: underline; }
+table.nav td { font-size: 85%; }
+
+code, tt, pre { font-size: 120%; }
+code, tt { color: #761596; }
+
+div.literallayout, pre.programlisting, pre.screen {
+ color:      #000000;
+ padding:    0.5em;
+ background: #eeeeee;
+ border:     1px solid #626262;
+ background-color: #eeeeee;
+ margin: 4px 0px 4px 0px; 
+}
+</style>
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div lang="en" class="book" title="bzip2 and libbzip2, version 1.0.6">
+<div class="titlepage">
+<div>
+<div><h1 class="title">
+<a name="userman"></a>bzip2 and libbzip2, version 1.0.6</h1></div>
+<div><h2 class="subtitle">A program and library for data compression</h2></div>
+<div><div class="authorgroup"><div class="author">
+<h3 class="author">
+<span class="firstname">Julian</span> <span class="surname">Seward</span>
+</h3>
+<div class="affiliation"><span class="orgname">http://www.bzip.org<br></span></div>
+</div></div></div>
+<div><p class="releaseinfo">Version 1.0.6 of 6 September 2010</p></div>
+<div><p class="copyright">Copyright © 1996-2010 Julian Seward</p></div>
+<div><div class="legalnotice" title="Legal Notice">
+<a name="id537185"></a><p>This program, <code class="computeroutput">bzip2</code>, the
+  associated library <code class="computeroutput">libbzip2</code>, and
+  all documentation, are copyright © 1996-2010 Julian Seward.
+  All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with
+  or without modification, are permitted provided that the
+  following conditions are met:</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p>Redistributions of source code must retain the
+   above copyright notice, this list of conditions and the
+   following disclaimer.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>The origin of this software must not be
+   misrepresented; you must not claim that you wrote the original
+   software.  If you use this software in a product, an
+   acknowledgment in the product documentation would be
+   appreciated but is not required.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>Altered source versions must be plainly marked
+   as such, and must not be misrepresented as being the original
+   software.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>The name of the author may not be used to
+   endorse or promote products derived from this software without
+   specific prior written permission.</p></li>
+</ul></div>
+<p>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.</p>
+<p>PATENTS: To the best of my knowledge,
+ <code class="computeroutput">bzip2</code> and
+ <code class="computeroutput">libbzip2</code> do not use any patented
+ algorithms.  However, I do not have the resources to carry
+ out a patent search.  Therefore I cannot give any guarantee of
+ the above statement.
+ </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="chapter"><a href="#intro">1. Introduction</a></span></dt>
+<dt><span class="chapter"><a href="#using">2. How to use bzip2</a></span></dt>
+<dd><dl>
+<dt><span class="sect1"><a href="#name">2.1. NAME</a></span></dt>
+<dt><span class="sect1"><a href="#synopsis">2.2. SYNOPSIS</a></span></dt>
+<dt><span class="sect1"><a href="#description">2.3. DESCRIPTION</a></span></dt>
+<dt><span class="sect1"><a href="#options">2.4. OPTIONS</a></span></dt>
+<dt><span class="sect1"><a href="#memory-management">2.5. MEMORY MANAGEMENT</a></span></dt>
+<dt><span class="sect1"><a href="#recovering">2.6. RECOVERING DATA FROM DAMAGED FILES</a></span></dt>
+<dt><span class="sect1"><a href="#performance">2.7. PERFORMANCE NOTES</a></span></dt>
+<dt><span class="sect1"><a href="#caveats">2.8. CAVEATS</a></span></dt>
+<dt><span class="sect1"><a href="#author">2.9. AUTHOR</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="#libprog">3. 
+Programming with <code class="computeroutput">libbzip2</code>
+</a></span></dt>
+<dd><dl>
+<dt><span class="sect1"><a href="#top-level">3.1. Top-level structure</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#ll-summary">3.1.1. Low-level summary</a></span></dt>
+<dt><span class="sect2"><a href="#hl-summary">3.1.2. High-level summary</a></span></dt>
+<dt><span class="sect2"><a href="#util-fns-summary">3.1.3. Utility functions summary</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#err-handling">3.2. Error handling</a></span></dt>
+<dt><span class="sect1"><a href="#low-level">3.3. Low-level interface</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#bzcompress-init">3.3.1. BZ2_bzCompressInit</a></span></dt>
+<dt><span class="sect2"><a href="#bzCompress">3.3.2. BZ2_bzCompress</a></span></dt>
+<dt><span class="sect2"><a href="#bzCompress-end">3.3.3. BZ2_bzCompressEnd</a></span></dt>
+<dt><span class="sect2"><a href="#bzDecompress-init">3.3.4. BZ2_bzDecompressInit</a></span></dt>
+<dt><span class="sect2"><a href="#bzDecompress">3.3.5. BZ2_bzDecompress</a></span></dt>
+<dt><span class="sect2"><a href="#bzDecompress-end">3.3.6. BZ2_bzDecompressEnd</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#hl-interface">3.4. High-level interface</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#bzreadopen">3.4.1. BZ2_bzReadOpen</a></span></dt>
+<dt><span class="sect2"><a href="#bzread">3.4.2. BZ2_bzRead</a></span></dt>
+<dt><span class="sect2"><a href="#bzreadgetunused">3.4.3. BZ2_bzReadGetUnused</a></span></dt>
+<dt><span class="sect2"><a href="#bzreadclose">3.4.4. BZ2_bzReadClose</a></span></dt>
+<dt><span class="sect2"><a href="#bzwriteopen">3.4.5. BZ2_bzWriteOpen</a></span></dt>
+<dt><span class="sect2"><a href="#bzwrite">3.4.6. BZ2_bzWrite</a></span></dt>
+<dt><span class="sect2"><a href="#bzwriteclose">3.4.7. BZ2_bzWriteClose</a></span></dt>
+<dt><span class="sect2"><a href="#embed">3.4.8. Handling embedded compressed data streams</a></span></dt>
+<dt><span class="sect2"><a href="#std-rdwr">3.4.9. Standard file-reading/writing code</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#util-fns">3.5. Utility functions</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#bzbufftobuffcompress">3.5.1. BZ2_bzBuffToBuffCompress</a></span></dt>
+<dt><span class="sect2"><a href="#bzbufftobuffdecompress">3.5.2. BZ2_bzBuffToBuffDecompress</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#zlib-compat">3.6. zlib compatibility functions</a></span></dt>
+<dt><span class="sect1"><a href="#stdio-free">3.7. Using the library in a stdio-free environment</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#stdio-bye">3.7.1. Getting rid of stdio</a></span></dt>
+<dt><span class="sect2"><a href="#critical-error">3.7.2. Critical error handling</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#win-dll">3.8. Making a Windows DLL</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="#misc">4. Miscellanea</a></span></dt>
+<dd><dl>
+<dt><span class="sect1"><a href="#limits">4.1. Limitations of the compressed file format</a></span></dt>
+<dt><span class="sect1"><a href="#port-issues">4.2. Portability issues</a></span></dt>
+<dt><span class="sect1"><a href="#bugs">4.3. Reporting bugs</a></span></dt>
+<dt><span class="sect1"><a href="#package">4.4. Did you get the right package?</a></span></dt>
+<dt><span class="sect1"><a href="#reading">4.5. Further Reading</a></span></dt>
+</dl></dd>
+</dl>
+</div>
+<div class="chapter" title="1. Introduction">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="intro"></a>1. Introduction</h2></div></div></div>
+<p><code class="computeroutput">bzip2</code> compresses files
+using the Burrows-Wheeler block-sorting text compression
+algorithm, and Huffman coding.  Compression is generally
+considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of
+the PPM family of statistical compressors.</p>
+<p><code class="computeroutput">bzip2</code> is built on top of
+<code class="computeroutput">libbzip2</code>, a flexible library for
+handling compressed data in the
+<code class="computeroutput">bzip2</code> format.  This manual
+describes both how to use the program and how to work with the
+library interface.  Most of the manual is devoted to this
+library, not the program, which is good news if your interest is
+only in the program.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p><a class="xref" href="#using" title="2. How to use bzip2">How to use bzip2</a> describes how to use
+ <code class="computeroutput">bzip2</code>; this is the only part
+ you need to read if you just want to know how to operate the
+ program.</p></li>
+<li class="listitem" style="list-style-type: disc"><p><a class="xref" href="#libprog" title="3.  Programming with libbzip2">Programming with libbzip2</a> describes the
+ programming interfaces in detail, and</p></li>
+<li class="listitem" style="list-style-type: disc"><p><a class="xref" href="#misc" title="4. Miscellanea">Miscellanea</a> records some
+ miscellaneous notes which I thought ought to be recorded
+ somewhere.</p></li>
+</ul></div>
+</div>
+<div class="chapter" title="2. How to use bzip2">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="using"></a>2. How to use bzip2</h2></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="sect1"><a href="#name">2.1. NAME</a></span></dt>
+<dt><span class="sect1"><a href="#synopsis">2.2. SYNOPSIS</a></span></dt>
+<dt><span class="sect1"><a href="#description">2.3. DESCRIPTION</a></span></dt>
+<dt><span class="sect1"><a href="#options">2.4. OPTIONS</a></span></dt>
+<dt><span class="sect1"><a href="#memory-management">2.5. MEMORY MANAGEMENT</a></span></dt>
+<dt><span class="sect1"><a href="#recovering">2.6. RECOVERING DATA FROM DAMAGED FILES</a></span></dt>
+<dt><span class="sect1"><a href="#performance">2.7. PERFORMANCE NOTES</a></span></dt>
+<dt><span class="sect1"><a href="#caveats">2.8. CAVEATS</a></span></dt>
+<dt><span class="sect1"><a href="#author">2.9. AUTHOR</a></span></dt>
+</dl>
+</div>
+<p>This chapter contains a copy of the
+<code class="computeroutput">bzip2</code> man page, and nothing
+else.</p>
+<div class="sect1" title="2.1. NAME">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="name"></a>2.1. NAME</h2></div></div></div>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzip2</code>,
+  <code class="computeroutput">bunzip2</code> - a block-sorting file
+  compressor, v1.0.6</p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzcat</code> -
+   decompresses files to stdout</p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzip2recover</code> -
+   recovers data from damaged bzip2 files</p></li>
+</ul></div>
+</div>
+<div class="sect1" title="2.2. SYNOPSIS">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="synopsis"></a>2.2. SYNOPSIS</h2></div></div></div>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzip2</code> [
+  -cdfkqstvzVL123456789 ] [ filenames ...  ]</p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bunzip2</code> [
+  -fkvsVL ] [ filenames ...  ]</p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzcat</code> [ -s ] [
+  filenames ...  ]</p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzip2recover</code>
+  filename</p></li>
+</ul></div>
+</div>
+<div class="sect1" title="2.3. DESCRIPTION">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="description"></a>2.3. DESCRIPTION</h2></div></div></div>
+<p><code class="computeroutput">bzip2</code> compresses files
+using the Burrows-Wheeler block sorting text compression
+algorithm, and Huffman coding.  Compression is generally
+considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of
+the PPM family of statistical compressors.</p>
+<p>The command-line options are deliberately very similar to
+those of GNU <code class="computeroutput">gzip</code>, but they are
+not identical.</p>
+<p><code class="computeroutput">bzip2</code> expects a list of
+file names to accompany the command-line flags.  Each file is
+replaced by a compressed version of itself, with the name
+<code class="computeroutput">original_name.bz2</code>.  Each
+compressed file has the same modification date, permissions, and,
+when possible, ownership as the corresponding original, so that
+these properties can be correctly restored at decompression time.
+File name handling is naive in the sense that there is no
+mechanism for preserving original file names, permissions,
+ownerships or dates in filesystems which lack these concepts, or
+have serious file name length restrictions, such as
+MS-DOS.</p>
+<p><code class="computeroutput">bzip2</code> and
+<code class="computeroutput">bunzip2</code> will by default not
+overwrite existing files.  If you want this to happen, specify
+the <code class="computeroutput">-f</code> flag.</p>
+<p>If no file names are specified,
+<code class="computeroutput">bzip2</code> compresses from standard
+input to standard output.  In this case,
+<code class="computeroutput">bzip2</code> will decline to write
+compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.</p>
+<p><code class="computeroutput">bunzip2</code> (or
+<code class="computeroutput">bzip2 -d</code>) decompresses all
+specified files.  Files which were not created by
+<code class="computeroutput">bzip2</code> will be detected and
+ignored, and a warning issued.
+<code class="computeroutput">bzip2</code> attempts to guess the
+filename for the decompressed file from that of the compressed
+file as follows:</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">filename.bz2 </code>
+  becomes
+  <code class="computeroutput">filename</code></p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">filename.bz </code>
+  becomes
+  <code class="computeroutput">filename</code></p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">filename.tbz2</code>
+  becomes
+  <code class="computeroutput">filename.tar</code></p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">filename.tbz </code>
+  becomes
+  <code class="computeroutput">filename.tar</code></p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">anyothername </code>
+  becomes
+  <code class="computeroutput">anyothername.out</code></p></li>
+</ul></div>
+<p>If the file does not end in one of the recognised endings,
+<code class="computeroutput">.bz2</code>,
+<code class="computeroutput">.bz</code>,
+<code class="computeroutput">.tbz2</code> or
+<code class="computeroutput">.tbz</code>,
+<code class="computeroutput">bzip2</code> complains that it cannot
+guess the name of the original file, and uses the original name
+with <code class="computeroutput">.out</code> appended.</p>
+<p>As with compression, supplying no filenames causes
+decompression from standard input to standard output.</p>
+<p><code class="computeroutput">bunzip2</code> will correctly
+decompress a file which is the concatenation of two or more
+compressed files.  The result is the concatenation of the
+corresponding uncompressed files.  Integrity testing
+(<code class="computeroutput">-t</code>) of concatenated compressed
+files is also supported.</p>
+<p>You can also compress or decompress files to the standard
+output by giving the <code class="computeroutput">-c</code> flag.
+Multiple files may be compressed and decompressed like this.  The
+resulting outputs are fed sequentially to stdout.  Compression of
+multiple files in this manner generates a stream containing
+multiple compressed file representations.  Such a stream can be
+decompressed correctly only by
+<code class="computeroutput">bzip2</code> version 0.9.0 or later.
+Earlier versions of <code class="computeroutput">bzip2</code> will
+stop after decompressing the first file in the stream.</p>
+<p><code class="computeroutput">bzcat</code> (or
+<code class="computeroutput">bzip2 -dc</code>) decompresses all
+specified files to the standard output.</p>
+<p><code class="computeroutput">bzip2</code> will read arguments
+from the environment variables
+<code class="computeroutput">BZIP2</code> and
+<code class="computeroutput">BZIP</code>, in that order, and will
+process them before any arguments read from the command line.
+This gives a convenient way to supply default arguments.</p>
+<p>Compression is always performed, even if the compressed
+file is slightly larger than the original.  Files of less than
+about one hundred bytes tend to get larger, since the compression
+mechanism has a constant overhead in the region of 50 bytes.
+Random data (including the output of most file compressors) is
+coded at about 8.05 bits per byte, giving an expansion of around
+0.5%.</p>
+<p>As a self-check for your protection,
+<code class="computeroutput">bzip2</code> uses 32-bit CRCs to make
+sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data,
+and against undetected bugs in
+<code class="computeroutput">bzip2</code> (hopefully very unlikely).
+The chances of data corruption going undetected is microscopic,
+about one chance in four billion for each file processed.  Be
+aware, though, that the check occurs upon decompression, so it
+can only tell you that something is wrong.  It can't help you
+recover the original uncompressed data.  You can use
+<code class="computeroutput">bzip2recover</code> to try to recover
+data from damaged files.</p>
+<p>Return values: 0 for a normal exit, 1 for environmental
+problems (file not found, invalid flags, I/O errors, etc.), 2
+to indicate a corrupt compressed file, 3 for an internal
+consistency error (eg, bug) which caused
+<code class="computeroutput">bzip2</code> to panic.</p>
+</div>
+<div class="sect1" title="2.4. OPTIONS">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="options"></a>2.4. OPTIONS</h2></div></div></div>
+<div class="variablelist"><dl>
+<dt><span class="term"><code class="computeroutput">-c --stdout</code></span></dt>
+<dd><p>Compress or decompress to standard
+  output.</p></dd>
+<dt><span class="term"><code class="computeroutput">-d --decompress</code></span></dt>
+<dd><p>Force decompression.
+  <code class="computeroutput">bzip2</code>,
+  <code class="computeroutput">bunzip2</code> and
+  <code class="computeroutput">bzcat</code> are really the same
+  program, and the decision about what actions to take is done on
+  the basis of which name is used.  This flag overrides that
+  mechanism, and forces bzip2 to decompress.</p></dd>
+<dt><span class="term"><code class="computeroutput">-z --compress</code></span></dt>
+<dd><p>The complement to
+  <code class="computeroutput">-d</code>: forces compression,
+  regardless of the invokation name.</p></dd>
+<dt><span class="term"><code class="computeroutput">-t --test</code></span></dt>
+<dd><p>Check integrity of the specified file(s), but
+  don't decompress them.  This really performs a trial
+  decompression and throws away the result.</p></dd>
+<dt><span class="term"><code class="computeroutput">-f --force</code></span></dt>
+<dd>
+<p>Force overwrite of output files.  Normally,
+  <code class="computeroutput">bzip2</code> will not overwrite
+  existing output files.  Also forces
+  <code class="computeroutput">bzip2</code> to break hard links to
+  files, which it otherwise wouldn't do.</p>
+<p><code class="computeroutput">bzip2</code> normally declines
+  to decompress files which don't have the correct magic header
+  bytes. If forced (<code class="computeroutput">-f</code>),
+  however, it will pass such files through unmodified. This is
+  how GNU <code class="computeroutput">gzip</code> behaves.</p>
+</dd>
+<dt><span class="term"><code class="computeroutput">-k --keep</code></span></dt>
+<dd><p>Keep (don't delete) input files during
+  compression or decompression.</p></dd>
+<dt><span class="term"><code class="computeroutput">-s --small</code></span></dt>
+<dd>
+<p>Reduce memory usage, for compression,
+  decompression and testing.  Files are decompressed and tested
+  using a modified algorithm which only requires 2.5 bytes per
+  block byte.  This means any file can be decompressed in 2300k
+  of memory, albeit at about half the normal speed.</p>
+<p>During compression, <code class="computeroutput">-s</code>
+  selects a block size of 200k, which limits memory use to around
+  the same figure, at the expense of your compression ratio.  In
+  short, if your machine is low on memory (8 megabytes or less),
+  use <code class="computeroutput">-s</code> for everything.  See
+  <a class="xref" href="#memory-management" title="2.5. MEMORY MANAGEMENT">MEMORY MANAGEMENT</a> below.</p>
+</dd>
+<dt><span class="term"><code class="computeroutput">-q --quiet</code></span></dt>
+<dd><p>Suppress non-essential warning messages.
+  Messages pertaining to I/O errors and other critical events
+  will not be suppressed.</p></dd>
+<dt><span class="term"><code class="computeroutput">-v --verbose</code></span></dt>
+<dd><p>Verbose mode -- show the compression ratio for
+  each file processed.  Further
+  <code class="computeroutput">-v</code>'s increase the verbosity
+  level, spewing out lots of information which is primarily of
+  interest for diagnostic purposes.</p></dd>
+<dt><span class="term"><code class="computeroutput">-L --license -V --version</code></span></dt>
+<dd><p>Display the software version, license terms and
+  conditions.</p></dd>
+<dt><span class="term"><code class="computeroutput">-1</code> (or
+ <code class="computeroutput">--fast</code>) to
+ <code class="computeroutput">-9</code> (or
+ <code class="computeroutput">-best</code>)</span></dt>
+<dd><p>Set the block size to 100 k, 200 k ...  900 k
+  when compressing.  Has no effect when decompressing.  See <a class="xref" href="#memory-management" title="2.5. MEMORY MANAGEMENT">MEMORY MANAGEMENT</a> below.  The
+  <code class="computeroutput">--fast</code> and
+  <code class="computeroutput">--best</code> aliases are primarily
+  for GNU <code class="computeroutput">gzip</code> compatibility.
+  In particular, <code class="computeroutput">--fast</code> doesn't
+  make things significantly faster.  And
+  <code class="computeroutput">--best</code> merely selects the
+  default behaviour.</p></dd>
+<dt><span class="term"><code class="computeroutput">--</code></span></dt>
+<dd><p>Treats all subsequent arguments as file names,
+  even if they start with a dash.  This is so you can handle
+  files with names beginning with a dash, for example:
+  <code class="computeroutput">bzip2 --
+  -myfilename</code>.</p></dd>
+<dt>
+<span class="term"><code class="computeroutput">--repetitive-fast</code>, </span><span class="term"><code class="computeroutput">--repetitive-best</code></span>
+</dt>
+<dd><p>These flags are redundant in versions 0.9.5 and
+  above.  They provided some coarse control over the behaviour of
+  the sorting algorithm in earlier versions, which was sometimes
+  useful.  0.9.5 and above have an improved algorithm which
+  renders these flags irrelevant.</p></dd>
+</dl></div>
+</div>
+<div class="sect1" title="2.5. MEMORY MANAGEMENT">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="memory-management"></a>2.5. MEMORY MANAGEMENT</h2></div></div></div>
+<p><code class="computeroutput">bzip2</code> compresses large
+files in blocks.  The block size affects both the compression
+ratio achieved, and the amount of memory needed for compression
+and decompression.  The flags <code class="computeroutput">-1</code>
+through <code class="computeroutput">-9</code> specify the block
+size to be 100,000 bytes through 900,000 bytes (the default)
+respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+<code class="computeroutput">bunzip2</code> then allocates itself
+just enough memory to decompress the file.  Since block sizes are
+stored in compressed files, it follows that the flags
+<code class="computeroutput">-1</code> to
+<code class="computeroutput">-9</code> are irrelevant to and so
+ignored during decompression.</p>
+<p>Compression and decompression requirements, in bytes, can be
+estimated as:</p>
+<pre class="programlisting">Compression:   400k + ( 8 x block size )
+
+Decompression: 100k + ( 4 x block size ), or
+               100k + ( 2.5 x block size )</pre>
+<p>Larger block sizes give rapidly diminishing marginal
+returns.  Most of the compression comes from the first two or
+three hundred k of block size, a fact worth bearing in mind when
+using <code class="computeroutput">bzip2</code> on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block
+size.</p>
+<p>For files compressed with the default 900k block size,
+<code class="computeroutput">bunzip2</code> will require about 3700
+kbytes to decompress.  To support decompression of any file on a
+4 megabyte machine, <code class="computeroutput">bunzip2</code> has
+an option to decompress using approximately half this amount of
+memory, about 2300 kbytes.  Decompression speed is also halved,
+so you should use this option only where necessary.  The relevant
+flag is <code class="computeroutput">-s</code>.</p>
+<p>In general, try and use the largest block size memory
+constraints allow, since that maximises the compression achieved.
+Compression and decompression speed are virtually unaffected by
+block size.</p>
+<p>Another significant point applies to files which fit in a
+single block -- that means most files you'd encounter using a
+large block size.  The amount of real memory touched is
+proportional to the size of the file, since the file is smaller
+than a block.  For example, compressing a file 20,000 bytes long
+with the flag <code class="computeroutput">-9</code> will cause the
+compressor to allocate around 7600k of memory, but only touch
+400k + 20000 * 8 = 560 kbytes of it.  Similarly, the decompressor
+will allocate 3700k but only touch 100k + 20000 * 4 = 180
+kbytes.</p>
+<p>Here is a table which summarises the maximum memory usage
+for different block sizes.  Also recorded is the total compressed
+size for 14 files of the Calgary Text Compression Corpus
+totalling 3,141,622 bytes.  This column gives some feel for how
+compression varies with block size.  These figures tend to
+understate the advantage of larger block sizes for larger files,
+since the Corpus is dominated by smaller files.</p>
+<pre class="programlisting">        Compress   Decompress   Decompress   Corpus
+Flag     usage      usage       -s usage     Size
+
+ -1      1200k       500k         350k      914704
+ -2      2000k       900k         600k      877703
+ -3      2800k      1300k         850k      860338
+ -4      3600k      1700k        1100k      846899
+ -5      4400k      2100k        1350k      845160
+ -6      5200k      2500k        1600k      838626
+ -7      6100k      2900k        1850k      834096
+ -8      6800k      3300k        2100k      828642
+ -9      7600k      3700k        2350k      828642</pre>
+</div>
+<div class="sect1" title="2.6. RECOVERING DATA FROM DAMAGED FILES">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="recovering"></a>2.6. RECOVERING DATA FROM DAMAGED FILES</h2></div></div></div>
+<p><code class="computeroutput">bzip2</code> compresses files in
+blocks, usually 900kbytes long.  Each block is handled
+independently.  If a media or transmission error causes a
+multi-block <code class="computeroutput">.bz2</code> file to become
+damaged, it may be possible to recover data from the undamaged
+blocks in the file.</p>
+<p>The compressed representation of each block is delimited by
+a 48-bit pattern, which makes it possible to find the block
+boundaries with reasonable certainty.  Each block also carries
+its own 32-bit CRC, so damaged blocks can be distinguished from
+undamaged ones.</p>
+<p><code class="computeroutput">bzip2recover</code> is a simple
+program whose purpose is to search for blocks in
+<code class="computeroutput">.bz2</code> files, and write each block
+out into its own <code class="computeroutput">.bz2</code> file.  You
+can then use <code class="computeroutput">bzip2 -t</code> to test
+the integrity of the resulting files, and decompress those which
+are undamaged.</p>
+<p><code class="computeroutput">bzip2recover</code> takes a
+single argument, the name of the damaged file, and writes a
+number of files <code class="computeroutput">rec0001file.bz2</code>,
+<code class="computeroutput">rec0002file.bz2</code>, etc, containing
+the extracted blocks.  The output filenames are designed so that
+the use of wildcards in subsequent processing -- for example,
+<code class="computeroutput">bzip2 -dc rec*file.bz2 &gt;
+recovered_data</code> -- lists the files in the correct
+order.</p>
+<p><code class="computeroutput">bzip2recover</code> should be of
+most use dealing with large <code class="computeroutput">.bz2</code>
+files, as these will contain many blocks.  It is clearly futile
+to use it on damaged single-block files, since a damaged block
+cannot be recovered.  If you wish to minimise any potential data
+loss through media or transmission errors, you might consider
+compressing with a smaller block size.</p>
+</div>
+<div class="sect1" title="2.7. PERFORMANCE NOTES">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="performance"></a>2.7. PERFORMANCE NOTES</h2></div></div></div>
+<p>The sorting phase of compression gathers together similar
+strings in the file.  Because of this, files containing very long
+runs of repeated symbols, like "aabaabaabaab ..."  (repeated
+several hundred times) may compress more slowly than normal.
+Versions 0.9.5 and above fare much better than previous versions
+in this respect.  The ratio between worst-case and average-case
+compression time is in the region of 10:1.  For previous
+versions, this figure was more like 100:1.  You can use the
+<code class="computeroutput">-vvvv</code> option to monitor progress
+in great detail, if you want.</p>
+<p>Decompression speed is unaffected by these
+phenomena.</p>
+<p><code class="computeroutput">bzip2</code> usually allocates
+several megabytes of memory to operate in, and then charges all
+over it in a fairly random fashion.  This means that performance,
+both for compressing and decompressing, is largely determined by
+the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss
+rate have been observed to give disproportionately large
+performance improvements.  I imagine
+<code class="computeroutput">bzip2</code> will perform best on
+machines with very large caches.</p>
+</div>
+<div class="sect1" title="2.8. CAVEATS">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="caveats"></a>2.8. CAVEATS</h2></div></div></div>
+<p>I/O error messages are not as helpful as they could be.
+<code class="computeroutput">bzip2</code> tries hard to detect I/O
+errors and exit cleanly, but the details of what the problem is
+sometimes seem rather misleading.</p>
+<p>This manual page pertains to version 1.0.6 of
+<code class="computeroutput">bzip2</code>.  Compressed data created by
+this version is entirely forwards and backwards compatible with the
+previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0,
+1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and
+above can correctly decompress multiple concatenated compressed files.
+0.1pl2 cannot do this; it will stop after decompressing just the first
+file in the stream.</p>
+<p><code class="computeroutput">bzip2recover</code> versions
+prior to 1.0.2 used 32-bit integers to represent bit positions in
+compressed files, so it could not handle compressed files more
+than 512 megabytes long.  Versions 1.0.2 and above use 64-bit ints
+on some platforms which support them (GNU supported targets, and
+Windows). To establish whether or not
+<code class="computeroutput">bzip2recover</code> was built with such
+a limitation, run it without arguments. In any event you can
+build yourself an unlimited version if you can recompile it with
+<code class="computeroutput">MaybeUInt64</code> set to be an
+unsigned 64-bit integer.</p>
+</div>
+<div class="sect1" title="2.9. AUTHOR">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="author"></a>2.9. AUTHOR</h2></div></div></div>
+<p>Julian Seward,
+<code class="computeroutput">jseward@bzip.org</code></p>
+<p>The ideas embodied in
+<code class="computeroutput">bzip2</code> are due to (at least) the
+following people: Michael Burrows and David Wheeler (for the
+block sorting transformation), David Wheeler (again, for the
+Huffman coder), Peter Fenwick (for the structured coding model in
+the original <code class="computeroutput">bzip</code>, and many
+refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+<code class="computeroutput">bzip</code>).  I am much indebted for
+their help, support and advice.  See the manual in the source
+distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms,
+so as to speed up compression.  Bela Lubkin encouraged me to
+improve the worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+Many people sent
+patches, helped with portability problems, lent machines, gave
+advice and were generally helpful.</p>
+</div>
+</div>
+<div class="chapter" title="3.  Programming with libbzip2">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="libprog"></a>3. 
+Programming with <code class="computeroutput">libbzip2</code>
+</h2></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="sect1"><a href="#top-level">3.1. Top-level structure</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#ll-summary">3.1.1. Low-level summary</a></span></dt>
+<dt><span class="sect2"><a href="#hl-summary">3.1.2. High-level summary</a></span></dt>
+<dt><span class="sect2"><a href="#util-fns-summary">3.1.3. Utility functions summary</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#err-handling">3.2. Error handling</a></span></dt>
+<dt><span class="sect1"><a href="#low-level">3.3. Low-level interface</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#bzcompress-init">3.3.1. BZ2_bzCompressInit</a></span></dt>
+<dt><span class="sect2"><a href="#bzCompress">3.3.2. BZ2_bzCompress</a></span></dt>
+<dt><span class="sect2"><a href="#bzCompress-end">3.3.3. BZ2_bzCompressEnd</a></span></dt>
+<dt><span class="sect2"><a href="#bzDecompress-init">3.3.4. BZ2_bzDecompressInit</a></span></dt>
+<dt><span class="sect2"><a href="#bzDecompress">3.3.5. BZ2_bzDecompress</a></span></dt>
+<dt><span class="sect2"><a href="#bzDecompress-end">3.3.6. BZ2_bzDecompressEnd</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#hl-interface">3.4. High-level interface</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#bzreadopen">3.4.1. BZ2_bzReadOpen</a></span></dt>
+<dt><span class="sect2"><a href="#bzread">3.4.2. BZ2_bzRead</a></span></dt>
+<dt><span class="sect2"><a href="#bzreadgetunused">3.4.3. BZ2_bzReadGetUnused</a></span></dt>
+<dt><span class="sect2"><a href="#bzreadclose">3.4.4. BZ2_bzReadClose</a></span></dt>
+<dt><span class="sect2"><a href="#bzwriteopen">3.4.5. BZ2_bzWriteOpen</a></span></dt>
+<dt><span class="sect2"><a href="#bzwrite">3.4.6. BZ2_bzWrite</a></span></dt>
+<dt><span class="sect2"><a href="#bzwriteclose">3.4.7. BZ2_bzWriteClose</a></span></dt>
+<dt><span class="sect2"><a href="#embed">3.4.8. Handling embedded compressed data streams</a></span></dt>
+<dt><span class="sect2"><a href="#std-rdwr">3.4.9. Standard file-reading/writing code</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#util-fns">3.5. Utility functions</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#bzbufftobuffcompress">3.5.1. BZ2_bzBuffToBuffCompress</a></span></dt>
+<dt><span class="sect2"><a href="#bzbufftobuffdecompress">3.5.2. BZ2_bzBuffToBuffDecompress</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#zlib-compat">3.6. zlib compatibility functions</a></span></dt>
+<dt><span class="sect1"><a href="#stdio-free">3.7. Using the library in a stdio-free environment</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="#stdio-bye">3.7.1. Getting rid of stdio</a></span></dt>
+<dt><span class="sect2"><a href="#critical-error">3.7.2. Critical error handling</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="#win-dll">3.8. Making a Windows DLL</a></span></dt>
+</dl>
+</div>
+<p>This chapter describes the programming interface to
+<code class="computeroutput">libbzip2</code>.</p>
+<p>For general background information, particularly about
+memory use and performance aspects, you'd be well advised to read
+<a class="xref" href="#using" title="2. How to use bzip2">How to use bzip2</a> as well.</p>
+<div class="sect1" title="3.1. Top-level structure">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="top-level"></a>3.1. Top-level structure</h2></div></div></div>
+<p><code class="computeroutput">libbzip2</code> is a flexible
+library for compressing and decompressing data in the
+<code class="computeroutput">bzip2</code> data format.  Although
+packaged as a single entity, it helps to regard the library as
+three separate parts: the low level interface, and the high level
+interface, and some utility functions.</p>
+<p>The structure of
+<code class="computeroutput">libbzip2</code>'s interfaces is similar
+to that of Jean-loup Gailly's and Mark Adler's excellent
+<code class="computeroutput">zlib</code> library.</p>
+<p>All externally visible symbols have names beginning
+<code class="computeroutput">BZ2_</code>.  This is new in version
+1.0.  The intention is to minimise pollution of the namespaces of
+library clients.</p>
+<p>To use any part of the library, you need to
+<code class="computeroutput">#include &lt;bzlib.h&gt;</code>
+into your sources.</p>
+<div class="sect2" title="3.1.1. Low-level summary">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="ll-summary"></a>3.1.1. Low-level summary</h3></div></div></div>
+<p>This interface provides services for compressing and
+decompressing data in memory.  There's no provision for dealing
+with files, streams or any other I/O mechanisms, just straight
+memory-to-memory work.  In fact, this part of the library can be
+compiled without inclusion of
+<code class="computeroutput">stdio.h</code>, which may be helpful
+for embedded applications.</p>
+<p>The low-level part of the library has no global variables
+and is therefore thread-safe.</p>
+<p>Six routines make up the low level interface:
+<code class="computeroutput">BZ2_bzCompressInit</code>,
+<code class="computeroutput">BZ2_bzCompress</code>, and
+<code class="computeroutput">BZ2_bzCompressEnd</code> for
+compression, and a corresponding trio
+<code class="computeroutput">BZ2_bzDecompressInit</code>,
+<code class="computeroutput">BZ2_bzDecompress</code> and
+<code class="computeroutput">BZ2_bzDecompressEnd</code> for
+decompression.  The <code class="computeroutput">*Init</code>
+functions allocate memory for compression/decompression and do
+other initialisations, whilst the
+<code class="computeroutput">*End</code> functions close down
+operations and release memory.</p>
+<p>The real work is done by
+<code class="computeroutput">BZ2_bzCompress</code> and
+<code class="computeroutput">BZ2_bzDecompress</code>.  These
+compress and decompress data from a user-supplied input buffer to
+a user-supplied output buffer.  These buffers can be any size;
+arbitrary quantities of data are handled by making repeated calls
+to these functions.  This is a flexible mechanism allowing a
+consumer-pull style of activity, or producer-push, or a mixture
+of both.</p>
+</div>
+<div class="sect2" title="3.1.2. High-level summary">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="hl-summary"></a>3.1.2. High-level summary</h3></div></div></div>
+<p>This interface provides some handy wrappers around the
+low-level interface to facilitate reading and writing
+<code class="computeroutput">bzip2</code> format files
+(<code class="computeroutput">.bz2</code> files).  The routines
+provide hooks to facilitate reading files in which the
+<code class="computeroutput">bzip2</code> data stream is embedded
+within some larger-scale file structure, or where there are
+multiple <code class="computeroutput">bzip2</code> data streams
+concatenated end-to-end.</p>
+<p>For reading files,
+<code class="computeroutput">BZ2_bzReadOpen</code>,
+<code class="computeroutput">BZ2_bzRead</code>,
+<code class="computeroutput">BZ2_bzReadClose</code> and 
+<code class="computeroutput">BZ2_bzReadGetUnused</code> are
+supplied.  For writing files,
+<code class="computeroutput">BZ2_bzWriteOpen</code>,
+<code class="computeroutput">BZ2_bzWrite</code> and
+<code class="computeroutput">BZ2_bzWriteFinish</code> are
+available.</p>
+<p>As with the low-level library, no global variables are used
+so the library is per se thread-safe.  However, if I/O errors
+occur whilst reading or writing the underlying compressed files,
+you may have to consult <code class="computeroutput">errno</code> to
+determine the cause of the error.  In that case, you'd need a C
+library which correctly supports
+<code class="computeroutput">errno</code> in a multithreaded
+environment.</p>
+<p>To make the library a little simpler and more portable,
+<code class="computeroutput">BZ2_bzReadOpen</code> and
+<code class="computeroutput">BZ2_bzWriteOpen</code> require you to
+pass them file handles (<code class="computeroutput">FILE*</code>s)
+which have previously been opened for reading or writing
+respectively.  That avoids portability problems associated with
+file operations and file attributes, whilst not being much of an
+imposition on the programmer.</p>
+</div>
+<div class="sect2" title="3.1.3. Utility functions summary">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="util-fns-summary"></a>3.1.3. Utility functions summary</h3></div></div></div>
+<p>For very simple needs,
+<code class="computeroutput">BZ2_bzBuffToBuffCompress</code> and
+<code class="computeroutput">BZ2_bzBuffToBuffDecompress</code> are
+provided.  These compress data in memory from one buffer to
+another buffer in a single function call.  You should assess
+whether these functions fulfill your memory-to-memory
+compression/decompression requirements before investing effort in
+understanding the more general but more complex low-level
+interface.</p>
+<p>Yoshioka Tsuneo
+(<code class="computeroutput">tsuneo@rr.iij4u.or.jp</code>) has
+contributed some functions to give better
+<code class="computeroutput">zlib</code> compatibility.  These
+functions are <code class="computeroutput">BZ2_bzopen</code>,
+<code class="computeroutput">BZ2_bzread</code>,
+<code class="computeroutput">BZ2_bzwrite</code>,
+<code class="computeroutput">BZ2_bzflush</code>,
+<code class="computeroutput">BZ2_bzclose</code>,
+<code class="computeroutput">BZ2_bzerror</code> and
+<code class="computeroutput">BZ2_bzlibVersion</code>.  You may find
+these functions more convenient for simple file reading and
+writing, than those in the high-level interface.  These functions
+are not (yet) officially part of the library, and are minimally
+documented here.  If they break, you get to keep all the pieces.
+I hope to document them properly when time permits.</p>
+<p>Yoshioka also contributed modifications to allow the
+library to be built as a Windows DLL.</p>
+</div>
+</div>
+<div class="sect1" title="3.2. Error handling">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="err-handling"></a>3.2. Error handling</h2></div></div></div>
+<p>The library is designed to recover cleanly in all
+situations, including the worst-case situation of decompressing
+random data.  I'm not 100% sure that it can always do this, so
+you might want to add a signal handler to catch segmentation
+violations during decompression if you are feeling especially
+paranoid.  I would be interested in hearing more about the
+robustness of the library to corrupted compressed data.</p>
+<p>Version 1.0.3 more robust in this respect than any
+previous version.  Investigations with Valgrind (a tool for detecting
+problems with memory management) indicate
+that, at least for the few files I tested, all single-bit errors
+in the decompressed data are caught properly, with no
+segmentation faults, no uses of uninitialised data, no out of
+range reads or writes, and no infinite looping in the decompressor.
+So it's certainly pretty robust, although
+I wouldn't claim it to be totally bombproof.</p>
+<p>The file <code class="computeroutput">bzlib.h</code> contains
+all definitions needed to use the library.  In particular, you
+should definitely not include
+<code class="computeroutput">bzlib_private.h</code>.</p>
+<p>In <code class="computeroutput">bzlib.h</code>, the various
+return values are defined.  The following list is not intended as
+an exhaustive description of the circumstances in which a given
+value may be returned -- those descriptions are given later.
+Rather, it is intended to convey the rough meaning of each return
+value.  The first five actions are normal and not intended to
+denote an error situation.</p>
+<div class="variablelist"><dl>
+<dt><span class="term"><code class="computeroutput">BZ_OK</code></span></dt>
+<dd><p>The requested action was completed
+   successfully.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_RUN_OK, BZ_FLUSH_OK,
+    BZ_FINISH_OK</code></span></dt>
+<dd><p>In 
+   <code class="computeroutput">BZ2_bzCompress</code>, the requested
+   flush/finish/nothing-special action was completed
+   successfully.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_STREAM_END</code></span></dt>
+<dd><p>Compression of data was completed, or the
+   logical stream end was detected during
+   decompression.</p></dd>
+</dl></div>
+<p>The following return values indicate an error of some
+kind.</p>
+<div class="variablelist"><dl>
+<dt><span class="term"><code class="computeroutput">BZ_CONFIG_ERROR</code></span></dt>
+<dd><p>Indicates that the library has been improperly
+   compiled on your platform -- a major configuration error.
+   Specifically, it means that
+   <code class="computeroutput">sizeof(char)</code>,
+   <code class="computeroutput">sizeof(short)</code> and
+   <code class="computeroutput">sizeof(int)</code> are not 1, 2 and
+   4 respectively, as they should be.  Note that the library
+   should still work properly on 64-bit platforms which follow
+   the LP64 programming model -- that is, where
+   <code class="computeroutput">sizeof(long)</code> and
+   <code class="computeroutput">sizeof(void*)</code> are 8.  Under
+   LP64, <code class="computeroutput">sizeof(int)</code> is still 4,
+   so <code class="computeroutput">libbzip2</code>, which doesn't
+   use the <code class="computeroutput">long</code> type, is
+   OK.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_SEQUENCE_ERROR</code></span></dt>
+<dd><p>When using the library, it is important to call
+   the functions in the correct sequence and with data structures
+   (buffers etc) in the correct states.
+   <code class="computeroutput">libbzip2</code> checks as much as it
+   can to ensure this is happening, and returns
+   <code class="computeroutput">BZ_SEQUENCE_ERROR</code> if not.
+   Code which complies precisely with the function semantics, as
+   detailed below, should never receive this value; such an event
+   denotes buggy code which you should
+   investigate.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_PARAM_ERROR</code></span></dt>
+<dd><p>Returned when a parameter to a function call is
+   out of range or otherwise manifestly incorrect.  As with
+   <code class="computeroutput">BZ_SEQUENCE_ERROR</code>, this
+   denotes a bug in the client code.  The distinction between
+   <code class="computeroutput">BZ_PARAM_ERROR</code> and
+   <code class="computeroutput">BZ_SEQUENCE_ERROR</code> is a bit
+   hazy, but still worth making.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_MEM_ERROR</code></span></dt>
+<dd><p>Returned when a request to allocate memory
+   failed.  Note that the quantity of memory needed to decompress
+   a stream cannot be determined until the stream's header has
+   been read.  So
+   <code class="computeroutput">BZ2_bzDecompress</code> and
+   <code class="computeroutput">BZ2_bzRead</code> may return
+   <code class="computeroutput">BZ_MEM_ERROR</code> even though some
+   of the compressed data has been read.  The same is not true
+   for compression; once
+   <code class="computeroutput">BZ2_bzCompressInit</code> or
+   <code class="computeroutput">BZ2_bzWriteOpen</code> have
+   successfully completed,
+   <code class="computeroutput">BZ_MEM_ERROR</code> cannot
+   occur.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_DATA_ERROR</code></span></dt>
+<dd><p>Returned when a data integrity error is
+   detected during decompression.  Most importantly, this means
+   when stored and computed CRCs for the data do not match.  This
+   value is also returned upon detection of any other anomaly in
+   the compressed data.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_DATA_ERROR_MAGIC</code></span></dt>
+<dd><p>As a special case of
+   <code class="computeroutput">BZ_DATA_ERROR</code>, it is
+   sometimes useful to know when the compressed stream does not
+   start with the correct magic bytes (<code class="computeroutput">'B' 'Z'
+   'h'</code>).</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_IO_ERROR</code></span></dt>
+<dd><p>Returned by
+   <code class="computeroutput">BZ2_bzRead</code> and
+   <code class="computeroutput">BZ2_bzWrite</code> when there is an
+   error reading or writing in the compressed file, and by
+   <code class="computeroutput">BZ2_bzReadOpen</code> and
+   <code class="computeroutput">BZ2_bzWriteOpen</code> for attempts
+   to use a file for which the error indicator (viz,
+   <code class="computeroutput">ferror(f)</code>) is set.  On
+   receipt of <code class="computeroutput">BZ_IO_ERROR</code>, the
+   caller should consult <code class="computeroutput">errno</code>
+   and/or <code class="computeroutput">perror</code> to acquire
+   operating-system specific information about the
+   problem.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_UNEXPECTED_EOF</code></span></dt>
+<dd><p>Returned by
+   <code class="computeroutput">BZ2_bzRead</code> when the
+   compressed file finishes before the logical end of stream is
+   detected.</p></dd>
+<dt><span class="term"><code class="computeroutput">BZ_OUTBUFF_FULL</code></span></dt>
+<dd><p>Returned by
+   <code class="computeroutput">BZ2_bzBuffToBuffCompress</code> and
+   <code class="computeroutput">BZ2_bzBuffToBuffDecompress</code> to
+   indicate that the output data will not fit into the output
+   buffer provided.</p></dd>
+</dl></div>
+</div>
+<div class="sect1" title="3.3. Low-level interface">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="low-level"></a>3.3. Low-level interface</h2></div></div></div>
+<div class="sect2" title="3.3.1. BZ2_bzCompressInit">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzcompress-init"></a>3.3.1. BZ2_bzCompressInit</h3></div></div></div>
+<pre class="programlisting">typedef struct {
+  char *next_in;
+  unsigned int avail_in;
+  unsigned int total_in_lo32;
+  unsigned int total_in_hi32;
+
+  char *next_out;
+  unsigned int avail_out;
+  unsigned int total_out_lo32;
+  unsigned int total_out_hi32;
+
+  void *state;
+
+  void *(*bzalloc)(void *,int,int);
+  void (*bzfree)(void *,void *);
+  void *opaque;
+} bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm, 
+                         int blockSize100k, 
+                         int verbosity,
+                         int workFactor );</pre>
+<p>Prepares for compression.  The
+<code class="computeroutput">bz_stream</code> structure holds all
+data pertaining to the compression activity.  A
+<code class="computeroutput">bz_stream</code> structure should be
+allocated and initialised prior to the call.  The fields of
+<code class="computeroutput">bz_stream</code> comprise the entirety
+of the user-visible data.  <code class="computeroutput">state</code>
+is a pointer to the private data structures required for
+compression.</p>
+<p>Custom memory allocators are supported, via fields
+<code class="computeroutput">bzalloc</code>,
+<code class="computeroutput">bzfree</code>, and
+<code class="computeroutput">opaque</code>.  The value
+<code class="computeroutput">opaque</code> is passed to as the first
+argument to all calls to <code class="computeroutput">bzalloc</code>
+and <code class="computeroutput">bzfree</code>, but is otherwise
+ignored by the library.  The call <code class="computeroutput">bzalloc (
+opaque, n, m )</code> is expected to return a pointer
+<code class="computeroutput">p</code> to <code class="computeroutput">n *
+m</code> bytes of memory, and <code class="computeroutput">bzfree (
+opaque, p )</code> should free that memory.</p>
+<p>If you don't want to use a custom memory allocator, set
+<code class="computeroutput">bzalloc</code>,
+<code class="computeroutput">bzfree</code> and
+<code class="computeroutput">opaque</code> to
+<code class="computeroutput">NULL</code>, and the library will then
+use the standard <code class="computeroutput">malloc</code> /
+<code class="computeroutput">free</code> routines.</p>
+<p>Before calling
+<code class="computeroutput">BZ2_bzCompressInit</code>, fields
+<code class="computeroutput">bzalloc</code>,
+<code class="computeroutput">bzfree</code> and
+<code class="computeroutput">opaque</code> should be filled
+appropriately, as just described.  Upon return, the internal
+state will have been allocated and initialised, and
+<code class="computeroutput">total_in_lo32</code>,
+<code class="computeroutput">total_in_hi32</code>,
+<code class="computeroutput">total_out_lo32</code> and
+<code class="computeroutput">total_out_hi32</code> will have been
+set to zero.  These four fields are used by the library to inform
+the caller of the total amount of data passed into and out of the
+library, respectively.  You should not try to change them.  As of
+version 1.0, 64-bit counts are maintained, even on 32-bit
+platforms, using the <code class="computeroutput">_hi32</code>
+fields to store the upper 32 bits of the count.  So, for example,
+the total amount of data in is <code class="computeroutput">(total_in_hi32
+&lt;&lt; 32) + total_in_lo32</code>.</p>
+<p>Parameter <code class="computeroutput">blockSize100k</code>
+specifies the block size to be used for compression.  It should
+be a value between 1 and 9 inclusive, and the actual block size
+used is 100000 x this figure.  9 gives the best compression but
+takes most memory.</p>
+<p>Parameter <code class="computeroutput">verbosity</code> should
+be set to a number between 0 and 4 inclusive.  0 is silent, and
+greater numbers give increasingly verbose monitoring/debugging
+output.  If the library has been compiled with
+<code class="computeroutput">-DBZ_NO_STDIO</code>, no such output
+will appear for any verbosity setting.</p>
+<p>Parameter <code class="computeroutput">workFactor</code>
+controls how the compression phase behaves when presented with
+worst case, highly repetitive, input data.  If compression runs
+into difficulties caused by repetitive data, the library switches
+from the standard sorting algorithm to a fallback algorithm.  The
+fallback is slower than the standard algorithm by perhaps a
+factor of three, but always behaves reasonably, no matter how bad
+the input.</p>
+<p>Lower values of <code class="computeroutput">workFactor</code>
+reduce the amount of effort the standard algorithm will expend
+before resorting to the fallback.  You should set this parameter
+carefully; too low, and many inputs will be handled by the
+fallback algorithm and so compress rather slowly, too high, and
+your average-to-worst case compression times can become very
+large.  The default value of 30 gives reasonable behaviour over a
+wide range of circumstances.</p>
+<p>Allowable values range from 0 to 250 inclusive.  0 is a
+special case, equivalent to using the default value of 30.</p>
+<p>Note that the compressed output generated is the same
+regardless of whether or not the fallback algorithm is
+used.</p>
+<p>Be aware also that this parameter may disappear entirely in
+future versions of the library.  In principle it should be
+possible to devise a good way to automatically choose which
+algorithm to use.  Such a mechanism would render the parameter
+obsolete.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if strm is NULL 
+  or blockSize &lt; 1 or blockSize &gt; 9
+  or verbosity &lt; 0 or verbosity &gt; 4
+  or workFactor &lt; 0 or workFactor &gt; 250
+BZ_MEM_ERROR 
+  if not enough memory is available
+BZ_OK 
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">BZ2_bzCompress
+  if BZ_OK is returned
+  no specific action needed in case of error</pre>
+</div>
+<div class="sect2" title="3.3.2. BZ2_bzCompress">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzCompress"></a>3.3.2. BZ2_bzCompress</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzCompress ( bz_stream *strm, int action );</pre>
+<p>Provides more input and/or output buffer space for the
+library.  The caller maintains input and output buffers, and
+calls <code class="computeroutput">BZ2_bzCompress</code> to transfer
+data between them.</p>
+<p>Before each call to
+<code class="computeroutput">BZ2_bzCompress</code>,
+<code class="computeroutput">next_in</code> should point at the data
+to be compressed, and <code class="computeroutput">avail_in</code>
+should indicate how many bytes the library may read.
+<code class="computeroutput">BZ2_bzCompress</code> updates
+<code class="computeroutput">next_in</code>,
+<code class="computeroutput">avail_in</code> and
+<code class="computeroutput">total_in</code> to reflect the number
+of bytes it has read.</p>
+<p>Similarly, <code class="computeroutput">next_out</code> should
+point to a buffer in which the compressed data is to be placed,
+with <code class="computeroutput">avail_out</code> indicating how
+much output space is available.
+<code class="computeroutput">BZ2_bzCompress</code> updates
+<code class="computeroutput">next_out</code>,
+<code class="computeroutput">avail_out</code> and
+<code class="computeroutput">total_out</code> to reflect the number
+of bytes output.</p>
+<p>You may provide and remove as little or as much data as you
+like on each call of
+<code class="computeroutput">BZ2_bzCompress</code>.  In the limit,
+it is acceptable to supply and remove data one byte at a time,
+although this would be terribly inefficient.  You should always
+ensure that at least one byte of output space is available at
+each call.</p>
+<p>A second purpose of
+<code class="computeroutput">BZ2_bzCompress</code> is to request a
+change of mode of the compressed stream.</p>
+<p>Conceptually, a compressed stream can be in one of four
+states: IDLE, RUNNING, FLUSHING and FINISHING.  Before
+initialisation
+(<code class="computeroutput">BZ2_bzCompressInit</code>) and after
+termination (<code class="computeroutput">BZ2_bzCompressEnd</code>),
+a stream is regarded as IDLE.</p>
+<p>Upon initialisation
+(<code class="computeroutput">BZ2_bzCompressInit</code>), the stream
+is placed in the RUNNING state.  Subsequent calls to
+<code class="computeroutput">BZ2_bzCompress</code> should pass
+<code class="computeroutput">BZ_RUN</code> as the requested action;
+other actions are illegal and will result in
+<code class="computeroutput">BZ_SEQUENCE_ERROR</code>.</p>
+<p>At some point, the calling program will have provided all
+the input data it wants to.  It will then want to finish up -- in
+effect, asking the library to process any data it might have
+buffered internally.  In this state,
+<code class="computeroutput">BZ2_bzCompress</code> will no longer
+attempt to read data from
+<code class="computeroutput">next_in</code>, but it will want to
+write data to <code class="computeroutput">next_out</code>.  Because
+the output buffer supplied by the user can be arbitrarily small,
+the finishing-up operation cannot necessarily be done with a
+single call of
+<code class="computeroutput">BZ2_bzCompress</code>.</p>
+<p>Instead, the calling program passes
+<code class="computeroutput">BZ_FINISH</code> as an action to
+<code class="computeroutput">BZ2_bzCompress</code>.  This changes
+the stream's state to FINISHING.  Any remaining input (ie,
+<code class="computeroutput">next_in[0 .. avail_in-1]</code>) is
+compressed and transferred to the output buffer.  To do this,
+<code class="computeroutput">BZ2_bzCompress</code> must be called
+repeatedly until all the output has been consumed.  At that
+point, <code class="computeroutput">BZ2_bzCompress</code> returns
+<code class="computeroutput">BZ_STREAM_END</code>, and the stream's
+state is set back to IDLE.
+<code class="computeroutput">BZ2_bzCompressEnd</code> should then be
+called.</p>
+<p>Just to make sure the calling program does not cheat, the
+library makes a note of <code class="computeroutput">avail_in</code>
+at the time of the first call to
+<code class="computeroutput">BZ2_bzCompress</code> which has
+<code class="computeroutput">BZ_FINISH</code> as an action (ie, at
+the time the program has announced its intention to not supply
+any more input).  By comparing this value with that of
+<code class="computeroutput">avail_in</code> over subsequent calls
+to <code class="computeroutput">BZ2_bzCompress</code>, the library
+can detect any attempts to slip in more data to compress.  Any
+calls for which this is detected will return
+<code class="computeroutput">BZ_SEQUENCE_ERROR</code>.  This
+indicates a programming mistake which should be corrected.</p>
+<p>Instead of asking to finish, the calling program may ask
+<code class="computeroutput">BZ2_bzCompress</code> to take all the
+remaining input, compress it and terminate the current
+(Burrows-Wheeler) compression block.  This could be useful for
+error control purposes.  The mechanism is analogous to that for
+finishing: call <code class="computeroutput">BZ2_bzCompress</code>
+with an action of <code class="computeroutput">BZ_FLUSH</code>,
+remove output data, and persist with the
+<code class="computeroutput">BZ_FLUSH</code> action until the value
+<code class="computeroutput">BZ_RUN</code> is returned.  As with
+finishing, <code class="computeroutput">BZ2_bzCompress</code>
+detects any attempt to provide more input data once the flush has
+begun.</p>
+<p>Once the flush is complete, the stream returns to the
+normal RUNNING state.</p>
+<p>This all sounds pretty complex, but isn't really.  Here's a
+table which shows which actions are allowable in each state, what
+action will be taken, what the next state is, and what the
+non-error return values are.  Note that you can't explicitly ask
+what state the stream is in, but nor do you need to -- it can be
+inferred from the values returned by
+<code class="computeroutput">BZ2_bzCompress</code>.</p>
+<pre class="programlisting">IDLE/any
+  Illegal.  IDLE state only exists after BZ2_bzCompressEnd or
+  before BZ2_bzCompressInit.
+  Return value = BZ_SEQUENCE_ERROR
+
+RUNNING/BZ_RUN
+  Compress from next_in to next_out as much as possible.
+  Next state = RUNNING
+  Return value = BZ_RUN_OK
+
+RUNNING/BZ_FLUSH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FLUSHING
+  Return value = BZ_FLUSH_OK
+
+RUNNING/BZ_FINISH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FINISHING
+  Return value = BZ_FINISH_OK
+
+FLUSHING/BZ_FLUSH
+  Compress from next_in to next_out as much as possible, 
+  but do not accept any more input.
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = RUNNING; Return value = BZ_RUN_OK
+  else
+    Next state = FLUSHING; Return value = BZ_FLUSH_OK
+
+FLUSHING/other     
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+
+FINISHING/BZ_FINISH
+  Compress from next_in to next_out as much as possible,
+  but to not accept any more input.  
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = IDLE; Return value = BZ_STREAM_END
+  else
+    Next state = FINISHING; Return value = BZ_FINISH_OK
+
+FINISHING/other
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR</pre>
+<p>That still looks complicated?  Well, fair enough.  The
+usual sequence of calls for compressing a load of data is:</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><p>Get started with
+  <code class="computeroutput">BZ2_bzCompressInit</code>.</p></li>
+<li class="listitem"><p>Shovel data in and shlurp out its compressed form
+  using zero or more calls of
+  <code class="computeroutput">BZ2_bzCompress</code> with action =
+  <code class="computeroutput">BZ_RUN</code>.</p></li>
+<li class="listitem"><p>Finish up. Repeatedly call
+  <code class="computeroutput">BZ2_bzCompress</code> with action =
+  <code class="computeroutput">BZ_FINISH</code>, copying out the
+  compressed output, until
+  <code class="computeroutput">BZ_STREAM_END</code> is
+  returned.</p></li>
+<li class="listitem"><p>Close up and go home.  Call
+  <code class="computeroutput">BZ2_bzCompressEnd</code>.</p></li>
+</ol></div>
+<p>If the data you want to compress fits into your input
+buffer all at once, you can skip the calls of
+<code class="computeroutput">BZ2_bzCompress ( ..., BZ_RUN )</code>
+and just do the <code class="computeroutput">BZ2_bzCompress ( ..., BZ_FINISH
+)</code> calls.</p>
+<p>All required memory is allocated by
+<code class="computeroutput">BZ2_bzCompressInit</code>.  The
+compression library can accept any data at all (obviously).  So
+you shouldn't get any error return values from the
+<code class="computeroutput">BZ2_bzCompress</code> calls.  If you
+do, they will be
+<code class="computeroutput">BZ_SEQUENCE_ERROR</code>, and indicate
+a bug in your programming.</p>
+<p>Trivial other possible return values:</p>
+<pre class="programlisting">BZ_PARAM_ERROR
+  if strm is NULL, or strm-&gt;s is NULL</pre>
+</div>
+<div class="sect2" title="3.3.3. BZ2_bzCompressEnd">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzCompress-end"></a>3.3.3. BZ2_bzCompressEnd</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzCompressEnd ( bz_stream *strm );</pre>
+<p>Releases all memory associated with a compression
+stream.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_PARAM_ERROR  if strm is NULL or strm-&gt;s is NULL
+BZ_OK           otherwise</pre>
+</div>
+<div class="sect2" title="3.3.4. BZ2_bzDecompressInit">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzDecompress-init"></a>3.3.4. BZ2_bzDecompressInit</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );</pre>
+<p>Prepares for decompression.  As with
+<code class="computeroutput">BZ2_bzCompressInit</code>, a
+<code class="computeroutput">bz_stream</code> record should be
+allocated and initialised before the call.  Fields
+<code class="computeroutput">bzalloc</code>,
+<code class="computeroutput">bzfree</code> and
+<code class="computeroutput">opaque</code> should be set if a custom
+memory allocator is required, or made
+<code class="computeroutput">NULL</code> for the normal
+<code class="computeroutput">malloc</code> /
+<code class="computeroutput">free</code> routines.  Upon return, the
+internal state will have been initialised, and
+<code class="computeroutput">total_in</code> and
+<code class="computeroutput">total_out</code> will be zero.</p>
+<p>For the meaning of parameter
+<code class="computeroutput">verbosity</code>, see
+<code class="computeroutput">BZ2_bzCompressInit</code>.</p>
+<p>If <code class="computeroutput">small</code> is nonzero, the
+library will use an alternative decompression algorithm which
+uses less memory but at the cost of decompressing more slowly
+(roughly speaking, half the speed, but the maximum memory
+requirement drops to around 2300k).  See <a class="xref" href="#using" title="2. How to use bzip2">How to use bzip2</a>
+for more information on memory management.</p>
+<p>Note that the amount of memory needed to decompress a
+stream cannot be determined until the stream's header has been
+read, so even if
+<code class="computeroutput">BZ2_bzDecompressInit</code> succeeds, a
+subsequent <code class="computeroutput">BZ2_bzDecompress</code>
+could fail with
+<code class="computeroutput">BZ_MEM_ERROR</code>.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if ( small != 0 &amp;&amp; small != 1 )
+  or (verbosity &lt;; 0 || verbosity &gt; 4)
+BZ_MEM_ERROR
+  if insufficient memory is available</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">BZ2_bzDecompress
+  if BZ_OK was returned
+  no specific action required in case of error</pre>
+</div>
+<div class="sect2" title="3.3.5. BZ2_bzDecompress">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzDecompress"></a>3.3.5. BZ2_bzDecompress</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzDecompress ( bz_stream *strm );</pre>
+<p>Provides more input and/out output buffer space for the
+library.  The caller maintains input and output buffers, and uses
+<code class="computeroutput">BZ2_bzDecompress</code> to transfer
+data between them.</p>
+<p>Before each call to
+<code class="computeroutput">BZ2_bzDecompress</code>,
+<code class="computeroutput">next_in</code> should point at the
+compressed data, and <code class="computeroutput">avail_in</code>
+should indicate how many bytes the library may read.
+<code class="computeroutput">BZ2_bzDecompress</code> updates
+<code class="computeroutput">next_in</code>,
+<code class="computeroutput">avail_in</code> and
+<code class="computeroutput">total_in</code> to reflect the number
+of bytes it has read.</p>
+<p>Similarly, <code class="computeroutput">next_out</code> should
+point to a buffer in which the uncompressed output is to be
+placed, with <code class="computeroutput">avail_out</code>
+indicating how much output space is available.
+<code class="computeroutput">BZ2_bzCompress</code> updates
+<code class="computeroutput">next_out</code>,
+<code class="computeroutput">avail_out</code> and
+<code class="computeroutput">total_out</code> to reflect the number
+of bytes output.</p>
+<p>You may provide and remove as little or as much data as you
+like on each call of
+<code class="computeroutput">BZ2_bzDecompress</code>.  In the limit,
+it is acceptable to supply and remove data one byte at a time,
+although this would be terribly inefficient.  You should always
+ensure that at least one byte of output space is available at
+each call.</p>
+<p>Use of <code class="computeroutput">BZ2_bzDecompress</code> is
+simpler than
+<code class="computeroutput">BZ2_bzCompress</code>.</p>
+<p>You should provide input and remove output as described
+above, and repeatedly call
+<code class="computeroutput">BZ2_bzDecompress</code> until
+<code class="computeroutput">BZ_STREAM_END</code> is returned.
+Appearance of <code class="computeroutput">BZ_STREAM_END</code>
+denotes that <code class="computeroutput">BZ2_bzDecompress</code>
+has detected the logical end of the compressed stream.
+<code class="computeroutput">BZ2_bzDecompress</code> will not
+produce <code class="computeroutput">BZ_STREAM_END</code> until all
+output data has been placed into the output buffer, so once
+<code class="computeroutput">BZ_STREAM_END</code> appears, you are
+guaranteed to have available all the decompressed output, and
+<code class="computeroutput">BZ2_bzDecompressEnd</code> can safely
+be called.</p>
+<p>If case of an error return value, you should call
+<code class="computeroutput">BZ2_bzDecompressEnd</code> to clean up
+and release memory.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_PARAM_ERROR
+  if strm is NULL or strm-&gt;s is NULL
+  or strm-&gt;avail_out &lt; 1
+BZ_DATA_ERROR
+  if a data integrity error is detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the compressed stream doesn't begin with the right magic bytes
+BZ_MEM_ERROR
+  if there wasn't enough memory available
+BZ_STREAM_END
+  if the logical end of the data stream was detected and all
+  output in has been consumed, eg s--&gt;avail_out &gt; 0
+BZ_OK
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">BZ2_bzDecompress
+  if BZ_OK was returned
+BZ2_bzDecompressEnd
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.3.6. BZ2_bzDecompressEnd">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzDecompress-end"></a>3.3.6. BZ2_bzDecompressEnd</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzDecompressEnd ( bz_stream *strm );</pre>
+<p>Releases all memory associated with a decompression
+stream.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_PARAM_ERROR
+  if strm is NULL or strm-&gt;s is NULL
+BZ_OK
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">  None.</pre>
+</div>
+</div>
+<div class="sect1" title="3.4. High-level interface">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="hl-interface"></a>3.4. High-level interface</h2></div></div></div>
+<p>This interface provides functions for reading and writing
+<code class="computeroutput">bzip2</code> format files.  First, some
+general points.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p>All of the functions take an
+  <code class="computeroutput">int*</code> first argument,
+  <code class="computeroutput">bzerror</code>.  After each call,
+  <code class="computeroutput">bzerror</code> should be consulted
+  first to determine the outcome of the call.  If
+  <code class="computeroutput">bzerror</code> is
+  <code class="computeroutput">BZ_OK</code>, the call completed
+  successfully, and only then should the return value of the
+  function (if any) be consulted.  If
+  <code class="computeroutput">bzerror</code> is
+  <code class="computeroutput">BZ_IO_ERROR</code>, there was an
+  error reading/writing the underlying compressed file, and you
+  should then consult <code class="computeroutput">errno</code> /
+  <code class="computeroutput">perror</code> to determine the cause
+  of the difficulty.  <code class="computeroutput">bzerror</code>
+  may also be set to various other values; precise details are
+  given on a per-function basis below.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>If <code class="computeroutput">bzerror</code> indicates
+  an error (ie, anything except
+  <code class="computeroutput">BZ_OK</code> and
+  <code class="computeroutput">BZ_STREAM_END</code>), you should
+  immediately call
+  <code class="computeroutput">BZ2_bzReadClose</code> (or
+  <code class="computeroutput">BZ2_bzWriteClose</code>, depending on
+  whether you are attempting to read or to write) to free up all
+  resources associated with the stream.  Once an error has been
+  indicated, behaviour of all calls except
+  <code class="computeroutput">BZ2_bzReadClose</code>
+  (<code class="computeroutput">BZ2_bzWriteClose</code>) is
+  undefined.  The implication is that (1)
+  <code class="computeroutput">bzerror</code> should be checked
+  after each call, and (2) if
+  <code class="computeroutput">bzerror</code> indicates an error,
+  <code class="computeroutput">BZ2_bzReadClose</code>
+  (<code class="computeroutput">BZ2_bzWriteClose</code>) should then
+  be called to clean up.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>The <code class="computeroutput">FILE*</code> arguments
+  passed to <code class="computeroutput">BZ2_bzReadOpen</code> /
+  <code class="computeroutput">BZ2_bzWriteOpen</code> should be set
+  to binary mode.  Most Unix systems will do this by default, but
+  other platforms, including Windows and Mac, will not.  If you
+  omit this, you may encounter problems when moving code to new
+  platforms.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>Memory allocation requests are handled by
+  <code class="computeroutput">malloc</code> /
+  <code class="computeroutput">free</code>.  At present there is no
+  facility for user-defined memory allocators in the file I/O
+  functions (could easily be added, though).</p></li>
+</ul></div>
+<div class="sect2" title="3.4.1. BZ2_bzReadOpen">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzreadopen"></a>3.4.1. BZ2_bzReadOpen</h3></div></div></div>
+<pre class="programlisting">typedef void BZFILE;
+
+BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, 
+                        int verbosity, int small,
+                        void *unused, int nUnused );</pre>
+<p>Prepare to read compressed data from file handle
+<code class="computeroutput">f</code>.
+<code class="computeroutput">f</code> should refer to a file which
+has been opened for reading, and for which the error indicator
+(<code class="computeroutput">ferror(f)</code>)is not set.  If
+<code class="computeroutput">small</code> is 1, the library will try
+to decompress using less memory, at the expense of speed.</p>
+<p>For reasons explained below,
+<code class="computeroutput">BZ2_bzRead</code> will decompress the
+<code class="computeroutput">nUnused</code> bytes starting at
+<code class="computeroutput">unused</code>, before starting to read
+from the file <code class="computeroutput">f</code>.  At most
+<code class="computeroutput">BZ_MAX_UNUSED</code> bytes may be
+supplied like this.  If this facility is not required, you should
+pass <code class="computeroutput">NULL</code> and
+<code class="computeroutput">0</code> for
+<code class="computeroutput">unused</code> and
+n<code class="computeroutput">Unused</code> respectively.</p>
+<p>For the meaning of parameters
+<code class="computeroutput">small</code> and
+<code class="computeroutput">verbosity</code>, see
+<code class="computeroutput">BZ2_bzDecompressInit</code>.</p>
+<p>The amount of memory needed to decompress a file cannot be
+determined until the file's header has been read.  So it is
+possible that <code class="computeroutput">BZ2_bzReadOpen</code>
+returns <code class="computeroutput">BZ_OK</code> but a subsequent
+call of <code class="computeroutput">BZ2_bzRead</code> will return
+<code class="computeroutput">BZ_MEM_ERROR</code>.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or small is neither 0 nor 1
+  or ( unused == NULL &amp;&amp; nUnused != 0 )
+  or ( unused != NULL &amp;&amp; !(0 &lt;= nUnused &lt;= BZ_MAX_UNUSED) )
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise.</pre>
+<p>Possible return values:</p>
+<pre class="programlisting">Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">BZ2_bzRead
+  if bzerror is BZ_OK
+BZ2_bzClose
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.4.2. BZ2_bzRead">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzread"></a>3.4.2. BZ2_bzRead</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );</pre>
+<p>Reads up to <code class="computeroutput">len</code>
+(uncompressed) bytes from the compressed file
+<code class="computeroutput">b</code> into the buffer
+<code class="computeroutput">buf</code>.  If the read was
+successful, <code class="computeroutput">bzerror</code> is set to
+<code class="computeroutput">BZ_OK</code> and the number of bytes
+read is returned.  If the logical end-of-stream was detected,
+<code class="computeroutput">bzerror</code> will be set to
+<code class="computeroutput">BZ_STREAM_END</code>, and the number of
+bytes read is returned.  All other
+<code class="computeroutput">bzerror</code> values denote an
+error.</p>
+<p><code class="computeroutput">BZ2_bzRead</code> will supply
+<code class="computeroutput">len</code> bytes, unless the logical
+stream end is detected or an error occurs.  Because of this, it
+is possible to detect the stream end by observing when the number
+of bytes returned is less than the number requested.
+Nevertheless, this is regarded as inadvisable; you should instead
+check <code class="computeroutput">bzerror</code> after every call
+and watch out for
+<code class="computeroutput">BZ_STREAM_END</code>.</p>
+<p>Internally, <code class="computeroutput">BZ2_bzRead</code>
+copies data from the compressed file in chunks of size
+<code class="computeroutput">BZ_MAX_UNUSED</code> bytes before
+decompressing it.  If the file contains more bytes than strictly
+needed to reach the logical end-of-stream,
+<code class="computeroutput">BZ2_bzRead</code> will almost certainly
+read some of the trailing data before signalling
+<code class="computeroutput">BZ_SEQUENCE_END</code>.  To collect the
+read but unused data once
+<code class="computeroutput">BZ_SEQUENCE_END</code> has appeared,
+call <code class="computeroutput">BZ2_bzReadGetUnused</code>
+immediately before
+<code class="computeroutput">BZ2_bzReadClose</code>.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len &lt; 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzWriteOpen
+BZ_IO_ERROR
+  if there is an error reading from the compressed file
+BZ_UNEXPECTED_EOF
+  if the compressed file ended before 
+  the logical end-of-stream was detected
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the stream does not begin with the requisite header bytes 
+  (ie, is not a bzip2 data file).  This is really 
+  a special case of BZ_DATA_ERROR.
+BZ_MEM_ERROR
+  if insufficient memory was available
+BZ_STREAM_END
+  if the logical end of stream was detected.
+BZ_OK
+  otherwise.</pre>
+<p>Possible return values:</p>
+<pre class="programlisting">number of bytes read
+  if bzerror is BZ_OK or BZ_STREAM_END
+undefined
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
+  if bzerror is BZ_OK
+collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
+  if bzerror is BZ_SEQUENCE_END
+BZ2_bzReadClose
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.4.3. BZ2_bzReadGetUnused">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzreadgetunused"></a>3.4.3. BZ2_bzReadGetUnused</h3></div></div></div>
+<pre class="programlisting">void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, 
+                          void** unused, int* nUnused );</pre>
+<p>Returns data which was read from the compressed file but
+was not needed to get to the logical end-of-stream.
+<code class="computeroutput">*unused</code> is set to the address of
+the data, and <code class="computeroutput">*nUnused</code> to the
+number of bytes.  <code class="computeroutput">*nUnused</code> will
+be set to a value between <code class="computeroutput">0</code> and
+<code class="computeroutput">BZ_MAX_UNUSED</code> inclusive.</p>
+<p>This function may only be called once
+<code class="computeroutput">BZ2_bzRead</code> has signalled
+<code class="computeroutput">BZ_STREAM_END</code> but before
+<code class="computeroutput">BZ2_bzReadClose</code>.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_PARAM_ERROR
+  if b is NULL
+  or unused is NULL or nUnused is NULL
+BZ_SEQUENCE_ERROR
+  if BZ_STREAM_END has not been signalled
+  or if b was opened with BZ2_bzWriteOpen
+BZ_OK
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">BZ2_bzReadClose</pre>
+</div>
+<div class="sect2" title="3.4.4. BZ2_bzReadClose">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzreadclose"></a>3.4.4. BZ2_bzReadClose</h3></div></div></div>
+<pre class="programlisting">void BZ2_bzReadClose ( int *bzerror, BZFILE *b );</pre>
+<p>Releases all memory pertaining to the compressed file
+<code class="computeroutput">b</code>.
+<code class="computeroutput">BZ2_bzReadClose</code> does not call
+<code class="computeroutput">fclose</code> on the underlying file
+handle, so you should do that yourself if appropriate.
+<code class="computeroutput">BZ2_bzReadClose</code> should be called
+to clean up after all error situations.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzOpenWrite
+BZ_OK
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">none</pre>
+</div>
+<div class="sect2" title="3.4.5. BZ2_bzWriteOpen">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzwriteopen"></a>3.4.5. BZ2_bzWriteOpen</h3></div></div></div>
+<pre class="programlisting">BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, 
+                         int blockSize100k, int verbosity,
+                         int workFactor );</pre>
+<p>Prepare to write compressed data to file handle
+<code class="computeroutput">f</code>.
+<code class="computeroutput">f</code> should refer to a file which
+has been opened for writing, and for which the error indicator
+(<code class="computeroutput">ferror(f)</code>)is not set.</p>
+<p>For the meaning of parameters
+<code class="computeroutput">blockSize100k</code>,
+<code class="computeroutput">verbosity</code> and
+<code class="computeroutput">workFactor</code>, see
+<code class="computeroutput">BZ2_bzCompressInit</code>.</p>
+<p>All required memory is allocated at this stage, so if the
+call completes successfully,
+<code class="computeroutput">BZ_MEM_ERROR</code> cannot be signalled
+by a subsequent call to
+<code class="computeroutput">BZ2_bzWrite</code>.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or blockSize100k &lt; 1 or blockSize100k &gt; 9
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise</pre>
+<p>Possible return values:</p>
+<pre class="programlisting">Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise</pre>
+<p>Allowable next actions:</p>
+<pre class="programlisting">BZ2_bzWrite
+  if bzerror is BZ_OK
+  (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
+BZ2_bzWriteClose
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.4.6. BZ2_bzWrite">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzwrite"></a>3.4.6. BZ2_bzWrite</h3></div></div></div>
+<pre class="programlisting">void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );</pre>
+<p>Absorbs <code class="computeroutput">len</code> bytes from the
+buffer <code class="computeroutput">buf</code>, eventually to be
+compressed and written to the file.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len &lt; 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file.
+BZ_OK
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.4.7. BZ2_bzWriteClose">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzwriteclose"></a>3.4.7. BZ2_bzWriteClose</h3></div></div></div>
+<pre class="programlisting">void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
+                       int abandon,
+                       unsigned int* nbytes_in,
+                       unsigned int* nbytes_out );
+
+void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
+                         int abandon,
+                         unsigned int* nbytes_in_lo32,
+                         unsigned int* nbytes_in_hi32,
+                         unsigned int* nbytes_out_lo32,
+                         unsigned int* nbytes_out_hi32 );</pre>
+<p>Compresses and flushes to the compressed file all data so
+far supplied by <code class="computeroutput">BZ2_bzWrite</code>.
+The logical end-of-stream markers are also written, so subsequent
+calls to <code class="computeroutput">BZ2_bzWrite</code> are
+illegal.  All memory associated with the compressed file
+<code class="computeroutput">b</code> is released.
+<code class="computeroutput">fflush</code> is called on the
+compressed file, but it is not
+<code class="computeroutput">fclose</code>'d.</p>
+<p>If <code class="computeroutput">BZ2_bzWriteClose</code> is
+called to clean up after an error, the only action is to release
+the memory.  The library records the error codes issued by
+previous calls, so this situation will be detected automatically.
+There is no attempt to complete the compression operation, nor to
+<code class="computeroutput">fflush</code> the compressed file.  You
+can force this behaviour to happen even in the case of no error,
+by passing a nonzero value to
+<code class="computeroutput">abandon</code>.</p>
+<p>If <code class="computeroutput">nbytes_in</code> is non-null,
+<code class="computeroutput">*nbytes_in</code> will be set to be the
+total volume of uncompressed data handled.  Similarly,
+<code class="computeroutput">nbytes_out</code> will be set to the
+total volume of compressed data written.  For compatibility with
+older versions of the library,
+<code class="computeroutput">BZ2_bzWriteClose</code> only yields the
+lower 32 bits of these counts.  Use
+<code class="computeroutput">BZ2_bzWriteClose64</code> if you want
+the full 64 bit counts.  These two functions are otherwise
+absolutely identical.</p>
+<p>Possible assignments to
+<code class="computeroutput">bzerror</code>:</p>
+<pre class="programlisting">BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file
+BZ_OK
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.4.8. Handling embedded compressed data streams">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="embed"></a>3.4.8. Handling embedded compressed data streams</h3></div></div></div>
+<p>The high-level library facilitates use of
+<code class="computeroutput">bzip2</code> data streams which form
+some part of a surrounding, larger data stream.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p>For writing, the library takes an open file handle,
+  writes compressed data to it,
+  <code class="computeroutput">fflush</code>es it but does not
+  <code class="computeroutput">fclose</code> it.  The calling
+  application can write its own data before and after the
+  compressed data stream, using that same file handle.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>Reading is more complex, and the facilities are not as
+  general as they could be since generality is hard to reconcile
+  with efficiency.  <code class="computeroutput">BZ2_bzRead</code>
+  reads from the compressed file in blocks of size
+  <code class="computeroutput">BZ_MAX_UNUSED</code> bytes, and in
+  doing so probably will overshoot the logical end of compressed
+  stream.  To recover this data once decompression has ended,
+  call <code class="computeroutput">BZ2_bzReadGetUnused</code> after
+  the last call of <code class="computeroutput">BZ2_bzRead</code>
+  (the one returning
+  <code class="computeroutput">BZ_STREAM_END</code>) but before
+  calling
+  <code class="computeroutput">BZ2_bzReadClose</code>.</p></li>
+</ul></div>
+<p>This mechanism makes it easy to decompress multiple
+<code class="computeroutput">bzip2</code> streams placed end-to-end.
+As the end of one stream, when
+<code class="computeroutput">BZ2_bzRead</code> returns
+<code class="computeroutput">BZ_STREAM_END</code>, call
+<code class="computeroutput">BZ2_bzReadGetUnused</code> to collect
+the unused data (copy it into your own buffer somewhere).  That
+data forms the start of the next compressed stream.  To start
+uncompressing that next stream, call
+<code class="computeroutput">BZ2_bzReadOpen</code> again, feeding in
+the unused data via the <code class="computeroutput">unused</code> /
+<code class="computeroutput">nUnused</code> parameters.  Keep doing
+this until <code class="computeroutput">BZ_STREAM_END</code> return
+coincides with the physical end of file
+(<code class="computeroutput">feof(f)</code>).  In this situation
+<code class="computeroutput">BZ2_bzReadGetUnused</code> will of
+course return no data.</p>
+<p>This should give some feel for how the high-level interface
+can be used.  If you require extra flexibility, you'll have to
+bite the bullet and get to grips with the low-level
+interface.</p>
+</div>
+<div class="sect2" title="3.4.9. Standard file-reading/writing code">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="std-rdwr"></a>3.4.9. Standard file-reading/writing code</h3></div></div></div>
+<p>Here's how you'd write data to a compressed file:</p>
+<pre class="programlisting">FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if ( !f ) {
+ /* handle error */
+}
+b = BZ2_bzWriteOpen( &amp;bzerror, f, 9 );
+if (bzerror != BZ_OK) {
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+}
+
+while ( /* condition */ ) {
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &amp;bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) { 
+   BZ2_bzWriteClose ( &amp;bzerror, b );
+   /* handle error */
+ }
+}
+
+BZ2_bzWriteClose( &amp;bzerror, b );
+if (bzerror == BZ_IO_ERROR) {
+ /* handle error */
+}</pre>
+<p>And to read from a compressed file:</p>
+<pre class="programlisting">FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if ( !f ) {
+  /* handle error */
+}
+b = BZ2_bzReadOpen ( &amp;bzerror, f, 0, NULL, 0 );
+if ( bzerror != BZ_OK ) {
+  BZ2_bzReadClose ( &amp;bzerror, b );
+  /* handle error */
+}
+
+bzerror = BZ_OK;
+while ( bzerror == BZ_OK &amp;&amp; /* arbitrary other conditions */) {
+  nBuf = BZ2_bzRead ( &amp;bzerror, b, buf, /* size of buf */ );
+  if ( bzerror == BZ_OK ) {
+    /* do something with buf[0 .. nBuf-1] */
+  }
+}
+if ( bzerror != BZ_STREAM_END ) {
+   BZ2_bzReadClose ( &amp;bzerror, b );
+   /* handle error */
+} else {
+   BZ2_bzReadClose ( &amp;bzerror, b );
+}</pre>
+</div>
+</div>
+<div class="sect1" title="3.5. Utility functions">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="util-fns"></a>3.5. Utility functions</h2></div></div></div>
+<div class="sect2" title="3.5.1. BZ2_bzBuffToBuffCompress">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzbufftobuffcompress"></a>3.5.1. BZ2_bzBuffToBuffCompress</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzBuffToBuffCompress( char*         dest,
+                              unsigned int* destLen,
+                              char*         source,
+                              unsigned int  sourceLen,
+                              int           blockSize100k,
+                              int           verbosity,
+                              int           workFactor );</pre>
+<p>Attempts to compress the data in <code class="computeroutput">source[0
+.. sourceLen-1]</code> into the destination buffer,
+<code class="computeroutput">dest[0 .. *destLen-1]</code>.  If the
+destination buffer is big enough,
+<code class="computeroutput">*destLen</code> is set to the size of
+the compressed data, and <code class="computeroutput">BZ_OK</code>
+is returned.  If the compressed data won't fit,
+<code class="computeroutput">*destLen</code> is unchanged, and
+<code class="computeroutput">BZ_OUTBUFF_FULL</code> is
+returned.</p>
+<p>Compression in this manner is a one-shot event, done with a
+single call to this function.  The resulting compressed data is a
+complete <code class="computeroutput">bzip2</code> format data
+stream.  There is no mechanism for making additional calls to
+provide extra input data.  If you want that kind of mechanism,
+use the low-level interface.</p>
+<p>For the meaning of parameters
+<code class="computeroutput">blockSize100k</code>,
+<code class="computeroutput">verbosity</code> and
+<code class="computeroutput">workFactor</code>, see
+<code class="computeroutput">BZ2_bzCompressInit</code>.</p>
+<p>To guarantee that the compressed data will fit in its
+buffer, allocate an output buffer of size 1% larger than the
+uncompressed data, plus six hundred extra bytes.</p>
+<p><code class="computeroutput">BZ2_bzBuffToBuffDecompress</code>
+will not write data at or beyond
+<code class="computeroutput">dest[*destLen]</code>, even in case of
+buffer overflow.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or blockSize100k &lt; 1 or blockSize100k &gt; 9
+  or verbosity &lt; 0 or verbosity &gt; 4
+  or workFactor &lt; 0 or workFactor &gt; 250
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_OK
+  otherwise</pre>
+</div>
+<div class="sect2" title="3.5.2. BZ2_bzBuffToBuffDecompress">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bzbufftobuffdecompress"></a>3.5.2. BZ2_bzBuffToBuffDecompress</h3></div></div></div>
+<pre class="programlisting">int BZ2_bzBuffToBuffDecompress( char*         dest,
+                                unsigned int* destLen,
+                                char*         source,
+                                unsigned int  sourceLen,
+                                int           small,
+                                int           verbosity );</pre>
+<p>Attempts to decompress the data in <code class="computeroutput">source[0
+.. sourceLen-1]</code> into the destination buffer,
+<code class="computeroutput">dest[0 .. *destLen-1]</code>.  If the
+destination buffer is big enough,
+<code class="computeroutput">*destLen</code> is set to the size of
+the uncompressed data, and <code class="computeroutput">BZ_OK</code>
+is returned.  If the compressed data won't fit,
+<code class="computeroutput">*destLen</code> is unchanged, and
+<code class="computeroutput">BZ_OUTBUFF_FULL</code> is
+returned.</p>
+<p><code class="computeroutput">source</code> is assumed to hold
+a complete <code class="computeroutput">bzip2</code> format data
+stream.
+<code class="computeroutput">BZ2_bzBuffToBuffDecompress</code> tries
+to decompress the entirety of the stream into the output
+buffer.</p>
+<p>For the meaning of parameters
+<code class="computeroutput">small</code> and
+<code class="computeroutput">verbosity</code>, see
+<code class="computeroutput">BZ2_bzDecompressInit</code>.</p>
+<p>Because the compression ratio of the compressed data cannot
+be known in advance, there is no easy way to guarantee that the
+output buffer will be big enough.  You may of course make
+arrangements in your code to record the size of the uncompressed
+data, but such a mechanism is beyond the scope of this
+library.</p>
+<p><code class="computeroutput">BZ2_bzBuffToBuffDecompress</code>
+will not write data at or beyond
+<code class="computeroutput">dest[*destLen]</code>, even in case of
+buffer overflow.</p>
+<p>Possible return values:</p>
+<pre class="programlisting">BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or small != 0 &amp;&amp; small != 1
+  or verbosity &lt; 0 or verbosity &gt; 4
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed data
+BZ_DATA_ERROR_MAGIC
+  if the compressed data doesn't begin with the right magic bytes
+BZ_UNEXPECTED_EOF
+  if the compressed data ends unexpectedly
+BZ_OK
+  otherwise</pre>
+</div>
+</div>
+<div class="sect1" title="3.6. zlib compatibility functions">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="zlib-compat"></a>3.6. zlib compatibility functions</h2></div></div></div>
+<p>Yoshioka Tsuneo has contributed some functions to give
+better <code class="computeroutput">zlib</code> compatibility.
+These functions are <code class="computeroutput">BZ2_bzopen</code>,
+<code class="computeroutput">BZ2_bzread</code>,
+<code class="computeroutput">BZ2_bzwrite</code>,
+<code class="computeroutput">BZ2_bzflush</code>,
+<code class="computeroutput">BZ2_bzclose</code>,
+<code class="computeroutput">BZ2_bzerror</code> and
+<code class="computeroutput">BZ2_bzlibVersion</code>.  These
+functions are not (yet) officially part of the library.  If they
+break, you get to keep all the pieces.  Nevertheless, I think
+they work ok.</p>
+<pre class="programlisting">typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );</pre>
+<p>Returns a string indicating the library version.</p>
+<pre class="programlisting">BZFILE * BZ2_bzopen  ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int        fd,    const char *mode );</pre>
+<p>Opens a <code class="computeroutput">.bz2</code> file for
+reading or writing, using either its name or a pre-existing file
+descriptor.  Analogous to <code class="computeroutput">fopen</code>
+and <code class="computeroutput">fdopen</code>.</p>
+<pre class="programlisting">int BZ2_bzread  ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );</pre>
+<p>Reads/writes data from/to a previously opened
+<code class="computeroutput">BZFILE</code>.  Analogous to
+<code class="computeroutput">fread</code> and
+<code class="computeroutput">fwrite</code>.</p>
+<pre class="programlisting">int  BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );</pre>
+<p>Flushes/closes a <code class="computeroutput">BZFILE</code>.
+<code class="computeroutput">BZ2_bzflush</code> doesn't actually do
+anything.  Analogous to <code class="computeroutput">fflush</code>
+and <code class="computeroutput">fclose</code>.</p>
+<pre class="programlisting">const char * BZ2_bzerror ( BZFILE *b, int *errnum )</pre>
+<p>Returns a string describing the more recent error status of
+<code class="computeroutput">b</code>, and also sets
+<code class="computeroutput">*errnum</code> to its numerical
+value.</p>
+</div>
+<div class="sect1" title="3.7. Using the library in a stdio-free environment">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="stdio-free"></a>3.7. Using the library in a stdio-free environment</h2></div></div></div>
+<div class="sect2" title="3.7.1. Getting rid of stdio">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="stdio-bye"></a>3.7.1. Getting rid of stdio</h3></div></div></div>
+<p>In a deeply embedded application, you might want to use
+just the memory-to-memory functions.  You can do this
+conveniently by compiling the library with preprocessor symbol
+<code class="computeroutput">BZ_NO_STDIO</code> defined.  Doing this
+gives you a library containing only the following eight
+functions:</p>
+<p><code class="computeroutput">BZ2_bzCompressInit</code>,
+<code class="computeroutput">BZ2_bzCompress</code>,
+<code class="computeroutput">BZ2_bzCompressEnd</code>
+<code class="computeroutput">BZ2_bzDecompressInit</code>,
+<code class="computeroutput">BZ2_bzDecompress</code>,
+<code class="computeroutput">BZ2_bzDecompressEnd</code>
+<code class="computeroutput">BZ2_bzBuffToBuffCompress</code>,
+<code class="computeroutput">BZ2_bzBuffToBuffDecompress</code></p>
+<p>When compiled like this, all functions will ignore
+<code class="computeroutput">verbosity</code> settings.</p>
+</div>
+<div class="sect2" title="3.7.2. Critical error handling">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="critical-error"></a>3.7.2. Critical error handling</h3></div></div></div>
+<p><code class="computeroutput">libbzip2</code> contains a number
+of internal assertion checks which should, needless to say, never
+be activated.  Nevertheless, if an assertion should fail,
+behaviour depends on whether or not the library was compiled with
+<code class="computeroutput">BZ_NO_STDIO</code> set.</p>
+<p>For a normal compile, an assertion failure yields the
+message:</p>
+<div class="blockquote"><blockquote class="blockquote">
+<p>bzip2/libbzip2: internal error number N.</p>
+<p>This is a bug in bzip2/libbzip2, 1.0.6 of 6 September 2010.
+Please report it to me at: jseward@bzip.org.  If this happened
+when you were using some program which uses libbzip2 as a
+component, you should also report this bug to the author(s)
+of that program.  Please make an effort to report this bug;
+timely and accurate bug reports eventually lead to higher
+quality software.  Thanks.  Julian Seward, 6 September 2010.
+</p>
+</blockquote></div>
+<p>where <code class="computeroutput">N</code> is some error code
+number.  If <code class="computeroutput">N == 1007</code>, it also
+prints some extra text advising the reader that unreliable memory
+is often associated with internal error 1007. (This is a
+frequently-observed-phenomenon with versions 1.0.0/1.0.1).</p>
+<p><code class="computeroutput">exit(3)</code> is then
+called.</p>
+<p>For a <code class="computeroutput">stdio</code>-free library,
+assertion failures result in a call to a function declared
+as:</p>
+<pre class="programlisting">extern void bz_internal_error ( int errcode );</pre>
+<p>The relevant code is passed as a parameter.  You should
+supply such a function.</p>
+<p>In either case, once an assertion failure has occurred, any
+<code class="computeroutput">bz_stream</code> records involved can
+be regarded as invalid.  You should not attempt to resume normal
+operation with them.</p>
+<p>You may, of course, change critical error handling to suit
+your needs.  As I said above, critical errors indicate bugs in
+the library and should not occur.  All "normal" error situations
+are indicated via error return codes from functions, and can be
+recovered from.</p>
+</div>
+</div>
+<div class="sect1" title="3.8. Making a Windows DLL">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="win-dll"></a>3.8. Making a Windows DLL</h2></div></div></div>
+<p>Everything related to Windows has been contributed by
+Yoshioka Tsuneo
+(<code class="computeroutput">tsuneo@rr.iij4u.or.jp</code>), so
+you should send your queries to him (but perhaps Cc: me,
+<code class="computeroutput">jseward@bzip.org</code>).</p>
+<p>My vague understanding of what to do is: using Visual C++
+5.0, open the project file
+<code class="computeroutput">libbz2.dsp</code>, and build.  That's
+all.</p>
+<p>If you can't open the project file for some reason, make a
+new one, naming these files:
+<code class="computeroutput">blocksort.c</code>,
+<code class="computeroutput">bzlib.c</code>,
+<code class="computeroutput">compress.c</code>,
+<code class="computeroutput">crctable.c</code>,
+<code class="computeroutput">decompress.c</code>,
+<code class="computeroutput">huffman.c</code>,
+<code class="computeroutput">randtable.c</code> and
+<code class="computeroutput">libbz2.def</code>.  You will also need
+to name the header files <code class="computeroutput">bzlib.h</code>
+and <code class="computeroutput">bzlib_private.h</code>.</p>
+<p>If you don't use VC++, you may need to define the
+proprocessor symbol
+<code class="computeroutput">_WIN32</code>.</p>
+<p>Finally, <code class="computeroutput">dlltest.c</code> is a
+sample program using the DLL.  It has a project file,
+<code class="computeroutput">dlltest.dsp</code>.</p>
+<p>If you just want a makefile for Visual C, have a look at
+<code class="computeroutput">makefile.msc</code>.</p>
+<p>Be aware that if you compile
+<code class="computeroutput">bzip2</code> itself on Win32, you must
+set <code class="computeroutput">BZ_UNIX</code> to 0 and
+<code class="computeroutput">BZ_LCCWIN32</code> to 1, in the file
+<code class="computeroutput">bzip2.c</code>, before compiling.
+Otherwise the resulting binary won't work correctly.</p>
+<p>I haven't tried any of this stuff myself, but it all looks
+plausible.</p>
+</div>
+</div>
+<div class="chapter" title="4. Miscellanea">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="misc"></a>4. Miscellanea</h2></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="sect1"><a href="#limits">4.1. Limitations of the compressed file format</a></span></dt>
+<dt><span class="sect1"><a href="#port-issues">4.2. Portability issues</a></span></dt>
+<dt><span class="sect1"><a href="#bugs">4.3. Reporting bugs</a></span></dt>
+<dt><span class="sect1"><a href="#package">4.4. Did you get the right package?</a></span></dt>
+<dt><span class="sect1"><a href="#reading">4.5. Further Reading</a></span></dt>
+</dl>
+</div>
+<p>These are just some random thoughts of mine.  Your mileage
+may vary.</p>
+<div class="sect1" title="4.1. Limitations of the compressed file format">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="limits"></a>4.1. Limitations of the compressed file format</h2></div></div></div>
+<p><code class="computeroutput">bzip2-1.0.X</code>,
+<code class="computeroutput">0.9.5</code> and
+<code class="computeroutput">0.9.0</code> use exactly the same file
+format as the original version,
+<code class="computeroutput">bzip2-0.1</code>.  This decision was
+made in the interests of stability.  Creating yet another
+incompatible compressed file format would create further
+confusion and disruption for users.</p>
+<p>Nevertheless, this is not a painless decision.  Development
+work since the release of
+<code class="computeroutput">bzip2-0.1</code> in August 1997 has
+shown complexities in the file format which slow down
+decompression and, in retrospect, are unnecessary.  These
+are:</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p>The run-length encoder, which is the first of the
+   compression transformations, is entirely irrelevant.  The
+   original purpose was to protect the sorting algorithm from the
+   very worst case input: a string of repeated symbols.  But
+   algorithm steps Q6a and Q6b in the original Burrows-Wheeler
+   technical report (SRC-124) show how repeats can be handled
+   without difficulty in block sorting.</p></li>
+<li class="listitem" style="list-style-type: disc">
+<p>The randomisation mechanism doesn't really need to be
+   there.  Udi Manber and Gene Myers published a suffix array
+   construction algorithm a few years back, which can be employed
+   to sort any block, no matter how repetitive, in O(N log N)
+   time.  Subsequent work by Kunihiko Sadakane has produced a
+   derivative O(N (log N)^2) algorithm which usually outperforms
+   the Manber-Myers algorithm.</p>
+<p>I could have changed to Sadakane's algorithm, but I find
+   it to be slower than <code class="computeroutput">bzip2</code>'s
+   existing algorithm for most inputs, and the randomisation
+   mechanism protects adequately against bad cases.  I didn't
+   think it was a good tradeoff to make.  Partly this is due to
+   the fact that I was not flooded with email complaints about
+   <code class="computeroutput">bzip2-0.1</code>'s performance on
+   repetitive data, so perhaps it isn't a problem for real
+   inputs.</p>
+<p>Probably the best long-term solution, and the one I have
+   incorporated into 0.9.5 and above, is to use the existing
+   sorting algorithm initially, and fall back to a O(N (log N)^2)
+   algorithm if the standard algorithm gets into
+   difficulties.</p>
+</li>
+<li class="listitem" style="list-style-type: disc"><p>The compressed file format was never designed to be
+   handled by a library, and I have had to jump though some hoops
+   to produce an efficient implementation of decompression.  It's
+   a bit hairy.  Try passing
+   <code class="computeroutput">decompress.c</code> through the C
+   preprocessor and you'll see what I mean.  Much of this
+   complexity could have been avoided if the compressed size of
+   each block of data was recorded in the data stream.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>An Adler-32 checksum, rather than a CRC32 checksum,
+   would be faster to compute.</p></li>
+</ul></div>
+<p>It would be fair to say that the
+<code class="computeroutput">bzip2</code> format was frozen before I
+properly and fully understood the performance consequences of
+doing so.</p>
+<p>Improvements which I was able to incorporate into 0.9.0,
+despite using the same file format, are:</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc"><p>Single array implementation of the inverse BWT.  This
+  significantly speeds up decompression, presumably because it
+  reduces the number of cache misses.</p></li>
+<li class="listitem" style="list-style-type: disc"><p>Faster inverse MTF transform for large MTF values.
+  The new implementation is based on the notion of sliding blocks
+  of values.</p></li>
+<li class="listitem" style="list-style-type: disc"><p><code class="computeroutput">bzip2-0.9.0</code> now reads
+  and writes files with <code class="computeroutput">fread</code>
+  and <code class="computeroutput">fwrite</code>; version 0.1 used
+  <code class="computeroutput">putc</code> and
+  <code class="computeroutput">getc</code>.  Duh!  Well, you live
+  and learn.</p></li>
+</ul></div>
+<p>Further ahead, it would be nice to be able to do random
+access into files.  This will require some careful design of
+compressed file formats.</p>
+</div>
+<div class="sect1" title="4.2. Portability issues">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="port-issues"></a>4.2. Portability issues</h2></div></div></div>
+<p>After some consideration, I have decided not to use GNU
+<code class="computeroutput">autoconf</code> to configure 0.9.5 or
+1.0.</p>
+<p><code class="computeroutput">autoconf</code>, admirable and
+wonderful though it is, mainly assists with portability problems
+between Unix-like platforms.  But
+<code class="computeroutput">bzip2</code> doesn't have much in the
+way of portability problems on Unix; most of the difficulties
+appear when porting to the Mac, or to Microsoft's operating
+systems.  <code class="computeroutput">autoconf</code> doesn't help
+in those cases, and brings in a whole load of new
+complexity.</p>
+<p>Most people should be able to compile the library and
+program under Unix straight out-of-the-box, so to speak,
+especially if you have a version of GNU C available.</p>
+<p>There are a couple of
+<code class="computeroutput">__inline__</code> directives in the
+code.  GNU C (<code class="computeroutput">gcc</code>) should be
+able to handle them.  If you're not using GNU C, your C compiler
+shouldn't see them at all.  If your compiler does, for some
+reason, see them and doesn't like them, just
+<code class="computeroutput">#define</code>
+<code class="computeroutput">__inline__</code> to be
+<code class="computeroutput">/* */</code>.  One easy way to do this
+is to compile with the flag
+<code class="computeroutput">-D__inline__=</code>, which should be
+understood by most Unix compilers.</p>
+<p>If you still have difficulties, try compiling with the
+macro <code class="computeroutput">BZ_STRICT_ANSI</code> defined.
+This should enable you to build the library in a strictly ANSI
+compliant environment.  Building the program itself like this is
+dangerous and not supported, since you remove
+<code class="computeroutput">bzip2</code>'s checks against
+compressing directories, symbolic links, devices, and other
+not-really-a-file entities.  This could cause filesystem
+corruption!</p>
+<p>One other thing: if you create a
+<code class="computeroutput">bzip2</code> binary for public distribution,
+please consider linking it statically (<code class="computeroutput">gcc
+-static</code>).  This avoids all sorts of library-version
+issues that others may encounter later on.</p>
+<p>If you build <code class="computeroutput">bzip2</code> on
+Win32, you must set <code class="computeroutput">BZ_UNIX</code> to 0
+and <code class="computeroutput">BZ_LCCWIN32</code> to 1, in the
+file <code class="computeroutput">bzip2.c</code>, before compiling.
+Otherwise the resulting binary won't work correctly.</p>
+</div>
+<div class="sect1" title="4.3. Reporting bugs">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bugs"></a>4.3. Reporting bugs</h2></div></div></div>
+<p>I tried pretty hard to make sure
+<code class="computeroutput">bzip2</code> is bug free, both by
+design and by testing.  Hopefully you'll never need to read this
+section for real.</p>
+<p>Nevertheless, if <code class="computeroutput">bzip2</code> dies
+with a segmentation fault, a bus error or an internal assertion
+failure, it will ask you to email me a bug report.  Experience from
+years of feedback of bzip2 users indicates that almost all these
+problems can be traced to either compiler bugs or hardware
+problems.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="bullet">
+<li class="listitem" style="list-style-type: disc">
+<p>Recompile the program with no optimisation, and
+  see if it works.  And/or try a different compiler.  I heard all
+  sorts of stories about various flavours of GNU C (and other
+  compilers) generating bad code for
+  <code class="computeroutput">bzip2</code>, and I've run across two
+  such examples myself.</p>
+<p>2.7.X versions of GNU C are known to generate bad code
+  from time to time, at high optimisation levels.  If you get
+  problems, try using the flags
+  <code class="computeroutput">-O2</code>
+  <code class="computeroutput">-fomit-frame-pointer</code>
+  <code class="computeroutput">-fno-strength-reduce</code>.  You
+  should specifically <span class="emphasis"><em>not</em></span> use
+  <code class="computeroutput">-funroll-loops</code>.</p>
+<p>You may notice that the Makefile runs six tests as part
+  of the build process.  If the program passes all of these, it's
+  a pretty good (but not 100%) indication that the compiler has
+  done its job correctly.</p>
+</li>
+<li class="listitem" style="list-style-type: disc">
+<p>If <code class="computeroutput">bzip2</code>
+  crashes randomly, and the crashes are not repeatable, you may
+  have a flaky memory subsystem.
+  <code class="computeroutput">bzip2</code> really hammers your
+  memory hierarchy, and if it's a bit marginal, you may get these
+  problems.  Ditto if your disk or I/O subsystem is slowly
+  failing.  Yup, this really does happen.</p>
+<p>Try using a different machine of the same type, and see
+  if you can repeat the problem.</p>
+</li>
+<li class="listitem" style="list-style-type: disc"><p>This isn't really a bug, but ... If
+  <code class="computeroutput">bzip2</code> tells you your file is
+  corrupted on decompression, and you obtained the file via FTP,
+  there is a possibility that you forgot to tell FTP to do a
+  binary mode transfer.  That absolutely will cause the file to
+  be non-decompressible.  You'll have to transfer it
+  again.</p></li>
+</ul></div>
+<p>If you've incorporated
+<code class="computeroutput">libbzip2</code> into your own program
+and are getting problems, please, please, please, check that the
+parameters you are passing in calls to the library, are correct,
+and in accordance with what the documentation says is allowable.
+I have tried to make the library robust against such problems,
+but I'm sure I haven't succeeded.</p>
+<p>Finally, if the above comments don't help, you'll have to
+send me a bug report.  Now, it's just amazing how many people
+will send me a bug report saying something like:</p>
+<pre class="programlisting">bzip2 crashed with segmentation fault on my machine</pre>
+<p>and absolutely nothing else.  Needless to say, a such a
+report is <span class="emphasis"><em>totally, utterly, completely and
+comprehensively 100% useless; a waste of your time, my time, and
+net bandwidth</em></span>.  With no details at all, there's no way
+I can possibly begin to figure out what the problem is.</p>
+<p>The rules of the game are: facts, facts, facts.  Don't omit
+them because "oh, they won't be relevant".  At the bare
+minimum:</p>
+<pre class="programlisting">Machine type.  Operating system version.  
+Exact version of bzip2 (do bzip2 -V).  
+Exact version of the compiler used.  
+Flags passed to the compiler.</pre>
+<p>However, the most important single thing that will help me
+is the file that you were trying to compress or decompress at the
+time the problem happened.  Without that, my ability to do
+anything more than speculate about the cause, is limited.</p>
+</div>
+<div class="sect1" title="4.4. Did you get the right package?">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="package"></a>4.4. Did you get the right package?</h2></div></div></div>
+<p><code class="computeroutput">bzip2</code> is a resource hog.
+It soaks up large amounts of CPU cycles and memory.  Also, it
+gives very large latencies.  In the worst case, you can feed many
+megabytes of uncompressed data into the library before getting
+any compressed output, so this probably rules out applications
+requiring interactive behaviour.</p>
+<p>These aren't faults of my implementation, I hope, but more
+an intrinsic property of the Burrows-Wheeler transform
+(unfortunately).  Maybe this isn't what you want.</p>
+<p>If you want a compressor and/or library which is faster,
+uses less memory but gets pretty good compression, and has
+minimal latency, consider Jean-loup Gailly's and Mark Adler's
+work, <code class="computeroutput">zlib-1.2.1</code> and
+<code class="computeroutput">gzip-1.2.4</code>.  Look for them at 
+<a class="ulink" href="http://www.zlib.org" target="_top">http://www.zlib.org</a> and 
+<a class="ulink" href="http://www.gzip.org" target="_top">http://www.gzip.org</a>
+respectively.</p>
+<p>For something faster and lighter still, you might try Markus F
+X J Oberhumer's <code class="computeroutput">LZO</code> real-time
+compression/decompression library, at 
+<a class="ulink" href="http://www.oberhumer.com/opensource" target="_top">http://www.oberhumer.com/opensource</a>.</p>
+</div>
+<div class="sect1" title="4.5. Further Reading">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="reading"></a>4.5. Further Reading</h2></div></div></div>
+<p><code class="computeroutput">bzip2</code> is not research
+work, in the sense that it doesn't present any new ideas.
+Rather, it's an engineering exercise based on existing
+ideas.</p>
+<p>Four documents describe essentially all the ideas behind
+<code class="computeroutput">bzip2</code>:</p>
+<div class="literallayout"><p>Michael Burrows and D. J. Wheeler:<br>
+  "A block-sorting lossless data compression algorithm"<br>
+   10th May 1994. <br>
+   Digital SRC Research Report 124.<br>
+   ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz<br>
+   If you have trouble finding it, try searching at the<br>
+   New Zealand Digital Library, http://www.nzdl.org.<br>
+<br>
+Daniel S. Hirschberg and Debra A. LeLewer<br>
+  "Efficient Decoding of Prefix Codes"<br>
+   Communications of the ACM, April 1990, Vol 33, Number 4.<br>
+   You might be able to get an electronic copy of this<br>
+   from the ACM Digital Library.<br>
+<br>
+David J. Wheeler<br>
+   Program bred3.c and accompanying document bred3.ps.<br>
+   This contains the idea behind the multi-table Huffman coding scheme.<br>
+   ftp://ftp.cl.cam.ac.uk/users/djw3/<br>
+<br>
+Jon L. Bentley and Robert Sedgewick<br>
+  "Fast Algorithms for Sorting and Searching Strings"<br>
+   Available from Sedgewick's web page,<br>
+   www.cs.princeton.edu/~rs<br>
+</p></div>
+<p>The following paper gives valuable additional insights into
+the algorithm, but is not immediately the basis of any code used
+in bzip2.</p>
+<div class="literallayout"><p>Peter Fenwick:<br>
+   Block Sorting Text Compression<br>
+   Proceedings of the 19th Australasian Computer Science Conference,<br>
+     Melbourne, Australia.  Jan 31 - Feb 2, 1996.<br>
+   ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps</p></div>
+<p>Kunihiko Sadakane's sorting algorithm, mentioned above, is
+available from:</p>
+<div class="literallayout"><p>http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz<br>
+</p></div>
+<p>The Manber-Myers suffix array construction algorithm is
+described in a paper available from:</p>
+<div class="literallayout"><p>http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps<br>
+</p></div>
+<p>Finally, the following papers document some
+investigations I made into the performance of sorting
+and decompression algorithms:</p>
+<div class="literallayout"><p>Julian Seward<br>
+   On the Performance of BWT Sorting Algorithms<br>
+   Proceedings of the IEEE Data Compression Conference 2000<br>
+     Snowbird, Utah.  28-30 March 2000.<br>
+<br>
+Julian Seward<br>
+   Space-time Tradeoffs in the Inverse B-W Transform<br>
+   Proceedings of the IEEE Data Compression Conference 2001<br>
+     Snowbird, Utah.  27-29 March 2001.<br>
+</p></div>
+</div>
+</div>
+</div></body>
+</html>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/manual.ps
@@ -0,0 +1,72843 @@
+%!PS-Adobe-3.0
+%%Creator: PassiveTeX 1.25
+%%LanguageLevel: 2
+%%DocumentSuppliedResources: (atend)
+%%DocumentMedia: plain 612 792 0 () ()
+%%BoundingBox: 0 0 612 792
+%%Pages: 38
+%%EndComments
+%%BeginDefaults
+%%PageMedia: plain
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset xpdf 3.00 0
+%%Copyright: Copyright 1996-2004 Glyph & Cog, LLC
+/xpdf 75 dict def xpdf begin
+% PDF special state
+/pdfDictSize 15 def
+/pdfSetup {
+  3 1 roll 2 array astore
+  /setpagedevice where {
+    pop 3 dict begin
+      /PageSize exch def
+      /ImagingBBox null def
+      { /Duplex true def } if
+    currentdict end setpagedevice
+  } {
+    pop pop
+  } ifelse
+} def
+/pdfStartPage {
+  pdfDictSize dict begin
+  /pdfFillCS [] def
+  /pdfFillXform {} def
+  /pdfStrokeCS [] def
+  /pdfStrokeXform {} def
+  /pdfFill [0] def
+  /pdfStroke [0] def
+  /pdfFillOP false def
+  /pdfStrokeOP false def
+  /pdfLastFill false def
+  /pdfLastStroke false def
+  /pdfTextMat [1 0 0 1 0 0] def
+  /pdfFontSize 0 def
+  /pdfCharSpacing 0 def
+  /pdfTextRender 0 def
+  /pdfTextRise 0 def
+  /pdfWordSpacing 0 def
+  /pdfHorizScaling 1 def
+  /pdfTextClipPath [] def
+} def
+/pdfEndPage { end } def
+% PDF color state
+/cs { /pdfFillXform exch def dup /pdfFillCS exch def
+      setcolorspace } def
+/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def
+      setcolorspace } def
+/sc { pdfLastFill not { pdfFillCS setcolorspace } if
+      dup /pdfFill exch def aload pop pdfFillXform setcolor
+     /pdfLastFill true def /pdfLastStroke false def } def
+/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if
+      dup /pdfStroke exch def aload pop pdfStrokeXform setcolor
+     /pdfLastStroke true def /pdfLastFill false def } def
+/op { /pdfFillOP exch def
+      pdfLastFill { pdfFillOP setoverprint } if } def
+/OP { /pdfStrokeOP exch def
+      pdfLastStroke { pdfStrokeOP setoverprint } if } def
+/fCol {
+  pdfLastFill not {
+    pdfFillCS setcolorspace
+    pdfFill aload pop pdfFillXform setcolor
+    pdfFillOP setoverprint
+    /pdfLastFill true def /pdfLastStroke false def
+  } if
+} def
+/sCol {
+  pdfLastStroke not {
+    pdfStrokeCS setcolorspace
+    pdfStroke aload pop pdfStrokeXform setcolor
+    pdfStrokeOP setoverprint
+    /pdfLastStroke true def /pdfLastFill false def
+  } if
+} def
+% build a font
+/pdfMakeFont {
+  4 3 roll findfont
+  4 2 roll matrix scale makefont
+  dup length dict begin
+    { 1 index /FID ne { def } { pop pop } ifelse } forall
+    /Encoding exch def
+    currentdict
+  end
+  definefont pop
+} def
+/pdfMakeFont16 {
+  exch findfont
+  dup length dict begin
+    { 1 index /FID ne { def } { pop pop } ifelse } forall
+    /WMode exch def
+    currentdict
+  end
+  definefont pop
+} def
+% graphics state operators
+/q { gsave pdfDictSize dict begin } def
+/Q {
+  end grestore
+  /pdfLastFill where {
+    pop
+    pdfLastFill {
+      pdfFillOP setoverprint
+    } {
+      pdfStrokeOP setoverprint
+    } ifelse
+  } if
+} def
+/cm { concat } def
+/d { setdash } def
+/i { setflat } def
+/j { setlinejoin } def
+/J { setlinecap } def
+/M { setmiterlimit } def
+/w { setlinewidth } def
+% path segment operators
+/m { moveto } def
+/l { lineto } def
+/c { curveto } def
+/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+      neg 0 rlineto closepath } def
+/h { closepath } def
+% path painting operators
+/S { sCol stroke } def
+/Sf { fCol stroke } def
+/f { fCol fill } def
+/f* { fCol eofill } def
+% clipping operators
+/W { clip newpath } def
+/W* { eoclip newpath } def
+/Ws { strokepath clip newpath } def
+% text state operators
+/Tc { /pdfCharSpacing exch def } def
+/Tf { dup /pdfFontSize exch def
+      dup pdfHorizScaling mul exch matrix scale
+      pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put
+      exch findfont exch makefont setfont } def
+/Tr { /pdfTextRender exch def } def
+/Ts { /pdfTextRise exch def } def
+/Tw { /pdfWordSpacing exch def } def
+/Tz { /pdfHorizScaling exch def } def
+% text positioning operators
+/Td { pdfTextMat transform moveto } def
+/Tm { /pdfTextMat exch def } def
+% text string operators
+/cshow where {
+  pop
+  /cshow2 {
+    dup {
+      pop pop
+      1 string dup 0 3 index put 3 index exec
+    } exch cshow
+    pop pop
+  } def
+}{
+  /cshow2 {
+    currentfont /FontType get 0 eq {
+      0 2 2 index length 1 sub {
+        2 copy get exch 1 add 2 index exch get
+        2 copy exch 256 mul add
+        2 string dup 0 6 5 roll put dup 1 5 4 roll put
+        3 index exec
+      } for
+    } {
+      dup {
+        1 string dup 0 3 index put 3 index exec
+      } forall
+    } ifelse
+    pop pop
+  } def
+} ifelse
+/awcp {
+  exch {
+    false charpath
+    5 index 5 index rmoveto
+    6 index eq { 7 index 7 index rmoveto } if
+  } exch cshow2
+  6 {pop} repeat
+} def
+/Tj {
+  fCol
+  1 index stringwidth pdfTextMat idtransform pop
+  sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse
+  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
+  4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
+  pdfTextMat dtransform
+  6 5 roll Tj1
+} def
+/Tj16 {
+  fCol
+  2 index stringwidth pdfTextMat idtransform pop
+  sub exch div
+  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
+  4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
+  pdfTextMat dtransform
+  6 5 roll Tj1
+} def
+/Tj16V {
+  fCol
+  2 index stringwidth pdfTextMat idtransform exch pop
+  sub exch div
+  0 pdfWordSpacing pdfTextMat dtransform 32
+  4 3 roll pdfCharSpacing add 0 exch
+  pdfTextMat dtransform
+  6 5 roll Tj1
+} def
+/Tj1 {
+  0 pdfTextRise pdfTextMat dtransform rmoveto
+  currentpoint 8 2 roll
+  pdfTextRender 1 and 0 eq {
+    6 copy awidthshow
+  } if
+  pdfTextRender 3 and dup 1 eq exch 2 eq or {
+    7 index 7 index moveto
+    6 copy
+    currentfont /FontType get 3 eq { fCol } { sCol } ifelse
+    false awcp currentpoint stroke moveto
+  } if
+  pdfTextRender 4 and 0 ne {
+    8 6 roll moveto
+    false awcp
+    /pdfTextClipPath [ pdfTextClipPath aload pop
+      {/moveto cvx}
+      {/lineto cvx}
+      {/curveto cvx}
+      {/closepath cvx}
+    pathforall ] def
+    currentpoint newpath moveto
+  } {
+    8 {pop} repeat
+  } ifelse
+  0 pdfTextRise neg pdfTextMat dtransform rmoveto
+} def
+/TJm { pdfFontSize 0.001 mul mul neg 0
+       pdfTextMat dtransform rmoveto } def
+/TJmV { pdfFontSize 0.001 mul mul neg 0 exch
+        pdfTextMat dtransform rmoveto } def
+/Tclip { pdfTextClipPath cvx exec clip newpath
+         /pdfTextClipPath [] def } def
+/Tclip* { pdfTextClipPath cvx exec eoclip newpath
+         /pdfTextClipPath [] def } def
+% Level 2 image operators
+/pdfImBuf 100 string def
+/pdfIm {
+  image
+  { currentfile pdfImBuf readline
+    not { pop exit } if
+    (%-EOD-) eq { exit } if } loop
+} def
+/pdfImM {
+  fCol imagemask
+  { currentfile pdfImBuf readline
+    not { pop exit } if
+    (%-EOD-) eq { exit } if } loop
+} def
+/pr { 2 index 2 index 3 2 roll putinterval 4 add } def
+/pdfImClip {
+  gsave
+  0 2 4 index length 1 sub {
+    dup 4 index exch 2 copy
+    get 5 index div put
+    1 add 3 index exch 2 copy
+    get 3 index div put
+  } for
+  pop pop rectclip
+} def
+/pdfImClipEnd { grestore } def
+% shading operators
+/colordelta {
+  false 0 1 3 index length 1 sub {
+    dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt {
+      pop true
+    } if
+  } for
+  exch pop exch pop
+} def
+/funcCol { func n array astore } def
+/funcSH {
+  dup 0 eq {
+    true
+  } {
+    dup 6 eq {
+      false
+    } {
+      4 index 4 index funcCol dup
+      6 index 4 index funcCol dup
+      3 1 roll colordelta 3 1 roll
+      5 index 5 index funcCol dup
+      3 1 roll colordelta 3 1 roll
+      6 index 8 index funcCol dup
+      3 1 roll colordelta 3 1 roll
+      colordelta or or or
+    } ifelse
+  } ifelse
+  {
+    1 add
+    4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch
+    6 index 6 index 4 index 4 index 4 index funcSH
+    2 index 6 index 6 index 4 index 4 index funcSH
+    6 index 2 index 4 index 6 index 4 index funcSH
+    5 3 roll 3 2 roll funcSH pop pop
+  } {
+    pop 3 index 2 index add 0.5 mul 3 index  2 index add 0.5 mul
+    funcCol sc
+    dup 4 index exch mat transform m
+    3 index 3 index mat transform l
+    1 index 3 index mat transform l
+    mat transform l pop pop h f*
+  } ifelse
+} def
+/axialCol {
+  dup 0 lt {
+    pop t0
+  } {
+    dup 1 gt {
+      pop t1
+    } {
+      dt mul t0 add
+    } ifelse
+  } ifelse
+  func n array astore
+} def
+/axialSH {
+  dup 0 eq {
+    true
+  } {
+    dup 8 eq {
+      false
+    } {
+      2 index axialCol 2 index axialCol colordelta
+    } ifelse
+  } ifelse
+  {
+    1 add 3 1 roll 2 copy add 0.5 mul
+    dup 4 3 roll exch 4 index axialSH
+    exch 3 2 roll axialSH
+  } {
+    pop 2 copy add 0.5 mul
+    axialCol sc
+    exch dup dx mul x0 add exch dy mul y0 add
+    3 2 roll dup dx mul x0 add exch dy mul y0 add
+    dx abs dy abs ge {
+      2 copy yMin sub dy mul dx div add yMin m
+      yMax sub dy mul dx div add yMax l
+      2 copy yMax sub dy mul dx div add yMax l
+      yMin sub dy mul dx div add yMin l
+      h f*
+    } {
+      exch 2 copy xMin sub dx mul dy div add xMin exch m
+      xMax sub dx mul dy div add xMax exch l
+      exch 2 copy xMax sub dx mul dy div add xMax exch l
+      xMin sub dx mul dy div add xMin exch l
+      h f*
+    } ifelse
+  } ifelse
+} def
+/radialCol {
+  dup t0 lt {
+    pop t0
+  } {
+    dup t1 gt {
+      pop t1
+    } if
+  } ifelse
+  func n array astore
+} def
+/radialSH {
+  dup 0 eq {
+    true
+  } {
+    dup 8 eq {
+      false
+    } {
+      2 index dt mul t0 add radialCol
+      2 index dt mul t0 add radialCol colordelta
+    } ifelse
+  } ifelse
+  {
+    1 add 3 1 roll 2 copy add 0.5 mul
+    dup 4 3 roll exch 4 index radialSH
+    exch 3 2 roll radialSH
+  } {
+    pop 2 copy add 0.5 mul dt mul t0 add
+    radialCol sc
+    encl {
+      exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      0 360 arc h
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      360 0 arcn h f
+    } {
+      2 copy
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a1 a2 arcn
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a2 a1 arcn h
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a1 a2 arc
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a2 a1 arc h f
+    } ifelse
+  } ifelse
+} def
+end
+%%EndResource
+%%EndProlog
+%%BeginSetup
+xpdf begin
+%%BeginResource: font PYRIYB+NimbusSanL-Bold
+%!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file COPYING (GNU General Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (Nimbus Sans L Bold) readonly def
+/FamilyName (Nimbus Sans L) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -155 def
+/UnderlineThickness 69 def
+end readonly def
+/FontName /PYRIYB+NimbusSanL-Bold def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-173 -307 1003 949} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b61177e95ea219474796072f4b363fd772dae3a9d9385cd2163
+c2c8062ef9af240bc02404e5411b401d68ee5d983d33df8a63b6da7ed443e71a
+e94a32ce1db15d759113b684bdc92cb4c920e35cb677534219abcea434fba862
+2fbc8237219af7943fb467616d86b4251b350647c43c8df74289646adecf0367
+7c838d720affd234259e947e6ac432993323e8fc0b1c7609675558ae470b19fc
+ba7b5ca1eff86dfe4d9ef0356f5d57d03f0b2d0f449d6165b92c78c00162b164
+648ca123b1ffa8c2bcdf125864ccc81c7d58f19374b71dcdacc3c43450bca81c
+364753c7d444062a98ce202aa990c652d540b1dd09459bd4818f7675d21cd2e1
+45a0d2670c3136a6c56fed36fa640520c0a880f954cf4bea74789d14c9b7ca0a
+e91f4ece020bb0d3cf1890cb79d94675c25c7ca667199195134e70ef0db9949a
+416f0a0443f1191421f2323202445f5af44871eed6956d3a3de21a34e302d41b
+d7eef2a4023a66862fef89ca6386a8e47ba55e6f89db590cc810feb27b68238a
+205275e7573968693cfe1f8a60b5af3fc965dc05bbac5bbd6d2ef74c4f140423
+9fb13eda8457a5b26248ca5ca4d3f896b0a93b69a9045b0adc25b43df700e90b
+820f28307cc6f6ff2fa4a06a8a6deb8cba4cb0d136da07593fabc1c8ba1149d9
+1c422f461a429ece40b7c90417320167d99ffa9490f9abc3101f2359bef6c6f2
+15c5585c8733ca06a9cb793d618247757063ff41c5fce1a209ea5a138777dad8
+943b73186bc17e03fb06ba658e5b3305e39078f5de984bfe093ab3d782150e2f
+8545c9601bd2a531a8196e157f8f18017c0331881abf07d6c21931fcf9b81c51
+be05d2ace462ab8899e2929f0d821eddb18e9887cb7e8e3ae0beda34ccd0428a
+38c4429417cebce5ef4bebf7f64eedca8769d004d2432ded2240b732481a6da7
+458cd26e4730c4aecdc1078ee3fbaf6cd275b426bbca2d0cbd42eb7b100b1c58
+f043391fc5929fca7ccb7d2188b6cec6bbdb78079e36d67129c17aef9fa72fa7
+5357dda5167e3c0ddb4f9266f3ef69c2ce9b6191ba911c1fc740549496aa76af
+b86e4fddc0f31f92595f8bc0bdd3ac613b16426d722c0d27822944899572bdd7
+96d248b1adba5ec18a7f0cab096e134c36b2fcccd0b2104e43b2123936dbf7d6
+e0706616a7676da73a30a36cfe2231fba5e1fe69952a2f0ac15145c5cff411a8
+b57db37742efd6b78096d0fc69fbcdea39cb05d034f31c23b04ee90fcb4484ab
+2053e8dd69a2eaf120a6bb64bd55409ab4b6a6e92d305e40974b0df80009f4d9
+8fe9e8aceddb346f8e75941c1189aeb685f4f02d20814ad6bbe3c4364bd1c64f
+9c1f111790dd74d635520606a6bc978b65ccb6e8bcfd8fdbae26ea62e36d0317
+5564995f2a07393255d7c3450303f5a26b783afa95962e9438fc3b10239fc8be
+7809f48340aa9a61ded2e1de62b8ece240dbd1dc8be3819ac3e9aacb6e165923
+4a264036c6017b46af959f7e574185e66a3a161eed1f99b8496a9fcfac13492d
+fe3f21bf1c0c1dd432fb523701060720730e9f51b76082ef4e72d2f2ebae7a00
+ecc0e1a922d6ded5c4f0a76eef3f6e157210a3a46a4a30114f032ba029d8207a
+5946b8242fc9b939559654b5c9831eab6bc2f1a8cd2779f95698f26bdfe2e421
+cccfadd7e6684364a8ce71574f2d675239e404f754237da4cb564bc7b23d7159
+5b1dd8a0b62d6bc044fe0bd2ea98458fb2188b8ab1af6438e9693ebf939c7c9e
+db285c87698d8eb206cf58d89a05e74a150ae0f0f0300dc1b3bcf1f3d6b73bd4
+70e604c23d313121a4cdcfedcc834feec5b1894e5384979966f496fea5cbf1db
+7f3645abc9a5e9fe04f056648f8b5882a5399fafad915207a1434b7184b48949
+43aa2c3ae059f96905277ec06fc91c4536efe679c6fa6e71167496cc0d2f297d
+d07159b01a02731e578879fb16f9ffd84768207629ba38f902230a03fc844eee
+f9fb458929cc8e1c988b486e9cdc3d00a84de8bf078ba4f1c73cf88a2cbb20a4
+e19a8c02d1bd767103c08b8ce14162a9cd99d167fd5cdbf53bc39fa14cab520b
+2e91ef7a2952c936c9825e30e3ed350ce9ad799b27b1091a0b2f3be2208838d3
+1bcdb3aad13a1299bd93b3f1a972c04f117f05bd9e5029b6c799eb25e3e98734
+a0ca4a814d824ee4ca5383c6eb8c6c45882289cf2a52934fb7764f3556eaebba
+2823e5007f83f6a3d3a6eb0f7fbc3b91320de755745ab44513deeb65d6d81c0d
+838125bc1480d494b8cdecb253a230fb950df5fd1cfdf3b8b0c56aa0168b01aa
+a690593f22c25e6ea9d2de70b8bb93cccde841d2b923b4a70c7cccfdc1c400e5
+d3d71cf640a201397f09e13d27faec5d041b9d904467c4c573c6fb1820a55c1a
+8d0ec1f6ad502bbda597925ab353429a5bbdf3df01066e5cb3c2bf2d19e7df4c
+285766c06ea868f915e051139ecfe22ac9b8466a5da38e4e2f92c01428ac9051
+4930a9e9420c49bb8dac35d2a7e9846b0c9c8db992bd5dd95fdc0c8d5bf2e7d0
+baefc4ce8fe265e57b7b6c8c91e1797db85d90eb1888170744db916ca7e353bc
+4edb9fc4a1d42013ba275d3efc76259e25860a3549d104880157db843cc75fcd
+5a14800ab8743fdacc4c5ff064cbf3ba6e737833850e618ad9674d0fb01918e8
+ba87eb21aab2c494c6f6ff275d1501d78a9a97d2774ef4d5fbc8032955669b04
+69e354b9984fcf4c0b890e4e8a7796d3b7b3855815f5565b13d95b139c32ee02
+4a2057235cef0b98b1c0bb84d64921dce789c2eccf58364e832cc2bef739d807
+012512769f57dfefa384083415b668285db3f6f9e5c850205dba7c66b2da0280
+f771183b302ff529a691590321a6b06dff8593a28e83a7c66008ae45b2989da0
+0455253031ed2da983e9f1ad6fbaaf85035b4715cc1525cc8d7f1a3c0ec40f9c
+9eca905a50a0f4b1f5db072918617213f7863ef202c0adf926e3be1c8307b571
+2c94daf13b6a659d0f613cb319e8782a0a2781b3a61227424ff5e554eba32b55
+de5bae43483ff916e37a129c877f10f7c8c0ec1fee0fe10b3fc813d976e6e54c
+8ea8aeaa179727d3335f86662bd318260fbc314986a2f97f919ccd564e001903
+eec90c13abbf988114cd330ccd7e9fde42e218a9484b565a0cd7e9c1807ada0e
+e6a7f916c5a38d64dae17faae3e84822e6c63bf32148ae3dffc010920509491b
+424d27fc1970abe5ac799936aac46c4a98cf4c66b3182e73df72431e53ab1f36
+460e6c6a9b2db27e38eda8972835ba64210b45dd04a778d59c5751b8478312b4
+38012796f5a8be056c8e3a9e656bfa909f7ebfb7f32fa1ae99dc291b0f002a0f
+8873351e9684adbefe40d607631559c78f5688a708160ad3803db743282353bc
+20098c6212dfad417f106d92527506ca0c9a8864c1eb61997dfedbbbf1d052d9
+81ea593f2a6c4a90676aec9354a6598436d1de7e15e4979344eb976a917471cf
+c85e52ecf3437ebb4b6f8e9b292b7db33be0a9ead500b9353f3f367ceff8dd77
+32b67a559e56ffa3b5311fb52689c1e296c01a362a5c33bbf54b84624f2373bd
+2c25e90644683376f03da577dad1fb9a9903c5ee9f531a5f9da82aadb2098e3d
+15896c3c727d60ee5de0ee1cefa7e4aa3a5336ad2f1a845d16bb2ee58c50d2e8
+055e3e11272224b23c689f2e7ca0051d10ae4d4514b89483ed8d97c2a77894a5
+640d45bc86b1f66de1fd24b08034e70a443cf1c3ee17f2e7c7e11da524781c7a
+75a1f69de55aad4a309e27fc8ae9b1ce1c7d52f94fc84c59f37165e35f0f721a
+9d3d5c3bcead85d8150408c1387e5a348d1f0f376b3cc2d24346280af119df86
+b62f46e2ddf46f38db4aeaa456accf3f29082f73e9c5f003d77d99eea3d5156f
+2043e9b573fe34694910236ef3a1ce03ffb205406f3466e028b635f3ec5173e7
+482c796060bcb0efae62308e3624c466df5b49b1dfd3445233a03cff1f58bf86
+0a2b46225d1784e91f65ecd52504c8605aaf2a5dca560db5b8ce7eb86187e6df
+677c977ab4d1fec4f124324bc896ee7d669aa295897fec0b881221434fae3a4b
+1a3a1f1457fca374bca91885e74543ee919b881181642cb1f6c34ff817fa8e81
+18aa5e21c994d8aa12e1fdf5d6ff6726dd3d075dcd056f046ddd86894235d7db
+fc11532518f8d8695ae74dfbb769528840e8c30572ad06d6ef7b0ed471db9418
+11ea9cd32b4ba6205b5c198bd528b06092df3f50b9714fc1275aa5105a3a7422
+823d4a30d7fd19f77bb2cc4c5df23202d6a74092a710a9a855d8059031ec6ec9
+4d4fc86b37186c46a5cd183a81fc12a743c7168837953d2b5202ade986b4b00d
+86e41a88fad5ba0d91c150f4a7c396a02aef1ae9b96c0cea83b3306785ab3ba5
+39c49d9f984a08a9e8c06d282af94d87606d5601296456b6a0ef4ea8c88a1fcb
+96cd1b1bc0e287adfd1b9aa1a8c8a7d4a6b14ed3b04b1f0532ed5d40238ebf71
+5bd8c8b032afdccd26a940b19a1340b1e93041b2265b8534c099d14f00b82fbb
+2b55d8dc64691c3e5a6dd7c0cdc1212d0c80be2f454a7d8613d0cf64ac5bcc7c
+64d4166bfda12bc262de9cdfc614d7dc1bc569109bb84bf469071963e5a576db
+b19f3e748799d49c30612c1d7fa918d72051db6cfba44520b5b5689c87541560
+292dd6bf1f40f6a5af97c3ff71b1fb57cb36234be973890a1a610551a724abb6
+b01bb5bd1fc5191c9f99b389b6445a99de978b0d81e4baa92e8b121a1e1b32b1
+601a34dbe6cd348e56f59a92af56caa782b3b416958a6f1bb73771f35000fb9e
+a55a132f9b151bea59cafa3a1cc72f7cd60952852c53379530e0a6bd4e9545bd
+f78da021349902332707106bbb5d307960ea2bd811adf35b869bb210e44a5717
+8893af229268d805262725a0904bcb5ea7c17a39552a1f26283f54ae45449943
+5270b17b9afe2e0c0729e5f10461a8ddb85efc35dc8a32bcfebfdb16a0642e5c
+c69e5a25a661cfbd1f3a9386aa2433b68a356f36404f96d97fff817b42a58a62
+a5fcb5653373df412068876f541169bf642bce8458297fb6a6e936d80af2004c
+e9a248e1c92fb63b3e53caadd749924c390fd9f542496cf2347a3a429cc25917
+c31fc437291fa9856a7d3b2b6a5644d82e23a14d0281ed4d8f9dd687e06f23a0
+d0e8a3dab5fe6ded172ebbcac68218092f4480c7ceabc55b059877d7e82d2846
+b4f9e82aabc56f397be2c6b67040dc71a9d1f39b1a60c33288bbae4e41457830
+f8d8c96c8dce7c01bc6efd70e021a0c2d160a61b906a3ea551b7e3fe8c1f9952
+7e9583c6b6010e0887560f1c3e19e0be82efe91f0114e726c888f580d6b514cb
+a0933ccde04de0872dd0e07b1a7cede67bf9f4e73400d118a6d600e13debe6f2
+aa1d895dcc127c76ff82e579a06d8a3a323458808bad060afc953c2158d476d0
+fe0725dee6886bde038e2726886d255dec9052e9ba886a318c75b8c7a218edc5
+78783ab8dd90b738b16cfb47ef8610f428a4315c703763d6b3dda570cd0a89af
+4e6c215ea5395b13a5c1f0883faa2eb2d6de918ec5fef99c21758e4b6bf72861
+b684a28787b63d3ae7f1096b1c56e4862e7f3650884d0803db03362c587e2ed7
+bf5c7f2847bebe35327f1f7fb76f3cf7e9fec9a5c057acedf6245c724a8e754b
+d44e028181b75ad590b3989a7f340fd59c3b75cc4a8e28b155b5da0fbf3cc358
+375edb0992206514347924c69ab28e30c707f24199767937bd7990bc70bd5849
+5c335a752c06bdd9f0520c6d8b2f5fffce931b601151b37f1be9885e41864e31
+1ea0f33e17fb4b844425ee7de31d839ad3a8609bfc9e393079b9a7891e17b48f
+2e5fed17943313afccc55826cc0144c2e7ac9784261bb40d51bbd4467103f432
+865cd4b821dd5be8fc760171b49b70141ce2042376e879013edf8180d185d988
+591f9084536cbf97816291ee77255315987422c2c2489d209d78e0a2fd3fa71c
+28edfc1577db5c080e7881848222220a63605f00205c205b35d0a017013ca099
+deb71a9ffd511549c61f9ee36a63ee00b0610d1b290e073b8a067dd91bf52f9c
+ab53a258ccd29d9220a659e44717f84062d39dd554294996c46e69608ca111e1
+088494c6c3c0b75cf06c2b39a08172700b35d1efd0526d78f2ca5388056b02d8
+28962b456a44b1348bc4c199c2425217cee4297873ba2018259ad02cdb518b24
+023f4ffc5fd7c2b7b022d8f61aecd1e97bf78c7d0448611c0af788af2447d5a7
+b66b496dfde8522f9dc0ff8513baf8b19b51256da57159b87df032545708fad8
+0b15a0764cb951263a5008d1a61a1b69f171a5d7449f1c1d2cba92e9ae340e13
+ee455edc278caf37e5733a34a5c1b2206833d4ec3c41db8e8c760624c6031550
+7124f71f9d18399c3df46c5023a753a08ecc991b61acb6ad781cd9c258af17ae
+33a2f8c5a86b5dae8ae1061893bdbca4e76473fb073cc9c5c3389e525553a879
+16c23e3fb51d65f3cc3bf3e87f97a02eedfbb928cd37a770e7e7b5413cbfb0c1
+3281f30eac6290a85ffe8ebf68a7fe77b4a68982d010a2284051861a35230401
+234b3278bd810686b1ee0c63104adfeaeb7ec79e0a4fae757018fc05fb12db3d
+81e0400f7760b46fa0ac5f9e52583f2af265843cbb2ec1d1392ee68c7410c9f5
+87351a0f3247036a01080242732f5453b54a88de2d7515b5b570d94bd2b97f2a
+d3894658627178dc90029c8e7131855b422c912c9fb6141439042b1df9f3739f
+063d8d054258cb1c9cc893aed8097aa06fbb7e923b3756409c61b7cff54c2c87
+51cc2f11c2b7bc0be6868584f64bbbc22a1e0ed325b6c2064cc0ef2fa8acfde8
+6fa40b544ab6d2c360b6786c29b69e80d20566e1e25cbb075f9a687b428f4ed2
+10c028936c8f5e7308d2a3984290d96e5c8df5c959a563b4be5b7ce15c24d5d2
+fd6dfeee85e0e9595f52ef13aa08f52db73e858a3932e9e913f5ba674289523d
+0eaaefd670f3ba4fb5a0295816fcfc042f7141c64ce577b103558455dbd0852b
+730b2acb37b3115ca4ff017602f9428879e96a621a760e7961c006801c5908c5
+f291981da07820a11aaafc3f4ae613c7cb4424b0e1b797094ddd88829d5d4eff
+d8613b50b2df38eef34ad0b05a9f13dac5b3c31d44c06bcc58d737f7d239ebe3
+eee1a4f981b35641482b536ee869389888c2eb28b56a5d0864a7f451f7d362e3
+d56ef1ec01fc6eb85c40c78d791b16aedf904c7d75890bf99bfef9783fdff55d
+ee19cdf9e0217133b8af29fd87ad09382b8f64a6690f4ece0ff8116d44bac576
+be9a602084c63bd4dbf56354dfe69300cfcbbb99ae3c8226d02b1bef022851fd
+896d83549c594e8fa709d23465207626632319b253dbb32a74155939d9fa0631
+8aaeaf9c26c04a55e1fe935fc5d21f1d798107a625fc25cb90d2ca72c31b3eb2
+c2aef7615eeb8c7f0e7f767aa672ffc236271f98c01bf41acd72da9d108792e4
+66ed133eced633ba0fe7503aaf68ebb226ed6d0e18561eb03c9b9763680f9295
+7709b653d3940ddc7703da6c3fcd893ace04627cc6bd92b65b80cfba4d0a50c6
+d48c5239a76bdaa4319fa9f0382e5ff6bb51c5a390678ef4bcb6a56a13828f32
+fa51ba7bd7d6a11405b0873d4e96b93fc693f21bada72f9f257d89630711cca0
+c3a78e2a0e5735617e77a7a77881b37d77877df4eff9da9d465239f1f2dfb5dc
+9351a5dd8216e98c15cf443250b85be6a463526d8aaed42fabc1cdc095ef9e42
+8f956a2abed2cb7fa127f49bd2b5accf7ed80cef4fe96fea42c0ed4991bbb734
+596379a991607836c6ea74bbc359ecf2eb52d015910b847534a519cfc32d5216
+9510940a9ded08ed2a83fe52ee1275b05d19666994836add094ad38cc0a3e081
+bed96e0cec2d8e17d51bbe3a63a34884da909733ab092c9ce8d8e411ca3b2831
+a022e5a3fd1abccb902647e484833b8181d1b9edcb5448098e13b5ad289c9aa5
+8e4726f0c2df0ceb089401871c26c7ddfc5d5cbeeae249871ac5604056b69e96
+3c1bf9b8ce006b701c9523b5b9b145be6f6c7b9e513973df94cc2d37694850ec
+e54c80d2ce79309ce51515d2ba0d44855014654d1a999cad1a5e9dd53a34e44c
+9cb32ea91176d5c3294e3064016e8554b9b6c6d2e6c03b4e655bf2a7957d95ff
+01cae1dc020e577abe5775f656caf198f1073b7bfe06ea127ba3b1edf4784917
+51d41bea93204e6ad3aada6f2415a8bcd5c987b6629874253852ca417bf6a259
+27b0e7f34e0ed0f9dfbe1be2c64d805c2edf0bd62c77be4224613f2e788c56eb
+0dccd0a467bb30d529610944338ea0b832d3ecedd85ad4da22ea2b47e799a1a1
+1cd56274f7dcd9a66a32d8509f3d0eb4c4a160a723a9e71f504da5549eab101c
+70c73efbf1ee0805c0f8e394f94f3e6623eb2fb5896563404fe4a7f0d47e802f
+698295ca19ad813ae552e8dce8d6f73a7e676308a07f230edb99902132ca5b6e
+0e95558764ff3f6f854cc29b338a5e1bc14c9468b5528f5b5dc8bcce69bcd0b8
+e295f3ff96dff56779de49a1157c7d1fe777e3a94cf95e3c707d6c1fb41b279e
+9abf7b4077fe611a1669c689c1d9a81c933e8075af7b5b440c24318b26a1206e
+92266a64a0577abd20659d83fbc433621c7a01f74c6863d43b02651ea96fd0a1
+e1a553a05978a4fbff7d591254a5e3a2642c0eec9b4a0988e4aae449964323b7
+9bade117a3ce68969f62944d027dd0bf7ff0f73b0283c8843e9a3001bd096baa
+f61833401353462890af71b05b84b2e8a8a3bce954febceeaf5c10ec704a68ff
+24364e70e1749dbc2b1299887309e014f82b805c37aecf05fd413220403e48c3
+3cb49d0c265ec2511211833f8c475d7bdc3959c3378597773f02b5d41fbded8f
+eb58a06037a79c3424e56d48a1cf82672026b3122e379a0012322a325bef16b1
+f95958c7b22cce273e8aaa1e8e40978abf5626000a2563577e164b89e24e4d06
+483f503454a37fac420c7945ad53a6c102f1713208c99ab6ccb0bb3e50a70b6a
+38b38bce6444a7951cd669008776a1720790b0b6722be634f90120f42e3b5cdf
+9007d9b8fcfeb1c2042367c5f7445e69bbc19cbea5b305b1bca2f6398211ca07
+96d5bd57d23639b1a7d7a5f50b609dff3c7622e922714dffc7dbd6b820460c67
+e8ea1c017e57fd172fa3cac1678df44f20e718542342847e33698d382ec37f60
+21b7d901ca384beec87374854e4a1372610ef8fe5c69a141b860b5a9c51af0be
+8e33cd57dc6f1d2fe672e72fd0f370cef74a02fef6a0e6303b7445efa72758ff
+b98b3549de42d525c166c92b652ef1e71c92b0ed3c1ba2418dd13a2d301ea894
+7b3d54d469676944a58f147851fcd8500747899ec3bd885f25e1631a3dedd10b
+4eeb87c74ac62e316d2ebd3aa0ce027e91b39450ea3e30cb01baafab02ed0567
+cd83c482d6e92d7835fe387cd6c050d8f4f2f64b95fc44e1101d89e112b971e6
+61d975a98183617bc942f425b837e4e868136b17ecde0e1380ce8a52b95881da
+2bf547a37f38c603e43ae53f32b5a347e4b43c0bb86d8aaf447bb5f4c983616e
+be1a48c7dc636242f20e876baef484506e2888f0913d8b76b1086b60409a2a03
+e82ac9970d6c120a6621bd68250d88e95c01abb861af559132e6d9b8f5abbb66
+4152d65779019e678cc86909e31bee3d13a16d764998d94ae5df24f02fc8153d
+72b41953605ca86a99bc3dd05ca620e7a28d51beddff28596ec8eb878c09c041
+74baef8d2fc52b3b0c55e95b7482dde018c706a3fb83b945d3df90cffeb1380b
+09c4576040668f537083afc50a1e26d28c4d58bad52b17964871210ecb2f148c
+daa07db5d3780ecd1635cc5d5dc23867a13e152872c78e20b95f11a4afb8508e
+813f4c580f80546b2d5dcda546a6fa4b28a906511be9ae09f3adf926fa237825
+ac9f250d275294c5f21466af681e4e61ea6915d623c7d48837d0bbfd7f893a2c
+d347cd7514ace7badbbff683aa9c6eef46d1c830afac64a9f64b95a6fba4bc48
+a33135b70cf12c2eb19c2af6a45b9be09619e4b89f47ef4b9d3d234466822c1f
+3ce559a85fc52ac8aa947f981fb5fe7605a373f5484d4929932590eb79a504e5
+ec35c263a30ab3e50ca900c2488baf5f1c1c23cd42d6401bfd7b09172be16f1a
+df93f41ab0b4465a4f1e2ab556078dbe76729d69434690fec8f59894a77d3b8b
+bbd3a87346b6706fb127da2f6b458208befdd75d68207bc88ca1f2e36b65d170
+922071549c382790beee82ba0dfde07d7d5f58ebd02b19feeaeb6aaad59792cf
+461d467665cb3a0cda48058fb5181273c8632075e2f11f8de7181373a9b73901
+a816cfde3e2029a04b1139eb306132f989f4a2e85cbebfdc52bda2e88bd8d1df
+3f331602fe0fc1802abcb35b8e6dbe5bff9740a4af24077a725d17660fee662b
+209db93c54baffeffbce92a9e2e696d5f56f5d7c81b29cd00a59ccaa389183b0
+ae2507f0ec1a9e224097be40e0db4c8099a96a858425c6a680365704f39a05cd
+4887bf94f49e4f8efacdab96877a18272900237356ce576042dcb16e5851e1b9
+4fa0ef754cc9d84e91486d771871151a5983f158b7e05cecad73ba064c258397
+cd00cd6b8cecbb898c5d4609531d387ebf15a5c38b80efe629bedc9314736e90
+d4117c763f18dda7974d519ef1bef9824934159d0fe29edaea2173c69c56967e
+ff9c37eea1e8b38eaed338699c6a3763c6353dfb2584f6da9923ab74b18cbe05
+278a5ed2936b193c75c986e8bfdcc63904a25ecb4a04e998ef8789e9c3ec618f
+1fefe74fe5a23d368b563579e318bbe956f29d191748ee26bc883bec714e1f8c
+88c98dc012b95385e894919f1de5afc62c9c513014d6105baf24ecaf88275909
+4d13079cccc3f103d6751b4f79b785577686abc760a6c56bf34db0f2ac3d0b82
+ee63f9e750c7790d7a3a1626d66e70d26617459a8103e08b6f14af71c017d3c4
+e5b4450986908ec345af9bfc4d650cf35f337026ae940513a9b3de95df3e16c0
+588a59a7f2f1d5e2a418410b5e2fcb4692998921834fa44f30f2117228005347
+9a3a82341434ea71f82d87e1bbcaed725ede9f6001ae4c8651da9afa36b3e6ef
+07a8b311afe1bda98e3143c8e2417fc188bfd48627d9b6aae94f510054dab99c
+12fa0d5d73069f48c86391d27e37265c91ab1c06ce4d4bf0af63db65e16e783f
+7dc649a88967284c9d9fe861add619a3ffde0a31a5719bb456d1ab8010ccc8ec
+89615ae875db7a321398ff923c088a6ab51ffe2fd21d3541474d79f07e536709
+46d1a8c65e8dd6ba6f19410b76ee7b5468462b9aadd9f8ddb68c32b08b0df0c4
+f3b909fe714f453bb1ebe914752c5eb5f68377a82e5d5b90abc19402bd589b43
+05f905efc12878733902c54391c267fd81aecb8cd692aaaac3218d34a4c1612a
+5aa9844d171e6ebf94f4d8900236e8e27c5bd7460fa1e195c1077da5918afdc3
+90abc6db247885a42158c3cd36ee89d82cbf2471c6daf51120ba3f6937d537e9
+370af7ce73f3b50b742ade8264df9288120dd74094a064909c00764e9347d2f9
+a3f92bb53d8263053a3082809e04e9bc7c9f3b8a7c97c5cc1f9f886115676a18
+cc04c656aa33535e5893b8db3ba5d627f8810048b2a7a28e6d1374afd6af6980
+ace96ee05d890339773f6dbdc92f2f840b50770213bf6188dcdd1bad8d527e71
+9692ab1dfc47e7673c175a1b9841d56e2e0b30e8685b01a68ce561bfc6463a6a
+d34557d05276f7befbc1fec7bd56a18bf0292cd25eae57450b3b590e60181258
+4b35e2004e7b1e27f3b26d7108a03c94dea662b7342e38f8300adbd92261809e
+bee8ec971a7f2f59487c89357580f9aa8145a1825573f037a0ade5b98be24a86
+530435bcb82e17054f67fa873946c732c8840b9eaa9130bbd360ef27fe72ecfb
+b421627d2d52578373ca7ef9fc6f850f4b7f22e6501378de0a9dd56f5f5815f2
+7ea81d8ee3a4f7b98e59ea1cb3159f5816fa703b18f03c5b0aafbbdcc979df41
+7258af2ed57f7da62871c0efdab55fafcbda5fbef92ce65aa0ff37b92ce6c953
+a9d92a8c6e02b8a1f9a9f0c66461c5a62097e12e9f656c87ae283e6f3b63ed10
+a6a723316b9beb28b62a55d372b9a22bdc669b51533c5690e593f2a409619b2a
+d73655a40a33e83c65e66f18a40c8e77b048674fad760b9a7d86621181d498b5
+59707d36440af3e015851ce43cfad5d1d96e9274ad714ef46cac1a02974245a8
+d25d894caa256c320af31f954bf574dd95bf32e5841333063d32709b93b009fe
+e680d5b2bb5f95275d118a085e98506d0272fd1b8220a2343979bb1467f9006a
+1f17b2ae2941413683c3cbbaa1c0a3aa55193d46a2573f2cbb8b7adc7e74d0d0
+135dfa18405bfaeda37f3d4787a965192ca64e4462a0c701de5c361088b3319e
+7b5d19a14337068661abc7c36002ff4dbe90e7b655b8e06bd70e283cad1c5d88
+de63628c638083b303ee6b038836893707f6e1121ef56292a75bd9301d987ae1
+ada2acdf61ef74f2b3dc4f87c6374254f865f6e8f6c0933c54265e9a5cc7ef62
+432baad5fa08dd485c3b1d0e75ffd5180e99df967b85861d9710ff294e93cfc3
+7ba6c006164690c10339aae9c1113cb48687672e8a2dd88ea9af6d0cae13ac05
+9b61095b999c87bc3c80748fe6722bb76818b2339223dc051a4938f435b92629
+4395dc3d2b9b3a0e370363535d960735fca855ffcba0aefe767732f7991c5977
+46fb683b9a0c11fcd6a3eb370bb56d6611e7c20dfa1d9fdb3b90ef31bf0a6aaa
+d8bee6d7ceb116373e74f072d2c61b646f0da308955829be7578d1909b03c4d9
+307709be75ab3d72d0864af89bb713da0938f038ffb3459b793d06bb37d6efd5
+5d4e755f3403c32c28201fa5f979f51f3a9d4c521480e58ccf06cc60a056a5b1
+c48f27872ef36da126d580ec0520ee9d252cd27c207b6a12b27b1861ae0debbc
+21e549144604b277ac8e7b4caaf5f7220d67fa9a985001488c128e1a4c9ebaa9
+de54a13cd4baedcd50653b73a6514ac47bb5411d8094854212c9219caa4e4c7c
+447324ab35edc9ceeeef505fb71a2348c3be2082fba20b8ab572bf9276e84e2b
+0b328828eb0c636750dc104e741c5df9caf3808a061484a23dd0aafcf5bfd1a7
+319c50d09cb55d73c87d3ab59e74e29de58723ea32cb96a0b497e2e530b54b9a
+355a27d988ef4387d8260863e8beecbcc27e4b051961aeffcb8475d7da9bdec6
+42d6a55f06ae9af2450545811fc6486c6be309955c53121db95ac255263e93ef
+3adb9e07e56b1133c491b550a511204ed55c8dd911e2fc0669c90fd904267f0e
+79d56ddeb72895002a7f795349da2137b6eedcc300c1206dbdfdc3a52f71c86b
+8141b63c3d33957c66a9e074bfa703ba2344d802028d787878f9fea87fa9ccdf
+f4ed49f4daa6e6839fd64c91e60f99b8e10652bffdac46169c413a36e8105d8d
+9343496c1a9b5bc33cb5e573166d4097fb4f3f5517b38f9298de2ac6d51121e2
+0eb9f07ecaf4d70c56a5280948c67e506e47fe9d3465c7cd156e5768b70f694c
+57c11c80e7a4d1417c25690197d058d02216a81d7104ef27003dadb3ed10c742
+4b03f54aeba13d17f681fee3a8797754348b134d89572a2083225178a9db4466
+ababce914cf2777d3ae7effca5f4973eb2945672c0218c420173d8d2fdb8d60a
+a1b40773a74f904955e7991bc973d12eb5bffc4dd0032b1a1397cb5ba3b431cf
+92b76b1f7bf1f9eec8389e525553a8791692a9a9eb495822684df34bc5209953
+1b38bc4875beb62a391a8e0fdef5b0ad35190c44c782e374e3ca17b9f5e2f5b7
+c8566acd0df90ef22b50100f501a80c17a32ef4eb28da320c20ff407fa116404
+aef81d37037013406eb51aa024605e01257fd78c625bd120d4bbbed7bfd4f95f
+a3c3088a0fb237d44fdf4aa0bff28254063416918e276e7b68c545def20f896e
+509cdc2c31b65668200637bbfa587b547b77f81bad98ff0b70805d9c6fd17abd
+f107e1d39d98d9ba1a7bcdf98ed607a3770508ada6bc25fcb63f5bb642a4e028
+bed525fcd1a9dbf1e1520c5164a53c0ddb1b3974366b8feaaf766f02a4085f57
+948854365bad4f6cf18fc871256f9ba3c60a79f3d08617f6a483fb6b50ef2dd5
+0755b2b824dad8935247fcff268b7cd152cab7e7a876b381491589f3d4c65c50
+3353d07c94786db7346cb89cf5350b585cf890fde7a891e7646e5fb912b71db0
+10e73de1100848dd1bd100d0daf43c4bef2b43440513be6281ea0359ae0be4ff
+a861b07d06a311b97028daf2fcfb14eb8e8f713bca854befa5a46172dbc0dbd4
+448a8c20ce02a71d33457d4c52704733b90b005b03fe89fa90b73e747f273118
+4bc20d38fca2e51eb0d5bd5454a23e0fa6616a330d61e5a487aa516daa6ca1d7
+b8cfc260bedbfcdfd3d3d0c115359c73a67c1921df252899298bc9015a6c96dd
+e70e6dee29597cc7c111a565a6877ec4efe425783478bd79ae97b5d1bac5d10f
+5cf77c6c026966155264c7ff1dd30028f21bfe0b7948edb1710f30ee09747272
+81aa09b166177f5e507ce6a09a6368505a1d7b58d5aa2d63dac1b073442be702
+9b2ba6a5a6073bb8aa8c6f741e1b135a73675ef22ea810435f4b1a899d180e2e
+be37106d4db6ac2c01d2d962117c4b6a62b1eafdd923d89cc830c00f4cacf98a
+3e02d0863389d2dd73db37d8af50cee306da798989047e47c165d47926ec533d
+5e1f5fd0d039ff2fb3e01c61509b3ddc62754cc30b7946c4a705d56f16730b99
+8a40275da604170fe8da1f8d8c5e4a393c701aa708f916fb66939adf2546097f
+2ad583fd795ad2fd059e9450c6df7be3a22f36c359ddcd8de44e1106b1edeed8
+65e317c06382f6473e3d15fd731ee92b39d3a3dc42c9107ca046febf2ed214f8
+014ea9efdd078b94dfe6a53e5357dcb99a937583a89b90105349829575a5f474
+ce7519336dedef19083bf6d9312f19c78f09085db567895a10edb5a6cfbf3532
+5cec8e3db206815af7bd78c8dcde6a910eb9232eea4b9e68684be8083f335761
+916fc1f64c649fefda1b3fd499e851cdfa7ad22acd535a04986f35b62c2adf2e
+74519f043c7c1864c6b3a9d5126fd87c105f123711b560531f46628f872b085d
+ad00961bf770b386b416ca2c5a738ba54f7a7a2e234dd97b2918d007c135aabe
+9ba541eaa0d19c216b5a6f245cd33a1666e26bcd5ece41bbd5bfb3aea9511bd7
+da27388e8b62f49f0b4db0b190c5dbb7bfdb1fec5a786bf43783cbecf09d8056
+15ce4179710883f8fe7bf4fde22e8a7b46273172e9a4751b4fdf6ec099e8d685
+32a4c9c4708902285df499de4a6b0e143d72c13b747461bda19f5e3a34f1dc8a
+96dd2194b6083c75715f9f5261947ef0eb21c496effe37f407f45c5f66aadb99
+cf42aea5fab6694a64cd89daecab44bcc134280a3614f02c432b98054ff8be39
+7cb464de7b1ee896f798a90377bdd07afbc9394ba931c3fe490d11fc60506a3e
+476d86bff5d3d850683942744d651355cb081b39d8d2147409a4bbf3ec699da2
+d79303ca40261fa3b6ab5b17ff331eb3d9f01896590905a2c7841d1f4b1f85a0
+b4afeb0183a61e21958ab3f541d321ac6bc81dafc5dc633cf1f4231b0e4dbc9e
+bd3c
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F116_0 /PYRIYB+NimbusSanL-Bold 1 1
+[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+  /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
+  /zero/one/two/three/four/five/six/seven
+  /eight/nine/colon/semicolon/less/equal/greater/question
+  /at/A/B/C/D/E/F/G
+  /H/I/J/K/L/M/N/O
+  /P/Q/R/S/T/U/V/W
+  /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
+  /quoteleft/a/b/c/d/e/f/g
+  /h/i/j/k/l/m/n/o
+  /p/q/r/s/t/u/v/w
+  /x/y/z/braceleft/bar/braceright/asciitilde/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section
+  /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl
+  /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet
+  /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown
+  /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent
+  /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
+  /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef
+  /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef
+  /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef
+  /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%BeginResource: font XDVKOU+NimbusRomNo9L-Regu
+%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file COPYING (GNU General Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (Nimbus Roman No9 L Regular) readonly def
+/FamilyName (Nimbus Roman No9 L) readonly def
+/Weight (Regular) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /XDVKOU+NimbusRomNo9L-Regu def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-168 -281 1000 924} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa763773acd59cb757
+ae119355777a1bfbd6751f24f58ee0133199ed331e67ff4101e33040d6628f4b
+77ee87860b8e32a4923e2c1fca43cf544a5eb1bcd649ebd836daecb23e3a986b
+9bd8398e690be6b48bd6479823a435defe1156284048c4d49b5a869164485630
+3810995159568b3dcf3734b11a3f25453e0e8b40b080c9aa94e140a58d5ebb74
+7d1e083dbe00ad5498c3b19deb502dc63d69032d8d31e6778af4713c30404059
+6a862aeb8cf607fa52a9348e3fe23c1a0296ddb41642aacd6aacd2c6d905073f
+98b58ebd11af774beee32533fa19871148dd6db41f3a8c499f25f37cf3955eb7
+bf5bbdbe984535820dd33f60cfe7c2b44ba6e10879b3c65948beed00a84b093e
+8e4ea07e34955aebfd0ed462afc5b4b42c5b8be85ce0ab1b9cba42969bbf8a36
+e2943b1d9b20f6ef3416e226763f55a196ca0d86788a6b0ed38ec5b0124ac901
+f55f2f67306ce94aae5809b2203bbb5a8b185b66b2f8a18a456d028f62d8e17f
+4cfccddc0743fb02567f0294ab77dca0b9708b262570e3097c76769bd590a09f
+ad1523e3bd1ed5fd8475c0b57b95011759d1a55c70b39970dccf76069cdb9690
+68a4626bc863ae1d579604011354cd3ebd51b54a1ba9789f7678546bdef64c9c
+51cb6f654c25578c3b4b7c2bbfad476423ab58c57f48b2a54c9d44ad356d106d
+8186a85f8578b1735610f6767883701431f5a2503341005020b639f45810440f
+f341eda457f8ad2213058a3369016452185f849ee25140060264a04eda7e04b8
+afedf6924f2da0adf944e4ee346e33735f6e78691634e18c4179f28fdb673ec1
+6a2b093eec51a4611030ffe1d4c1a1456e3ead051b01c94e5d9ee94c855cf31b
+b8e544e687f2e2a99fd8865ad44eb929430ed39ac0985e4a5c382e16aa2d6ec3
+3b396fe9643124dc587fde09d3d867e9efde49c283dd44fd33b04ba4eacded81
+b3e7d3f7c09d565a6412ac30fc8e81be8821a9031850579b02cefe615c8e7c22
+61a77e73f5382e58ae160043a5defca7470ea62b90e0260faaf5a97a7254b091
+2a187ace29ac6adfa49c7d6f35cdab93ad32553137363ba2f0dcbafd40fa8ffa
+7747eb9bb51dcd01291bc073331531dbdcea7db24c9a0302c9896a1c2cd0191a
+d88b33d0b0352b356c93987ed9613720cf2be3b164c6a4a3360bf41c9f178831
+62fb73ae514d9c57675572e8c1f93313fbd1b05302f57bbebaa2e76feefea0b8
+9c83d511164b53b481bc920f40d59d152bb1f5674344801f0dc7e71ca5de4e24
+cc79207c66d0b692fe7c1c258be75488f2a0bfd5c81ec5bd0585986d0c5d4575
+82e9ce40b7477b87facaa826ebf147bddb1dc60788dec671c199d18dcd2ca48a
+4653963ca85e8944074c501c8143685306d4f133037fea449b0d1cb4ab3bce89
+04a311f9410984d754a3509f51d89a4ef73ffa7f9f3bccd80daa0a34e0e10912
+b7897005607925758237d0bd3b92ac9669b1a1dcf19ff0864f84a993bf7cf266
+1d1b3981fbc5e4fdc3a5b70bd79bce35c6fcfc0a5aca0006433bc0c120073e96
+dd4ae86f022260fcfe119fd4655c3bf00be48c470b0d86e721afca140fe6bf31
+836d578fdae49d71676c77ebe2d09016e1ab71d7c681c8c0565cff9b73d79920
+1ee2def2f16d65647262f96082dd5c44fa3993d3bd1d10c217ea56b73b38428c
+767dd9b71530c5f01be2d2611cf9644c28f3f52fd814e463358d70de7bc6bafe
+cd377b48633d0107b05ad2472ad6652a1ad30c39adce69ebde3aadb1c5fcdaa6
+96fa9b3c3e63a7c4dac907e3b5cb7a3713505c5ad53c8dd8710acdb3786a919f
+b356cc2695cb227540a5f235ae1ba3c6f3547ff24606651e5887fe889cd8913d
+de9f3b04019ce0d724c1f6521925bd4fd8154f6f4d640ff94a0b0b027e483f9a
+bd1188942cdff486f1a234fdf8adeb552b7e7e10aa577ed3d559010aea480709
+fa1f644fe5b7ca3479599a7e708dcd3ba33a6b2d640f8e39492565965e3b7c74
+bc8c48f3ea9a6048e86197146abc446788a3c83782f797cd278ee1b740627726
+3e1703246bc561faa060de93d224ed3eb1bf548892bc64806c4e9186a2b276d0
+fed43a3021b5a54530de20db8168d44e1947cce7fa1dc8f7927a591d6798c5a2
+b51185c3e74bb6ac782af6f089a4204b6379298617c8f67e38900ac231610ab9
+79400dfaf270c91679c516d2062b949a8d91bd5c8c1a0af1e7401489ad6e8101
+b9103cb5f50dc53ddcf2b32afa218289e9f1b5e29e5c5a2a0f67238558343524
+78cb11a68006685e13f8b9ae54732c180b4949f09839b935b1f7a944f1d4bd84
+a5074b583202cc4aeccb4b8e18096e258bff705476440b9864e746f18703321e
+5d5e2f8ca5e2d07b195779f6a0d6a731116f1a26a484fb0d9931dfaafef53b41
+e56e00f32e3952261c0205afbb6f2afaffee7cc1fd39b2e108841f39dc8df97c
+0f776adaf41423b47c551d48add01398dad167f4590dccc3106a5a4386499462
+78831779383abaae807b3b03b5dbd4b973219f2d1d19369889dd72e446ec95e1
+37017fbf85f4064f81f27cdb4f9117be248a8d5a65225edca22e833df98da456
+98a428edafa84085c323399562865aaa8286eb5dc63dad6839b597386e0558d2
+11bc45d66e0e60a86c968519b8b305d5ba7ebc2fad7cb5004559544330668c1a
+7b77dc9762baafb4190dcc1aae670824824e00f023c574e1c017e33650e24fb5
+d4ad701ab8d93f0fd91867bd21299867f966e93cd621ec0332fa04a2a691ae0b
+179d1dd6364166f94716b69027d8d0bcfc6622a086dbe92198e5c625699d0bbf
+a9dee06d20554b4d82584108208ca24d7509c4ea30e71ec44f014f8cd97b8eeb
+f1322fd5b116009584559a3b0574e24329aef35d2964756d50ee8a0fdae1be91
+19e20fb52c3437ef677f37b549851cc9bb60c04cbee8d80b6f1442cd8676b0e7
+bc4b2c4883d212135bcde4fc15eff6d20269a6f4463b12c214d99e68f113c5c6
+7c2d25384d8e7b9eb31d79e2c4607421389827e2fac887dbf08a43a5ddbc5797
+797a1fd10143a4e97ad79bd0bd7f3f1205130061a6581a4d30183e71fe80d570
+42083823e3ecdb6d6352b6bd54413a9b6bbaab94a76d12ad93ff99f9433e3ec6
+bab36ccf8168cfb64c4b15987379cc129f6c7c1761df5d7dc46e0996e5588298
+b329b023056dd59f4befb792c4e43fa095d63df49b6e25f821b999b56ae05919
+16346777c2579ecd17b5a87f1505f4686ba2aad3045cb414cc65cde98b92c76f
+20a9be4a42b77e077b9c00eaa3914709c3fc1a16787e639a2c7fd9a30d9e8ffa
+1d5a900dc9cfd5c319ec34570cb758bae3a342d936a30915dbd5160922aaf241
+74c014836eb17224a681c1d7cae7fe0d0627bd5af08286c59e2640cadf9e33db
+6636197d955a073214899ae76156146452d063a460fdc5a82df0eafe9ad88a24
+905f7db7dc8097c0d9b0f9319aea0aaf7aaed4a85c93979445e8d1e5a9bdd3b5
+4d74320a1b797ace38376db0b2f6566432b8a90ca4fc7842b90623603f7aa2e5
+a2f0298157822d42f334b8f9f80fb04c36bfde0eb1187c1b15ad0666031c5c09
+62bab12d2476f696939130c5b59fe70b61320e4510be29e04f13236cbcc78a8f
+93bd11c24fcc4b45405a13a65ea47c13be1f82075662c316b4de144f89beb6aa
+cfb84f0d288c67d488faed8dbfff92be9a24bed443e9db3f1deab63ae94eecef
+43ae1d68455826cb3a48c456d7e9a849a9822c77503e5b9f029fe70168831ea5
+2ec0c2c4471627fb5f2d03bdf8726bcce14a8a162bd9bb26137253ba8b581941
+e759a7ca7917d4244da33f45df6684d3dc361bda88b4a0a02e5e55a1efb0d851
+b4e418bc6a0e213172a08b7596b1fd93aaf111f2778006da546ca1db88d5db98
+4ae9658c1d31adf6ecd3180c19791c85a0ddd1547fdb800479a6dfea56ff1e11
+9b3c1dc388c0f372a44712954373ab66cc420b2cc80a92c2fa011d91c441bab2
+f54dbbea462e186e0617b2f3921f1aa33dcd2c1c5eccbcc37dc50bc29d0ffb03
+e45372aefe3b44d8584035f3bf5ad94459a65fa170516c271b722a2f08bd241b
+7816ae887856fef57292179987b26bbff4cf1da6cd2bb092df2f6ae3064d61b9
+e7bed1d13e534b991610a2c067a1c107ec6b0a8dfa6f6c4c2539c8747ad33057
+f5a9d083a689e34c8ca2957263786c1f78cff0347ba42730544865be79b7c461
+7ebf003f8cec1e4b6af75689fa6f6dcc317c7f6975df451eada5382583a1d1c6
+510ca60fd85e55c6e16ed39a86dea378d6f41c00beed05ff2f9f1a2219e6838c
+819e9576e4ef216802c4a913de00062e70df8d83754166a27708337ec6b8a031
+04a426a1c31371eaf807c8d638d16e6515ef0693651bc2dfc870a1a7e340d504
+be0feabf24b5bc879e75801d188856be2225a82eae90a792fb4e0d66ca0c4a64
+a5064e1c9c2fbe84b5d6578c2af56fef340a49911a0a346813fd5da9e694726e
+a0dea4f42008ef28f8d6ea9f974327fe71889fe76945b30fa99c4c8c7bd3c40c
+ccaa4f19c0e0e0c4cc88611829bdca334cd69463228c2f83e1467125b7eb3c9e
+812c62fdaf831871ea0af75efe4c81224eff156fb21bf1a27123d020beb9e1a4
+d72626ddf4dfd474b98694e87ef0691b71a8aa4d346d03eb56e0715d8f6148fc
+424cc472407f00bbff0cb49d05b0b5923821fccfc27869a85fedae1ecd60b31b
+1c8e8810879809ec069ca308454613df0f673b5516598fb5b822833fe3e0c0fd
+1b3684f7a66ff0f9132de78d198fb6dd459c42208ddd13ecf433d4c9901b0aaf
+4c8ca7685711deb49d9a2cfa4209a0d058aa8490963164652bbd3cf858e53975
+0af2b20db08bad60ac71809271597b65071e7946d81c02d8e8eac13adf5d5249
+ac0b42f5c602e16b6199dde3666d58abec0c1485ba6ba71086c36481229891a6
+89bd1c4d67e91e5ad6d75ae80420cac489198821227c1ac94954cd0c94098773
+ef4313cd8aa49aacd7d34bec814e77f9aa794e57bd14f678a5f3d9311036fcf3
+d39a94b0b23b982214469f645fdb728751627c28359d6613978a340b2b2ba9b6
+a0304f87a77389a09a36a660cc983072063683920005b2434951a9c8ff375cb8
+17ce6c78b6991ab5a5efd7dd4e8b3171133da1cb44af59bd84724150d09f13b4
+39a1046904d4d3ec3d2a90cf5275a9527f8c3c62a0ae24a60e9e7d1765eabd75
+cdfc9a14c4043fd34ea73afa2e08cec40386f048879987699fb8123ded9709a8
+75b020943bfafac56dcbe4a2101223949b0179cf7de6b550657c91bf3116ee7c
+66e23e4ff64cedac326536ca1f75ed1bc7113f0267ea7a26fd44728714e2a1a3
+13e88daf24c9a46de29e3767648e961b346ddc72a6724a0857078c9a2ed39df9
+d17c65b89136a6cc0c954e0c46e9f23900c7ce91ae71d74237ea1128637a673c
+f6ea0c8286ef99801cc6d45bb780e21c5a7464d16f77b45236bb9819ed3a8c4c
+7e1b15400eac8a99511e77effdceaf8af6cef034b79862eaaaaa00bd02f5667a
+c1a03c0188d09fe4d1fcc0b0d3354c880b2943b9666224238db22257a3873b36
+be9a8a55e01165f4e8d3c8eb3521ed57aa834a4f88b97f2fd77b3b3c39ae4bbe
+869a24a4714476b3d396eff67982ba0a8f9ac34bf7b247951c0c241a01f347f7
+84bf841495d76f9fb2ac130779145677c799a07678eb8a3ea3de9fd00430d46c
+b1b3b6c392afd853df1d0bcee9a053d6fecad859bb9bad0bf186a6196b89fcb8
+44799928b4da77817a8cd1c36cf9515090cbf63f373aaf151154a769cb58704c
+2c0263028c641e1ae224235cdb17d89af5398f3d1daf44254089e6b4db47475a
+1fc228e0151f244b025e5c14411c8834486e483e4cb4406752788fa99336d980
+a7a6e6f1afecbd87f2c615880f3a6bc21524abd7076eaba6ea1bae0f995fee85
+f938283c60a7a1dfdfc053a8353051b18bd03129dfe6b472e73958d11467aded
+ced7829ddf6e7879dced36391a1d113cb87969b0465d64b96b5360f774a98596
+1272aefdb74ea23d85c8af588ae0f6b43ec47292c880217c0ad03d87e1cc22bd
+8117ee06e36394a8fa5e72cab0825bc3af8bea7256e7f8abe7fcf57a38e38df6
+b60d783d56905a5d7794904c0cb95e2aa835145062e022b159fa7247af415890
+117a2c9a99674891b134760def15804badb8d4ae414a1410886eff8d5284b042
+9586db6610fc1e7c2ff53f19060e6b43dfb0d8bf8dd94efd5105ee20ae0bddd9
+58176c666d2ccdbaa1a3b0a8cda0b452409c8cf61b9e085d9a9164b7eac06dad
+f878ef8ff5e36bbd6414aa86e1d73d211175ab042ed5ff72030b44aba32b970b
+917282a1d69f3005b0a110f90942ea6f9cb2d9eb57a43000c48bfc2af2b572c3
+f8387ab21c90facde17d772ed98280b44061671ea4d98e901f33b8a8bf0f97a3
+d87d0c4d81d6e29d895f50c1552fcbef2df93a75e3b0046c794d20229d7eae01
+7f230053c4c2f463020d060b8552cfd6463018b4c03275dea0ac42977b3dbe97
+3d7efc22c9ddbf499f2a2358f6287a8c9946fd16e6e998dc763b5abaa6888484
+c2430f2fb9f2b0ae84984af32ba54cb191274f7b85695f5faa3cd5eb154b0f1b
+fa2a0b9ae93d591648d33b6c23e27f9a18e0b8548bf1f45158ba7c171bd1136c
+d045e9dd27e4f23dbfe5b29a66695628a87949cd0d4d15cd066916eeddc6cbc6
+f0a5c77201d4cd352584ae70d1b8e4ad2d5278a472d230997c7c03d16cb5ea0d
+d04df0bccfc7a277a0ec9516e10134a9ff93b3e6267c5ede4e5b848bdeb76b87
+52249e458b602c175ce8717e89da05ceb850d2538c340ef6142f0b5cf5906f99
+c271b6e5b9e614d64a7c72372835ec4a99bb39a7aecbc41d021118dd56d21326
+c818bff4de332c9c00e96755e71288117c19e3b920c23766f249b1abf4ebb173
+3f9d38f1772128cad4514c4c06fee49abf401feaf2368edf5b4f78fb13336189
+5040b953d2ec56876cc72fdf69ea7692da01a508c2ff7096e17d78e2f61a04b5
+400d9c28610aa8d48b790edb4bd5cf08646923b0d5a86178956bf7940f291242
+1c4f3bc76fd991e36e18d40f813095c5b9165700cf94403b23b2b7887458c4d4
+4a4f160ceee87c7d50fb4ddc3d4e3242d9ac170b060d472889e553c988126096
+dd343532e74b54d664d63141b1eda0e6ffd1d82ce4d084352e97f09e2e05a17d
+cd8bed5a8adc08494e5ba8b57ce522758413cbe5e5d74e6d3b251a6567fbea78
+5d838a9506c98691e0ee47be4421a95e6b02e8c66aa06f9c88b0ab94a1a32660
+fa0d8a24f2d5873ac94ff8e0670b96d4eb007ab89f1c77e0f1d1be46155fa2c4
+5930779b70c9a6d559a3646af2b83590b2f1ac3a3f1c9e8d465e145c69fc07cb
+5df5093b7cda7f1780def8060d7daf747491b0486e7ca427857946d2f3d0e22e
+018cf12b04b2ecfe3accb88e5e52dde2d9118a1747917e6a9f211c1d210b2b15
+8f31adac46b63cc00beed35638a2e8155805bc068a00b757d6f9dca2ae540883
+11ed782d682b511c557ab8c413e95ea8b6dd3a6c12ea9716d670fe4446629890
+d14a1ff76cdb4eb9e2ff314ed9094148bb33db76e4f6bbd5b6ec76aac13c6660
+38b1790d9c6ecf2f33b6d4ece409f012d58a75a1a4ef5e580986db61edcd97c9
+7ae81fa20bd7fcb07053311dbd6f3f73077ddd3949fa6dc327ad2fc056a8b798
+53b22c193126e73803c83fc4b7bd9cdc54c2fb1f6353ebddc027d3925bd32d89
+219a778cdc38e5f9621b41a27cb8fee8ffc1a2fc48ebd25828373b9bca8742c3
+0a58b2473a33b4805383415deeed7197a840f6c39267de16ecfcafe7d585f672
+b5ff6bb9d143e8e615d349ed779b847f2b5930aa83b08792e193d64aa163a090
+586a383d4ef4bc273f162164154d9abe6e68e23078cbbbd0a357a771bbc427c2
+3b6a3f24401e31edd9fd7091e8849c8e37d83ef396dc505f8f843f4ef305c505
+53776af2c088aaaa5a5efc05258cf692b579cba82efe7dd3f3394d985a5518cf
+93c258a168969d01842a624f56b4a6e50fde64083aa7cd0a8f3c0eea6e6d9a06
+d24b1f96d34d66c2fed66cf844b490b537561865299d18dbea55e025643f78d0
+2419619759dbcd65ed0ac4a2866c61f37383902b4e1665b2fd9414d348b4d41f
+ebaf2a1e4bc97f5497de6237170ec27597c98e6cdbefee9c6a7b106b3b6aff2f
+7dbc6ba1b2d145285029bed2766715781b230aedca4dbe0c92945bb7954d9fd6
+1702f5a981dc0c5c876c28659d744803202a5929f03db99b32f776a794afbec5
+3f03ab51fbdf52c98de52fcae577c7ef0a72cb1f4170bffa48734f1df30ac772
+9f23e8541aed00a2cb2bfa219626421f669494c472c88e288e5698541185b862
+29881c30d6b6124b276110bca39fc496691eb1c61432cf296b055401f2f63e03
+22b0f37395a0489a031945a21fba843a881730d3298008bb4c023b24b195dd5a
+1e30b76210c17a06095e3222bd39ff2b7f7b6366a173a9e0cb527172e1da2308
+5eb7568000e9e9fa521f977c341e7c4cefc883522696ab5617d6f6854bcaaafe
+ccb82352f821fd30f6edbab80310bfff84779899bc62743894dd9e726c6a585d
+b4a2883fddf1d1ccb7dc8242c6d0f16d008d551ee9e02cddd4a21a28cb56bba4
+0bcaaaf95dc41650643302346318e7eef6bba6f4fb6eb956f99457f2d2ebf601
+65b6b1e4405501ddedc0d2cce1a9cc7ee6282a2432e88ff45ac520a8155a2b4c
+4bfbef1e1a860ac2a2f2d25c1bcbd864001a54be48c3686cf72e98856e8d4e4f
+2b3f382c3e3a75bef479a567bab3764282da78b388d27a6dec10e31db5088362
+d3586e219c55ec4e24bdfcd77b920f5ea332d29630559785a900d05813400556
+d1d0721754258799fb25bb59a79699f6f4e56f0e58f6748bf8091d848e4bf22b
+728c913b0db74e9bae863413ba5ba04ec732d6f50d838424dd1a47b29e51aaaf
+8ee4831f52722e1627bc84cbc737535206f251d92549b8e2d24bc6b3d2cd5687
+9c4bdc972846bceecb47b5ad23df0a82cc481e37d74ff3389ad3535d0d6254d6
+d8ec450fa1e3b81b7be26897b75025a64f480dada26aa777cda828ed66cd65fc
+9d02717638bdb88571460a45aaf9abe1b460659f7893c1c64008192e38cef686
+8a076a626165bb53e34766580ea78b2bb63e45d6fa0ec31687bc4f243760d452
+b459dbed951640b1f5083a19705a3384af93eaf503a000e3f2384062bb52559e
+1e0d8bdaf66cdacfaaf91636d01f7a76dd5424b7b620a706304cae6fc50f0dd3
+8d395cf39dc796c7ec271721e13b1dcff35f06b5bf5cbb6b2eb908714f4fdd35
+9763585e39484118b080504f1bdb293321cfd1b2913fb217c7b41d7212b1daac
+1c4d770cfe91a1f649d760c132fd77024f7a0a4e8d0cfb275f5435f3dd911be1
+1db381c01a9c04645631fd9e1c871c5d2c91ac39a18d8b9dc563633d709a909d
+614024729bbb2824c33c216612efe88278d6b1082e18f486631fde76aefda526
+2a194ecb406ec7315a43695256b1f7503d323c8fcce1f572ce5410edc931f97a
+fe2671156d0167b444ab02691b81fa57696d07e235dda15640ce4d2a936d1dbc
+a0d1f41aff8f3ca1792ac1c146021056a40ba5b30278222286a89825638edeaf
+429cfba89cc85ff869cc5d51e41a8ffe937e03744732e3fab250127c9eb21d53
+48e3f6fbfa7d4abb16dac3c45e68e355e43d59c67a717495a6acdff50208c2c9
+7ecc5243915c0ba12e420d4fbc39c5332db7d681e51158af491169d7f7212fdf
+47b9a9dd0af18a2c28bf94199e0480f9cd97c2ed0e79a57a02adae4b0cd3c1c8
+f91521a111933abee28bfa1ee0810db409fe8dfa17195a9a7637f180ec400844
+e497a7f9cbafb57866834f37b2937cd71cfd5a88eb86b64a01e33e9a639ee133
+89460417242cec260f151b9613f6aca727b2578770e86b45b395b951caba7afd
+94c3442bd844ff531d069b8a2bc52710d341882860864884714eacfe23bc1cb9
+e4823b3c2315c09342cf097030f14fd7e663c2d030d2d71079b6d53799e5917c
+9798624793a0f850b6046e7c987f7b1b01b586a83e8fea61486dcbe8b1362ba3
+a2ddf29c622fa55d54800823824af57e426b41b6aeb440da475e13240445d467
+26a6d4518ca92a6003209d30974a40872e176ec005233706148979aa159c2b7e
+dcd5136921bb9116855f20b0de9f99a919854a9fb381d71265dbe5375b06ffcd
+490b11631704a069a04c0cf952ea0d9c4176d5acfbc48d8a48074357b1b4a8d7
+1a9bff215c77e14d23e09393eb10015a5474701d12005e66a31aaaafcae6a030
+34e2281bec8d06f7b41e9b2dabb7783daec99bc7a3a8dd48e90d36848efdde98
+c09309fb1c506f5a1c0af132020b07afb2a9b3c457cb0f1a66684e043872b794
+534308404c4d7faeb296d9f1561cac5fac91f4b02f89b429212c58c55cb96fc8
+bd812563b864833a0f9fd69422d24eb4a4acc9cb2bebc4ff8b9d8e891a63babe
+c423cda2fcb7cd52a04774b3738108a19eeb1208256540bfcea23ba55f4dce15
+e1d176c21f166ddc1c2bb79b75d40e38050c6658a23c416650a1dadd17e15584
+b382a148d2df13b0d186484217ce6e11308856598534befb42a76389263e975b
+0a17b79be1c651630970b99d5956213b5da9d41d160dfdbb14de1e25f83725df
+ee7b04c5f1eb6cf4914ce25d050de1e1fd701490f5e4d82dd51b28cdd8cce9e9
+e39bba025c012e85b2b1c125c45943798f8b93c791b06f159bbbe9a3ab1e0fde
+320164f98cb091b751a57d86d15a0fe812f9a8de5306b3cb033c9e7eaaba9054
+54af59e9d61518b06302c9aad9a4884c222a41898ed8e340c7b0163e5152a394
+ded4c2abb46fa6e763e27b55fad2c1f9c5e4ddf0bc39fb7178f9f5c84eb6d793
+04815fb8fe12ba84b91019d3c52d36febd917e5fc58c423b5c9e09ea31bf78f1
+da64ca6686189475dbdaa3fa111c24cd98c82e2a9f4c768969ca12ab4d160b85
+7aff1f4af235f5127e7735fd8a4e1f4023de13c477e98d7190bf7b6e45b4f867
+38f0c045e958f0e2e20fef19fe492044c0c04fa16a3a0d33dcdbded65d83cc01
+38ae67b6b6c82ce18705e39c04ad8308ff32f03939586fade451f2dc110ab4dc
+fb3125e09d8edeeb9c0ebf3d289f9354973ed883cc9df86e126f0cdf91d07622
+8d14814c51a72aaf37bf555a0e2e8ea5eb932165a430a9d0364247f0ef15886d
+fb61e13710f14ee5ff73120542ea256894a17034c5b5d2db4089ee4ae8a5aaa2
+cedfa0b8453c045c75ccf036b34d53f810c2a219e2765e0f6b1aa7c7d78dd6ed
+27df905f4874e65d79c161371032be490231487d9b877b3a2c6e8a9840e8f421
+7c2a536aa271ac2f44ee7037758b75f5eccdf5ffc7cb94cb100a8710a118e0cd
+cdee5ffe9a3cb0797b1015e78da676e14b78a252fe4f86deb0bda164d4058b46
+3cbc28247564d64fca96b4e6f54499e08714982e495918059ef68b396226aaeb
+e5ea86f697256fbb59abc1c752d459d585ddeec5792b769e8f1c55c79f9dccf9
+cb52f236496e84fd5e9a7e4e63d037835b976d5cbad20aa538a07fca3e44ee5e
+f03e7b4acf304a825c3d1783a46fe5c046e30f75e8935fd323a022161f2636d7
+287b209d2aff608abf3074cba61563cbe724afa0f51b8e2b49023d2165aba623
+aac35969666595b7f010b911eac958005ac45a5b756a9a1b711f79f2d64067a9
+d4258ff5e7b4fb2142de1e561d8d098a11d63934a065585dafb5693d7b9a546a
+ec40b879bb5b7c167e85cc4e9df665cbf0ea67d12e230d9bd922af96eb39dfb5
+e7bf1751f575552d9df1da8402ef816ba3be8f3c19b8912004e1da13463baf48
+ff7b3b33a57aed2a3e9e9f145be50f2e84900daa0b996632263af132f7e6b374
+35d91cbcf393cb46649ff8ee35a93b7e27a9bf39734b53cf410ab3f3a2fc4027
+af2c873a42c13aff732acc9bb83bf2862e7da328eecac95b7c0f0bf79744ea95
+363f54a5b19fd37f0282ffc0c1779d733f531ff661381dc983de2858e791ff20
+17a15a90500c579a5f61209d9a1f503788babb313bfb33f3ca0732c984c398db
+687dd0868699e20655fa21040c952224811bceceb52c86e3666430e4fec39c47
+4462ea17dbd53ce9feb02d52615b93ffd7928c8f6d24b3be92f7731b8b087c0c
+1d51c663dba72b2a6879c6f55c1de28f339676d7bb9af94fbe12af5488d4b3f5
+b529a6a3474e3f0cc46869343243748527080265184bbfb93eb971bdcb298e54
+16030d4076d4402b653b180ca984be40eebf024d2a7faf3910fa14a5545c6242
+fc6d8a9b6380cae5e75df338e07b8784bcbbd5369ad30a2c6a7ec32cf5d78219
+41b18b7aa533b522565cfa592c54a428813751b5943328dcd2c6a622ebd2ba11
+c6d2d65f03b4f419ba4375c714e62974b83a5a5c4392c26da2650e0ef90e5905
+402cbcac72fe007cdc6dd09bab715b7776e327215024acc013cc55f0a3a26859
+2a02a0a9f87370cc81e5c185db2e6090b6b2e947170a41ebd0cc6d71a264f0ca
+16eb08e781695fd8d35777542ba057443ec42bf0a822c27327b1e064af38db65
+9233639f837a74efb758b74a117ec8841779afda95ef3f0f916c97936ec16bbe
+f2b917a8e8e686aca6930649129fbe9dfd1f8247b34dbc586678999dbff6a12a
+c51c1881425432805a253cfeb23c5ea0cdf05c62f99d34aa7f73d90272af0969
+68ab75f3f1ebb30b5ddd6233202fdae3573f67a51662367833673f7ff1344346
+446dcd3e29699b9028c7bbed09471ebc899cb3139284a914b98fabb1d50119b2
+347ed0d201cfd78dee828badc1655fa2c70191b24e20e699454570fb31850dac
+38ae12ca5cdbbe2b0f22f0de8ef8b927dc6c54ecf3801e5c2544710a2e8f726d
+cf297becfb7a93b4b422089200aafafb934334704c3d384379d34147f7d163af
+3cb42599ea902106ca1befeae26d641d49b7a3490f09bf16b8d17c026e40a2f0
+8d727fa2aefcbe4ac82dafeef86eb672a95f413b73858600c7d9dc544694e25f
+259b039558da35ba48443e6c931f6cc6ed108e765c879314e532d888a79c1b2d
+460204838fb662dc90465032792f03f18ceb654a379648ba449922c9447c00d5
+08b81dddf1fd0304b2b803785ee94ae63b9700b36fcc894782782f51f397ccff
+2a1734032660685070d6d5fe94636e6de386bf347f063dff5819b6b8554ea416
+59da8bb46c01807fdc883e15a200a6cedd4b95810da0a805c3d71c6467d84899
+6b88c60191c3a5e3c4dff6863ff024a5c4d4092164792a397b7d390b4306b56d
+b002e6533752ab431804dcd2ec8c9cf242efc7b93dd9c3fdb21824068d3abb6a
+831d89d241613946e097ce77a82f68c92da11dfcbde58e3450f2830a3a049bdf
+c6e9bdff298b4800f150ad3833a612643316cb420af3db29f008ba36a2ef0181
+f64b4bdbb6334233c58e0e68876a6d2048db062b61a9cd020ed7ef071525cdb9
+3880a24eaeadf171b5c077e4de8527b5ed5b7e5005f73c09b2279ecf72e1ec79
+a3e4837d33cfd614e6d82df617f77eab048e71b51b3ba4334d8be27798576a28
+a21ed866fa75cd39ad747a1fea7a57446111ca317372060aacb159ee90e5efbc
+dc5fd16b41a5e63363b41f13c0160f719ce353b913d069e4126743b420562d52
+e56b970fe3e660f4a850e8ef45f7262128f936ab5610401756ebeb0d9b5dab1c
+8ef2d95e0cbe3542bfe0c6f29febf3f5a39fbd16a5c27d652c4a0c542124855f
+4b53071df5537a5fd5bcf653c0578b4e324bfd7587ed10318333382ea137d90b
+f0f83b4eb5d4796e42fb7053d4cd9feeb842d909cb67ba4bedf8592c876a83cf
+48e4a2f7e92558e57a5cc6c3c6a4eddd68bba96359eef224fd78f909e016c5f0
+ad7740a686e566386c4f000764c8b6e97a1f3e9e98b047f75cad6b84d502c377
+846904339303da4c0436f1f67fcefa9fc0581f769b319c38d4221576b74b949e
+532b99ed1cc90a2de4189b346dab2d48777ba5bd5cfc80bb15f0c8d4f478d007
+b84aff3121f7c0cc0887dc20cf195b1d964e14685acd86aabdecf09337ac26bb
+b0e45caec8be479279364fb840c6ff36d164b7be25f9f811a466ce04c2ce5a77
+4ee329b9bd773657737db17709d3a6913793de0357bdea11ddd259b5bdc94e1a
+bf95d33b8396ae9b26342cc1d2a2831e95939a0ef5f13443a9150f35aac5623b
+cbaf6cc5d24d51225c2920e3bcee9d09ca5c60f22b07f24a26dd856f8efec9ef
+b184f8a92781ea228c2f15ad9ab1da75002c9b352316a588d00af46a86b73aac
+feb16d461c9cf969977681a88806c8e6330c1e9e8d428c91de717fe3908802ec
+38abd40d988b018fd7a4c02a20f2f3c18d8364fb18692c310d4d1977be4108a8
+56f807519b471ded405d1e7ed6c02676970c2a1df6cdcda3b38edad9b5cee11e
+5b221716f3137083d4a433e6af2eafe4760b0cf8ccbd5c15af998b5d5785a3f9
+b79a81aeaa9a6706b2dcd217ed437b23de309a360ff60ca82a8251be5671a625
+a90de4daee9941d44d8d1e3a19399f13b93d9b567b2ab2f9cf2b71058ccd9776
+3b6a3f95ea470066f36b343c0429655f8f25c89e65074a52cc6047885f4105de
+2ceb8f80846530a88228b1f44c73e8cf8ff1e99d5cdcd3c91487caba9cce19ac
+bee693c2479d8dc2c8799895e188155502f957b20e26619874cebe43d125f6e8
+638092ae98ef4429bf719bf6cbd17b1f1fd9a7c90bbb6b0b34614b32234a7f4b
+1c259e4b10ec72d3a2e5526473e551450a11d8537cd6d3dfc472576307ad3354
+b2a9c24ae22c90aa37b1ac70352969e2aeb30d0fa894724d5e47a87e7319bb35
+7b76e95d7f665952ce39e05815e5718a7ec0d09dfb566e589c3655e87588b6b6
+95a272aba75b07eff8041298b7a1bf6fd1b10c5ce008180940df9f4235fab68d
+bc3d2ab597192b0912b5d9486b5c8f6cd5238cb94a0c807f4baabe7e81f072ca
+0b626d0a5cb1b8254a4ef588149c84c53d27ca3cbc729416976bf6a20bbed57c
+6c0fd85c86dabd7ade406b27a8890bef705bf3c5c8a59615d858ca2707c47404
+78f55c4d6da862b50f90997989ce492d884f97482166d5ddd4eae075395d7be3
+cb0dfed4d966b2fd24c41acb6ba9f1280ca84aa8cf607bf1d2cae3c6dae6871e
+c5eb10a943c84b83095fe1b7b9bc3682b5681a850001be80a48a2b1bf22790ec
+f53a1ddb50e2325392f118cd56727005b947495ae8ca6e46cab765670ea03488
+39275b5711fd6b227ed1a6b66c02c9f199c8d54b46609a0804fcffcfe0cc8b65
+0f1ec83354d395ae89ef02d548088674fcbc0ac0daed78ab47e3ed00df77c01f
+2d0e5967da9348fc0434d71eaf90785c3666694604f48bf2043bd54dae61ea1d
+3e2da8efc1ae867ecb0e7d11093ba20786413e80c8f05dabcf474d6d9a1149b1
+be96ad65eeb5b865f4b321de61ff8904a072092910bbfce7bd5a42f10c355e73
+c0890e342af2f2f4d7fac20c846d372877c7b12776b76756a9002723d5ee71fe
+5b1c0e5fbed5c354cf4b9cfb843f01b9e378e90e7a56994325c7c447e5269204
+c83b98d99dafc77ddb6a3fcfbbf430f6d0ab8a832c262f879369fd9ddd33b1df
+602f5462b9f2b29360f1a1b7d7eecacc4f10f188e7e2ba08005878b1d9c3762c
+ab8a29d01c0c164efe8d37328deb51567d5f17b25c11590a1078d53a36bee786
+5813fee10723c1acefe111dbc08b796895f2e1bb190f3da6accd6dc6c884eb44
+ec4d78df308ae7e774cef87ed4d6200bde349c35d7262448f165a6706c33563d
+24d04d409c69924949aae19c13d07ee64910d1c29d15ac711fb56e3dd05a980f
+acc11d9c08863c32a28bf94eb2c8fd1fa0ee61b939ed944b017a46b681e95cbd
+0365d77433a27195df9d20a3483ec94192fec56b9af5c656bfc2924ca0c19fef
+ad23207ac6d0169a15cc273d66899cc044b5efca9ef4078b9bc1e91f83842624
+c08a91c1c0d20306b1479e749386cc50fed78f22a27579fcfe943b033738bd67
+db8c4cba7f60e8ebbefeb2ceba747c757e902b70dc09622aa4ba96347b6948fb
+3ed5c54ac78148b5976001bd3f0474d93f4903d15a6cd68727714ebcda244345
+d9a4b0020bde3e2c74385736f244206da78d0331de35feb4960d8fcd0ef4bb75
+5ab20087c2aa1da104d16ade37b9159caa0f8bf528b55cc005f017d6823268d9
+b13d199ce47d3c95e492ac8067fc44b42ac8be86b639770a91c75b7f7a55ff60
+0181451587fca8bea1721f4950b3322dd9c8a09cf8e4d2abef3ec038c8302e9a
+3194d54745d5798e3b3844696d3c4566b179c98b7adcff4bd2a4fb402ab275f4
+30f2c77eecfb3c473d2e7102592e101c3d38f79a08021227f8f782a59d20cdf9
+c9750a8c0ac70e34d983356c313f85acb56ced4467357e07e23a62ab3fb6ed71
+9f9bf85edd20af93c1c1736b6112dfc8447b6d06ca12202f84b34f892a1a13af
+4423b723c13701aa57982dbf20ed6ca129b72f79f77f1705485967980db5df42
+c662f0ed38a02b55cf048e713c0c6a1a85c900acaeaf6d045dc96bea5d45ecf2
+8ae85d1accc9b38a45d6f516078c72388e5337b9c1a2023d086e97e3affd3f64
+517df9ece75c3afd0e3dc74e2ed3b4aef8a8c032cdd70127ec4698db19c78646
+58f9dcd6b98676dede88a1efae04d182ba73475290ba87fdc71cee2737057855
+c9b151917eb5b3cde9f70db961ab5c8a10443a7aff427bae1d1e720a604c39a0
+14de8b45e528237198f086421b5938871ef89008148eac965bfcc850ed7aeae5
+ec3e8e37b9762a8a6580c791cd89c4d25fcdbe778bae071bb1e18257fefe9771
+255f977611825be7f64134c3521ebe7c549741265838ef00f0687ce14c463d97
+884893e5c967d3ca5286b52d0aaca5ada20e778a4f4c807a9cd97f0c05ed4876
+1cb09c787085e213a86b7aaf33acf64552ce5d8c3459c261447024035997ae76
+85d1d4337cd1a1def984e185779b2a0a8a3c8da6212730f96174f4c3b104d096
+3e0e395fb85f918cdd5f98c77daeb09a64169dfac253730c7da4122a7025ef19
+dec6042fc24d4565a1f8a7b37da00d170b6c4be72475544dc73b111c775e5c20
+401ad5b382559c2dde0bc3ec0e46c07e42a08de477b3c07159666bda273e29d1
+8ef5b8e6d514e510d8210e0a998508c3062ae26b504abb3613f3d1f167c87bc6
+48308196ff8fe6ca97db5fe0baadbfa22593c01bfab9640edc31410fa037bc90
+f6ca35ea8010a6b3c031b43e19c38a010e84f1c5c97b73fb3330ac18268c16bb
+88648034875df43ea61c877c3278caddd457ee47509154aef00a86d801f8ddb1
+44e43f5ee5683e3ae84b7f6ba7aaa51f038607beb96ad79183364c49793ff0c6
+98c2a8fb0ac71b8f38eb7479a4995e1fbac92278b9f3528261d822db91d5d4f1
+9876784d0651ec7291f19a5437e987cd727afdcd267f983eabe8e5f3879805d1
+3f2089d9fca9d35e4fbfae0d72d7d0021c386bf7608fbfaa87d26a57933bb6ec
+95739fbc3f7229a82efe4343b679165df1ed79eb650fac11cb7f1e74d6fdc9b9
+a8847a85bd24f58e2d988aea2f26eaea9d27f5892d2cdd77669b849a92f8d0d7
+5c54ed9682ba9d0c7058e04997279bdb3454d2b6a44598267a269a814aa9e1f0
+abf598a1b6c2afb75e173eb6fc2634253c04fcee9cb2a896523aad92457ef0eb
+321e0a037eb6cfe349911c148473f86b5aff5b8985533a5f6d3b406ddac73d35
+23071332a8fc34a4816171b2c8a19bf458b4ce7259270785060b9d673f3c4997
+2da999ce0f2e7ebc2b2cce6de818d40f020d5e53b882f0d3754c341d5740ae72
+2868f364a2faa97e8c8143de444a9f3ae27eab6c4f7c838f3a5f8b9600d70831
+cbc2dc64ed3189f33030d0b32211b757f6682949ab889db99693f4dea2f670cf
+057032d3034aaa6c3e75a0bbdc092c5f4886b169e59ad2d7f4d41cf7ad2f5882
+77914fdb7253e198a40b2186b1a9a0aa958ba9fb99f21a074825e053e562c2af
+8cd8866861ae914042dc4b8b5342089b21013d519c44c28482cb8801c73de3a4
+9d6dd060294e4ccdc55f000f0ab7900b088e141fc2d8ce68cf771a068541657a
+8b41e95fd2b1b452949716ad5bb0b8c2ece99d07a41f3c3ec381212baf8cca9d
+801a993c8a3926b0e0d60637618f69facf70c7b3e6af9762afde0deb9e5be5a9
+105c3164b4d8372414fbee3181066f1772d21da04d0b350c806935669fd69cf9
+6073c324b8ea582638b11e58e43267c3854fa35c3deb3160d7756d66b87c8385
+92f86ab8a97bc9d6260e2723d435769d15dce8cec387318add815687ddb99d5f
+1980da44a5332e5c98c59c8d6ba28a995ef8d809d783a9b2510e1c6b820c25bb
+90f52ccb9fa3fdeaa661a69921794a60a591fc9157e755c28aa399f30e93d298
+9e7b35fcce14d5fe6bedab37c173d384d3f67323e702b14ea74951c5c07917af
+f9f9fcc450950a8232cfc4744dd38ba79b9fc41a37205c97f44ddac6ea5d423d
+7af9883610084080de39e5a71db472081595235f72c7ccea69a20cac059f2357
+b4d60e158834ad26f85fc1e9bbc948db8fe7a03c5c401ac2ed880fef8803e464
+76b00961ff910f1fcc897e1fa4f6b697a616f07aa95f5616a313ca01f39aa99e
+8a5a9fcd389c99d750ccfa38bdbdd9a0376452970f91859aefebe5b55779516e
+665c6f786b3d22a1cc781a729e477c5f82a65027c87b54a97d9130bd4464956d
+735fa5b8f710cea51eb9bb909e89716160cdb112e44876ac49494f62b8f46e63
+c978f80f3a57d99ede832bb7bc1ae59ad0025944669343f432bfeadf8d7408f0
+50c7568da4400df96139c1d243b8634b19f2134fd13c783fe9012a58a7e7843d
+55bc3b7c768579bee6f5931f1ea9caa44bd6808b12bf4550c852c1ee3cfa72b3
+5c883f0b6a4f4e5d768f93aed79bb5c70b681c3a9d604b6eecb7026c1b22e28d
+c184d2fdade4c6afb6b9fe8d7495abe07547d092bdd73c5701696e6f256cda8e
+1a6e58f3335e51498df75cf37a7213fa50f6d9a7a4ea4a251c3cd004b75b8805
+8c8b8efba9f66bbe5e8f321981aa2d8f5d455b47347e368686689d00fa5f996a
+b6922e325bf4e72ac9cb09fd5802f365e4a15045683884b45f15175cabb62651
+3e71fdf4e7ac9b4b91772644ca8e55c530a9459719e181f9f2d211601d1bc5d0
+55731eebc2964f4add0f713c6b22abd36bd9163902a147f5172c4e054ff44ff1
+1999337a57a673028374a04b65e7e77ef2ce24a75c90fa2bb48cad9e9fa77111
+24514b9400e2cadf75e9d7f62fb7993f82cc336c77716bea4c00c931ac21e95b
+04f35462cee46670514510bfa22ded3ea18bbb8b511f42c637bbd06134280404
+05d4355a5d252d9bc291c14cc81d77c491f62a54387442b9a884b3d21e0adc5e
+1c120ac2c0b03a0355204eda408570d379547d40314f5c61f8c97971b91c521c
+a5e86c1c321a90ae21dfbed0688e8c7287e7a35a1f0807b0a9a811a6d2d68636
+0fe12a04126f19c9b0fbed1083265ef6b2f4d463563df3b1be5b9fd0d277d53f
+f4f5ee43b113f580be21183338592a57e29c025bfcbd56dad49e4b5bef14363a
+db5594baba9ec550bd4cda1759277595d677a71c91925e6e1960f31a24117609
+4213750579cf163fdf9b3590951bb5e2a8f117412025f1807584ce1a4cd382f0
+9da5d7b56954f85327c0eb4ae556b79c08048b127101d2fb38f16996f1b66fbe
+0040841b5578762c35849b0641d3343d8290f2aba7f075a0e2721718e08f0a85
+1fc82805f23c2cb0cd67740ce3d5bc6b97f98f8818cd39ad76ea2779c48ce48d
+43302c382ec8d61904242e9a5e28527ea6a3bfcf9dce17a9d36398152c7c47ed
+777c944db9ba4bec4f30a1261a0096081ceb94708ebe98e7165ebcbd768240be
+d03fa2a0904086e1a4fbae8788315c7f864754e63f2399702bf2dca498b2b352
+09ce951389384a9e8ec4f01b207f61112956e9a59c0bf46677b9b1f8459b41e1
+b8323e5bb1ecde22bf2c47938e0e2f548cb02758dc7135004e448d9e689cf431
+11d2fa0a98f3e31b3882cf8689c76d276b85177cb27357bcb2ff0de3cb032166
+c58f25e0ddec5971b6a81325abcad1fc2a27cf0b20332769e80028ea27b841aa
+16506f7c22dd55171341687682311e1f884ef87494bccfec13f5b0b217333376
+fb86573ee65386e19628e78f49c6cd9fbe4cfdaf21ab25e6f62a99cba323ebbf
+c5eeaa523613eddbf85de5dbb9c66de1748624c271d8fdbc16bb8f9196428516
+f85e26d904878f9da7bd61848e96250c225e09dbd4f15180759e3e5da86d0dc3
+f5f4c5df81625a466d31872b9644afa35c81cd8a84a052b954bbada87c1e50c2
+c39594078c068c9b0aed83074cf941bc7afa3afbbcf3f40f34e4e3d1f133a57e
+9c10799313813684dc597fe5ae551cec1f61802dd873526fde81f323b6c62530
+0a5ad9bec4131b9cc9cf26a4554d6d64bbd5c7eb59024b2526f12f3f9352dad4
+7043446118b2339223dc051a4938bc6a2c691029d693b8bd3d35fcc458f7df7d
+bc2e51ea969285ad222a233e5331f99ee402eaf6d76403f6fec3114e6315a2db
+23659ff88a0cf2738c290fb6ccacc2472bcaa3e0ce03f9e9d8357b89580c95f6
+f97c1ef3f0bad43253b8e97e6613f0ac04f55f2f321b5688fbe4076558738b71
+b378712d45c48ff6ec34057bb2a0aa7086c27716aed9c3e6ca6703ffdcfc451a
+0471ae9d6512f0fa82155ae17e133b685717138397757d0230b62cda0ab1ee9b
+b1f0bb791daad5f3789ec0f22d13b44143b63250f09ac760e86ce3219292c6f1
+ca0e77313611d8282d8f62c986fd525baf75a8ab194038359f6e0217d1a5fde7
+ec7de056f4fc6893e740dd8c9efcd629fe529d5116db5482d12bf39b0e3a40bc
+bf1b3f99f627cbe937656f38909e3924b89ef1478be176320b6fb8a7c750f41b
+90dfa427229c900b51d806d959be3b8b2b6e6187fb1bd406fd179dac8af5e70d
+be10e747e198dd6cb67872b48585f33aec68a3ca94a22224056a32a8139cdba7
+aa07ea5cecad1d2e1054cd265d35c6b2ec0a25a0dc415955186cffd2c4b6a86c
+028129fe12b4fd07dde82836ded99925994f058cf323bd1b362a86a8b4ac5aa5
+dbad763abb2613b41ae6b947fb79a7edf3ad23eb7d732727376a1fa9ee0e8d79
+3b5871fc0e4535563bccef6ce24a71b717f90590a7317652d7978bfa78a72454
+353fcf512ec5e804ff6d2984c3e905401b69246e1b040693c581e794e6d57ed2
+5dba59acdedbc4114116da97b749c4007f51addf7dc9bec79c77cfe29b6a93c2
+61e2007b01a0b8d6f95a9e6c25551a20ed592c90c7ab5071280e5d85200d776d
+938df156ecd2d863f8b1848dfbe5d3a40d4b817deab66d5c191b4b05035e0009
+5f04c4cdfa26de785889829564c27377ff1f2518da932d4559017881aa68a802
+5bdaacfd2611e101ac667d3b69e7895337d522e56b4d9698c4c5f9a0e83c2386
+f084f40a75282c72b2fcc12973e5edf34e810fd247f9c0317899fe6efc833822
+8a788d33265883fcb78366ce69783b9a15e8c041e4556293f61c571bcc985d69
+b1761aca9460781c4b9f9035370dda95c777de8d35e1d7aac234987fe1a8ff45
+37888fde3267d97e27c8fb6d95088f0d207e4b8d3e3d689172b2d89b8dc28b34
+43d14646b23e3807afeaf3c83a22f45cbfe9eabdcee160ab7b1a664bb5fdba38
+4446b84b6b863c892a6ecf33f7a569d82df118582e514c11314dc73fdb04be15
+b6bc9b3be801419d90b74cdc52ac40e1342167440621fcaaeaaf9db8f78f9e20
+045d3a26e1b51f2c786b23c09cb94f9cc91df0b5236e3f54062925ce8804113b
+c93c3ab041948a2027d00e112043ef82ce54365fe241a2c503fa334df6973406
+3402fc6d246a8694f436b318bd5558f69c9f182746a25aea1bf1993f61ca48b3
+b04074f8a44206716d6a6d834ed3c455e272b41810c6d70133c455f246aa7764
+a104c482caff864d86eebb2e1764735775e78850006f959de537d66dfcea3f2a
+45e24e7d905439a59ab155474bb3dc63897c1dcb7e8f298366dd49b9b1e42f94
+816a3c275460375dbdf175ca420b46df137a34bb1ad7983807677f093a05b90e
+81fd0ee6b6de147a9813a1a1ec0c7d859777c0b2945edf2901f883b8b54aca59
+814b951e4c97fdbf48aaff19cb9fe7c6c0de6532f656e5b1f03193b58ee693f8
+4684114fdbbc86134a483ba1be41cf4fd823a23f5a52ceab00021c2954e5c04c
+865ec7222d33d82f19e09375610ff6dfcea95e0a25a1cd3d6156b63bcfa13740
+63bfe1d8a5e45659b0c924eb81cb3d4e70e59515ca1be45f66faadb5993ec547
+966f70f5d761c8731063422a510984f7b4587efe6799d2f28d90236b49ac10b6
+fbc45ecb7d91017e16e4fbf716709b37120d3586363e33d94ac92b01d1349c00
+18825eddd5cd9cccbf8c70046ca295d885209aa3fb0b6209c5298ef4843c39ed
+d64dc504c278334107d322cde4a388a4a079bd303c4d5588be979eaa6cbdf8b4
+942ffd0d27b2ebe1533f1d31b3da2c7fb5c8b663391151fe897cffda8c227d45
+e292e9113ed2538712b40601f1f0c8f3d0d69ccb584abe6db54b4044034791b7
+d7a0838aa9d80c971f45486b4304f20d68b76ebc6e55bb683dc20c356176006c
+b1f902f8d0be642da9f9209703c23e48235c35778221689c16d426fbd2903d19
+7fd00e071a1989e8b2ccef17d51e7d73d7189c06adcda120cd3e849c603729f8
+85006337a3a1136ca31e0e41d674620f97f0101a297a1b731b1d0348c51d72c1
+4be0366a2667999067d102d7007d510f31074799ec5cf6ee355e59bb68dd85fe
+3e3f553168c337afddf1bbf895c0df509355dd9120735dec0715fac5804075fd
+cd57fda443cffeb9e9d8e6f24a3daf1d9523ddbd29532a6c5a79e6b1ea1f2b1e
+55e0369cff1bf0c074873ac1226354a6a74e62faf42f1a15c863c0ba21c3c399
+b9c1ddc4ff6e9bc9a3ba58581b6bf67b89b7045b9542694b9c2dc3e185a1390b
+67aacd3c344d37467671f728fddce8bb08e2c6b8cd4a8abc60de087fdd560130
+3f40599da3a1d4abe2e93cffc5628e62d972f034681db1c6b07cdd0e7f9963dc
+0b146051fe8140004c5cb27f0f0411027ba88646baa9d6f02931a762300a8085
+7aba1853932d380a72753ebcf4c9c24a03fedbb2dc057c6f62f31695d35a7e8d
+da73ea4a610f515fb52ad509605b8deed5e44c36b7210dbafb46cf2c5ca7f42e
+00571a8a157a953226cc00a87592050135386c5e7fa1c5e3c023edb0359cc26e
+96762eff0ea623651b10ff61835614486760930756e59d54919f0dfe0b8fe93b
+9b28c474055246750aa1679389c5204657d283981a5cb160e21c1737503ab109
+044a661a3b3d100ec7f4581bf7b67b50970078319890d5a67d133bdc07265d22
+99504698a00ed8c9747feb1e747737e19850d39c03a837f0d504f9b43c8fe9a5
+725eba04ee6cd478f8416470ed154a11484aed5822bf9979b1ebd5e56af698f3
+4b865aecd29c67ca74814b0cd0109767f6d582205574670b0182e0ec6d23675a
+11e489fcd58f0965af4c2f2b891aabd05185de26ba4e0a86b4fce3ba710d9c81
+3a97ecb07ce16ba156e2627048da3a2155ae68a5063f6c2eebc0091711290605
+b540ca4ddd10838e2a64835ba38ecba8043074be230baddd628d8b253734397a
+a213b0a9bee70d623dd5411eb58e25855209b3648a42e4681f90d51b13354f28
+267d48d1b8aaec412be2dc199ea3ed041bc3edaace1af401d01e56b5762f7c71
+cadaf26892f3e1f6ab0438a4ba0e3f5ad953fb15a7d821f6444efc966c67082e
+47e1af0e6e0d199189a994239c9716711f9ed82f6fc2fa1f923b4e3aa45e5ad8
+c0dc71bb5481fa6a105b90a77bf4b8b9b852714cdf4fa814e9d0d89d349ba57e
+dce13210f79ceb8733526aff221386f826a435af47f027d81bfd4d263b84f8a2
+a807c55d1bada31a59649717a4ed8d560d4f5b81ae7f6943c66e9b2ba9739c3b
+559d49fe652de7c968c64030d91099ceacb9ac69417e8210f64eeb6dbec7ab1e
+fe4a3babea0a42ed49cba2e70a6db7018ea0ff1b2b0af498dc6b5e686eecd7a2
+a6b85e07401e08b825457e99d0b5fe48ef13a14fc0ceaea7bd7748b2c7414522
+59ef4ddcd6a12d5e84ad402badb6af6b8d50738250677ac12324e4e3c5d72887
+c3f36f99c04cc898704bada948b431f543765f3112175412fdb80af9850ac5cd
+19b65b018df357498fb4255439913acd686e3edd9a3bed54235ca6a3d93ac968
+6ccc1400b8ecc647ad4fb7334eb768ee32d3213b8a30ac2caae37e99ebd9e903
+b319139533fffa9289c29424a030940ab2b43df031c3f72542e7a8227d56c29c
+a3b07551a0be3cc4d406d2b0db792e9e72942777388d1dcb4d48704c64a99434
+885c4f4f170294c7179dd43944d60739ba9412245f2c34699d04f9815db6db1e
+b3835adbf1d8d9cba2da0d217562a25e0adeaa51bd8258b9b49f1ab66fb1e72b
+d0312788da672625511e07ba68cb0eaf05485044acd338305f55c7b67e52af4c
+124e54d8e3bbd2c6ec6080dd3e191416acaef07bfecc0e77acc92236749ecd88
+96577190a9e86b7ee306b613e0b19015af7bd544e26c6a3e98c51d98cbef559b
+29d79e6bc3ff0966663de38b24b2449d38846e6652159ea825303122ffb55333
+a108e242a05d015a9abb0089a5b9974cffa5eef0de271c243fd9a4f5ebed3b53
+324de92d22fae131fc7676b747460fdcf199076cb5d922e2098446275946481d
+681674c97c00466e79ed31008c4f83626ac2dda6b0464b589f01082e5ed3d7b3
+1caaff1052012b1da1e37f3c0049623555b7d1525f44c0824a53903b54d4da9c
+083d7acf2717e26be8596a07574661a53c504866959e13dfe3547fb8c5ee9c54
+e4d16952d25f0d32c103c1b2381a3b06ab7a26262f95755e2cef7a028266ffdf
+3687304ec78638f3607e1d4c76af0cea8a30bdb7afd9fed23b79acabfe622c82
+9059c90c5bc732c53d8ae7e55f6385ab5d78e0c4e0b55bb9c5867ff9a498d3d8
+dbe4f0c548de9edc0944f1119bd9a2c33d5d1c8de7c5156bccf7d4e52265464e
+5e58d93fd79f40f0ad593f50bafdad06a77fbb22982b35516497305e78f50471
+746076b77160149dd7a38f2fdd678ddc2a954ed788a19ddac34ba6ecfa9f0ed2
+f7bcb5f97eb077bf90e7c3852ea49b1a64b3a1e618cc83bffeabd15abb82fcd5
+38b644942b6b9741b3eff1409c67632c6a40d77c42ee0846d8edeedf56100f28
+ce8a9fb58b4aea6fd3fa0345832062d748ede2877fbe30187b635ae95227a7ae
+e15f86beee2718058ee928c73d0e6f2bfba3c144d5fcabdfdcd499f8b8db426e
+0553781a197bad1798327e3bdd32060bb55c660c24f3ea4e658d4e95f69fd589
+e9b35a2153bd45fde6f56e50a7cbdf803e26103a62824b24ee929b16add5f9d3
+5817264fbd1d0b3171fff576d67bf6aecb15eb25c5bc6024d558725718ea8406
+de77df6446ce372a13fc2d96fa72f65932fc34e7caf2ea065d3c94367070ad57
+84e94fef2858bcaf7c60f999caa4d0a483fcf77bfda5ead04c77b87c69a3bda4
+9e752456a8a91e78c89e72b3d805cddf729c8d13346df0c1150a7e16f37abdf4
+07f8a69b062fa83cc8996e8857d26bb0c09d5a5182cacc745772b78b584cde14
+6f5e78de240c5f6bc995606afd03afb003e0f8f07f4f62478caf38494a162a82
+ecbcedb9ba0d4f074611e68f0cb7bbfb76bb11615cf4cf26772a57d635613fbb
+9fae0485183a90656c81750e962f35cb61689ec21f11539df17b2662006e2391
+b5d31851ae55c40d408649349ae3500bd52990f1ad042a09d0f31fef1a5c7c89
+5ea1118ea0c1576b630bdba01bc628ceded0ad35e6decc10c02be1a05be5259c
+f318b84f4a0d5eeef0ef8d991e029c55213d73a07306160751c8fa142d010c1b
+9e85dce81b6c4638de70603f7dddf7fc3a80540151b985066926c581d21cda9e
+9a2a0b9f428fca992ef1970a985b3f5fa6e80e5923db4de6ed7898c508852a47
+439a8c50e416c2b75d7b3c8046513d91af6de66ee4b6f26f6b639d492b105b1c
+9049b04aeb7962405871e868f15b6e1a8e8806253672c6eba1d9447c1b453d36
+59860fc02c285f5f2d773f0e76c75d5fb2493a5c26901d9559a9f3550411039c
+129fa2d0fb9f5aa4d6a11f490488a08fb3de699fe868ce02120fa973fa0ae84f
+fb524eb2d7823fe52ed58ebf40ef5c7609b7b8a5e1d47cdb9f624d53d35a40fe
+c7ae7c17bc941a7fe4c9c50777595a97573e3ef83582033e1851577036e02f5a
+65aea4282fe5171269ab39a07939b2a71890ca4043102dfd0afcd8688996a45e
+7b6a858c30e54a6f32fb19bd71adabd584ab82ebb85535e53788081e553fa09a
+d97345c2ff7e6b7dda5093bb78844783002adae6217581860729e94f5455e6bf
+8050a1df07128cfd83f682b4d11696a62d204a7d7be0a43a653d1cb6f58a760e
+cc565ef2e33662ddd7daf376653963f1485cd1c523d9341b1131d527ddc5e166
+f49f08b1bf9344bf9f7551a2688bb258cf46775a6a31a4e38dd1114fe2e44e5b
+3b56d7f3d7f44e3c9f09c6e9e098d425370daf4dc3c638581a3f34336e80e8de
+9016f94e65ef7664a4ffc441c52d073d47da7b90c39aea70ee619b199ef79773
+bbf5ad46ce9dd19afdb335492d31fe45cd69650eac723a9d6d0a3c9c00eea011
+daae00acdde96c901f111c402703f7b1732e1527aabdab32fe1355348e76081b
+27491e40f472c84e26568e8fe043ae3b0813137b34205d5a005eecd8003b244c
+20e0fd57bdb3755e7bed94304a77ddf69a9c6ad5f286bd2e95e4f4f37b6b6004
+b9f7436171c6a17af1136c05bea345577c488112c7c8cecfe7c57f2601265076
+dc5cbfd0d2e66b8587d92d02ecf628c297f4d08c149fb2efd989e9ad7a41cdea
+03b48ae9853b03768a1528cef605f9d64045b1c1de64a5e0d26ec5af66ff278d
+296f02349a6344767f0b0983530d314a370687f2019ef6c778654c011206e8a7
+c47e5572f904f2946372e8ce442bef2cca4fde1ada3a06580539088c11804c76
+e66c32e076f0e3de041e9c9950dab9d79886a404c081f61d1eb5e0bb4ff05df3
+8412f34b01dac78411e4cd8c6322b956fdce30b66dbaa9e8df62f797e553b83e
+e379d96df6a2b11fa7edb9ea2f1fd8ec4b89b5ddf937bf91d3b574ea667a9847
+5737f2bce293b7f9ed9ae06ec39ca2befe1d4378b707e266ee3363acba05eef4
+7a9d71f8a205bbe81569ff184de2e187735829b17680534888904fe67fdadf4b
+146c1d80f3453840667908b0bd497d22c8ffbfd1400fbd57e140afe219fa8f51
+c8354af1cb982ef423f250eb9e8aebf30166780d631400ec33bd84bf71140403
+f5cd03fe38b27f08167cbe99bcaa3fbca13d734c74148a4321627b672468905e
+c93b528e396a0d2a917ce042d8dfa63eb2575723962063a2487f044c365462fc
+907b42eee612f0fb4e34a3fe9ea1a0f168da2cb89cccc1b5422e81f09bfa175e
+3479915053e90007ad92ab92a2a0644726bf022737f3b7b0ee7579fb7731ac29
+e7e043175277ef22942a9030e0bf91a1e775f9fa3f6d86ea3b72c8ddb42a670c
+68694780e5a7ab25968592d823bdc6e812d19641c1e176e26351ea5355435739
+7f0f92c33c67
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F122_0 /XDVKOU+NimbusRomNo9L-Regu 1 1
+[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+  /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
+  /zero/one/two/three/four/five/six/seven
+  /eight/nine/colon/semicolon/less/equal/greater/question
+  /at/A/B/C/D/E/F/G
+  /H/I/J/K/L/M/N/O
+  /P/Q/R/S/T/U/V/W
+  /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
+  /quoteleft/a/b/c/d/e/f/g
+  /h/i/j/k/l/m/n/o
+  /p/q/r/s/t/u/v/w
+  /x/y/z/braceleft/bar/braceright/asciitilde/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section
+  /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl
+  /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet
+  /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown
+  /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent
+  /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
+  /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef
+  /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef
+  /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef
+  /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%BeginResource: font QYKIKI+NimbusMonL-Regu
+%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file COPYING (GNU General Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (Nimbus Mono L Regular) readonly def
+/FamilyName (Nimbus Mono L) readonly def
+/Weight (Regular) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /QYKIKI+NimbusMonL-Regu def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-12 -237 650 811} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa763777e13b518310
+ac032eeb94b88c7dc8741fef59c541b57b0441c6888237a2b66a182599d1517f
+9ec474a9539f1632c9a5a1801fd646b529cec2b430f1cd205feff509b4092535
+29e0b7b372145ddf62052c9c08b7673d36dce58e3e78a8e4788b34e36eb543c0
+d68a36e2831e23c440c3e5f1ba2248633aec75ba8d6c9e7fc0da01af08776246
+9a8009a4f3a93241f2f34c72db3361e701c06538a631f6a8cc47b1b5df7cbf9e
+9029d42fad4b90f81cdc2b4cf52c09864f657c7c357180375c0b64206515e472
+c6d71a2c5d03c5143600d0dd439998956b9896ffbcbbb77fc1b6675f1e428390
+144b29367ed224ea9e5f51cb3e349dd118422bda8b6adfe217a02320be72983f
+d6fa232c9289e529552708746c4c76df4ff0c7b27fbca194c650679504c0fcaf
+0c643c945a2563ed47cd8538edd441bfee93dc4160421cd9efe6cb32d81a8e1d
+e1c446eb5ec2a6c855e4449731ed3da1c3ebbc3cfb6553c0f78fe88bea6edb14
+a4abb572eaea91681b7e9f6a2a08005164340dc1983f75b8abe75fc02747fc2f
+0c5b31e0f9a8960410d5cc677ea77d0b1b28681ab5e6b3ac11368b1e493f594e
+9d037f4fa4c47ee06351cb471af4c1966aad3e51415d70e57eb0d84ec3a655d2
+b0e3a818baebfcc472b485625414c4e20d63b9673b0a0780d8838b0b4004df79
+da0444405db6a534a7571cb1aaff7d4975ea8a578ac37044cb1395a056c7d9e1
+ccd617391a2e852a4d71101cdc3c9350e57657b376cfc7cf7e387414e4a017f9
+943ba9c3aa45e955812e6b8173acbb5e5fd0f0654868def282d134d0b4533159
+c2bf0fb6959689dde7e8e5d22618fe9c8a973a87ac0e853af5542de5b89e7b94
+44ad4496afb696be0eafc9dd7a421856b1c0baf95b5fa887669124ad3698b544
+5e82a4c5cfba4e5083784e52462f3724e7273de6e00e84a1d83b6a8c0e79afcd
+1df167b97e2dd796b6826231d31fd02991e990dcf2dbbb0026f9a151c0720467
+e68e2cc0a5fce825564902efd08e2ce18896ca20df47d2df8928baa632825543
+d0f6a5c94630e63411a6adb264443eb7d0f6c3883d195661ca3a1bbaea7bcb41
+d5c18fee8453579ee23f1785112e31c6dfd8e9ecb8681b248f0ce3d77aef339f
+b455f3817cf7182d1fb0c53589750be5bd6543beb9c341427d0a4107dd5d6ef6
+2197b85088749f3cafa40a6a3223d4ced495d6228b3398fbbd0d4765cad178a6
+f93c5217bd254777c20cbfbd33673c5ba58e2b021580d63c76bf196391815c05
+d05159b171c9034edbd0e861c5a26f2dd38736457fcd38003882a66a4cf8d7b1
+e2803ccfc1c9fc2abda0271c331247360b7f2cee58ad9cef1b325f62dbe2be6c
+babe23a220f662247df70428c1f79c79684890324e6b7166b269b174b98ec8cf
+f33b589cc3d3daf1aba6835a22aa2f59f8d386610bfe936a05794242e99cddea
+8da5b4e5e56a875c49267e2d48ccae616053235b4b64ae53a573922009e8a05c
+a56fe84205488200ac68b62fe4f07572392940638301363c4131ccb86462c242
+afa463e3f7f036f63e622243893261e7ef744ed489397030a6604318da3f592d
+037a620fcdc10da51b8f31c816f91016d38efc65b6d463779720ebe8df03be2d
+0ec52886ef9205fbfc6563ca80accfecb7c686f0212f85da5024129f01bd81b0
+bb90d58eefd17fb353ca143a4757421323238c5653a3bf9f28cabdce6ff9d946
+867a33fc9ffe0adabd3679b555a9ed3c181d3e108f776e13bb39794cb9f4edd7
+7a607e017fe054811b3ea3f5b02c95343a5eb449723c9fe7857441feab37cc93
+70c285d3d91df0a0e1bb21d022f68f0c0c8bfb311b8efd056f47c67b03b45dc9
+0bd78333d366796421469cda8df6f0095a5eee1a56621d055a5b12d6464cceee
+9f5fb6a40ce44ab669786f4f0ff1f348c9d3712761a07eb8aac26c35c694e1cd
+65b01b32a2319a381734864a06a349db71a2fba74ddd58010c94aeec901ddeb5
+41e0205df489d02664b4e2fa03a404c8aeeddd6d1506bfe56e2e8a6d3a83f79f
+35f2d552dfff754bad59df45582e3aa87e6bd45725b2c44260e651b70af70186
+8b168e440bd70014be5c4ff89028997bde67279b107f9fec9b4b2f2dc112d811
+4dae65205429ffb3c9734df32328ede30565ad65d8a1aa620bd543286908d747
+d13cec2a2f19cafbd2ad480206f8b2b39524a2fee286cea20b22b67dde321e3e
+3ed87d8f7d9b253a16c648de1c9c8cd84c4f2304510ee263083ac617954b7c9e
+62f397daee458e60e6058addaa14ea573888162b6777c4b5e80c2fbfc8f75ebb
+2026c01a1ea38b85c4fca949d15b9a470f36e0b697ef5dcee10c45f01230dc48
+728f50abafaa52ec5f2899b09db8b74f46ed55c8efbd3f54f6afb0691a992b15
+e1bfe3b6fcb6764227aabba94c4450183f139da7e12df63878b0aff0d07c51e5
+21a29ab9fa0482e9dcb043cf704f17bdc1fa1f79bac725d6fb01dda18a700eff
+5d691d1573cb0ba677a9b1a62dc483fbbb7e4fb0ee0c87cd631f7145b710d181
+85d5bf85df1cff42d9dda4430a8f6f4b6f6c01d20055d8d9cf1d48f268e046a4
+9bc64bcbd7742d090608a1c025f39d44bad9a05ec2c7b5ea4b48959f1cab0974
+537bdbb8828a830843ecb3b6bac3589cb8a35fddf8a55fe4445ee3419ecb9dc1
+3c9a3045f5fa5264860b6e310854cfec5bf920061c6a4784d911fbd82c6b5353
+72cdc7ff3dba22cbd02303654e4d1ce6c5f03ea5719bb456d1ab804a6a9e08e1
+15d0ddbc46f2ff494f0703fcb9f6c079e5af3f4a7bb5a4546f9ef8d708732fbb
+1bb4d11a942470e0a96d5c83d20343876d89fd6db3ae1fe60034cb97659382b8
+03a4c8ee4a01738285c8af5812c4de7a97b1eae85315c9497c082b28990e232d
+7603a06ade5075fa217ef86ed78492c31ce4082f14a6952e0d07ca9d8e15589e
+7c3f49cfde17055e8695923477b71b4c09986c62875e25576dfc3a3854c1cf5f
+73004b97da00a3deef1be0aec1920342613d3e4f805eda2ac121809b02a42d3f
+de9e9245943a23627ae0c1c34b5e6bb1504ceb67966e9b6f104fddff62e82b16
+cbe3d401aaff4d9b44236ef0d04b7edf16eb08b7d19862effe88b696d05008ae
+ffbfd118722a55a1597604e232416c2190b36c30928f82b208006c26b85d7428
+7153fccc92a65f04229c8d7b2c27ac4294034a051b45f6ed5b0fa3e23af3b5a3
+5f996bb65cf298c4e15e98d228a719e1c968e7d5d0a75a9bc3cdf8b5c4a136cd
+a6995d94f5dbe307ae1ca6beb56dfd09a6683bb1437fdcd537e43cb1633a72bc
+1e72a5f98497227072d863dee990660c137064f8f73d78d9c5a40096dcff10a9
+4e3c9dff0d2bb80c429e2c135895b2b3c5be663adb1bf39e3125e4017a6050c5
+d4dac24a8149a6166cf87493f766d9706e13a4c3b443722d7ddedf777c5d0bdd
+780e839b10a61dcbb8c06caf2246feccc66c6fbaaaf8270e06a4838391d7ba0a
+a3d35b278235fff9a707e8da8344c078d88e8eb2b5e2f8cd8f2134d458221623
+1dd96524af97b92662292f6e1759e004e2255dbdc4e0a9fe007e550144af357a
+32cd32e348fd2e60d4c10c33d032fc02ff8a897c4b4b5c35992e6caa8bc4c966
+6a520e2e98184efcb59e2d534fa34c428bb51998e68e91dc9382e28798845da1
+ae9d6e418c2e3b05373fe26901654e1e1a7849431681479cf05e0c19392ac9e0
+562794d94316670bdf9afe2d368fdc31fc2a2a98dc8f23bc236690d897e209b1
+c6048724f4ad378857640140a356919180b348fd6ceeb5da8e4b3f9dae1cda65
+fc155e10b53a271f23c65397711cedf404dc45dcfd9d3c87d57c1365cf9e6f9d
+64a11df0f71f72ff52a8a4c899879f38e797867570844ce904c3104e28f1b85c
+e31f5e4dc09852f5b47b4fcf2b1fb394f4a8c9cc8b807eaa9ad4d8ddd816a28d
+7bdea3811e47722cb0a11f3967bfdc501f5f19f5b7f925455da271243465b55f
+56030748235d6c1e8cda657c5fb7c1ef58427b148713c569d2fa172a2d32e50f
+7440f4cb961d34feff587acfc3009b39005f8ef1b91c28718601d140034b4030
+05dcca93b5d4a0778cfc1a3fbf7e489221c88c27e05652d3c3aacae2cbcd9b5a
+439d3687e32bdaa54a317a6f70833c88af86056dcd68e8546832e7662713ce20
+98e5bd9dcfee48545391246e794e408adbeba57fc3a3ba4e18e487abd6f26a3d
+085eed9bf8e30a77c85271294eff2f8e3def17482c5455dd60fb942f85dc73ec
+9f57db31ce83e7e3574e17004ebe6fd903f485e5ea88c8294ac48ed09afa41d3
+80ea17e2cd33190477a0492a51ba20be31a367e6260d0dbab050cedae7659cf5
+a67d94540d7022178ae1d4463f84630d51af81054a6b7ecf1229d9ba0a6773c8
+e3aa1a9d95416fbeea9ed901f1dab166058080d42f90499b415ad8aafd99ac0b
+7220401edb7a32b298bd9b9010679a1f9369a5bbe7cbe04b2c395f1159c2a2fe
+b4a85292714a8f491e29c703932acd583f6405828ca8331612f5f580c049da26
+22a27b7aef2806c427af57147beef345e56a2ad82b0fa3662a31828bab7f6b6a
+abf00d5bdcf2d595ef576d7da2ea634a82458444145803d443560553a7d17313
+b67ce7fa22fe118e9e8187dae14e79860b371c83ae2ae787210a86a6fdcb95d0
+c05f1b2ac98eaf239af2469397fd8afa989eb8ba0c15412b9f90c1555cbef583
+25c0999b1b10ce4345e6e949b375a91ec348eda0b0d418ad25ae482e02cb47d9
+ec19b444406d720a45986bdf85b4181b8064872f65e7a93bde15ff80ebe555dd
+8adfc28b6ab58525a6a72bbe50cde6461edd83ac9359c0042709e63ffda54a50
+a5a6e72058b498b7c494b2a7e68014bf1c354506c4dda52d7173e6530340f834
+7db62785ac8e70a8f560574249630f3f89c159f31ce437b8a86cac7f5b25ccfd
+b2fc41fc8392430c296146477d501ea752cf52ec9bfbf462d12b39291f49ae74
+28485eec80df5a1fa01806b3013bda44477e671e87e82f58fab32ffc10c111cb
+76e7099f297d6a67a7374e26109f751361768ef8118dca742c8f20774549a2d4
+da72d15706888cec1edbfba70bb8149b54655eba7caaa85529df4bea9ce0c633
+38837abff2597c6b75bd058dfe7091d3719efc3964d1a386b7c6b93d491b02ac
+86b08ff115b548abdb68f67de3b6cd280ee1544ddf344782fe30913a21eadc6e
+314f3ea2ab3d9a3783d5f9be76c4caed815af7def664098cf1a167444f31cf02
+b9229bfdd8109322df0cce8fe0405d523bd8020753f3d80f49365d5006829fed
+63cb9571b219b3869dddfdc2212f0fd468aa3a8c78d06f58fc6be0753bf19eb2
+b014e28d06053e931257185ff8a46b2c443b163f9d9997cd2225a33ec6bef513
+41aeafb9f384bdb7f3c78de5d4adb511c16259b1916b29440fd8cc01dde8ccf4
+e8bf0a4dc53a1e26c020f813cab07eda515e7d395348ecbf8c64186fa5a81390
+7653da3f3143382a374b96398d14bf60fcc5f7603512bed7e8b33e7b20529244
+187795b01754b61d5aaab742be9be4532ddcbe6b88671076aa9551ffd58e4930
+1f3fa48529d85586f1e197dd896f91f0c64ce80bd48519f8c1bf9c4816622cad
+d9cbbb97e7628a64f96b6816c5b0312bb98a23715c3de2a797015203e2787aa5
+ef40b3e17cac398805fe76a33819d4825f80654270445ba955779204f5e8fb5f
+418edf66b627b992cd3db5f04b18b5dd3f742689b3182d41760bfe95be97e313
+ed97e32ecdc16d3d574a2ba1092408b5ad6c165a39eb148b2513bcdd01141a77
+0720028f31693360e9909897d85bcb5364188d391e34dc98d86d4909fb41a13a
+cd4e43c7f943889aaf1d430714d1b0f3302432135a39b11be63f77d04780a191
+cb686729a89c7badec30d3a9b416c32350eb416fbd37104d038b0252a8b91f77
+45b543618155a76f06274dfcc284bfea8726e55ee8b47df6b4760e22c8f2020c
+e0da1fbba9564cd974075c1670bbbfa32b5b1598d198a1a9b82d87a7814f5d6a
+e5a97d890ae6e9307f3147d78d4fa40f5388b9759429acdb0e20d9ddc923f4cf
+f2865f95a8fc0595724b0043e90091a2315ea8c071ab631ccd04c3ea77541646
+b2fae2bd69c5bb80849b85fcc583ed6bc743c7ab0e83634e9625262ca557911a
+3715e19e727337fd16171908a75e44fd7f6ba76157167a214f11c228bb1f132a
+b6cb965beb1aeb597276e4e1bf52614076a37eb859f9d61669257c195560586b
+b567183114c9895464a71774bae8eb31e9de3c11e0011f85024f749a571a3e2f
+0fa7d8ce0d53deb20fd2f10895bb8aed95ac89f8956a8c93e809536e9087cca8
+09106a42a59417359e0ec681c5905a6024bd3208fed44320b723392e3f900e90
+767a6af4c4e67b407b215422a6f409d59c309d1999f973fd9b3746d983b0bb9e
+1675aa41b9f6713630710faa59328b3659f559a5e547451191d88e336863256e
+d43a577b77f81bad982c3d06cbe5a12321cf45da2d300346d8534c4ed6f449e5
+14ad627693dd361913862aa14548113a553b5558f8da4f5fe5cce86ef8b6efec
+00b188a5fa1ac6cf819110e6feb793411cfac4f900a379178c2d7990f8adfe06
+4d741594d2134678e7f9789fd72e87985334ce7e531f0855525b9dcac36196cd
+2d75d8bbe2b02ad9b20184d54e9ac6bbcfdb0d13367e2b4b4310b9f89172d59c
+385866af42d06f9477dbb56e8d3bc8ee8c129849080ced3d7b83d9dc1a32da0d
+b79f6e1760b7b836e2d9a0b59dc7312a3cd10932fc771d14f0f2278479e7168f
+2f4e058c0177456811b2de2b5358ef33a162bdbd4d908e3332930d0e1bfdcf35
+ebaad4210a5f80a39279c5faad2803a748d96651778d0ce97289bb70ba010d93
+60ca05073141c30ee35fb9b8d9eb3ba37cb97fe42fdeef382fd604a1cccbee9a
+65716ccdb777bee502ce3b654612362291ab13fcb507ab797d697f4f32d85763
+39b9cf437eb119eba024e775fe01501a8e7982d266531a5a9316abcbaf5b9672
+8ffdd900cd9814cf82b9ee6e789309cbf1dfc11f715b1a201dda33cf7527da51
+cff0e36d2f4856808b522d5344596058508302f36554419f9654f941ca0804e6
+b38a6d596ca3fd660901d1c3553aa92bcc95703219cdb0cc8bb540c2e60ce0ad
+0eaeab36ac18b3ae477967bf586ddc3a45b5949ca5fad78910e834d8c83faed8
+3cd8b0546efd2575a42e8d4e44c80f375c9d960686e6885a6cd283ad3c1f1a9e
+8e0cd7ed0590ffcad9da423285a26c04960dfbde0a5315d81e5170ae081644b0
+2aee581ab984fc189b5adbfb155a52d9f7ed759091062e9d2b2c2b03c9272ebc
+a0101422d252aeba66664b23a123ab5fb05da5c62e83934c10f7a9489fe6a26e
+72ae45fa17dfe3c1badf296c09a375d2451b7b7ed5dfd262a7c74fa4a9a4f5d1
+f431bfd1e79decc99db3f7eddfa78dfc46a47c0881f500f8fdb96aeb4fc4dcaa
+ae0f9687e6edb2519ea85fef772477c3e33ddb52900657f018ff227701992647
+c9db8e4802cb0d6976b1cb0e3dccbc573bfb38ecc9db8a95bed9c4d90c97d3b7
+0f87ecba2fc8b03a7088f1eb02875c27cbfa32efbbf38ddfa77ab23c8fb36d1b
+ce1112bfc0de7f911f1b096461faf86cc41be0bf61ef31581847b1b478fe28c2
+cf6a34770e43a95e08ba67e429545a65bb9e6e18a6c4dd2a34ca9cfbdba9cfe6
+63826142391f15c543076928f9867bde8b2b1acefe68c777fbcb70707f4f91e4
+7eff73b0c3c26986d1ca582bd05873f4e40179723271d1799dc4fc5e3dd9cf77
+64e41b8aa8dfb907abf53e3a0007a714d6c941114f5beaac82c46927441e3402
+36c2fb70de002ae35627ee5119577ad7fcb9fe5deefc239aa09e6bef15aee873
+db24b3cd614565415a3077b20c1b095a5726ae475c889cd9341c93d4a1984709
+5ffa8e8ef4f31ea7dcf6375177f319a05e551a8905bb47c9f23cc5c0e5fcd8e0
+29b3072632a060e6891f2b77bc1da20cf7da33173db210baaaf8270e0315b6ff
+3fd6c2207b1a429577d5d9d66a0f8268d4aaeb29681a21f7319ab813e2a1eadc
+39b8eb7aec1c33cc62809a10ef560d2453ed7551f097960efb4e4708858d5729
+6307189fdfd3ab62c75a7c501fada7428e157752fcabfe629902715193acb11f
+ca4aff2b0ed13442450e4f2a4873d5cc3689f7d4f7e372326e2f7093bd7df4d0
+ca957794a61a2e813e24155ee3a67c4312a06c72f84acba679e67e6c71f43027
+cdf8a21da3bb5f68e576405c1283016e541a3e9eadd67a20ff9ad7a658a8b831
+2f30c18c451f553c1149960156b201304263eff2f2549fef2e4906909c1b4904
+ced62fd9c0c973b82dd66044bfcd36e1991e0b6b84b6102258e205a458952aa9
+53832d094e6915c3a1669d4f532132424fc707dce60bf9ee9e06d4035394192d
+922641adf5777d563ae7960c8cd6175dafb255747737b02c40687953c766601e
+caf56e747afdc67f8163de81bec4dbd48b3712c0d24e92747d98d5d1da952de3
+eb9ccb3a132121cb1c9b2de42fe1417bea313043b5aec119bb0d1e3058a82087
+bea4d00203fefed8ac113723b1081e92ca7e91363b86eec7bb5dc2e123e41c66
+577dce271c93c667cd8665372d5d3b906070bd229489a91867551f3127591bca
+b1ce86d7d9bbd5f265bebdca4c58af03023e9ba2c291d78b629ef48bdd731c45
+591edf98d4eae6290a00c331780943d1c6671ac237a2844cbb84082c06d39cd6
+b04a2e5819d27a25da749ee7c94488fff5f59eb0a3789522ea85eb999c66f359
+d1ecc77cfe14774fd76b97270e30e95bec696aef56f99123db82304bc662d8d4
+6b342e53171a512e7d435f3009de3613d91a6f32f9ec2e11bc98b09c4dc4d516
+8a2ed64ac351109e5e38a68caac84ab583421eafafee02980bf8d8fc700f1a00
+129564d5efcd4f7896130e76fbcc6c6ad66411285958e3d17c2d408960cecab4
+02c5068c43df99d4de6b9876ec4fa2128d9ddcb0f10aa89aa8935f22c9445804
+4c1b0ce6cd07c272cfaddab0719ef5cc8c597960b7eea7b4cb5a10c826bed1b8
+219d464d72a0be58ae80de6edf876c04dd2abdca41253efcefc0552989dea491
+9605795e6ecbac4ffbc39307ce1fc794d4bd78b64ae38b2750546b8613378f70
+7c5c29640874f1bc3549f9a381ec1d13ab38b1c20d59f90dbd2397a573ffc9df
+525a4d4e995618a58148687c5c949e14c0879316236284a571a5a386fc94cb2c
+c5f7327f9269996e2483e9c4f22a813db3ba38cd036a454d335497f53d654d6f
+e28e4583febc2fe34cac50be37bb6e42b8f92f694cfd4f805c6423089bba4461
+8e36e92d90a06f749d8a1dfd93bd0645dc66cd18ee797ffc06d4938ed9fe7959
+ee2ee5daac4e5f2e15a8b4c311eff43f5ea1a13fb288ac57267b71bd0ae02964
+f1901a7b5005a834e366399eae62532648625bbc13c64c006c372491878ef7fc
+645667f249fc7ba564e152012e485320fb3c5dffbfcd936a93916045e0ddf257
+992e927120370994664643e2d57678fb19f0754ec4c483a8b6ceae60d39703d9
+f309e68388cf20bc752caee575c86ba39575a07528b65400cbe9fdae6a5f307a
+b199a54aaf70c5889bc64a30d5cce65c2276ed1d9fb30bcdc94a65941a2b0e76
+3940f7d243c8de8120b5b2f2995d2ec3c7be6421aa1f7a5f8b6050c17771c5f9
+d61330fb818df90f3062f9f21c23fd0a59d6ad28e023e0d3d7eb4dfbcf0c6bc9
+9fdfb74f740579c8460fa6755dfc800c5327da99e494d9e18efc6752f1e6eb31
+5e399606ddfe98339d085bf92634d2f557d2a07db440f45fc2e60732c51fc4c3
+047f9f6dfaccaea71a9b14ae1e22223987cfc33856fa6d78be0c8b4cfbd8d608
+96c0699ff248a80af31d111d3d7437427688430782e1e99858a2379852ca04de
+bf7d0922b11865b5771d902dae865c3ff7aba28da86ce91a6c031a647b6d5676
+672480a7ea057dd805ade4318482e9f5c7e2592df1672342b98c8b67cf25dda2
+f69d55e28f1c35b070acca2e4c5100c18b102164f534b151375bf8e9ec27cd8e
+e43a7a23cca2c5462ea92b202d9eaae4da36f8df69c38a4689b04ba3e6e6a2a7
+8b06763decd52595b21d5348e3f6fbfa775f8b88330a4f35bc3213a5ba19d277
+4fa8c256d06787e6aced43124b422d3ed2ca884c64da93933135926880b21cac
+35e222c4b6076bb2b391357e0c643f04d209788fc140c7303c90a3c3faf5fccc
+046d3b268154e017f1e4082819de8a5bef0c1725f008b936a243b2eb850d0900
+4560651003c30ae5fd462d8e68e4ae51d17b636bf9d45c7fe07255e470d2748e
+f9720203181e528304f71c1fa2fdde7872ccfe55bb77c8a04b529cc5ff114c64
+544c4896f091965dafaa0eef5e8671d258f4303512567dfe2eacc764f0ab9a78
+206ddb0942d1dc868d52241185e7c830c57f31ca9c08453c6a8f35bfd7220a52
+3e3148beb6fca0c2d56048b7755f068220d59d4fc713056bde03b1146e8e4b37
+cb5cb8a90858920236e561fa21f179c12f7be7cb63eba15759bf0b6299ef3835
+b8d41edd37c1f1098fa2bf3cbbfe0f7a98620e7b072f5ce1c90bdb8d5f6fa9e7
+8629f3c6b4bfb047c9ac1869daf234e4a95bc0bb73f036de76595dcfa2d5e856
+22b48bec72edc8a798ae673dd434b01e89019a908f59089c9789f58b8350a43d
+b00ca1fe192390daa4e85e7235492ce567dc403ae5fe8f0761274973e07ec119
+1b0ae1cb7f6f31076771d896139920861da5c58d3403a416f243f1b58cf54e94
+f3dbc9351633887e8d7ea6f88fc4a0dc6d2a471a78f98ebdc2a98613499a80fe
+b166a4b803b7b4ed05ccabefb2405745f1ff28921a05a0245bfae09355910031
+180305de2f64f071a7abb75a72eff13539eecbc4cf54ff0bc87f6d72d8a742cf
+5073aaf7942a137ab2f273e22391ad1d0dec9dafd58ec68553be5fc4e6c4936f
+a3e67a86f4ec045cf294a1cb7f9a60ebe5178026fda700042cf5bfadac3d7ad3
+17f9bfb62ebd5946992569e9aedbdce9f3abfaecd6d8fee82559f0888d48f794
+697c54b805026ceb1d708751d88af0e5cf88332068833ceeb24223f5b5025384
+066f67ce49e586ebc4249bfb15074cb522c3626bf2571af43f0164b044b5aa66
+9d8217230edeae2453fe02f018bf8a8043cfd63d744388c12cc8430ca4157c81
+e7018b963021ef43aeb42f1f5246eedde76ad7507e65225430f2ed40877214ad
+78a2e199f951e52790e30ca09c0ea8bb318756137639532e638661228e314364
+1b1d60aefb5222a3b724674ab6fbbc3445b878f99b629de47e52e36693dc4060
+9fcb048910f3d70211659cdbce05f0733af96afad264d1841b2fe33f3df5262a
+92e98f7a5873f70b931a7c78863dbaacfde460906281d5ba5accd188edb2924a
+bfc1c6313cf0cd29ac91d2d374734280adb1ec4b2dac9b53da1134b7ef26d10e
+e05685ea4b31e5396c4281ba371b59b12516816675ef303fe4f01f1f84de922d
+69edc0d18568c06d4dc79be0b9754b8f88632fc3a74fa418833aa2943c05c912
+b7b60343a7dc7a3f6f1aea9d83011afcc00619ca95cd8f97ea85176570bcb441
+e9b74ce8b100efa22290b3dc8113db1b383ec98f8367eca2844bf1742d752d29
+7cca604ed822c3f7b560300b39afe9fc8d9340735a718b09064157fd10d43dbf
+96302c60195fa1d5bde0c68c4f235184898d0381849a6011239ed7d6c47814e0
+a163b82e56389248e7594fb9f4a2522ccea4eca0d36e1295b3ef67aead84cc8b
+c297009eb5d21eaad7ab4176a443acadee13915c5ca44ff41ccc2bb9abb47fd9
+6461ec3d38876df77e5fa9993a300c39813f788e17320de56592806658b42a04
+dbcdaf7bd0684f445884e6f1a574467e52019ee8fc129ff3fe74fb03a5d67047
+80155de767defb2964317f6d058d5b8cc35324368469291ebb15cd320d566b96
+c5079d12493a8f84dda5005f8f3fd7038c40d1e704b4faade3ccbbdc7e90903d
+fd3da3bfeb37ba41db2557640f2bbd6f3f49d9e37925007cb97f98c6e365d06d
+282a433e1aa95dbef41be2facde3f5a08254a366a74b7a2f5c14898881d4be99
+aec4b0ee10022dcc55501637ef6f6570d437dc8120e63045002d7419057e5c15
+6a5539ebefa7d632d343a41df8804a6f855eaa3186b3f97fb7f79fe1377f5472
+04e186f1a97011fb950ecfbdeec1ff992b1ebc6837afbc0d9362c1712b114bb4
+4747c291759e7fee3f81b000f9ce65feaed5c16287f5e812f152ec27815bc6aa
+35aaa245c882c9176baabcbb81548b5f271c42169287da48a7c6140af35f09a6
+b82abdc84b8220577cbf0ecf0d8edfd303f468ab9d6a2b89d806b3e19297eb13
+eedade8e405ae9e0e9412525f95e6a7716948fa2ac037dce19d67a156c5b813c
+0af189b9b778bbfdf730c2050091018865e23d6cff0ea4fc0d26a0cc510ddf5f
+456f6aa4f1c33fe7b40f5f8576b477970d6487275389ce7b2444f09e3fa5c426
+9090dc59354fba985544a261230fb1758bac67e142c4a1e71664d7f66eafd525
+22b83d1f2cbb5f97f04924e8cc4645b27331eae812266982efccbccc4ee93bed
+e1e0ae7e88768e690cfaa0abba98973caff66daa632834527b26260e0a4b1655
+3994bdc9c729f2d45f72ba1c510a000b731ac3d9191e1faa5c9cbb7b94056d90
+f65df04c47abd4bc12b9ba0c1f84e4d77081d773a9dd939ba4c4b32785bbb337
+ab4df32d20ce0df7ef0374dcbf88be107e8813b5a769d530cded5649ec7de7de
+0f7f373f006ce997b6f7bef0c52d49b8a62a620a37069ee851e7d23244f6a014
+4d50911d347551a63f9ea59cfe0159797af521c09bdf75e12a4a8e4c38ede4c4
+4e7a9712340d42110b7cbf4061ba2f2a5ddcf67a39eef57345975a9198fb8573
+f34b9a350845815873e4ddb7866c702ba7193fb92d21bb74d8bb4c49f2f3c7fc
+3b703bcee9e7745fa637a9383786fc2729c73c29d2efa5ea274d9573265df506
+c1ddb510c9f3fdcd3a80c0ab90748651537efa2d8e0bf374472b5c7bb50b0101
+7263ffae7f90a979c3e5f3cd8a5cea478627890536251c4c16c0f63c1c822efa
+66a75e01a68758fd97c5928bb2b1df6f2b74d2950015f2eacca793e7888c26ee
+723e78f3cd926b1979bdf422bc83b4b51d1a0ae3ce120540e9b653728d769265
+c03c0a3cbee6240c0de90646e7ab730e5e0cf1124566bc16ec17989c1052f8e1
+84590223348e5b4510204322929d8632c4bd136c89169d45718a88babd7f2cda
+62afba21cc46bb3207676b96695d911fb99bbf37b375ff4fb8be949fcc4b0481
+3776a3451fe65a47d623565160358c977d4bebce7aadea5648814b8769dfbaee
+b8bc2da767da69b10daaff6a50b6a7006ab74f8bd0ec64e5681199b7f3bafeb9
+bd0ebd1a79554e8cf3e5896956d279d4d27202a4667afbc46b84c6b9873e8ef6
+9d5b0777a750a5c8ce86f3d5851cf3203e8b47edaabcc6c6256872f31ff228d5
+7b686b38b35d5dca23c755a5ab9e661630e61d1d376a46466b1f0100f66affcb
+fd1d6befb5b196143998848e48119456d6f5791bf1473a2cacb9973bb80421fa
+781d90e0c1e6912dcff9ff07ebe821aaff09597bdea4e71e72136c4e37946f0c
+146b9d507ee79dc7a715cf4d65db2614cd87c5709112938acf9bb2e01187fc03
+5cea0fd5c2ca980adb6bbf5b9eb427971bed47970a13775be150a7a87bb2b8df
+a92f8c86b98a36ab956ece9f5c562071306642d74f177ea0ebc1eadf96cda6ee
+4c53703763505ff273c296a11adf59c4919f63c78f9b7c2fa998f5befc631ab5
+4dfec01d96fbd7d076357fd85f26eef6c10aaf99a7639c5111b3a13bd144bdfa
+daf1fa9633b69feb2590a878ce4621251a2b860b3e1ad8d7a6ac1a896380f206
+158dbd525bde081e9e7c58f7aba0ba68a22065d3fb7638ab4b2027cfdf4dd926
+0f624b197d19691e1219f705d63781d6eac4ed8bddc3cbe2e7c735f73aabbfa8
+01081532536832bb4455483b827fa9f37d547a4d2cfc98707e5a4efe77037671
+faafb5489b64ea22fa51f2df96a89e8f986b3fa39e113be69438f1a4bb1b5d1f
+33ed7ca77228938a98bf47fa54eeb2da8d81ecedec102f71c278d824c2bf5bb5
+37cde6342b1ac156946de7f6c4c12e1d639d83cbe78d8775cce11584a4edbcf4
+59c05abd0b590172401b83fe9cd49b347c01671277ea43400b1ff4212b3d02fa
+cc6d384f815d7fdb652ab34d7bacca2e9b2b120de79e3532f81d778b6081d631
+32c88f10184f07abe8830a3f5efe712e7e3cac875f3b157ca3a0dd8a0417d512
+9554ac58171e09ae6ad91f69d3235be00c67d41e00b6988b7df3a07e5d65538b
+6f600988178e4c98db360c5ded8f7f8b7866e6d3168a085ca9a823a347519ab3
+5f4fb80774aa4bcee175c02cbe39ea9a0ca56044f50ffb2fd637f925339d30ba
+8f4f7fd7ea5a606dfd7b82ba69b4724c960a5cb49ad40f1900a0969cd912957f
+345c08603ed7e8292789984bcfafc504dcfc19eadb79ee198dcb6539164db7bd
+4d210c9bde5bfe4207c363af21967146511d70f7a0fd682afb045cf22a37bfaa
+edf500dc18251dd086a8d2a91ceb979d2a1e9cb45a6b59afedf66174b764dfc1
+1048356c96b585d142f943ec97c62de95f9b8a8253ee0d6b2b0153c445563826
+787921b9a60417cd4075922332dfd82be6d45b581b581c24c4548ac5782f726b
+0bf70d2d08493e9a96668054bccea2db3f66cfa6a4d37b36418f9fc8d8058c9f
+e713810483a5e75b3f61cfc012dae494dfc2b717cc59e417e25e8c0e21f62186
+acab4158cdf47343ad8b73dc8e43dc792dd29897d8aa1fbb977e9a3dd20fd247
+d0ceb53d2fcc627179dabb49f2920cf8a1fa4d57f39da7e5ca0a94d377cbb20e
+2c98445881201bebff5e33ce17d8089f552c3dea96bc70b99cdad2289a3686dc
+b5aea099076ae9450c3aa43f18a3d98d711e43835c31f566866ca556b2945738
+f359ef7e7ade8e1f56bfbb0317fc2d08846163cf343c919adbe19686ab94f7b0
+7a06f3d97d5545df781e11a06b06b175fbdd1316580a66af1d94f4247f158c59
+d8e1fee6ecb6ad565e772fdcfead3898a5be123f2d0303ddda02b8e86c7baeea
+70eca3cbd43509a85b853eb3286deae9e29921782ed417b13cf1e6775921b2dc
+ff5b2424f98bf14408d446d0ab530d88f49d231315c6739ccd0cc8d01cfdc259
+f47bedfe7a53dd893cd5be51674e6ba162e1a8aeb2b21ad54819bd3d648318e5
+4d651933c280e81a327934ef0eebb83b795b3b384a129c16536bdb05bb2ea560
+72241eeb5f35e10fa050fc0f05fe4deb3e2e8eb52a97450c56594746d0278802
+9559abdc108ddd3431c2cea2da1886ebc7a973ef73038004fa13752c80a35ee2
+8e5772676df858dc9ff0d05c735576262b80e3e49751d78f2febd65ae4c1d0d7
+66cb53656583299d2c058bc94f272d398f72728e72368362a69f69af06a708f7
+ceac24a0846496457635fdfae466621eb4e0755230abb71bb5abe293abf7cc5f
+8ea2fc15c66a5b2fc6a6d510a6730d9fb678a485616374f5c1c01b2ce834add5
+6f8dba31a95983c97af9e9ec5b8406fc67dc045c551ddf6131834edd18f79d55
+983aec1d18d5fb2209e87f1157df947772de42d04da8085d3691dc7010505c0f
+a9724190d9a82611cf435b360971bdcd2e569629d98d439da052bda080ce1e33
+bfa5ebd35ef2e7dd77bd517f1cae2250b13a031c69bfe0d147919c53ad773024
+142ecb1a3ba1ab50a941fb54e63ef49edf844306f7e5d12c9090d2819dc6e450
+42936015482c7bd75693e910eaae10f04385f624083d00276d0499cf9891cecc
+d31b06128a7afa49154eed960f37e7fc260e1372f1d4559062471db4f0db6faf
+efd3e6e06b578e2ba8ffa1e9c3f5a787124a22e0111ae960bd85fb1d62b6ca5c
+b2b3a87e3081470706237fcf936e37dc5b408d0c41299f921d810e01b5052751
+cfcc27024185194c147fe01bc1c4409c520b3e3a5c0f5514aea4cc899ca9e9ff
+7834dfe5bb0b4b0b019c1e8163f294fb6ee50b05fec276b53f04160fce3defca
+2c33ff34f6b1515705ecaba0aebd40a99fba99942bd8d451e1c1e489655daf7d
+39437b97be715b11ff28fb291b972b143da98f5c66b2d02a47850765017bf4e9
+82e2bb732dc64b51fd4fdd3d8144d1231548dcc29bb9927280492da505dfe82a
+dd17fb67b02ef0804bc82339d60dcc1c0f8789074747a805a7250f494dd1e9b9
+173110c4b3f2154e865371295ebad4e321f15826b3d3e61a400bdcd15ead2adc
+2a5f00bc25e36413e46e195eab01069a35f34fe5c00f46b90d2e444c8d5e8a53
+bfaf1fa61745cec24611b2854a7ee8532b54b40ad523f955a4fa2a9c546dea87
+e6d9e2de21fc4b3b2da747fb3075a641b29f6d6cfc3ecd725f26972e31594686
+111bfe80caba23be92b04171b738c1709bad40060fb0b603d3a2ed6e7d49daa2
+627ea6916d3fc19815fbd0fcbe5d1ec8a8c7a6a7488b465973d3c1991664bf71
+003353d2b025d571348227ec1700407e16fc5bda2cae07dbe55bcd7dd0207219
+f4e61479f22c8b7aaa0ec7281e933379b5d25a6ad9ce46a1c67a488cbb315f2c
+08fece286194bb86c66bfcda0fbc668b8b84c2af3e9cc85d065e17f55863529c
+d1668f07dcd6e51caca4eca02811c1ffb9a4eaea01a41e8bbb12b1d23cdd10a4
+97d1a6b9ad43927837f9b12b9f703d414070ee06729c1e0f78d5f63629739f5d
+95cbfaa9a695db4862149ee51c566b8f94f79ef9a3de87c0ebfd3bcdf4940bfb
+314e1bcd17595f3d041b65e4e7765b60a192c4ed917b8361ba0b5fb4fce8f49c
+b09412a1ae8f99d878a8fbdd375de3631a63119042e11e6d742f909fcd775784
+1f5a40a168b4da3dddc65d947ad0950a1a275fc72a923422db5fda3d54e4ed03
+a1ae04ab0f59134abf88aa65d6944affa2bd46ed8c5596062e4d32536d2c8ffd
+e5cee1bf927d1affbf9dd4e214ef0f323a9f48af8ce0ef87e858edac7a6cbc3f
+9ee530f7609cf023032a19298b334306ab3f5ed123b7652aaf77ef421dfa4ea2
+e1dbc68390082b50940aef52f583767e8a5d9eb33142f9883ec9dd26a4c0a446
+31e1b1e55031a9defc48060e783c7a56426e4f690aa6cd006c5a9fa76310d351
+9f8ba5c79c301bb370d30c7b3adcab60adb70e4b4cb9b9dbeac8bb08f07aba62
+3fa6c7805a38a4cf9c5b7f2ddd6dd510b174f7c63b2d5f4e391005bacb81b7e8
+5249518ce22a99e8811376e7a464e22fbdc4574ab3684b416dab3526b3bd0c75
+0acea306c0d448fc4942d2c61d44566f8a058ab93651eb319affdd9ecf2655c1
+d00500943b59360b6c75b780beaa2f1b98165ce2ea6a64aa9435ad5b4d57a089
+0fb6274b5f137ff957e2dc801dfcc8f778fec72a96b31e7457f421399dbd9dfa
+c99e611405a24bdf0bdce785d6ade5a5c09ffb66f787bcc2ca4b7e0f5dad5453
+b3d87e5ba383065143952a9364df8cf4063b2f7b3ab30c263e5b92ec64c43c30
+502894c1b01fee36aac472a6e2adbb9b74129074e25e4cfa3c70e8ac2b3d645c
+8f54f45ba3ed89629cb4f2f35c418ef74a194c496c4b2518429067932d57bc0f
+7569bf4fcac26e621327db71e19eeb5335d8a6f25c99d6aea57bc6ca73238c6f
+ea54a43c09c65c83d5319231adc05299a668372a9f77833064c460b312fd39e7
+49426fa209cb1f5d3d90c043603c8f997470de5cded5bef35daf0145f5dca5da
+50de2bb8b678e6f36c53643aa97f3fb0bfb3191ef20abf0022d160732455237d
+45d23239e4700ca5d7b71231d537bd032c3f2e7fee61b5e32caafd5de34b2a31
+9a4745e6e94da94286497233f66637586af51856552b0430710606bb3aefe457
+acaae21b8cdcd140b2bc4ff16705fcc80d04e0bd9b6a3207d933388b624893fc
+349fce3e420690841637e1ce83247d5de15a109350c60944853a42fc3adabeeb
+69e78bb11a5143fd2c465be7f72c9478a96883d1369414bcbc5b20bb60457eb5
+22e748594f23e082c29689369e48e01187efc53b3637218a36813cc4da7faa36
+9e29596f5de513074eb3a364b82e1af8a0cdcc513ec66d60f1173dd50937ee3f
+dc888950c9a6b86ceebd3bf64b6319eee63db2199b824dc84e53553442b80e6a
+6f29d9ed68d767c3d1ae78037e2c7835800e08a67c5be8f57571a71426c25e30
+a80439f9976ba351cc64a15249905b04742ab07e98b867d4985444e7a9096346
+8f70bfe63fe94f0a4f23257703e8793d059ffdc798ef3cf642a870aa311abca2
+c2a19fcbe68054c2bc94e2d030e8bede94db3c839e3d85302c297369903b9c9a
+fc45596809d3c3f2be2c287d8b49273640d1dde3c7a4000616cb0821a01ee775
+e7e1b96c796acb7764ce16478e2c98547840df255eb133fe407b5081d808f368
+c575cc039dfd5fcc9e332e629e8565cf227079d25627dcd5e4d6a0710b486b00
+7189b9cc441a094d4be628d1990b63cbc5cb7fa127f49bd2b5ac659115bbb018
+dfb667d4154218d907abe558d4fa3ea3c753aef0e05b94772e6ddba0b88961ce
+49d8d6f1d85930efde0fbd9dfa0682c5a8adb81d8d0be2fcd209238765af1977
+dcb18c4f80bbafa42b4cccb09f9da4db574398d30754f0c2870f0ff1d628dd4c
+b57e3791ffd27ee4a9793f3ee5e105a917cbf9b6dc9fb7a32c752519b8334b71
+8fbdd41eb77d5e6c5438c6cb200559b914cb5b562cb914d777f889dc0af180a0
+3d2c2036358f8a105ec2a6f6313155cb96c5d792e2dd3c2fec6c56084f295047
+c1ef4ce1317930046ee382913d7df30626801fc5f6d1501fa31e643345128e7c
+1f9dbd43ba580ef2bffd9af99a7a325a4e39f02f4ff5d372fd1ad895c3741914
+b1b944da9fefbe268e9a4763767718dae9d44728591c4e60845231f31ee5e929
+30f7c26c3235548323c5d14c3d7bc73033940071739c215441a9e72f2ff242f5
+5c65173ef32f00001340a53936c3f926a54e0818aa8cb28dd6fe9fd1c62ea09e
+141fd00782dc1203b43dadebeb2104286082a14af250bf64ec9bc75371a9542a
+2d27f971d3ff426371bfaae72a51d2aba44e859625120ccdfb350ba1c7f31413
+4669405f69b8515e23b0e305f3cfb9b0f29b410d26062bc8a1930ca753184e1e
+dc97b40c9769450780c4a742ece35d726475e7d5ca91700e23cd325c7853b6c2
+b9b439ea12ea4576d7267e7e19baa00665f42d0cd312715e3b92493bb6a3a6db
+54afd1f4c5e7f7bb20be232591b37778de18eecb0d6cfd30d247240b777501c8
+82b269a8959952836bf7d26713019f7677937a97354fd1106f6ee6d09f6c75d0
+296b22831ecac76882f68bb9434dfeef9d18f0d5b8ff6615dcafb348ec7a9866
+6fd749afbcf651be1ed1ca671a6013ce0c183f1ea86566dc9159cd9383b9e5ea
+9900ae6c384ce3409aa4db1603fdc010083db0f0ee139b27c6090b8135799e8b
+420f8f7b10e7334d53df7a0b1581485bc449776ca4b2678a490f9d0ec5207514
+de7bf64d8cf9711cbaef78b6b599d518d77b4544434b8cd95d04149e1b546204
+32b266a48da343d0704d10661485e4c11d4fd05fb727ab2db4975482edbc7c42
+b9b3af2806828da2173a304f83b9cff0ac4c5d4f553fe7276caec477bef48321
+ba153884a05e23002239cef2f5c95d8f6e99dc9554ea767409ce0108e73b76a4
+273aa49f123dfd32d27fb45f80622c7f61bc3242b8e00e6f50ea21d0b2c35f0f
+10308818835feeb760d0ae64c755aae98e40eacb8f0ce744c8aa6d6b5c1d256a
+0a476118f5f2d1de2bf12a0dfa68ca2a2e99f5cc0fb1aeb3e56cd8ee3221dd3d
+5ad1fd57901727acb63a9aac3aef6c753f57e34aec57d0876b442066c2e324cf
+b6637243db0a9cb9d2fe8e82e0dd2d513ad2b33f99bdf99b5c551cc0114da38e
+392ac1ba0d3f536963f6e078a6a123f973395ae4846dbd335e30af20c3c23134
+91e2bc5987f44b6d377af7c5242e4f9ffb43517017dc7340f54460977dd8f8b5
+d1461c6707040c47de84d198d4164ddd7e7715a70abd458507fb336b824ba24c
+ac0e6901295372b2863c119d0ee2fab224f7c0b56af33c8b82436ba9303cc0ee
+3a809129e3c15b8c7a45538ec88fd1597406f696adc7ecdce383d3715325bcec
+7563f1f4baaad70af9d24dbe272710dbff77d95c3462aec9e75a1e24e9f0f716
+2f82f1410d4b77344983fcae866279a98112d6718ff23da33bf16255c1b10736
+e8f98e8ef876d73ab139009bda89836d18dd03dfb13e332c50227032ff403ec7
+26dc8fa78d77aaef79bee7e0656275fbb6cc6aba6bec4920167380a1b07f8ede
+5fa970f56f530ea2cb06be96def3b5327ff0f35d2d2152d23d712013bfb47b1f
+e34f9339712f75c84d90df05f9ba2e8ab689f7804c588e5e075942b6dd11d875
+c56c016d18f48d569ff5ddcf4e323fd9fe03d5c702da6b98776601e925c73ff1
+7943756f5a4867c8d9c3f0a23280e873a891a6371c258e1cca3c4dd8be44e16c
+267512e5fcf49a6db090e47da0f7a2f56804992df1c5387639b67aea74912727
+2d54a49823165ad330dd59020f1351f22d2172d018383555b8bd88bd50d5f715
+0839576ac6b14c3d651b54411167189c9b93f44e1783880a4c1b31f671988e19
+be05d3e519b72857420d6053ee7e459e98b31ee77dbe9242fb65d39e7065b67d
+4c4b6619bb0a8bf1f860b98111710a61e2038d8ecf06c4f825322a66d327a631
+0bc1e8941fc36ff52d7286dfa8d2c38b76864f062457c198ee7335602cd975ec
+1958a3930918b4959aeee256b98e0bbba1c370c9ea62913e9ef33ec799bcccea
+de68997283d202476f1f065861c7d611478ffca395677e4152bc82e9686bc4fa
+a82c0cc2a7e8b025eabf0fdc11e0564eab69bcdd8c4a05e5c249164c117ba859
+3b0d1c7293455320b0dd104b95afbfde7a03c0ec5b25f9d9ac6accc4de9ce736
+eab4c6726b23a116ff885b29258a57981be31f03ea5c5bf6db8c9ba21b831f37
+41c32223133c36127a0b3ea1d378a31002722f439564eaa70bf9c6465c3a7d03
+da8deaf66b1534bf11654562b6f4ee776d5fd7f3d288b51bb1e78808d261120b
+b367cab8ac4ad2e910abe6bd80f9d421127cacdd282116a4bd376ff6999746f1
+4202272291588b6acc250700f32398d7ca3229bdad1e2244fa8d5a93af30fd0b
+98f114afb0e4f4f917aa0935f735ec4d5d3293ba3c9d70af980d3fc9b9ba6db0
+ec2d4038a4c9872775c3ff227583bf4a0bb3baa3a14fa3757b01c461b2f6b1c9
+4e549e58ea596670aa747ee95f8b881391593f409cf52daeed278831aaede2f4
+b7dc53a8ea279127c7ac74bd500f97c86a513e546e05b343a3d590b7081df88a
+3acc4d21a3c8bb060bd4ac8cf01971a8ba33d1e7828a5e64453028be2731bb48
+dec51bd85a6114c8dbb2f6ee87ed07af749318c90fb75a672b2b9c656c0b760c
+ee4c6c462f9d6fae1d26469b37a043720fc710031abe62cf4deb987749340f27
+43a142310687a8b5822724b7b0657e7b291e803d14d2eee8b795b432a983f54e
+53b17161d32c7a2d937fc8151c37866d3e25469c346b59c13930312fbbed651b
+3019b9f09ef2c2a217780eebe098bb92f43e86c1062e161110d23b17b9b92682
+e32feb15891454b1c6201c375d58c4f66bb0a322fa8cdcdb2ad5556a9b6f0eea
+2b3066c1c89a44adf94a7ee1cf4e15d51ae4c17052ac66df51d27e2b1cc36871
+14867d0fc33ea44338e9823c1016ee6263b1bf8365b900d2acdf2dc41b53429c
+b64e9e89bf148370f62822b51bc4faf675fac2c9cf47a29f34f37628a471c4e3
+6daa47bc0b23ea7c1933d849ed2cec6eecc3ca56cc93a14a4258ce5148c0dc0c
+f4f236316363140a32b91a4a7d78f7bd49e9e138b037621e52dd5e8e30062fb4
+1c537aac83e2e85b2e57cb43102568966d75c37fedd7799108a24de96670fd6a
+4e5d9b9b778b6d25d0030070ba7329e482c82696e65df223e0579823f0db7323
+e7ff8a4bbe8ed37afde9a15deb7fc8521a1179e9197e2d3e6640e591c50606e9
+11815ea278b0809d5b7ed1dac77d333638b027e340fb624e9f1d6fdc40ad7cf5
+bc8b03e4cae755be841a9c72c86930024006b17f89f9d4ee22bef17b5baf4cd1
+364f889aecf94c1cce61909dd22f6d35a389136125d44a6b4c27efac337d8e46
+6d657a804eefea97ad0b436468e088a93764365d2481aa2d5e79ab437ecde035
+43f6023c3b75a1eb4c5b1685bf0eb3b9e3944a78c9aa0d410d20f7e366670095
+8f17d09d8b713ba121c46774ce83b09ce675193b845ace5496ed1ed96bd0f1bf
+505353ed69f2aab2eef00169531e57f8ae498ec78d5d01aa45f4d7e2c96c486b
+e14a1b21a1b61f6e73c970630692e385184d32c08036af05fe240976397d06e1
+18892245ebace16be7ad3445945b9edfd4794f190bc4bdd159813aba09f80544
+58a0c5d5b5624fe081c09dcf2b1707890dbc43def71d3222f8f853a5d169fdaa
+95a33d1667b9e9bd7bf5883cdab58f17708bed530ebf7eee4acb2c9bae6b8337
+f1b4cb61b37c32cc0b3e390fdf35df5bb198a2d704ffbee24e27c4c1248f3f85
+606de45396611b4ba6ddbe1e9434e7e48273365ec73dd8df8aa378822e6f1f6f
+8f35454c47ac054c77d62fddaa17b41f60997bb9f1ba5b700e7f840f1cbad1cd
+e2305a92564e0f4c88bc4f3ccc6ee1175af3b2f83cbc57fcf10f0e63e7f635e7
+1e428064be1542f59407f2a18f70adb7d0eeff6baf6ed415d7a2a0237d17a726
+e84344dd77c48b43f47451142ae90d22b0e90e993715c55d0be8c808944f24d7
+d3b167f8f6f6469aba9fba2bde048298e85784ade8d96fe228ae328a0c8532b8
+1d97be36095fb1a3930417db8c50713f86e647113b607c7c93bfb424316e1aa4
+4f8543880efeb8b9be6fc7b978a4acaae9782a2721757f32173cc39142103963
+9da323208310b292114a62ff42e3cc0c986f709f986e07b9364634fad4a3be7a
+8a63cb7b26036eb8515b8ae6af058874ca36054c184f2626ec2683bf21304e1b
+5fde01772a0895de5ae8caa031125b614a83b949bf40681252218b10f5d4ec6c
+21e8190dafab34551a3b8712b13d195ad6c934cf96b9da70302e84b34e6f8bc0
+ef3d383ccb7adb2e5d67ee464f9b2124cd034dd4ffb20962a6abd3764694e07f
+4b4d244fad6fcee6167f5f44f943a02caa9b326726e949a8424496a79f5acb37
+d8c7c3b10d5fec76b568ee77b02061eec7bfc67c9e75ea1784e15ecaf2bade6b
+48a80532beea72fbe2ce5062da978663984b2cfcf067ddef4de6155f60a6c34b
+b469c3db6fdc40e5f79f3562cf6f8bc43ff8032692ec0f95a03263e2cd7cbfe7
+5b2f4a7c4dc6b8445dbecf16b800f43a6835ba3226b5b112cb09a18bb0161210
+4ab91a24919291406a436f4cafde0ed998da1b99718d003d3afa3729203b5999
+a87df0b91c5adda6e678039344bb36495fb1b5e5965fcfc86f6f61763d48c0d3
+7c55d221b1fded8a9a359371f8c08c778e269334c2af994b75186f3b75b7f61f
+6d6d48def0aa6856962f7b9c468c795abec3b622ed16241f4c506963acf2cb36
+29ab91296d06193741f36343fe0f315877a090df94858d93c527d44670760ba5
+68b61609a3d750e4153c0f17dcd5f870b3a38b7d2272ee60a24668afc2b54084
+63664a6fff7ebdf7d2bdf9b1636b17041bb12f49ee3cda336f84c77746fb5036
+61b18775cf02fbb4c635fd09886798b09085b8cdb795bab93438ad36f4e9c23b
+b30e1fcff1bab17fe49566f755ff904cbc11da5e966a545c6c7d7259ba4c729a
+391ae47953a99bc4d500d68420204e23a07f6c0e137bd1a7034d670e1e9d8804
+1bc039653a023a6edcae8f73c93ddcd8a2e85396f5debed0d0565be384f21c5f
+1171e37ce2443cd8ea5b20da6bab9b62ce5e8f1f485a4b3fd7fb22ba4bdd28df
+f76493059c56b7a5c65209ee98f2e81ab6e25cd0a0f81cb511004e9da7fcd65a
+8e73b549ee33577db68adc05e0b24e820500cd50523470eb760844155d4ffcd1
+759d5f50b803888f3bb3a616f99aad9a18a745fc6c248684c2b0df40e38234fe
+1d21017d2a7a1def67c9dd2884d2239e9e1790910a8486e5cd001d2aed32e05c
+bf6fd016f4e70e6af610330f47048bfc8d0a490e60b9e27cc75098a74147b30f
+267ca6983b5940b8ce47d4fdbfc3a7f89f78ff4c35ec0a50228aed5907e05dd7
+ea33ef10c079981b1ab1c361d78f58f78fcbb3d9d4a569e0c8e1f86067bd61a6
+cdcc34c490078ea150b792d466b7a6a1a4ed7c46f4ca2e46800f5498820464f2
+c88c8e6ea79bac3535fe2c12f9e121a07588426e60067e13e77999939ac6e36d
+9b63c024d67d2dd1a1e7172a6441a051b2e1405877aea4ad0e78cabb4cff67cb
+82535954d4ba25bbffaf67dfa0d2a889592d2ba5718168b3a620ed8fcc10720f
+b25da0cabd8265af47ce144b68c6058350d643d8f0746c43ace3b7445efebca4
+8d48d6f46c9154a95a4f4b8962fe1392418ab22e84ffe824554c74679bfd6662
+09b79c6d147858aa4ea978389503c1b8f0dd5ce10af89739f19a42a932c3cc14
+25882a16c505ddd2547572b93581ae8f0eea2c7725f91b8b2bddfed70ce9b39c
+398a0beb2d83471822dc81039695f6fda204907ea0078d854dc4b86318921169
+c744ac7d846af8980e123b6219f8663b9fdbaa3416e6cba8ae367755309372ee
+84b812650858053cd0f7f2d4e62d8905b0cd349112adac19953517ac36219044
+3cfb831fbe6e045dc567c182337d4148036e6e715a366a7e2be5bf0da704808d
+7bf418275826e99d696b0c296e7b5a15f5e63f9c90c5ac093822290c8d254e7e
+828104afc3ef7c5a8d8fe631f191e266434f34d9e10619a7f4b7df6566c86463
+a86f6dfff94f01f8b4c7688e999f306a65628679ab9123af6dca39e88808dfe3
+e99107b918a8dbb02b1d5ed0f6bb82d115cb36889e5aa14c9cef78bf09d3b429
+c1e3cf2ff96d289a6279d186130ec5cfcdd5a7dea4d23124f012646dca173108
+2ad555c142a587d98fca7b8308cccf3856b0901dbb3ca53082b368cd2850613b
+32da388cffd23ab28d932eeff2a7388295286539aaf03746f35eb28338ad23f9
+f4fb3c91c79ab2fef1e061cdf2aa1f2a991b39fd0afa1063cd54dae5d31d2f44
+516cd6be0ee051bbb0201cc747a04d5b171d4f13686e77b9ebf9ba2236886c4a
+505461037b7a5f2ee8db790e6fdfd047033354f60786c1f2c00aa6847c8fa0f6
+3ab3215c78229d47364fc91ac88f98eec9e5d96ecaf41c0aedb88dc216964a52
+54bf9f88a7bc9f5ed16fd210252dd2f8e7f54ca4b4ef4a7356023556fb69a31e
+72df664882f57b786417d6955b17783e9c206fd33064f6d9a9e23ca274189782
+1c18375d12d1ee22e74713f6911c3ab08b1d7f35f00f18f5e9b669ad15d4e1ad
+0831fb8edaa74fc257fcc5ab9ade88ed85a19cc22d32b2a9e2ff3830e76caa2d
+15f5c1fe3fc21bd1eb96d1d35e8966ac563d1ea40d6d3d2b79a9c602bafadceb
+31cc10aa90012955cef8982620ae3d6d01ce14bc184f5dcdbebf94cfb5b10c42
+d174ae261dbed22fb969fcf1bb64f2bdfe0e43ef54eacce5fb5e537e872eb1bd
+d7070d3bee6768186c4bc824cb828830b8696af783d3410a62fca2b996aaafab
+4ee639122e65f121b941485cfb581c57df7e0c5b7e4c912b75eb6409352ff5c0
+33b1c7e4dca272245235cd8b23a5e9452652d212fad18eaa899935b90bebf320
+3c50b223eb1caaa160a4ce8469a1311c69ba2ae787edc9ee304f32afa013a0e9
+092d80c29dde16413909f3d00f9844e86dc234442748128e96b3ee0d243ac8a8
+00d872aba50e81604e5270aa9972e57b021dbb1eac08a064d250df6acf727c6a
+098c99b2074af3b4bf14913fe867707fe0f9b058e05c38205d1603925f7fe1a2
+54eaa39ce49ff00bfb494cbfeec9b738750b53feaead8bce2bfa1e20cedb5e2f
+d815755c40352198c1daa5d092c700d3745eaf183bc281b86e7762985bb5f730
+baa1ffa889dbb0e2f7aee08d5abc2180466eecef7c588a1c0f78453685526911
+165bcbf5cf3e9e
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F124_0 /QYKIKI+NimbusMonL-Regu 1 1
+[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+  /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
+  /zero/one/two/three/four/five/six/seven
+  /eight/nine/colon/semicolon/less/equal/greater/question
+  /at/A/B/C/D/E/F/G
+  /H/I/J/K/L/M/N/O
+  /P/Q/R/S/T/U/V/W
+  /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
+  /quoteleft/a/b/c/d/e/f/g
+  /h/i/j/k/l/m/n/o
+  /p/q/r/s/t/u/v/w
+  /x/y/z/braceleft/bar/braceright/asciitilde/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section
+  /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl
+  /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet
+  /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown
+  /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent
+  /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
+  /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef
+  /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef
+  /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef
+  /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%BeginResource: font BITXNG+CMMI10
+%!PS-AdobeFont-1.0: CMMI10 003.002
+%%Title: CMMI10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup
+/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /BITXNG+CMMI10 def
+/FontBBox {-32 -250 1048 750 }readonly def
+/UniqueID 5087385 def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI10.) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 45 /arrowhookright put
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+d9d66f633b846ab284bcf8b0411b772de5ce3c05ef98f858322dcea45e0874c5
+45d25fe192539d9cda4baa46d9c431465e6abf4e4271f89eded7f37be4b31fb4
+7934f62d1f46e8671f6290d6fff601d4937bf71c22d60fb800a15796421e3aa7
+72c500501d8b10c0093f6467c553250f7c27b2c3d893772614a846374a85bc4e
+bec0b0a89c4c161c3956ece25274b962c854e535f418279fe26d8f83e38c5c89
+974e9a224b3cbef90a9277af10e0c7cac8dc11c41dc18b814a7682e5f0248674
+11453bc81c443407af56dca20efc9fa776eb9a127b62471340eb64c5abdf2996
+f8b24ef268e4f2eb5d212894c037686094668c31ec7af91d1170dc14429872a0
+a3e68a64db9e871f03b7c73e93f77356c3996948c2deade21d6b4a87854b79da
+d4c3d1e0fc754b97495bcfc684282c4d923dfeace4ec7db525bd8d76668602ba
+27b09611e4452b169c29ea7d6683a2c6246c9ddcf62885d457325b389868bc54
+3ea6dc3984ba80581133330d766998ae550e2fb5e7c707a559f67b7a34fea2f3
+bebe4226da71af8b6e8d128c7ae0b3dc7c9aa4a1faef312fc9b46399b18c437a
+776de1f67caf78e15d4cc76d6fa57dad7abc6d35ede0d7118e8c6f3a201f9ea9
+eabf8a848d182eba8922addbe3c488f51eac02906400a84ea0abfaf48116cdc6
+6fbc00330a76a8818cfaeb7afdeb029a204e0a70b47a05aa50153b56d2bf6736
+c7a2c50b023ed92cfff13eba974f804a346d4130ccfd5233b6d6b92a14c87bbe
+2ba216bae4123911e1856975e5cf4d94e44f400f687d2d13db288e0d821451c8
+83e9928f8cbc41e0f4b99f8b29d3b11bd4ed0cbca83d81082e39a9e79cebf433
+671b1af39c3d0e1f5bbe5f1fff62ff6f5f15f0421c56a4dffac682cb07b6f257
+221fed1902e4b69d9bc2e061f2e96f5a46734f91298494a425ef6432f2b9778c
+4ebbadd3483ef5447df5f008db9d91c559950ebcedb4b1316a5aae8367a80e06
+bf3162beb99c4aaa617c60be688da7627f29c1775983ef635b26306a94f0b258
+003779f8670a1398681953b785a226057f7d1270fe2dd2ea66d65e2061fbd65f
+0ac51b6c347a56e9f3e86e52f3e0bf1d5f8d6540afb32a027a7c96919557692e
+b739cc298ec7999b4286538edf7333cf8f8f6ba02c5e8c62929af07acbb90861
+0bcb85345f4206e3ea130512dcfbc6cefa31ef2bd1da11d3010fec57b5b232ca
+706f9c44fb9cab8903be783eca66d748b3fa5b1f5d5445f6c16a9a52c88a7e2f
+2bfb0be4e416ea209a9810dd6c38e47a58dc9270b2f49f9b9d482156f7dc8164
+b621b6803b6434a2a354a50fd9353a2ce3fa761423634b8f2adcd63b2b7acf15
+07588caf127a0d6b2017a451d3df77c53e6171c66236e5318d49fab9ce4b1026
+853f65d0d5f7913d88ea66b9b63cf06a4bfc8ed3246bb86cf6de255ff46d245d
+109939e32dc483a0e5176b614ccb7f1adcf99854cf50317bd081131a146ea089
+8ed59e46da7b6254bdccbc660686e2eda0ad7b894cd2eb2688c0c00aca589d39
+e3caa6e0faf7eeb5df3e3f8113dae4b454a0d8c86fee52779ad3e13a0a871e9b
+65b9ef0a2ff20989bae81d1cc1181679fbedb80e7d84a08774e6da58a283ba22
+3780f2717484e066fa7dc012e6d19429b08638045352d358957917123c9c73b4
+326a954f5ebce183ba1025c00c8f559dba85e07b3ed48d2fa0acafa9436d6fdf
+e530ce25ac7da170db1764e77b6816343e8a128a075e7744a6f0406551f4640e
+c403ea61696459d15ee040bfb53f08700c69333b1cb28142c5b9411d65fbfb1e
+c7f4f50c03d122ad4b63e9e65f0a0af43efcc9fc546fd13da42a1c13b8c9cbfa
+79a480d923701306249955ce1c61a680b2809d3551325a333a189db71bc83c59
+47d17b31f8ff63564919b00336285f724d22f889748564808083ddaa4eeb8632
+5d636961e1f634f3ff3def1dcd7299bb7679dbaf685e2ac1484bd9b17c5cf4d8
+59897713b51a4deba3332c2ab5c48a76357d2eaaa539a617b09f223661bcb411
+0e6559e99a7d900336a9327d4b8330ee5f56b016cebb8c07dbcc2fa736c07ecb
+8930f26b429288c6fe6cee3e7792de58ea3ce248598db0c604787612bd137d80
+e4462d249b229b62142128b57a6b44515262743bb3c70ee96aa4b8c49d6b0be4
+4e19f634add30634f999f4dfb3dcff6a412a9b6067d28751aab1b20928a6e73b
+cb81b0510d551f84437062e8cd403bf8c343003965e926465b288b0aa2fc85f9
+90f9a63fce188d72008aed98bcba5ff4ae850711d2664f0857ded002e3a89fa8
+75f930ddf7918d6b2f92ae26af35f50cc9d2a8f9b5d5d80981b12ddf4c59565a
+aa62ec34589e5bcc3075cc6a163e45d46bb280b22158c5c04c90beb6f8a1c791
+5597b0f69be3204d876cfa54481cc86ed2fe799bc46555c6c6fffc73854104dc
+9c8a6f85331fce7c5d1f20af5d99e4e61b7ab981dd4eae26951a9447d5553140
+b5862e2f39023bc7d14901eacf467a9424a6be8055d82f4b02036cd766367871
+e0a01d09790ab2777db18248482fb32a25fadb62956b93affc59b1796f78d0b6
+6aaeee9778a3b253bd98035c79b5296e173fba9e56e8824ab6191ef9062b1fc8
+1b6b6185a05b167adccc6698b1801297d766492add5b66193d024d121633d329
+25bcf1a9ae109371aaaeb64f2805bf5c2d5a218c191e9eeb4ac30a48291c7251
+f690b51d5135f6a37f5418624c7d2f3ece356b12ec18f73d5177a24ffe371635
+fc88231b3a95d72ca2555f164c503f91b5c7ca174e43aee6534df6d569efd50d
+da3e950e11c6cff788e50ce5f1332ad76a2357c39d44ea38e88b24f2d37cf29e
+21b7468adfcacc8ab8fe1ae9da4c933b5f7f0a6451964a4924b6ba96c359c828
+d818166d5271e813f7a34a5b18927e66d61003392c96ab36b3e2175f31faa3d3
+7e77200bbbeba91c532c053f318f3f83080bf3d641d4c5df796c2882e34c01b9
+cf74bba01f03ef559012eeece809c019ab6d40d22a16fb9054143990db45b902
+a5574f672dda96d6c18c0fb048e970e6180e6148061e22085c7aa4fdc2102fd2
+d31e84456a56057b9d3189f331cc8354b195564cfdd23579574b7c7a80d2f3e3
+97f07cdab67407a46a4264e985563dae7ad933dac054d64a7ebce65bb2beb5fe
+d53360fd76a0fe706e7283550c4d5657aa9bf62ee713592d74e89998e9b0adb2
+327a9dd5f19184a500870a3c53367431b56cc4dd60bb629ae68a009fba0049eb
+16d11d5f299d5a99f3d45f6510450e53740da5556335eccd43e1408b826fc535
+10c7784c44cdbf41988ab67ffdc54ea61dd05208204c8bed9c66c678e6324428
+9682cc6ea0b2dad69cdb69dc8daacfd1a98c730dc3d9bc8d83e2fa2e72de08b0
+031ef3455ba92d03acfdb7ecf50ee883a8817abd96e58f72ae050feae0d224a5
+42aa0b4c022f8a90e73ab84216f520d6ded72680471b9ed2ce317536305d7360
+810a92f4957c9aba9328b116349fdfa728e9f042b2fd2d116bbcbbb99ec6966b
+a5e1f4fbbb4b1eae6d8bdd40de5fa44127e6d7c05abad3c012082c245265096d
+d4445b03ad8dc08d707ecbf0aef0890b0658dc9341fd386d417ad9f5e79c0464
+be4e3b22e4997e1806d192a8be70dfbcf69715b8194347a60e80934ed09fb08e
+c4df7c3b204b07ee3610c041dff7d4c76060e4be6a3a2f0b0217005ab38f80ff
+fe55a6252afa361b5cd8f3b642e6e193da913ccaeae5508c2470036aad80c0c6
+e977c374852b69a8de69aea44aaad49eb7fcd420bd55a5c5cbf073e859ba9d6a
+857da20a5cc2744843ea07efcaf91e992f0a44e1e520bbca097b6965c4e30c99
+03ac3ca1af1bbeeacffd7cc22e7b9763b0876cf8308ea38828a716da7f430898
+2beecd1cb81cd95ab8fe70242026f11061a70fb42445aa9246488d6d0029df17
+dea43305ac74df52e5699b6c243025786b21fd43993a8039e9e75fce2dbb7d6b
+7e4cd140e7edacc20dcb473dc45eab68d8ea296baf9bb969093862d391f84073
+5e17f87847ff2e9186080feb184ff7869a5a8bee6aafe3461454dcbcd00d2c24
+61ef831a52dbb0fa736694b4a3a4d85c6d80636b316fb12be67f0887cce6df04
+80c145ea8762ef8b2c43ae71f3c32686fd5813eb49a39bc6d4980472bd5cdbb6
+c282c9ffe2fb52656f607692e1ba726417703feccfd4aeaf9c66d543ce1506b1
+a9d6b95705f67086d4f36b06a283cec841a01f1028d95d4de419d7110f091014
+f6dc905e81add1d54f95b16cddcfd0793d1cf4a85e7a35458c81197a24fe82cb
+63edde30cb6b538a708fbd41f00268a772730b85bd8860054acd93fe6b8bbcb9
+cc474568d426e83f15838520a313e0ae1b60959de340398b21986f5c404c9361
+54975d52740bec0f7abfaf271a2ac1f7553b862d45d11ae585936fbb5462e2dd
+bf35e4afb7bffcbd3294be3eabec4b787133c3a5e0c95f74a71dad9be990d07c
+d157d7258830a3cc3de6459140afba942eef325ee072b3a53a9f281d483eac65
+e8da50ccddb3d43baff7d8c7d7a1847d6d579ce92df1b54de141ce7a73607362
+7d909e8cd9fdc373b840145f9373bc2f02979ee34688bf840f4f9245c2ab976c
+ee8bde685c47606201f6611e38a49ab72428def2c85e553313af719ab4d4f5ef
+e3f3430522abff76bf8bb8f56afe11008d3f989ffadccb411dd3b7e6352ea873
+3abe5dc71b3b4832ae85bdb23f6cbfb4b2631412e4fe0050a5f7f4216508a3db
+ea2d74318ed82f1a2fc791623c869593dcfd6bfb2fe57bdf06e9d1946f9bcea0
+13848fcdc603e3eca5384725118970cebcc9ebc6b74df13ad395fa6efdc22463
+5380eb1b3521aa929eba30958ae2da40852196b67ee44409d323383b0c7fa1f2
+b4fff373041d9f5eeab03d6743f0a291b481dd3ff9e8ebd77a073b8d5f5d93bc
+727e6566204893af892f74fc0bc3f3e83643a93747678eb998f9c91b3a0ff942
+3d3924f507f1c7eb18249b2ab73691f5fac868720ff52183091f65ac3be8cb0e
+80d257c52ea8647ef747fe304598e1ce0900a4de4031e4b6a58d7869b08a56aa
+710c91ccb8afab94ad10d670e767a44e0177795ddfd65c9cdc7332716deefe3f
+9e2ed8a54bb6faf63b7bf5f554b934821086c09fc28fa74ea2efd410e006be6b
+ebe0c464e078c14968453dc783a788a55d925d72205492c07d0dbaee4982fbed
+9b32dd19ae230da5870499feeac55b09b0970ad5926375fd79b95552816be003
+90515262b5ca891babcd81bf86847cbc5850d4a056bdc528e97aded1ea6d7b76
+bd8ec34e742a9fccf19a6310004499b1cc1a920b5f3b746bd4de2d9b9dea341d
+25a7a7b60546a8f9ef99190cf8ddedb21a0103414f9f28ae8673c966b12528dc
+fb70ce44db4822322605982d708a0b4bef7eb08962e3f433213d7545f351e994
+970828eb443c3bb36ab0c4cab7fadfd949e5f93273141da2b6dffb41b4678647
+93cd4e53c78a63c632d4fcbad772122e86dde337d5438e5e4342a0e18be8b014
+3ddd7290d16096f2149c6c71ad28325dddbf994e651b9d4be89430b31dec3fa7
+d2703196f7f10b5e8d98f20e14151160507e53ff1f3d4bddff3f45f9e64b1b9b
+9b26b32bf389a3725c243209245bd78c2f78d67033be00ebe25955a1ac718305
+b52a0260a07220a9f7410bad935538c6c7c56f902a70730c1cf90d45a5f66c6b
+a762406e512bf3cc3b52918c6e9e92893279cf86af1684d9b67d1ebbe84be9d8
+4b56548323ab381ae18c9e9570453abe77ca9d9ed1164563120b939fc3acc33d
+49f5e989a74ac760f0c99458295278efde92e99003c4780935d12eda68a82308
+ba444819ea9fd930c80263b57ec1b9164aa50ce386b8ef81a53a710416c6c868
+794bddb4fe463b3c59ff9fd085fc7ec37cf2abb7df09d41113f4542f72bffda6
+1fafef41c462eabcc7a3b4fbe46cac256c7af4309a617e73e7934450434e344b
+5cb6ddf2e63f4523f1526ed2f79522eae16b23dd9ff4924053a0fa7c4a0b29ff
+f4485c041b06147d2c94d276553f443c2980cb96ef5da49bfda4ee95bbf092ac
+e2dee947d0c711c1930500b79a5424e8494df6e1798b009a3816342f4d1d7cb0
+b7bf239f3d60361ac605020591740d13ce386bca1e69a2e8063c62f9959c9fb9
+010ae39f18882b1e3b3d0d9b0447db7f7f7a3810375372702686b224896bf5e4
+cd40e308b5a6988b614d8088c296171423cab2657cfb98f462afe21e990b0c74
+4c8738d1b13097ca887ccfd3eabe4f1e29df71d0e51046957409964f9f02a33d
+78b2a5bac5058bda0dd8a65fe6c53dff9310fd2b97afd24f39e586417dcc18a1
+5c0be1795e0f2c3d785f8cc1ab5505bb8fc0dfa1364f08876a42dae3383f853f
+84e7e54405bb8d00911c5b8ef4794494d9bf076d57a65f2392628b61ff967c77
+29114960e00fadc36961617c61c673bd2d2e4a9d54702233c8414026e67940bd
+ed16e2d3822f06068502c0966f2ff68f74d11a0b780b95f3f52bcc162a37b6ef
+48cf5ff8513cf4183176734f80b9835401b3db6bd53597645873fa96488eb183
+646b577037e5717952d23cc71ee1780b3df42d9c768804fc47cf147db059b9ee
+7a6399d4f4afcf2d296902f16d56d6df28ac4c9a96e357678ba901fe72ce3d2f
+b10fbf263146547d455df1bc33a1dfa753251c264db8798da35943a4940962f9
+e3b8a68d2b094177154ba30af7bd201cad919c09a34536e41d6c5772873c0634
+fef84dca5f1a5d5488997e279876af1dfb3f51790a6ae085d09ea4e1947fc10b
+987c2db0634c100484f4b45404119fee7a7ec81111029cff1b4cfa1a8637d4a5
+ad472b5ac0cb9f428cb1df8abfea3db8082a26cc815437ab387e7f87902398d2
+e0c6bf6c95c2381f15b61fb2c5bdb8684afbb7a6c1a01ca2286a8dff62e52a16
+3d7c748c1b2c63d2933012c5306cb7efb0b4cd733c56ba7700acc731d294f7a1
+1f2a1f8f461983f2972da8c3dbb3f9117f7a6f3583c8a5dcabb364ac0310457f
+93fbca26c31482d806c6a7a4f87f4cb92e3f30b4dd2dd5e3da5360430c008237
+7165549aa416a73c62a50b707074b2b7ded2b07454574f60861cd2f0342e4f78
+24789278e711f18ef858b819a0accb67384b47145fee30b32181d66ff47aa657
+83f0cccb693ac70657bc2bf204974bb3bcbffcd6540477e7a973718754acbe68
+823672daeaf24c93263a57598ac4bc999120e367aaa4b54c643e8c8987024b07
+9b0d40fb33d55cee534e3a38a1a316276704e9a6df08553fde29e4d4526225d1
+fbda6f8cb78098e83e8a360de3c4c77e2998094f920aaba9c7587735cd2f22cb
+e17c6b99a8286519242f18de4aabbe470bb8e0931ec7f5c19e1c304df56f2368
+70d154e925c4f2e5012d52a0283ea52acefa09d2a8ecc832358868bce8efba7c
+492e3575c1605150a3f7d6822960f1a9975151c7b6e928fc07f73493351895b3
+5ea783de8482144ddfaf6f881d0835472a603fcd52464da80de0c380fed5cc67
+e38eea70c066dadf026e03fe00be35c6310f64aca4b991ed4bc4eb125b4c0a79
+b87109b442c0b624c340271988ca36e92157ebe00ace90fa4515b6c649b9ef36
+f82cfb4954c124878dfece799bd987ee930148967069b9e6ff5663689e5d186c
+26dbdfa146c3dd3ab9c2104fa4e92423c88a0821443aa8008b11008525290207
+146118e39b4d7893fdc8c7225f4c97fa3f1cc264122afa3a87d630ef325d3778
+28ecba34700bae5038bc2a1c2e0476351d9e73cb623cf58eb35d4c518630ef2a
+f8b64bed95d72bb7403e652e2dda6faad38fe8fe4319ae190f0496a1c6806cca
+10efc6d15c7e19522b152476c36f9644a599da6786df08fe7981f9eaa0e8611f
+880ce7444e6e72e82aefccf6ae7aa0ae68f883d9f85b8126a6c52687c0ffe6d4
+fc712eae8bcaf81dbfddd0a58717c4cea5ebc76c94567833f5549daa0cf6254c
+627a1a0662537ad3b43c6f3a90d553bd6e7e841769777c502e4dd5fb8b15431a
+61ad9b26cd69b5d7d2b28776074e7b7beb25da2d5b8ce39e2d982b9fb9122e6f
+401cdba8684365458bd82680150de4ea9c386dc6666e613f4de18bcf4540ce5e
+663a6f3de86e8ff97339085dd62fc33bdaed076740de76c1830a14618ced99f8
+07519a5526f787b5f96e8086ff187ddc36ab3b385520dd23ceb0b0a779c97537
+496cdcbd8b82bc87bd2473acc490c6a86a6e6f85496a2dabbe2c92f4394c23bb
+714c0cdce7c02a397f2a66862ac165931eadc3dd374873357e315c8cd99f00b9
+20d3c62c04401d15413d4c640c2aa4caf5fa5db6eecf4ecf43478b2ed317e06f
+cdbab783a6921463b346d8bf72e98a4d7fbe011cbe565cb54a7157af3fa4d5c9
+d6a36c7600f5a884595278efddf5085f74c3d7d8e9beb3be3f7f6131e8233b08
+4b16dfda9cc778dc10adda42786156d707750d12c920cc297e8f58578d5084a8
+6d68a5180a
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F230_0 /BITXNG+CMMI10 1 1
+[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/arrowhookright/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/period/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%BeginResource: font ZWXELK+NimbusMonL-Bold
+%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file COPYING (GNU General Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (Nimbus Mono L Bold) readonly def
+/FamilyName (Nimbus Mono L) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /ZWXELK+NimbusMonL-Bold def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-43 -278 681 871} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa7637750ee32abe88
+6f7c1368d9ce6c8e0c490dfce9b86d093c646a926013616599be4a08eeab1ef9
+4d9066aa43407ce8754ca1bb33035af23db30794e2d3368c4fa14ccccbdeaf01
+2caf3cd75f4a9430011661c1bf054a530ddc57f032ecffb56ef20be97a76074d
+a40f2ab5f5ca4b83c12482c76211aebb54d996a3771a33008145b436f16e5100
+3c766da4e9fc3ac88ac60879f47b0d72099a606f615cd397a05aed4a92a6e86b
+6a9685a3fce4cb303371639026c74f19dd67a353e70a7f40b4d317f830c0342a
+9f2fec7a3304e4c4009e2bc3f0dcee97c8381bc7682c6d3f80d93a69ce5d74bb
+b3ae9b016bca6cf044056c8ab210f7f1ab28c6b4c457d0184278951c4e2bd743
+41f9c9c8fafb9f11da77c2ce9f820e65ba3b7184d08598f9ecc956d38ffa3d71
+0ef485905434474fbb7cf4b43b193a537efe076c26a9251d45d06ff575a5b9a6
+20ec66effcfa67a9e089a1a78ab7331d3841898dd7476d70a2a97c8f6c283fae
+4010a9eb770604ba65878fa2105d063a44c56e21bd4847b542af04cec1cfc7d5
+ec2b1ee2103bd35e162f2dc6d1f224925a0d7eb5b883a6eff782245605bb8fcc
+1e0453694af4725205d9225ffa329bbdd4392fcccb8dac6a0e8be2059177757e
+2fc359426f4e1ed2e19ca9b5311c2e77ef9f97618b0c337a906ff39926d2b0b7
+883abba6508102d9f4fb0387d88d82973b53718c98d58c9b83d2a62386b74c16
+9cb5c33dda965420dd78aa19ff23f88bd2355f93ebaca543d8b18ea36b4ee8fc
+b5924e01f73a9501819be812383107d361fe8c805163a6957de6aa4af7fa6963
+e77ac8e5d39349be33448d2f6258da61aaf47917c66c7c5ae99a990b727c6c70
+20f14175225efea39202b489cb6623c51f41fe9a5f6d3be27796e51be6945774
+6cdc1ec49ed6114400f4724ecff05fe0bed476dd3d5650ce735475ff6f232456
+5918f9ed222319d2a544aa4a74be19f45cd466fcf191e7ea641ea38f9d3133f8
+872bafe19691dcdf0bce48ed6fd0e0ee9a81faa6dff8b239874ffe2072a73107
+0ffb5095f90a653a1690655a9b4287545138b8049e04eeb928256a05a73edf71
+4e0c8692f37cf1d7e3defd43b2b428f853f35bd79f3811fa7bf788d1c1cf4a61
+65b8eebc60521fac324403d3bca11817c9d15012e0be84e194435fd27361e68d
+79b52b6c9a96c1a40596f048a31c49088b883ee21d9bd24b48e4d1e03e7378c0
+5b62dc00623f9c5dbe5087eb9122de23199ac72b491ff847674d6141ca7facd9
+6bdbfc373e1e1f87881fd7bc3a7d64292c55a687f3837424612103bd6be8fe2c
+0b3f529ff61d27d3fe8cbb25636f48e6a41f205d04a802e50fd974cfa67f94ec
+19c3ec32aa714e650af284926ec5f2e29bb880efc696d77d210536d7d1148ac9
+ea9263bc02d2ba97369f2ab531944e132484c3f2c2638b01fc97731f1b39a492
+4822b5265773a5e86a17a41e7346b7c4c48029f58450663e0d09836d75ca7f8a
+d9a78eeea4f41976945501f32bb383455467d217777e642f32777bbd74cff9c7
+97041d0a982ab1c0d4999077201cc9ab52a92cf959cafd2e6790ab45f6927c7e
+96f24481280a0242e823e22a4e32669bc829ef1b7ec3fa34e9cdd920b0f7e2c3
+8f138ee0922fbdd3d7bec614805aa562591c3969760019c54ede008db2c2f8af
+bc66034e5810bc32c823b819eb39a15c0f25be8f2dfe5a01b90848a5adcc95de
+49241dc602f4b71f8901fbb38725ee7ff097f769c017f16598b835a0b93cc6aa
+c437310f1a7d586cc05048684af27ef3c09f72ac62adb2f4fe7f99d1340d27c4
+479c144afdc37e4131d8fc6479afbb1004ba15e3e5d0ee470b9811a0f51294c6
+dee3fa7431267cb6ec7a96c590ebc1cc7333a103eddc21219f392ddbea601d6d
+dce7a8645953235a0ab6d46578e8e438ffc41be6b509b844b73e586131f694bf
+f0ed77a7847f7c747410cbba2473f5869eda83ec8118d800f3b2a7b5ea03e16b
+204962bc68ac47bcc5d29f88aee951c2452d22aa967d32c3f37a91ba88baad3d
+bc74cf2c7fbf0c76faa4eb347390dd08303b439cb1f1a3363d265fec5734c81c
+bf1af913f88820cc29f4a3b54c712e006e1d6bd993668999c3ad54676c71fda5
+e29df4c794a4fa812b13ad32b28bc57e05c7908b8334bd4fe842d57b04423fd0
+db3a43eb047f86eb925dfe31a012031f36d5f6099187724b0e2203ca1da764db
+623d1e0a59b9fe47d7d4d67c241d297bc5a6641770f5e9f75c572675ae6e69e7
+ae37627c1e4d3ba60b95605da55c67c5f6ef7ae2049ea3d1246a0c03309ebd39
+951a398883fc919a711e8e891d914459d4296bc3a584610663af1c2ff053c137
+9f447f918ca55c5dd4a52a060d1725c26e6940371eb4fd9d254749d04ebc0f11
+06f62a30d3f714a33e4f65f4dd0b20daaa10aa02b9a6e6eeec07fd93d19f9c0a
+6cd6bde1d7ccd1a973bf297fe6a8821e03a381c468b9adfde87a4b7f484a55ff
+a5b83052ac23f4b3644234d935485f912cba1c84227a609b32509552ad1d7ce4
+6f564f7f9da1e131d9921befbf53cad1adfee699702cb6bc949688b30f0b4f3f
+d3afc9caa04a796e5afe2aa8f8e14a7959731a74dc4b215d7ec095ebe86a3863
+ef6d7975c3d2edc2e7c2f5d2c8cfc5f6fda37368a54dc07a7026ebe9e2d290b1
+eedfe0322838aad2f5be5c299a658f47d0487584b1f9e7def39aaddd212138e0
+8a8d2479be76477e5193944353796d86aa5e2ebce0a453bae8cd9bc976a14910
+93b30d44f25a29808227330b98bb42bad91b4964f6832f2946b0ff1701853c49
+dc522636d5b7fb6ef764097a17da725c3af793585d24c91627f49e83271b7498
+cbd67abde015c94f5f24579852564ef01dc4ad98f15d522bd15fb9043b241350
+2b1f128d874c1d119798ebb0e11be341f78db622204aef7778aa81055bf4b7e8
+c455a6398d7d5dac94a5007b4f76265bc8875392b5354bd38ddc111dbb8b5b92
+15beaf72f041f17d55b49b81f3d1279bb7a5ccb1a9daaf125e79d5ad7dab0595
+9e694040bce7da09f795dd3cd508b405c6bd07cc7ee9bfe298156ff2620bc3cb
+cc7b27d9618e04a2ee6e3744d7a344f6554e0baa2290b2082f996026adc420c6
+76ad5978868e062323522240a388179de4d224f19182ba7a35c3aa952844df49
+f6c532d429e5c86f89d1e697fce1b50861cca95504dd63423bf603b14459b7c6
+91bf64bed93e5ca158ed057c9bf9160f61584608ee366e3be548bf2dc46c219e
+9e0acdbaaca1a5b02770bbf21dede6a80f3af65ae92a9089683dce3ec5e6ec68
+9de2dc208f7304afddf88f35e1f428dbe74e7042766346ec02e1eda87b8c246f
+89a0eb22d1c6fdb17142af0c8c0b565ab6db819d2ae2bb3bad7c7778c53b2686
+72191116278357d8659bcc81753c2906eac08fc3fb966aa5ded522da2a5edf40
+9a3eeb5735617e77a7a77009cd38c2b62bcb89ab73052cce4526f4f02bbec777
+e6ca65c90ff5931dadf03da48afb8561fc2e71008fb1d1d4343512ada1b78e71
+0a10079f211faa5227eb0b30588e9e03fad6d901dca2b6bac956eb8cd2ccfad8
+80e8cb37e31fa6a8206f6a9a2a9e1cfff1205345019a0feaecde57fb0fa418c6
+f4cb83025e7180e50394f52064d8ea0383b80482e48ac91c24d10c7ddabe98b2
+13eaacad917275e916fc0803796efc1f9597f8952547d27dee1fad9ac1fa6d10
+27127514e0f2dcdf9ca30393cefc7cda027c85e53d10ce53796529fb13b079c2
+0c7402109235a0c25965b3b7d741e90e500ec2476c5dd11dfae57d6f57b218c4
+b9cce956161aff0a55a52eb58a59d7a62d90b110f9a0dd26b8c902122271a38b
+7923957a15d11cf1427ce56323c7e4428d2ee1ec6b1c465be35668b0a7ac8eb8
+af1f080a993c3c74871e4b7bdb2602d07587aed96ddb05374c2aadaa24486f9a
+831ba1179b2ea3602d071411f1756b58168f9ffb572d787b2ffe01bc07c04d48
+f893271ee576454a86a0c216b224e0de81d66ace456d352a5b2537eb96be26e0
+342e4165d30208448c9314ec962ac31ee36f887d0cf61a575444b31180850172
+10ce125407e77e5c63c947fa320845efd26c85ae8813a99e518d679137ae1dfa
+9e9f19c49b461da073dc1be4a9d32f6ad62d05afdcdce4e33091132d471edcae
+38607b7f5a17e7340b4e1a110bf7ed2bbbb9ad9b8ab909430f29f87b1db0a04f
+a4a80796d144bc1875a846990df6fb3f14a1457be695a3cf1a5c16878d44be38
+107e327ec4096cd66caa90efb30bf9837ad04d995c4f9165b1ef14d394b71ff1
+281b0d67d4d3cd375c79603efa6e0830183be17f77e7d5423dbe0776fa1387d7
+df0dccfbda67f6ada4d87dc8c6325f0460690be677aa6db7e0250b5196b420d0
+cc8d66fec329d81a7584a5d001c2c3e42350eb22313f036b5ae64868fc6aeed9
+af95ec8f2aeefe4a95e69cc77f321fb7e7aeaa45b2f56d92d0956bf321ad859b
+d2e2bbe984b17fe9303f13428a68d6a1959288ffb63d800c11ffb6226920324f
+6517eb5373f2b8f058be35adbc7ff15a2b0a81683aea4ff11071451a49efd1cc
+f15664182fc26672cf89416da86a3b8cfb45510e1ebbe11060963434bcb7581c
+4816bbd63c6d79dbdca7dcf26a4217bff8060ad7955402af67fe4743997a028c
+c33d49847b57712e0e23a1c5b72da33198426130a132be52890df4423fe21d4d
+2625e646ce72588478bf941f1f74e875812f7d7ac9c54d0ddcd12178abf50bcf
+f5131713cf9c42d0faf6cde696534896406a8a5234a8ac19bfd531ca934c35e1
+576099082701fce199811dd294cc46ca147d5a187c3737d3d128ee8d437a2afb
+114183da45b49ddc768c31e35c395c3bf67a79f8b1ac292f38ab2ef721453256
+523e9dc08e80bedabece9bc9af135276c819140d7a0e966156dea6e2f7aae463
+c634c4de83feff86407b556651a455077d64b52c5ff4b80250d312dbdf83dc0e
+b9ebd541aa9fbfddef1f775be0c411788b054aad44c85d8723ca7d2a6b00cca2
+4ac55e90ec48e4acc15be17b9544bb71ad967c4b8437470e4d020fc6e8677251
+92e2307b51148b2cf46fc1b7f2b149ebc1ebb02c33477b4c56e56a9f06566377
+d2de31c00d90ff5ddb509f8ed457e915c6fee8103da73b5d782bffad7f7c029e
+12e1930e95fd7b7bb37c48b7cc48d99dc9aa79388c90bf6c7c0b83c7f7fc0935
+8fd5f673dcc906c7e0fa7711abe8258828289ef48a40723e39b7ec79f2d3822c
+6f45a6ae0745413ce860467d7cc0aef52c680b8cf1767915d3550d9813b5bde7
+1c21b0f7b7119bb0e1eae6a7874ff0588adf14626d101b4e117c63f2e7a60627
+dc40cb9ab16032434469f390804b9039e21f1afc9380f26571e3b2c64a86c851
+74fc32a61b787769985079d60cf71131977accec6954da9032b1333396fd5450
+00e364e7e6a79bdbc9f1e842e222ca480f1f22089a38079692312519392296ef
+08f00707ec53e1cf114795631e3b14687b9e351f1b7bd44d6f7d41ac91e8404d
+8ae952c3c78e4a6bc9ad64ac1baeb952053c409cfad43a877a7c420006ce3e9e
+0278a33cebd6d9d9737432c982165ed82c45d26f55c133162a41be27005cd6fd
+e60cc41bc098314a5a1619dedc6bd9acc637f398219f9a3c543f8421ad4c4e58
+9265d23edb6cb45f2273a908ca416ad8c32c2992d9efa95d86e631ac8fad778f
+ef9936c2dff4053cfb253c24c65bd20fd534d6509c0c141a358d4ad95bd9b5af
+8abb5cacb94788cbf6c43bb54d52751d05a1a2e6848c33ab9b769ca9bccd8e3b
+ee742c0d93ecba4c5c31c1d32a567d4213522f2a5687b014351cc01a42c14208
+69ef5852aa703ba076abcd4c6653fe6c4100bfbe047e34d4d6e9c62a6e5532e3
+f9ac9e7cac24e076546134c226f38ad0f51f8f2dd8501a001b5c0da65d9286eb
+3560b947ee38fa27a502e87f8c99ffcd54b1d128096360be6c5b6f3e536c57e9
+1acffa0392e87026f5acadd1d81295d54155ac6154e247d95bad5d9ace11215a
+e0ca996979f6dd8e94e7567ea17b8827ea4d5d5c9a8484ca568332bac134f993
+91505c7fbd8ba336f9c37d6dedd17261483c232995658b078fe8f1a312cf74ca
+de87453964bc73a936a0ea09f74e9b0822b8336cc888f0f1f399061c342c8b18
+1d93b17a0afe2a2a69acf2f91ecbc8441db2aa35091968a0408b2abbfa35e4cc
+77208f81b76a199312d8b3c3426e49e08f8359e6ceb694550f4b8fb113f2b977
+937eb20585083e72e0abd60e60ca4ac0f216b65b7a9bcbe1005c5b8bbddb702d
+ca9da36f1fd416315266905f3ca5ed221be1ec496c5b16070bbe38ea094ae5ef
+be93eb0eacb95603d7c36ba04f606a11ad22580b1ee5498ffae48f218108b774
+d71bde64b7de26f696d95abd3c13853aa368cd2582f2b03be9b7ac59e9bf0207
+df0ad55054c594811c5e89277d3804d058e1fa5419b15d11605066742d284108
+7411f111e7375c6710060d26e0b60f6aa8387f348cf2bcc5762c16ef320e24c1
+755f88376f5f2ec00b4121861518c97145a7105bd0d571454c177da407fbfbc3
+4a93ee4852b09cb436f682f9f84da4d61ecf72f8f801a548a9304f19163d6bb8
+12f5de6e1f2b4ccc494015627416d54877ee71221b95fe357bf67271242a8f17
+a4eb4be3b7a649c234524b2554a8fd24210b7acefdecb2198265167b8bb28593
+07ed7a654e9a6e2119e6dd14fb33faa084c71e930b8035952b87fe8b4a297dc0
+e4a89d17214cf1063caac03d4bdd5b4fd62bfa6897811c3494ec3018c558282c
+2efa94538edde156727152eea21c6e3f88f68a0176aaee333b79e6b37344bfe2
+77292544c72d4023a3728c2e39d2841c2450465852d02503fe0a871700b470c1
+a73d8c1db644db39e9c1ce3ccbf2149625e915599ecc3091e15e0a74768ed5b1
+8271fc242e10bd83e73b4636cf874ca6e6d756e707e671d99fc43d61ce6bf80c
+3a3be178d9f5d3cb32ca669cf99b70b10dad7d270d0cd85a9865d60df07fdd94
+cd
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F440_0 /ZWXELK+NimbusMonL-Bold 1 1
+[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+  /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
+  /zero/one/two/three/four/five/six/seven
+  /eight/nine/colon/semicolon/less/equal/greater/question
+  /at/A/B/C/D/E/F/G
+  /H/I/J/K/L/M/N/O
+  /P/Q/R/S/T/U/V/W
+  /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
+  /quoteleft/a/b/c/d/e/f/g
+  /h/i/j/k/l/m/n/o
+  /p/q/r/s/t/u/v/w
+  /x/y/z/braceleft/bar/braceright/asciitilde/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section
+  /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl
+  /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet
+  /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown
+  /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent
+  /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
+  /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef
+  /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef
+  /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef
+  /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%BeginResource: font FRBTTO+CMSY10
+%!PS-AdobeFont-1.0: CMSY10 003.002
+%%Title: CMSY10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSY10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup
+/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /FRBTTO+CMSY10 def
+/FontBBox {-29 -960 1116 775 }readonly def
+/UniqueID 5096651 def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSY10.) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 32 /arrowleft put
+readonly def
+currentdict end
+currentfile eexec
+d9d66f633b846ab284bcf8b0411b772de5cd06dfe1be899059c588357426d7a0
+7b684c079a47d271426064ad18cb9750d8a986d1d67c1b2aeef8ce785cc19c81
+de96489f740045c5e342f02da1c9f9f3c167651e646f1a67cf379789e311ef91
+511d0f605b045b279357d6fc8537c233e7aee6a4fdbe73e75a39eb206d20a6f6
+1021961b748d419ebeeb028b592124e174ca595c108e12725b9875544955cffd
+028b698ef742bc8c19f979e35b8e99caddddc89cc6c59733f2a24bc3af36ad86
+1319147a4a219ecb92c71915919c4ab77300264235f643a995902219a56d8626
+de036037defbd3a2c6bb91c73375b5674e43810b4f7eccb675b36f35d63d9ec2
+def21c5fe49b54f92f0d18b89289682cb097244225af6400f6ca98efaf336c9f
+c304161e2006b3bedbff4dd36fa7a8f7594c02dab68c077e83335ee6d018f860
+8d9a9131325d953d6c38c7e0a34236506c1e70cb6657dafc3c9520131a251350
+49034e216ae175cb232c2ef5a3c569ab581f936ef4e8b8c8bccac287f06f24ee
+1d15d2819058bd9aebc4ea91b74935f6d411562a453674b14bd76fbf5f298f9e
+8fd37f529f9e0450bbbe473b5a4039d8d0228f56330fa15411d7544ce700984e
+09593a854180d3100e136beea91daedaac36cca03d82b83d953880307edbd0f0
+014451ec8f10b1e30b51c2f9055e906272f02f32085e4b9fbe5a6860a74e274a
+74349069b6eb90fce84259d281f037d6de9f42fe557f5f13a87e5c9f668dfb8e
+f5e7f4b5ef9f5841b3885a6c8994bfd27fe35fa3cc1dbd5ac68e1c98c0d0ecc3
+bd2795e77848b5faf604f01362ca473ac72284a56cabb68f35ba43ddc6158955
+5bc6614cbcf4b80872c2cc66b6f4f90c315bf73b34e481705ee8b54eef70fbaa
+71424420120f27d8853933e3ad4d8026397b040c88567f440df538120d61d0b5
+8232d66e2e006866b60ae46c3f4bda16a2eb5b248bb88a11b3fa4770f0f6c31c
+dd13bab11c2f4ac77a63f703a5824638fb765033dce02f584f36c879416fbfb1
+ee7eebe75d57711b44824db906885934dfa7f386b811a2598fd5cca2585045f0
+4cfd32e35f32b90badb9a96f48957b0a311778d21914c9ea27bfbc75197cbb6f
+0df8f6fa574e1f1d529a4594f2a6ed99b98fd302f4fb2694e3986c1f46ff165c
+7f4c1102526831ae1e469e62f1a6adcf7d2b876c0d43f85d20a6a5dbc2280884
+1c7666d56f832b66cf189c4debed1fb37df76c3f1c632ade8822eead5e7f52ac
+e65daa6d86e410d469a7844baa4fc9d28e21490b8cb2d3b2fbe718f55211fe5f
+74d3573b99bfccf198c775402823aa742acca713d30b55a09c7b7ce3f5f5517d
+6133e546a86c0395bef3387804ac1b07a4d27492485741a8c2ade23bb321da56
+ded0fe0d43baca1483566fb397db76ba9eec923fc2b3941f3b949cb13dcbdc3e
+2c84c6e3a7abbe5c22abf9b6959a17d152ed0576524395d8a5049c5144680a19
+0ed3405f2c9ec716cb9c0fbd6b12168d62666ce74149f8505e02aab39977d99a
+13a66449c9487a6b2863f7338378fb901e8ac981ec53ca555049b3667b4bcea9
+cd731a850ceecd59afbca1ed2fec76c18fcf5ba1b9fbd81eb84c254fa140eb99
+48838693123cde50278e4aa3cbdb7f7691d52cc624b4226855a74d3ff4b3eb3f
+e193702ad68437760ed7173ddb5031737de3470f9340a44e92355ef033958954
+e5b33866ba86201a7951a68783b94f2984b40dac3037d3e6d2250e850984470c
+a4fa92527aa313f3f366e97b87d05e114468dcf43ce4a27b9999e24295cbead6
+7dfac0c6d99e7332662743f379dee2b05fc7aed3ae405d631e3893b16e1a3771
+278319e6014b88fc346b4f3d17edfeab40d6552092a8dc6c2cdd506f458bde17
+e66b02d4992a0e370871035bda2106ecf7fab7ced8e8d35c6fbb825ed724b726
+8ce5f3f25d11386c958fe4b773b9268484c12f90e2e25e299a2154e5c480610d
+f302e1aceed9d0b3e11681bd5322a13b8fe895fc755e0053890a4135f2993642
+3d11dba2766edb9954e308ad998fb1cfbc2285d1f7a9135d2f06cd2d7f7d7b88
+d1c6c9409fd3962b8b1c9a690e01fda96361ce706ec9dbe3b4d3e0d57baa0d4e
+a98200ef682573f9aae9f09e2000b9d7e14ea41682e4e5ac56dae4cec783bf61
+a99a5df4e83fd52c0c02edf26274a16c939868103691ff4f8876c25fa70652e9
+ccb3399053205e0350ed215170f709c1901bf7b97236f7bcc13ba5b35a96e8bf
+c6e476d81e396b0c79118e16b5489279703b1a44c9d7e320936a19ed319cd03a
+f052845dacdd9b627a47433f2225827c65dda57721e8b196cd368dcba55250e8
+24e6b7b93affbdd429c9bd8e4523d8e8a56427acc3e5bf1b2db9b60cc832002f
+1bc52025f18e7d87d9bf1b8cd8dc170c6dcb85af5afc1ac4a24c0e38cfc0f4d9
+8d63cbf3b5cf6f14d902ac8a9b4c48a5d4ba4bdcf4f3b69e2998f507719e2bd7
+db63597995c5cdbba59f9b010a135f4dcc8cfd602d40b30730125606fd1b27f4
+9ccfb1d0f6a97453a8c9a40f643fddb1581504132883598385c4f76b4e57b559
+c0ed46d83ce8427db396e96bb3dbc307df52ed28dad5cf5e32d82510300241fc
+fdec6d84bb008cce0fe96c7c6d836fd3c8eca9341951e5ba15ad84a1799d137c
+938fda761f12ef2b7e90a49f1ec49445b5638ed4b2d903924dc6ebd72fadf61d
+16eb74d88503fc48659a86d95043b4e9764eeee72247367d0ca6ec0dee079f9e
+5db531a1411790c08c942b7ce7b028e4b956d5f1df8a47a8ac6c37824b661b57
+147ade729f5fed3dfb47227b27aa34cb86584d20a628bf18c395b186ef197a2f
+dcb3b6d97ad24cc35a847cb98944011ec6342d0ff9e13045ed70b68a1a5a53fa
+b8f341c7e187ac0888b3c8e119d8b841e494b9c1bd746cbeb1ce48fda15b0054
+817873ce4da21d8550892ab4a06565a98fa666a6be00776bda87181ef8483129
+3708a88f69228dd0c3ef8224301dd8fe81b4abc3563f69bf1212897af3e738c6
+c57cbfa53e64ff6a79549a8d81c3b5566dc7e697e11971a7cc6743ca1991f391
+efd8c0ba9a01397a05bbe5548843de7f2fc4747eba91c5988605a76f1d2aed97
+398cc672cfd5498ba16f6aaf55ed4bf613786aa1ba2e092c06cdf82b6231b0d6
+b2f10cc3499b6c444cef515a033381f7b6502d6e6ff4bcf2bd273cd059bddf06
+652dec312ff80e8c9f37818c2a453523976487f1a46f8e967b5d43aa3e24fe03
+46097a6721d0882aa36fba00d3056a8ad42d4efb81edcda5cdad6ff2388fc54b
+775167dd8d709c2a315e130e822ed68a889dcec2ebb10c4c56897ef4c8fffcf8
+6d0d146c61ce0d5d2514ec2e22a66090bba95fae51b7691c7f1ae470c0f6c58e
+1eca070773920235792e58838f031cd2cdae29f1e61ca254a1ed00a6f664314b
+9fa26bababcc8a6add7faba2081b6e307a17aa47ae1de11f7189b78feb61a957
+51e9257a84d3184ab2b9d858a41aa2c23374497930c4bea32e04d32389c55b93
+23a41d83442345d482927070af462aaba8f5b1de9876ef724fd364ce6e376e0b
+a411d2036639832aaf1bec583af5bee73ec7bc9a3a2acdde4c1d6602cd8d15c3
+39922661926a3b2b1d7b15bb30870929d0da419267c3b04b2aea81584bc202db
+56b6277ad95af3cc411dda29096eeef6cf0bb3d554bc9411c39990db4ccedf0e
+4aebeff2e95e4469a8fd5ba6f03a733c9ddcb832c221f114de5587fa7c9b0096
+2306f9355684eb66d1558aea7150817df7fcd27c3dff8c9abbbe47c2354f7c50
+c306e8739a39f1a71e8e7de4e5932a0a1d2b677041802cb02cc13d7c6aab3235
+1143c982379bf5d50c92ef96afb597d81c107f2ee92f46a81b1bc9b9cb30a296
+74529ce1ba8a022e221c77650c681a19bf0e5080a065e4d66d70f2ee4a876fb4
+40b0b1e29681ff5ff0ea41d27f33a7e25115e9bf421e56f47e24f03945a2ba16
+906a3d0a8b5d3f20abe89d7b7705af5f0f3533f7a546ee67d3bfb3349d4299e8
+e49bec41a8ab12e1bd71b2cff0cb0f1fdfc0ded134b5078a1e87a490d0ee31ae
+506618d409acf32cd653c59f36f4e3bc051ca072a4a75b91ddc17660e00cbcb5
+b1fb8d17f4bf7f78f74724ff9f1b84a5eacf2e7da1b9ce0bcc94b7a817dccfbe
+46cd999463b0b19a91823d18adc1662117011f2acbbdaa2e062fe77706c48952
+38ba2840d9d98b9a7a0d63b8bd40c34e26496d979edda33e5821c86d9565f1ca
+40ce6c160e57ff22d2564348e8f89d38d46b17d591053c79f89c4e750d619407
+eaa5a8bdc52ea6c6ef02744eb4a5c4886c32b210b86b41495d8729174df80f7f
+b653a2e6ff5996d96eb51a828d0606998fd526a82a5e8e1dc79127fc6340000f
+e218fc26b7c97c3cdfcec5a497f7be1ed11aedb012ffead9aa2b94630ead80b6
+3ca17e79276dec733c9955e9813970215fbe02a751bcdaf5e427a64e9b47b4ef
+e105983e0e02c5a8cdc06a5db4126ef333583e4aa17a3fd944ed803d4ef88501
+bd626e0d1d8d7b71176259283e22d9382ae88bbec9cd6ba87933f86fe28af800
+dc2080f38948e3c20d8f4477e2b9f85da4800cbd1b9015eb64a07b459215caa5
+c38b7781d919e199112e241556e1e7681a749cf67a6b246b6b245d34ebaf1504
+f06366b8a1faaf10bb4304579640f2cbf3fb339df697701f6c51afa09351e699
+890462e1a8152f70f301b5f3a01c549371be46d138045ffed5411192bf6eeb13
+51d407ffa26d4b8e7b267a3b3cd5bf9e06816df2e35b6937cccf16b4eb9ca3f1
+272a16fd71588054016ef2743c1bd58c6bf22f083fa9326d19299ecbcf66f4b9
+afed95e1e2a2f8792328e3af6025da7baa1b10a721bc511e9c2f302673df78b9
+f466e742ab2bacd5728bef45dfef5b74d1da674f4b1c8d51a324fa24b23d141a
+e082d79c3fea6440336329105d33aa1a960eead51cd500252a4d7d481cc31a99
+e9a59e3b4364a3e19805c97270bd19b031146afd9f46111a10bf886385731d74
+95ed4727f7e2435c96ba702904ad29f606fe9c5f1f9a11a229b1d528b9fa9ba5
+b50b4d4dba0ab5b3840d71c67626b6afcaf743dfe5334e00b64c5a73b3775450
+757b911673bcbacfb0f8509e8b2b2d9dada9a1558b97b146f555f85022bb4bce
+86862babbcd259be6537133f30ab2895f60869641b1b9a4cb43b676b0739c112
+2859492d908c6c60aef5ee3b60d515e7e641d008483ab4aea0e159481d623193
+b5e2bb48c77bb87783c7525e59d19a190e2c0aa02446a8d4964844d9f2561a3f
+70f20779d197b91450de25463dbb82c2c7c6428706f6d9f6a1474bd85068b37e
+4eb45bb80449ca5fea88804308f054167aded26609e7093cd396948cfc810160
+347c6d834531d64a27bcfde1dd24607d5209060f8207da7f5ca88011e24e326b
+66a261f36f754a37339d7f10eab4f276e1eabff47f4bdb577b9c4dd3de333fd7
+8f8da94df25df93a57193b1411761f908510980558e23b0584421f920989a758
+138f2e50e1493b3f9f2154a488202e0bb77316ec03f6555de4ae83923dd1588a
+fe0bfd9235b4c08a8072804d743e793daf862ae381624303be7e5e0dbd74c51b
+4172b1a16c27b6f8c5a695fcf3015cf4f7d89fc91c4c8102eb83a15093263774
+740f02f675477a3b4b6734daf3d18d1e3bb7752922e9b33bfadc539596c276bd
+cbf0fcf5437eb33fbf4a83bb2f92462236552eb0303ee70602f42bdc4b51d384
+301922cad3abd13deb81f173e9deed83786f4a5de1d7aa21cc77fc364fdd2e7d
+8b9e8074ebcb7f3511f0a256e2cba9b32bac11a5b7acadc0fc1d378ab3557382
+9aaed6a9c679e7e5cac49307549f8c4335fc477267e25506c41035cc248f8797
+8c267cb08fb5bf8a087e95dd47aae4d8389e97ea0da1af064d76e5df286a1774
+a783e3df200df1cfa26ef1ed9b5dce5dc55102cc5718854fd8911a886d0e2e8c
+a38eadf009525bbe17d0986f4e3c6a23e608fe2782e7c4bc31ad13d80ec03b7d
+1f0ff0855c4d7f9d63d6283ad8658fb13ff68586e3135a99341e4b88678704a9
+c5e8a4c2a9e70f13408c9c54ac9420d52761f62225c64b7c60514b7de0a2c8e3
+f27544869c93890e7df32680fdc438392efdd6a7bbe7621a7642632b7f45bf2b
+3f0cc935a688266c39f458b9503ed06e67f4094946e73a3fc27494d890065355
+4fce63c60e6a32436d5ba5e0ab4f373e816b57fa6ba5a2a9bd02cb58af2783b2
+ee1da6169c0f15c23c55a7b2d74edb384c6f646adb73d70e3310873e0c99231b
+1af196d1742758956415392b4537b1f04ee4060899648c387bc55df28c6db99d
+2f87190bc6f1109ebbd78e15a5641a76198b590286065996f6fe1f776f7013f4
+e999219945c4509d37463f6f18cfc46a500f39e2f2ad229bc16793428a9d8cce
+c5d950ee8ef43b425e518f4fa99333f9bf2a420b33b383756ebb0324b7df49c6
+0eeaff9f5f4f0665fe60d40a1f9824c0df60827d2d3915512fc4a5e54db36580
+9e3fd8c1c7c9ead2b0b5011e10ec68e4035d8aa662f0bf09fde9bbeaab5fea32
+3cd1f8cd96c62b0410ec741cc2aab05bcf9cb188194aa1fea94f40a4254d9149
+82dee90d74a6b5d876068386d55c1ab92f62e3d1c3f24d564615ca3035ffce2b
+6b49e53257393e66967da9b72010d0f8c4b6f4337487b6abffbaa16aaa86a6c3
+7c22a7b4e6f4ee90d60a9fc7c95b15d34c8a689f028e591215b329d86f35376b
+15dffe9323257f0748925c002cac78ce7cf473af7378eda5489e3c464b11e3e4
+87d805cded68a70bb95a36d01885006d2cded168532d575a128f0e03ce4a1827
+b7b0f7ca3da8e4dc774ee59db3616caa3a8924f84f35df50e48477c35fd08945
+308a214bde3389d0cb225ee5d1f96771fe3930b16645c6283b70223dfeca6663
+d72e9b6b4773edd543cbeb81e38a094ff9f1eb6012ca08a77092987bb8dfa849
+361743964bfd43032f77b09d6d1407abdcca53d424ae51fb1ed1434cf4a2f391
+b81678987709e0bea61d8546b8de9b05260d7e2284e445933ecd867cb63b6004
+0fc50c76fb25f81fdaaf545bed63d6065def8265028a224797551a6a8ddfab06
+84798af0747678d53a7564519116755a795f14b254642293aaa3622be7c14f86
+5dd86caf78e0273677f2e33658b24310bf444b1e4f0719c187669b286740775d
+66a65699cbc25bea7f7eeb8c3146f9e91e5e0f413376ac09c7e24f9b76d2af1c
+b63201760c0a7afae554b8defacb30d9dd146223f69b015b9b7a79cf92d52404
+6531acdb6bd53597645241ec6028c585407b903d0579573ebff088e43efa91af
+e77940e6c5ffb955e1fa083b949cb13dc3483bc7637b96f03c79426237a96c21
+26788fbaf00540a987d4ef95082d64a104dbbd75e4ea5c00c2cd02e622987ff7
+2775eeca7c15213edb33fb30b48d17c3bca35ed5ae941829d5992d7bb74f8fb9
+b04fd6fa321052a8c2b40f78c8e8eb081f8851c508f4774267d091e2bcfd53fd
+bb9e9b22d7aa6c9b62f0f67a3bb9b1984979d55c45d705c1cbea897072a86b4d
+0cb7400640c26526c0a03395986cc3ca897453f7e6c4251d81ed29e82f7052c7
+f8ded9c0aa221832b5750a9845659235f82bc4d9b073a75af2271a0814b1b9a7
+f598e0e7628851b21af4f0b0536c129f6ac5f62090191a7a0776190010de80e2
+7e252e134b7a5c4e14a18a84e7fce3f71645ea072ce3655632d2113d4d176f13
+29142d814a63c756e0a43ad21a55d932d1b83ec93188d7c893220fbf5157baa0
+834ffdf5d191342a4f7afbba2e63b8f36a6394ab5926fcdfdcd8d8cf138fecea
+3deb371294591899b4f6f8c8f0ea2c41356eca49df468a952f9c3ffccc8a99e1
+0d5d61732eb44e2ae7b254bab320d13990ffcdb63f3d541ed21ae022e86ddf20
+1eac6701a072aaf27664dd4e7874c4e428682c44de9d9b14c25fa8c2e8760acd
+79f11c13e198602be9d9573f6f04643b80abae1cb6269e00c8ab419d49c3606b
+11b1f8f46e7977789b19ee83c5bc35bfc48da6d32dd4d16c1303b0799dfe98fa
+0cf8531205195af9e992dac76c6cb79ef51865e6b012f29df6d3333daae56b36
+8ede2fc26a580344fdedcdf9c61366f5887fb1e7300f7898e38de35b4dac436d
+c4f79f7b365cdf9b6a32d842b6f8494b7b6c91c122af116dd8a3c3c1a35a21a9
+509f5c0c8479c5e57b2c0e175fbb4a85d3b52c927a20fd0cfdf3e2273ec8726b
+58c23b0d4f56d69ec2c59d8ce896ea7dd86cea423c2f7250170a09991fdba4f2
+40a6df094cd170ee83bab69d4b8706441730cf417284c8206c646b5105d592da
+9274bc54d07e141fcdcd130e51bacc353ea2e99dfae63ecfb9138e0aaa07178e
+de98a4f4d365375190585c8579e73929b840667afbc659f5ba4b9f25fe55c75a
+2a42fe330a4b90f3a088202806baa50fa1e99fb32973f23819fba8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F548_0 /FRBTTO+CMSY10 1 1
+[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /arrowleft/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%BeginResource: font AMYDOG+NimbusRomNo9L-ReguItal
+%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05
+%%CreationDate: Wed Dec 22 1999
+% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
+% (URW)++,Copyright 1999 by (URW)++ Design & Development
+% See the file COPYING (GNU General Public License) for license conditions.
+% As a special exception, permission is granted to include this font
+% program in a Postscript or PDF file that consists of a document that
+% contains text to be displayed or printed using this font, regardless
+% of the conditions or license applying to the document itself.
+12 dict begin
+/FontInfo 10 dict dup begin
+/version (1.05) readonly def
+/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
+/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
+/FullName (Nimbus Roman No9 L Regular Italic) readonly def
+/FamilyName (Nimbus Roman No9 L) readonly def
+/Weight (Regular) readonly def
+/ItalicAngle -15.5 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /AMYDOG+NimbusRomNo9L-ReguItal def
+/PaintType 0 def
+/WMode 0 def
+/FontBBox {-169 -270 1010 924} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding StandardEncoding def
+currentdict end
+currentfile eexec
+d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
+6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
+bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
+045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
+0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
+1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa7637750b770d7b13
+99fd7523816e22986f43b17ad2f9328028bba7f383ce5c429773b3d968b4307a
+efc6f468433d2320871c85fc9a377c8146b0238e6386f2f010e4c23bf50f301c
+95de2b4a559abd765880f5b3d8960d7c462f28339aec4978f261a05761583468
+b73b46da2852db1d9b0b53f6427551b6e87f1a1492a19dd774ccc6a1d0bf8d1f
+afb24bc1b3a56e452791e8fb9206a2c9df1677e848a67c4dc754cd0833116c84
+25127a919ffae922f6ec724252ae53662f3eeab1dba230a6ab6ad98cf27afcb2
+6837487ece5214be13a113d27d5ec449ac017cc7f12ff7b731b6aea24462f3bf
+e743debd18a99eda36d085ad3602ee939e3c2a40fb9551f4e5e904578e8df0ae
+a6e10910d5205c917b45b0d0f44caa993ea6fc2e17ea43b83e62abb31717b3cf
+d783d25486084caa1c642a4d9719906889510d7e60c8ba0b48b9d40222d36a01
+1aa4c8148ba57f165bb7181534df0a597bcd1df98fd644fd3e3a09a21bb018bf
+637e620e494eeb843c575bdc71016214e19d0d3d030b8a9eaea88822ee97d8ba
+ffbd2f522d3ac2f34927961e189b0c163c365ebb410088e95a5bd200e62bd5b5
+e846bdf4c127018a54a78bce6dc744c4c1aec0087df470d72e461c8079f1e8a5
+12794d770d391a02d428fccaaa4fc4ce3eefcf12b553d8fc59588b922565aba2
+c179b29dcecea5254dd73f388bb94a7ea4f16c0ea0278deaa11f2be56dadb4b0
+43bf781fb5151a4d2491bfa2d439082e8cf7a05cbc84393aa92f1d09af1e69f1
+692065dfb293c7d7bb552469bead4b1479ad1b75e552af4c162d37027dda9863
+5e1ff0b4c3ba9cdb41e9c292e901446d40a10906ca0c3f649f7968b4ffd2c653
+650bb2320e55fa19938e4c3775f286a05a1011cff4e4c7f353bfdd88ce318584
+799cd9350da919e462621dc3556b48bf53edce91940eab01870741f0fbbebd2b
+c6a26e593fd78e7ab5d05af43231c262477a5309acf964c0fbc114419c98df24
+279612da5ae02b2db3eb07c329891aeab0da742593183a92a619912d6e53b33e
+f9489dfb011045b4f20c79a7038e473f435dcc8dfed5b9071acab5a322d4e4b9
+f225eef68b8281688882693085432c16d81dbadaa3df3c2ed508a5547c4b8b18
+2cbe2aab5bfd98acf80d5927a07da8a3aa987a899e28e69a49aca9aa960b45b0
+53079246f09b1f8be89a5912784ef566497df949ac722c37b8b4c641f602217d
+e1c7fcd757c04c263aa2a4a08d7e08055e5b922d850c2a898cf32baf2418e0a1
+fa6e54e2459ef6283fbcdd406b9079950669763106c9d8b16d0aac8815fe894b
+e1c7af9702ca13b36325fdd90110f1b8a03ce3e7aff614a0a2b1b15a1041800b
+b72ceea17cf4a939410c53d5bac0b89eeeb9e2f9cfc6bcdfd9a438c109784adf
+9d2843fc809a040b9287f0c71d93f7c2b3273d39c5ed535a8e130b46d3c97f4d
+e0bf14ef07eec07f1c747a6b5d294cf4d47ac12f1d9282d2de0f808a4c609e4a
+0e2a68646e9583b6b9a75c95840bab3fe259ad8846a82af91f44923f25bac677
+3c8ad0a810731fafb0a95a5445b5800d0be0378909aec60f544c3e7438760b6b
+feb2b9b16652caab36f65ac444ce9358670e060a90cc422043b8ea8f0b065446
+0b4ed94690003cc77027d8a3c0a06a48bccdf5d6d6770402b4f44ed2673b1329
+06d4f88bf12a3445794fc9db3f1bb4afb8d380def7dc1dc78624c748192fa321
+c96b32dc26b30e54dffe770165d1759d82a5542cfc4a772d8c2cadcd2e2fb1ca
+1517ac15deb0bccf94ce83436e989adba2903489abb6b2eb9f977f3f4d690b31
+e8f6e27faa56bde2c4fd331ceb502ad286857dd67d898f8b86e13a98044f77c9
+ef13c7b14a754fd0e07c68a90940f3fe3594afe83c605102c08ccb046b807975
+e69c165c9b833f41da40d17653b80730495803061fe194ca599d53a3367ba3c2
+8db6183ae68f6564178dc0372c58a103da58de056b7b0f8795cccb1cbd4239ee
+a2b6af7eeec2f7da99f12110e07d663dfbdc0645dbf9e051f91924855405f022
+13933f1c51af2ca7a39ae3204ed31d68b15f2b74914bf86548d87316170a909e
+e9638b25282a209e9d8bbea3ecfa3ed46c2dba5cb3b38d8fadd66baf9417f5cb
+6b3a9186e34d1710c011e3a16fe8f9dbc207edeaa72c2f7d4b7b7112bfdd1b0a
+1330a7f88ee867f55c828a9154dda3c57b6e596b830b33ff636e46d8d00fb39e
+cc497f82e037ae6f7975a36876d66694e3dfccdd4a5f9ee70883fde704969531
+9cf38a1bbe0c7fbea056326e41636e17d93850a1df92ee50089f30f3c4ade4d3
+07305271d998208c7ac0f998b96ab3e3e182e29b819fd861e52b04e00f9b6be0
+8f5766fa4f3557d0ccc9edf31bf84531d664fc186ae2e7f9c81fe8c4f9f1f2ae
+3b9560c9df5fe69d969a0d6c120a6621bd68991fd5593f3197223c9f09613eb7
+1ae0c78d9ffad6be1e36df5885f657994ffb6eefb5e0949674c34768f001827f
+12f1ba77ae821657e3e96f17de324f9355152cd28c7bc3bb93b0bd0d40d17d35
+2b303f2518e05cfdc4dfa697683ecbd6a949a2eab9cce57b8b14c53ba2265a49
+5c28d22dab35e36b5b02d2fc02738aa6fa7c4cc66c88f5bf25b2be88a4987cfd
+39ca40be4ebe0174ba827e7dba9579fe52b869142fe488f9ea5cff30111d6400
+ac3cdd3e1476468fb113f2b977937e70b7214069a06007d987d0f3ade59460c4
+35361b9ee2378b0b2365178ce4fdaff19dc8e52a4eba7cea25387a2e330bea1f
+dac191c9e385c837ee253220a279f05876328864c9c2248258814f7a16030c60
+5a0da56b130757b262ba58ab68340b32d30ba67ae01efd748994a6510bdfb15b
+50c31f5dedaa1866ee9123cfc235591e6516e8210dc0157687a8f081c3aae846
+7481d16e8af6d8caa9c8596c801dd5948cf7361cafb8e01268eaf0cb40ae29d0
+de3bb879970e06fea94930ffce9d4a15ff822de7486a4023fb6bcf27d496e0a5
+2c73d409ed6aea6923de8e6ddcd7615d76b5af4f2be2cee210bb781fd622574e
+042b2fa03ff6e45cbefae7dfb53447fc56da42938717098806352776208567e1
+f07e8372e0bd8a19332de3a09320e82dfb6ac58689a65ec1fb97808e3ecfc84c
+1173378bbcabc629bb8d4f2642cfbe1bfa1a25137db295526810f349baa1e4fe
+9bc755f32a1ed330171ada792e10540d41b177bffbd9b94c2c008ff74a20138b
+eb2d0b23fcdc136e434d7fc5e7710559b91756ad1171ed3bae249960384eb4b8
+4ec4c71e91d872b1db3b7ee412aa9b4e66c8e5a03d5f1d98de47ab51dd77014c
+2926ab5e994a095d9ee5fb336746bba506603279bfa91724f6cc868abb2ce5b2
+c145dae2b6128e6c913c8814a5a0b4134c30edc7f97908ddc6e7bb65cf8a58de
+88ffab9273afe5819be1d31040559f763e95cfe230d48681d0b4103ebb92a3f8
+01177bde9bdd61e288e9c5dbd18163eac0a67899acfc1c386f8b261fabd320ab
+89fe9be450e41549b3753c32e2cd3069e82101530513728dc24d8c2c25b06ae0
+91db97dcde55f701a63895445c0bcce07ccf4c82b318494f42c776d9482c8c19
+46fce4e987e770a4a7512b5276e36ec3072c6dc9812e56e11b34baaaf9bed596
+e52d1ac1768e8e0a8b20b94f320d56406f4ea3202920fe665809102ba71932b5
+51ad5c83f6f34b1e87272e8ac300761cb99c9104a20557c09df9cf7ac51625ab
+05c5a60689321d8cef7eb8edd092b9feaba272a94e133aa84a9b7cded15c6824
+3f7ef11eee530323afe1153fbd6285b2302588252609824ed75c05416beae011
+98155779dec43c2e7fc92532951a1ce0dd6613afb3f9c73055f528f993a342c2
+3ea326391cb99feae1d61d95af36536b1c53d0a2c19709f7c85f07715f95a98a
+cdb7722e297692fc187c000a9e64bdfb0c56852bf7ff946f932852d3931043f2
+60b7beabb6b6faf76bd8ff3f2a6fca03fb36ef04f59a9f67d26da5ddbc23bf20
+d82e99326a41155cfc7b4fedb80f69d361c31826743ec395b7aa83c10f9b5eed
+80044f3c258d7e2052d2cfe08f6046189bd0022ad8e6e7890cd31848b2477ecd
+095ba2ca9f4e9ad4bc8c7b2dae33d20d4cd01885c2f172052c1f8bcea593fff3
+4821540e79f626f4d7fa64c0bb4cc5485309e67071d0277a61369645ad3a4d8c
+fbfb1722ef6011fa6b2095aa4e5b32746f64c16af093df2e9bc175409949d440
+795f6f2b72a69435be1621154ade8d4dfb1bfbb0e28da8f08c76cd0521ff176a
+d2e7dd44916af6a1dfa3ecd6194189190b428cb56e2ef4a1bdc5d739ff1cbefc
+39eac4b5934d3707bd30caf67adb3612b37056151b45e9eb73c3bde4b4350148
+23c3ea6ad5be04886842418ea1872bc169f92a890670fe0b8bdd86421400b49d
+57e5ae8fdded5d706eebe573a5a172004e59b9c81fc990d2cf7036344c4335b1
+842a5c879354a84cc837d76b2babf981d4e60c857649054fc69fc59bf14aea72
+51210ac8babc95d58f4f3b497d5db3395a638fe339c5149f284b8dfd340c0b0c
+1984d43b5951b7bdb82423182dce8af2baad5eb25e037c5d976b534a3459f742
+751b5ed1c5bbe4915a7b281d1b1c806c58bbf900d5ca092fe2119ce099e52872
+0e5c8231dd6d7ed8fa5d2c953bd8bdc13781119d2b31a94bf39948d4b3688e58
+8aeae48e2d66e17935058ed16528d28e50e37bbeb1d155450364517018b1b44d
+bb0703befedb3681a2b609063302129628fcc24d88653589b431fb84e4ddb650
+c2f783594de613ebdad8a1324574cad1fd05a37844799928b4da778710e3a4cf
+b85afd46ed46ccad840106074f69ae7c306abf4cead6c66f4fbc0fdeef002570
+25305004426efca887ed5b4f2ef6dcb912ff552089f383d270c1312811b510f4
+11622aab22c5add53e1979fa80a9ac5ab80b3255c901cda700904e4254725a18
+6925971163b35469c55ddf9d36d2e690c988678e2be17e2668807c0fee64d264
+5a8f26899ceae3abc5553bc58674333d43f27d0ead9297619e8169554512d7f2
+9984c12dd44285a3d8a75dd20ebdb5280b95471bcbe5473447fcf750c3b061ba
+bf491a61adf487ccefc79cc514569978f12a7a3420ee046e1c28776c96c550e7
+fb0e2b46b3e57b2b8a6ae7d306fd0eaeb026beb5b13b8c980828f78905369fad
+aa7ac9c3b91df9a4d1be00b3aea709995849ae4ece16c126b99c3d0fc0bdc084
+f8486d70022e0d5a8e50a27e9439e37d3bc175c3a3bb19914a4bded2feb81ec1
+fa7e274b027f4f4bfb331bf4fcb58fcdd1b999a775bd2a9002e846d7fe61c6d2
+e29fedf3121af6edcef90f23f54b128efad5fcc3e2236e1f9f59218994460d1a
+f21eb9a2999501fc489873e9eafb986d9e9e780b4eddf332aa72697ec956f63a
+4307133ed0fd2dfafe283677469b7b14b155b17a8da4a81cbce56da716149124
+bb3b20fa7a2b64b58d6eab90dbaff1d560e5e5492f17615b7308cf7670f09a04
+6115d454937c733ed45b1156c2e7d0ed43c093d6416b91533637d5d5f649bca5
+50a5ca5522b0f8362042caa30a4bc87a4a4339710e2de9b2c0c84baebedd073f
+25cacf0e4c4bdba46f4c545e27d20536827ea4a4d5f5e19518fae6ba2d45b5e0
+b247f20752a795594d9ce548b5c0217ef480cc5a0be6794178fc7c017aa8a3bd
+74686310f635ae6153d9e18a0514882d4ccfe9d7dae9f24b393985e8da776880
+1d9a6515ed7bfad3cabd1e13f2a9be17d42dda60f38dc5dd5412b03b938bed86
+0f9cc900eba7eb281e619edc39b5413af1e242ab56171d3a01203c76788d9024
+2f72c89b7adb10f5caf6851acd3a4369972f796d5a1a9816023f5a454dbf5bfa
+5ea34c00df81a76fd79a0198e91ea01efbf7d89d78f9da5253250bb29770c4e8
+df955af85d48c33fbdff3845d6868920a3b09ceb0b7de798354e80d1f3ec05d6
+3ceeb37751ab5f9d5f7e682958235c0fb224551296108eeded2e000bf86193ad
+5f290f698375727743a699633867f03f2d7801b18627f25628c0b65ace0e766e
+ed22bae384ad0305bbba6a3cbb913641106259e2947e77caa437856febd8b604
+7621e8be93bf909cf3893cb2e0b4c75afabcac6ee9ebfa30dc6ba5e9bb572318
+ba844429bd3b5bec550ebf2b7a3776f11dcb71c930489a792bbad9f6a1679b6e
+22a32048d0652fe2e3c1dfebce17cf97281087ed892b5d02d83a97dba1b3b221
+4f52eaa45592670902f979905281d7e92e9bbeebb909d5152f97aa49068d3b2e
+8ce26b784b48936a3f8e569e5d96d8f3cf19335c7ca5f139815f26b62ef0be05
+2f436d3d7ad037451cef14021a15b0b10a07048ffd4cc4b4ca987cde5290318d
+7100cdfb146fa044c694c79f3ff3ac98f1067bcdddc054cb3867af0b7e340e39
+81cc10ba0763901afa3f492590664fbddc6fe2ef568d6765579eaa5ff1501a1e
+6b6b303c415557a70b4d60994b9841785a8791b51814f08ce8f0b048c690dc05
+fce223f392df0b93c030960e7a4717203c957f428fa52cf5d206eac92a7ec569
+b1353585ae6a14877eebbd8c402163bec563feab67ed764809e5205bc3f50fcb
+557af616a430215a7f9915872478572a2335fa3817abd8ff113020f023c513b4
+202a3015e22d173b07d87e6d6eeeb3e0b0891c00831843c6a2613c15bfbcaf5a
+8bad5d9e69a88eed3a1965e1876b223b74dedd8f16a2302c7f70ed7c8b5e60e2
+25c39cd88e4b559888007abc4f48955fe377c69b00be16bf9eec8248ebeb6808
+5a80b2f60ae03c29fa29b91f30efb4ca29bc51fb2bc09a7343d0b107ffd02a03
+b26ffb1c6b1d2b5adb3647d37bdb45420e8a115beadb142e3aeedbcc8d0ecd93
+8777fb9ee661d5db7088e3faf04e91f1865418e2723565fe2617d2d8e106a230
+a2dcb6a4502528d22457a4399cb7f9e4f788a03d6c8b5757cf59267fd86ac4f9
+21675f6da1a90156bbdfa77facf6df331491cd2cde707e509b8e5d03ba1b6781
+eacd2ac3eeabb5f5ac4d0d8f5b10676e7357557c23bd6412c625d7944302c969
+561c704f937fe5304e1704b20352a758d6237e52c4a356a08f9893743a5c20da
+6a817899bb2edbadbf4234e1ece52b9b3f3e29095f0975259c931b67595f0ce0
+db8e4ccd5f6fdfdda07663d252bd05fd4ca58fa54a9fa6acceabd97f2313c59d
+195cbc3bfb55f9050d5e3ec4e42f883635f18d17efb2a0ab333e09c2521705be
+aa147b6717c816e57d38adfb2f4658249a3a345b337251b7537cd305c6424dbf
+b204417f4c36086edaa8da348dc065aa5a7f68a0ad3e3676a7c240e76ddc8786
+96b56cd4e70c28c3009185ae13ad4e96c8522735074ad649cabf39201903e974
+12967a45b574790d727dc68222dff726fd162dbfee4964afbe6549abeead5264
+a033fb29e70f1d17fe58934bfdd5ee6defe6056ea4a0e39a39b7fc1a6da06713
+f952bc20c689bdddb94bd67997f60f31fa6239387089deee5b687455a5c06fa9
+fe941781f0d9835d8d020cc6286c2fb8ed5906eccffacadd71ee0b7c7b67d8c7
+aaa95f9cb24fd22bea989e0e0919a4ea35fac630a9090346da895bb5b6e1c1ba
+ff90f1e16665998ab7612444979edefd96f1f701d13950e0ca2daa7787735fc8
+4b268e36cba6d7de0506dc5353f3d13ad666cba8f8c56e27e44b57873adee581
+fafd1f33a85b6169d4794b1d73940c134f11dfde03ccc5709f6d806cfffdb6fd
+f9361520d0023ac6aa3c93b843d8cd8a652a665eb31d6b75d752e7679a9e1327
+d0adf92820acc78b0793b9f0307c776c201a408a883f99f9d2ade3960b1e62e2
+db5d6ca4115a028f87f77651c95bd71456ba087709827b05a80ff78746cd3c09
+72eec0baa7ebc8a05043e18e63517fb66e333973dfa6bc796af520e8efbae640
+a2f4b94f244d365b76fb3e229726dd7c61478dff4d616cdceaec1ad70d9cefd6
+0e9e6affa41f34b777da7174b3281acda204977bcedb3f5f9f0c5d77607237a6
+9d6780dd18cef875257fd719d237a35864498978239cc0933a9ad0fb8ac74f3d
+869fab0c30e8001a2df0ada8f56de43c5e9a7dc78220720dae05f0fff948adf9
+0e8319eafa3fc8e936c9c040b1498e7eafc36f03bb4cd11a6fed37b7a8d05b1d
+00b5f36799e9556526f5e5f2205dd641ee39a4bd6c8ec20a36473eadfe1a499e
+88284d2fb544b7bdb637868345ae4b3dca6bc0754bad59df4558d2d608faf166
+68daeac6bfb73db431a3146628d371c2d158a1ba65c8d2d47ceec7addae77864
+042ef587a6d6c04dce664bf83492d164d2fc00c1313c220bfdd7a30dede201c5
+1e84d9573c79235a8d847d0a4c231fe009058f5848c775e343c61835c7c8e025
+44dbe77ccfff9e9c950ace49091771604234e586c1335904da22349a847ade3c
+060aec69c2987eb1f3332d8b66e59be53edab3da137d59cc6efa0f579f8a1d03
+882c720c27834570c10bf892f79b30340ead8535881b11171b2040fb6637140b
+e927369f803a4ff311d78d7e68f4b5f8628fdcfa2cc376442d78e6f47cb378eb
+31f079902cd32d6aec688f02a7365b66797de1ea022afec2f3aae36fe01a3e5e
+6cc49c79ca23dc10ed8071eea3a0f8924a0dcc610f842e4e30c1104f859ac970
+06c7490195599c65393be11269c8dd7247c96d632523256f59edeb144329b8da
+b35303c922432e92394a95196dad464e35858f00e6a27320cf515b7b8af90d06
+82e89f09afb605862d14eab6a99218b3f66f11ea2f345629c402bd9aeb25e3e9
+8734a0ca4a814d824ee4ca5383c6eb8ff1458c767dd9b71530c5f01be2d2611c
+f9644c28f3f52ac748749b54eb652f76630e3a62b63a3562a54144c306beddfd
+557e154c7d4931bafe9a9136c3aae071b00e7204150cece0d45e10bd736b633c
+8abf3817168828ba17b23c8ef8ee35119c43cd7fe068e1f016aadc734d4338d7
+8abd60567f307d6ec471f99b03cc7b5e8140dc07f726303c2185590f9f2224c1
+52bf01b038ae1e963098a309edf98ce5ba1ab235e1190ba23732e42841b2bf69
+36560701e1653df36a29c8c3254d402d0140f5ffeda15ded4728c176e3f39c35
+48b5a2be25266587b52bda256f255c940adddbfcaf37ba2500213239f12dc7e0
+0b61230190a4380917962c18effc6774f6db08b799c5966ca7133fadfd7e2b25
+75116286d1c2a40545f973870cbb5cf97691afe304ca7b586f198c426a71dfa8
+cedbe3d94bda4267b9b5ff1454ac7d54f59c5d94588bb274601cee186b9ee892
+5f359ec5bc402442bba33b2663d564461ca130d7f1405b0467027ec1e27bbec4
+8d51c674c81b66ec733c4c57410956520f9c16708aaee0d9ae34f1050f6412c7
+7a23c8c3364dad8e407319772c9b201c49b75dea4685566d9c912acdb47aece3
+f9786e47398891c07b0269e74e2eb935991c9d7a835eb88bc04eb2b195ddeb02
+38dcd1e4bb773e269ad58fa9e2f5482db94a661f065bfafee3ccc1c812e9fac3
+31fd70975e3a0c72d37207d6c90f998103a821c35734f0153950e5f72ff6a8ac
+cb831f57267142dcc4079c915a4d01807fdc883e15a15b67e8cea1ef8d26e4fc
+b55c69418d7a4dcef51473a037050cc43e204fc7de2392905800993bbccaf459
+3bd84187fd1c295d111867930dd068988631f5d0abb9adc48b7ca8134f8a3baf
+3569f5ffbf19291022b3e13fdabbf0ddf64fef601cf97dc70ed2e4355de38f1c
+0ca81966adfc95cf03e794d875025af92bbeaacd9ee58b49c3f0b67d72b13a0a
+971076819781d91814c47a0a3b53f767b7630fb55df3d2706d834b127d56fc95
+b9b30ab934839b8324c9ee0147f0bbec998eb1b2939a2102c59c896b9f57c9b2
+fc138cfd94fd5c512bd83e30e8356e983cceb0de72224f78b3c8a98359e46f22
+c19ab808b70c4287397eade3b28a311244385d3d49fb80adc4f90f32366fcf42
+eaea8d05392164a48f03184563922bcbeb78376f512b9a289325a61c0c357e40
+bb3dbeebf870ec12ef096a8997bb6ec55251ad55bd881ebdda84056556380935
+b0b8eb1f74ef96bf02375a30dc53795da638252a12a2e9bc18bfd7ff5aa7a8f4
+4a6bb4a34f1c94a781a129fc975823bd16a6df7c5d75b7f6dff55ac5f82e3e2f
+572f339f48024e93f0c59fb1fc95bacf7bf5fd7c683c9b159c3b5d937c3a2110
+e78889021ebbbbe76b1f984317d310ea61f7b5cdb4ed1754a35adc9c6924c3e0
+2e3b157261eea5092e0e7a914a259eea2b14192343680a18710db9f82e54c920
+369587bcdeed8f8acb72d2565ca89ea92b6b58bb861012ccab7270200ed5cef3
+9bdc58f4831161e8ce4ef5c6fc839deb8216482d906d60c1a3292de191b40c79
+85529eae01de8fadd442ec8bfa775366070a9e193138a4c6f6eca7ff554c57a0
+19346015d6ed5dfe8b9dd876a207e7247deaa1e42a41c3edccb32d47e5fa97c0
+9bf3f8324a366856d6c6df8f295da2a9164a99b6e66adf4247dd79bbf54525dd
+bcf518651fd8b374cbca6ac532ed443a1c952ce148a67cc655d92b670ab76c64
+cba90089f1d252ab55d93cfd0ec1545e79b65c5337fc57e46ad6ddcf5ca56204
+867e467d3982d77c2e603fee7ec4b57bd8718e5be9203666459815b7428679b2
+134188b7c2c89f64b7426e0dde73f586a7a86a4cc4136bcd5b09b2482aaf3ea2
+6a9c99cdc852ae0a7262b57c06143f1a6528b02cdd69b9fd5edc635873997b4d
+7c5644daa467783e154ad0a787e72bf5a627f712267198d9368b480a4e764627
+b268d7f1500b8e155615bf9e59bedc125774802dcbe33451e222f6a9ba24afc1
+92933742c74822f138baac4bddcfbf447dea77a4e913028db069e802014b5d57
+b0c7d6b7a727742eebb6a7c7a2231c94d63fbe66fa8030f3b378006027ceb4b2
+74d8d75d001c7b4d0225ec9cb04ca7f5e1668b44682847a8b14dda4ecd87fda2
+6b1694a2810f90537c403ff242d0accc8b73fa0088d668fb4fd50c4a0b0aafe3
+0dddc6e893c1bb127147fd1b35254e2ef659f023cd826cbf5e400dfba85f4df9
+f70b30a42df485bf5dd6c620e37c82bedef5841131716bc5eeb40aefec8c0379
+f9348a1d7ad0618a422d85300bc0f4208a5b4baf9dd1f568da943f0023eec988
+21187716ec2104282a7fed77b0c5b01e78d5d9d5d99994a9f232859ce68a62a9
+e6960f557f153d7101dd98b7836d7841d3180be3b34a99d4434af82db181de42
+e7f3fd86d86678ea86c4ea4d0af845955141ca4f9266f3ef69c2ce9b73ae1558
+9dd98a8a0802572fba00fc509918a64f1dcabd06286039e75042d53d472ae66e
+38ecb6e6795e3dd12757255e786909f306fc17d14ed432f5107aac6cc50236b7
+d381ad2c4da239669d94cb276610a846e991f508a75e1a3a851be789b9a3f75b
+f5d7dfde15eadd55e7710d79b5a4127b5e9f85f6bceace031aa9ad412541848d
+59dd3f66886672db5d90f51fd15334eb973e64baa4181186cc3c090b2a5bbb70
+e9e1fd9420a31674e9e517b1dc0196fcb5624668785a65dfa60a0944386beda0
+66e2a3d871913d23001c0b5f22c4136fa48e6fbd636fe0bbc104cba53ecd15b7
+0034db9200070b7924ab31ea318cffc35cb44bbda45e04f64516b48bbaceed37
+56a2aaa5d5c0a2d06f71a5ca689c8c8afc991638fff960d060555d9ee7a13868
+434853e22d4d9aed6231039517aa713e67e7c08467c687a21bfb00e6c99c9b15
+51859fb8f437c77bca2b0fc97a36ee9b552645b83ddcd2ae48049085693c356c
+53b214b9216d5466852340dbb92eadc60bb6225d9c08bb9f5e9f50e40dfb7c12
+2b5126c6e11393d04691831af2707bf11e0c4e887511a59442469df76bc8eb2e
+d2e97d09b6b2f1b533ac64d85d454f57702af92cc88d5ddc46388d6c203ba06a
+f57846d420ef1727d97d964da29018245d91f1e37e3e3f9f04e02d997b0c28fe
+4c99293e87c978606c3a0c7ca1d121c60ac58fad627be407057eae2ebc2074dd
+fd2bd9fb017ad048ead3d1243b7634701508034a934c81a9f63a05b7319676d7
+bb9af94fbe826f84d4149e81b46424e482c8c1c655affecb4393177d768eaa24
+a68a71e4faf578e57865b15f459315a26ddf6e39bd3d16958a3a8cbeab793eaa
+533eaa3d89e78d292fe37f0c23e32abfd50b2c9fba8261331c66458340bb4cd5
+4e7a7cac3df5ca530fbffd93789357877ad2fe127377b899340416d6100e2165
+64c62ed803d484656ef5ff7587902285671f280de39228b9432ba46c3ecbdd23
+46222998ef3c528cec6da555eb72092d97664cf35ea21e31ffb70e8b8102ddf6
+0203d3dddaa7593a8dc0b1c6af796d891e80860e6bba501e4c38dd5c6b5a6f35
+a38ef0c7cd4ab7cce0e17fae913eec2572565070169cce8517c37b21699fe4d3
+58439dcec0066047253d42a74ba564d2fc7ccf34b3b4e77fbac09d950c3c134c
+5671c64b9964c124d123a299d2070826fde61b7f637bf87739e7a0de70ef82af
+c901821eabb31969a27596e9826dd506912d05918ddd2981d5fb153526683f83
+04bbb13678af6d8a65aaae58240688caf7a8419f7bacf078dae7495ab646fc40
+c9004cbabf4c76143e33fe49fed460a102129b9f6cdda0797e53df9b9db99890
+7dc89ecb49ee18cd7556b44b096c9337f6a5618b589c6d7c87ea0f292bb446fe
+c901b120180e3b514e3e7e32e52028a30cfd6879068a68b7ef5db202f575a6f3
+52748c45a3509d747d672b446efd09b0dcab7b3f8808c011a0470eb5c9d8d632
+0f413186fdf227c7f9c45c403ef93db5fb63819de4ca368f1b9387dfb0f039e8
+2c47f56fa0d3073c901393803ae628eba7313821a01b07918efa4d901aca044e
+90d0227813c537cdc2c906e44140bdcb8717e95b7597ad7c01b51b7dac732e65
+fa3870fe8865ae6dbc96b5a984e2e363c4b67a3a07fe4eb42044112ecfff74f4
+09329f03a55e1f57656f88a08e597bfccb97a2b0bc0c26db9aa5bc5f1d1bafa3
+65f32c6ae5de5f798233ed6878583d8335e8988021438e992be94f6b73608413
+b83693b45e539261664f851652bd9458e643bd60628d0acb48a0edd350749e13
+9e480bb10cfb50b4fa0e37348d2f5ebc3e3f3457128b9793ef1359076da9e92d
+e3bbd59ccc0c0327867bd7895a19cb93fdcd6ef8d459ccabadb1e0bc6896b456
+b13cab755da348b349da1b485947a23d05e9bb5dfeb8300f8fef30d7f09d288f
+681ee6e23d21f76f806440680e7913d323a264fd6d69d4be33527e050856f8d7
+20fcf33f81e5021271c2cefd7b1c6a2dc9e207140be0030fd866fb65e33cf5fb
+8879dd70eed5e887537c45d136be8bb191bd9dc4cea400137903a12b66dcd359
+9b6c2e43306759110af0878c8f37c8daf847657c2bd68d5c3ca105b332d18d5e
+03269eedc1ae92f4e45c79915981c1f32b5a39c46c358708460301ca4298bbb4
+5b91e0d45fd1de756c6885545bdf5bce1cd40bb0c92c481a629b0d8dafb6b895
+995c6777d9355af0b03720d3c7456ad60eaa5a80549bb54c0820e000eb30a3e6
+f81c1cdc55b70d902a432d13a233c63ae54f98718d6ddae3c6aabebc65760e59
+d87abb67a5171a4ec2b2377bb5a39f
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F621_0 /AMYDOG+NimbusRomNo9L-ReguItal 1 1
+[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+  /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
+  /zero/one/two/three/four/five/six/seven
+  /eight/nine/colon/semicolon/less/equal/greater/question
+  /at/A/B/C/D/E/F/G
+  /H/I/J/K/L/M/N/O
+  /P/Q/R/S/T/U/V/W
+  /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
+  /quoteleft/a/b/c/d/e/f/g
+  /h/i/j/k/l/m/n/o
+  /p/q/r/s/t/u/v/w
+  /x/y/z/braceleft/bar/braceright/asciitilde/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section
+  /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl
+  /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet
+  /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown
+  /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent
+  /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
+  /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef
+  /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef
+  /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef
+  /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+612 792 false pdfSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+117.435 701.916 Td
+/F116_0 24.7902 Tf
+(bzip2) 63.3638 Tj
+-278 TJm
+(and) 44.077 Tj
+-278 TJm
+(libbzip2,) 99.1856 Tj
+-278 TJm
+(ver) 37.2101 Tj
+15 TJm
+(sion) 50.9687 Tj
+-278 TJm
+(1.0.6) 55.1334 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+90.493 661.631 Td
+/F116_0 20.6585 Tf
+(A) 14.9154 Tj
+-278 TJm
+(pr) 20.6585 Tj
+20 TJm
+(ogram) 63.1324 Tj
+-278 TJm
+(and) 36.7308 Tj
+-278 TJm
+(librar) 51.6669 Tj
+-10 TJm
+(y) 11.4861 Tj
+-278 TJm
+(f) 6.8793 Tj
+20 TJm
+(or) 20.6585 Tj
+-278 TJm
+(data) 42.4739 Tj
+-278 TJm
+(compression) 128.5785 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+207.676 503.285 Td
+/F116_0 11.9552 Tf
+(J) 6.6471 Tj
+20 TJm
+(ulian) 27.9034 Tj
+-278 TJm
+(Se) 14.6212 Tj
+15 TJm
+(war) 20.5988 Tj
+20 TJm
+(d,) 10.6282 Tj
+-278 TJm
+(http://www) 61.103 Tj
+40 TJm
+(.bzip.or) 42.5127 Tj
+15 TJm
+(g) 7.3046 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 2 2
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 709.534 Td
+/F116_0 14.3462 Tf
+(bzip2) 36.6689 Tj
+-489 TJm
+(and) 25.5075 Tj
+-488 TJm
+(libbzip2,) 57.3991 Tj
+-542 TJm
+(ver) 21.5336 Tj
+15 TJm
+(sion) 29.4958 Tj
+-488 TJm
+(1.0.6:) 36.6832 Tj
+-766 TJm
+(A) 10.358 Tj
+-488 TJm
+(pr) 14.3462 Tj
+20 TJm
+(ogram) 43.842 Tj
+-489 TJm
+(and) 25.5075 Tj
+-489 TJm
+(librar) 35.8798 Tj
+-10 TJm
+(y) 7.9765 Tj
+-488 TJm
+(f) 4.7773 Tj
+20 TJm
+(or) 14.3462 Tj
+-489 TJm
+(data) 29.4958 Tj
+72 692.319 Td
+(compression) 89.2907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 680.364 Td
+/F122_0 9.9626 Tf
+(by) 9.9626 Tj
+-250 TJm
+(Julian) 23.8007 Tj
+-250 TJm
+(Se) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(ard) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 663.427 Td
+(V) 7.193 Tj
+111 TJm
+(ersion) 24.3486 Tj
+-250 TJm
+(1.0.6) 19.9252 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(6) 4.9813 Tj
+-250 TJm
+(September) 42.61 Tj
+-250 TJm
+(2010) 19.9252 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 651.472 Td
+(Cop) 16.6077 Tj
+10 TJm
+(yright) 23.8007 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(\251) 7.5716 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(1996-2010) 43.1679 Tj
+-250 TJm
+(Julian) 23.8007 Tj
+-250 TJm
+(Se) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(ard) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 633.938 Td
+/F122_0 7.9701 Tf
+(This) 14.1708 Tj
+-250 TJm
+(program,) 28.9952 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+119.151 633.938 Td
+/F124_0 7.9701 Tf
+(bzip2) 23.9103 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+143.061 633.938 Td
+/F122_0 7.9701 Tf
+(,) 1.9925 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(associated) 32.7571 Tj
+-250 TJm
+(library) 21.2483 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.768 633.938 Td
+/F124_0 7.9701 Tf
+(libbzip2) 38.2565 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+255.025 633.938 Td
+/F122_0 7.9701 Tf
+(,) 1.9925 Tj
+-250 TJm
+(and) 11.5088 Tj
+-250 TJm
+(all) 7.9701 Tj
+-250 TJm
+(documentation,) 49.3668 Tj
+-250 TJm
+(are) 9.7315 Tj
+-250 TJm
+(cop) 11.5088 Tj
+10 TJm
+(yright) 19.0406 Tj
+-250 TJm
+(\251) 6.0573 Tj
+-250 TJm
+(1996-2010) 34.5344 Tj
+-250 TJm
+(Julian) 19.0406 Tj
+-250 TJm
+(Se) 7.9701 Tj
+25 TJm
+(w) 5.7544 Tj
+10 TJm
+(ard.) 12.1703 Tj
+-310 TJm
+(All) 10.1858 Tj
+-250 TJm
+(rights) 18.1559 Tj
+-250 TJm
+(reserv) 19.471 Tj
+15 TJm
+(ed.) 9.5163 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 616.404 Td
+(Redistrib) 29.2264 Tj
+20 TJm
+(ution) 16.3865 Tj
+-250 TJm
+(and) 11.5088 Tj
+-250 TJm
+(use) 10.6241 Tj
+-250 TJm
+(in) 6.2007 Tj
+-250 TJm
+(source) 20.802 Tj
+-250 TJm
+(and) 11.5088 Tj
+-250 TJm
+(binary) 20.3636 Tj
+-250 TJm
+(forms,) 20.5868 Tj
+-250 TJm
+(with) 14.1708 Tj
+-250 TJm
+(or) 6.6391 Tj
+-250 TJm
+(without) 24.3566 Tj
+-250 TJm
+(modi\002cation,) 42.2894 Tj
+-250 TJm
+(are) 9.7315 Tj
+-250 TJm
+(permitted) 30.5494 Tj
+-250 TJm
+(pro) 10.6241 Tj
+15 TJm
+(vided) 17.7096 Tj
+-250 TJm
+(that) 11.9552 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(follo) 15.0555 Tj
+25 TJm
+(wing) 15.9402 Tj
+-250 TJm
+(conditions) 33.2114 Tj
+-250 TJm
+(are) 9.7315 Tj
+-250 TJm
+(met:) 14.1708 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+73.993 590.899 Td
+(\225) 2.7895 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(Redistrib) 29.2264 Tj
+20 TJm
+(utions) 19.4869 Tj
+-250 TJm
+(of) 6.6391 Tj
+-250 TJm
+(source) 20.802 Tj
+-250 TJm
+(code) 15.0475 Tj
+-250 TJm
+(must) 15.5018 Tj
+-250 TJm
+(retain) 18.1479 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(abo) 11.5088 Tj
+15 TJm
+(v) 3.9851 Tj
+15 TJm
+(e) 3.5387 Tj
+-250 TJm
+(cop) 11.5088 Tj
+10 TJm
+(yright) 19.0406 Tj
+-250 TJm
+(notice,) 21.4714 Tj
+-250 TJm
+(this) 11.5168 Tj
+-250 TJm
+(list) 9.7474 Tj
+-250 TJm
+(of) 6.6391 Tj
+-250 TJm
+(conditions) 33.2114 Tj
+-250 TJm
+(and) 11.5088 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(follo) 15.0555 Tj
+25 TJm
+(wing) 15.9402 Tj
+-250 TJm
+(disclaimer) 33.2034 Tj
+55 TJm
+(.) 1.9925 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+73.993 573.365 Td
+(\225) 2.7895 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(The) 12.3935 Tj
+-285 TJm
+(origin) 19.0406 Tj
+-284 TJm
+(of) 6.6391 Tj
+-285 TJm
+(this) 11.5168 Tj
+-285 TJm
+(softw) 17.7096 Tj
+10 TJm
+(are) 9.7315 Tj
+-284 TJm
+(must) 15.5018 Tj
+-285 TJm
+(not) 10.1858 Tj
+-285 TJm
+(be) 7.5238 Tj
+-285 TJm
+(misrepresente) 44.2659 Tj
+1 TJm
+(d;) 6.2007 Tj
+-303 TJm
+(you) 11.9552 Tj
+-284 TJm
+(must) 15.5018 Tj
+-285 TJm
+(not) 10.1858 Tj
+-285 TJm
+(claim) 17.7096 Tj
+-284 TJm
+(that) 11.9552 Tj
+-285 TJm
+(you) 11.9552 Tj
+-285 TJm
+(wrote) 18.1479 Tj
+-284 TJm
+(the) 9.7395 Tj
+-285 TJm
+(original) 24.795 Tj
+-285 TJm
+(softw) 17.7096 Tj
+10 TJm
+(are.) 11.724 Tj
+-828 TJm
+(If) 5.3081 Tj
+-285 TJm
+(you) 11.9552 Tj
+-285 TJm
+(use) 10.6241 Tj
+-284 TJm
+(this) 11.5168 Tj
+-285 TJm
+(softw) 17.7096 Tj
+10 TJm
+(are) 9.7315 Tj
+-285 TJm
+(in) 6.2007 Tj
+-284 TJm
+(a) 3.5387 Tj
+79.97 563.801 Td
+(product,) 26.3412 Tj
+-250 TJm
+(an) 7.5238 Tj
+-250 TJm
+(ackno) 19.0326 Tj
+25 TJm
+(wledgment) 35.4191 Tj
+-250 TJm
+(in) 6.2007 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(product) 24.3487 Tj
+-250 TJm
+(documentation) 47.3743 Tj
+-250 TJm
+(w) 5.7544 Tj
+10 TJm
+(ould) 14.1708 Tj
+-250 TJm
+(be) 7.5238 Tj
+-250 TJm
+(appreciated) 36.7342 Tj
+-250 TJm
+(b) 3.9851 Tj
+20 TJm
+(ut) 6.2007 Tj
+-250 TJm
+(is) 5.3161 Tj
+-250 TJm
+(not) 10.1858 Tj
+-250 TJm
+(required.) 28.5489 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+73.993 546.267 Td
+(\225) 2.7895 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(Altered) 23.9023 Tj
+-250 TJm
+(source) 20.802 Tj
+-250 TJm
+(v) 3.9851 Tj
+15 TJm
+(ersions) 22.5793 Tj
+-250 TJm
+(must) 15.5018 Tj
+-250 TJm
+(be) 7.5238 Tj
+-250 TJm
+(plainly) 22.1409 Tj
+-250 TJm
+(mark) 16.3786 Tj
+10 TJm
+(ed) 7.5238 Tj
+-250 TJm
+(as) 6.6391 Tj
+-250 TJm
+(such,) 16.6017 Tj
+-250 TJm
+(and) 11.5088 Tj
+-250 TJm
+(must) 15.5018 Tj
+-250 TJm
+(not) 10.1858 Tj
+-250 TJm
+(be) 7.5238 Tj
+-250 TJm
+(misrepresented) 48.251 Tj
+-250 TJm
+(as) 6.6391 Tj
+-250 TJm
+(being) 17.7096 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(original) 24.795 Tj
+-250 TJm
+(softw) 17.7096 Tj
+10 TJm
+(are.) 11.724 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+73.993 528.733 Td
+(\225) 2.7895 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(The) 12.3935 Tj
+-250 TJm
+(name) 17.2632 Tj
+-250 TJm
+(of) 6.6391 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(author) 20.3636 Tj
+-250 TJm
+(may) 13.7245 Tj
+-250 TJm
+(not) 10.1858 Tj
+-250 TJm
+(be) 7.5238 Tj
+-250 TJm
+(used) 14.6092 Tj
+-250 TJm
+(to) 6.2007 Tj
+-250 TJm
+(endorse) 24.787 Tj
+-250 TJm
+(or) 6.6391 Tj
+-250 TJm
+(promote) 26.5643 Tj
+-250 TJm
+(products) 27.449 Tj
+-250 TJm
+(deri) 12.3935 Tj
+25 TJm
+(v) 3.9851 Tj
+15 TJm
+(ed) 7.5238 Tj
+-250 TJm
+(from) 15.4939 Tj
+-250 TJm
+(this) 11.5168 Tj
+-250 TJm
+(softw) 17.7096 Tj
+10 TJm
+(are) 9.7315 Tj
+-250 TJm
+(without) 24.3566 Tj
+-250 TJm
+(speci\002c) 24.3487 Tj
+-250 TJm
+(prior) 15.4939 Tj
+-250 TJm
+(written) 22.5793 Tj
+-250 TJm
+(permission.) 36.9733 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 511.198 Td
+(THIS) 17.7096 Tj
+-401 TJm
+(SOFTW) 27.0107 Tj
+120 TJm
+(ARE) 15.9402 Tj
+-401 TJm
+(IS) 7.0854 Tj
+-400 TJm
+(PR) 9.7474 Tj
+40 TJm
+(O) 5.7544 Tj
+50 TJm
+(VIDED) 24.787 Tj
+-401 TJm
+(BY) 11.0705 Tj
+-401 TJm
+(THE) 15.4939 Tj
+-401 TJm
+(A) 5.7544 Tj
+55 TJm
+(UTHOR) 27.449 Tj
+-401 TJm
+("AS) 13.4376 Tj
+-401 TJm
+(IS") 10.3372 Tj
+-401 TJm
+(AND) 17.2632 Tj
+-400 TJm
+(ANY) 17.2632 Tj
+-401 TJm
+(EXPRESS) 34.1041 Tj
+-401 TJm
+(OR) 11.0705 Tj
+-401 TJm
+(IMPLIED) 32.3188 Tj
+-401 TJm
+(W) 7.5238 Tj
+120 TJm
+(ARRANTIES,) 46.7128 Tj
+-401 TJm
+(INCLUDING,) 46.2585 Tj
+-401 TJm
+(B) 5.3161 Tj
+11 TJm
+(UT) 10.6241 Tj
+72 501.634 Td
+(NO) 11.5088 Tj
+40 TJm
+(T) 4.8697 Tj
+-304 TJm
+(LIMITED) 32.7571 Tj
+-304 TJm
+(T) 4.8697 Tj
+18 TJm
+(O,) 7.7469 Tj
+-305 TJm
+(THE) 15.4939 Tj
+-304 TJm
+(IMPLIED) 32.3188 Tj
+-304 TJm
+(W) 7.5238 Tj
+120 TJm
+(ARRANTIES) 44.7202 Tj
+-304 TJm
+(OF) 10.1858 Tj
+-304 TJm
+(MERCHANT) 44.7202 Tj
+93 TJm
+(ABILITY) 31.8724 Tj
+-304 TJm
+(AND) 17.2632 Tj
+-305 TJm
+(FITNESS) 31.442 Tj
+-304 TJm
+(FOR) 15.5018 Tj
+-304 TJm
+(A) 5.7544 Tj
+-304 TJm
+(P) 4.4314 Tj
+92 TJm
+(AR) 11.0705 Tj
+60 TJm
+(TICULAR) 34.5344 Tj
+-304 TJm
+(PURPOSE) 34.9887 Tj
+-304 TJm
+(ARE) 15.9402 Tj
+-305 TJm
+(DIS) 12.8398 Tj
+1 TJm
+(-) 2.654 Tj
+72 492.07 Td
+(CLAIMED.) 38.2963 Tj
+-576 TJm
+(IN) 8.4085 Tj
+-287 TJm
+(NO) 11.5088 Tj
+-288 TJm
+(EVENT) 26.118 Tj
+-288 TJm
+(SHALL) 25.6797 Tj
+-288 TJm
+(THE) 15.4939 Tj
+-287 TJm
+(A) 5.7544 Tj
+55 TJm
+(UTHOR) 27.449 Tj
+-288 TJm
+(BE) 10.1858 Tj
+-288 TJm
+(LIABLE) 28.3337 Tj
+-288 TJm
+(FOR) 15.5018 Tj
+-288 TJm
+(ANY) 17.2632 Tj
+-287 TJm
+(DIRECT) 28.78 Tj
+74 TJm
+(,) 1.9925 Tj
+-288 TJm
+(INDIRECT) 37.1885 Tj
+74 TJm
+(,) 1.9925 Tj
+-288 TJm
+(INCIDENT) 37.6268 Tj
+93 TJm
+(AL,) 12.6167 Tj
+-288 TJm
+(SPECIAL,) 34.3193 Tj
+-288 TJm
+(EXEMPLAR) 42.9509 Tj
+65 TJm
+(Y) 5.7544 Tj
+129 TJm
+(,) 1.9925 Tj
+72 482.506 Td
+(OR) 11.0705 Tj
+-299 TJm
+(CONSEQ) 31.8804 Tj
+10 TJm
+(UENTIAL) 34.5265 Tj
+-300 TJm
+(D) 5.7544 Tj
+40 TJm
+(AMA) 18.5942 Tj
+40 TJm
+(GES) 15.0555 Tj
+-299 TJm
+(\(INCLUDING,) 48.9125 Tj
+-299 TJm
+(B) 5.3161 Tj
+10 TJm
+(UT) 10.6241 Tj
+-299 TJm
+(NO) 11.5088 Tj
+40 TJm
+(T) 4.8697 Tj
+-300 TJm
+(LIMITED) 32.7571 Tj
+-299 TJm
+(T) 4.8697 Tj
+18 TJm
+(O,) 7.7469 Tj
+-299 TJm
+(PR) 9.7474 Tj
+40 TJm
+(OCUREMENT) 49.59 Tj
+-299 TJm
+(OF) 10.1858 Tj
+-300 TJm
+(SUBSTITUTE) 47.8206 Tj
+-299 TJm
+(GOODS) 27.449 Tj
+-299 TJm
+(OR) 11.0705 Tj
+-300 TJm
+(SER) 14.6172 Tj
+80 TJm
+(VICES) 23.0256 Tj
+1 TJm
+(;) 2.2157 Tj
+72 472.942 Td
+(LOSS) 19.4869 Tj
+-360 TJm
+(OF) 10.1858 Tj
+-360 TJm
+(USE,) 17.048 Tj
+-360 TJm
+(D) 5.7544 Tj
+40 TJm
+(A) 5.7544 Tj
+111 TJm
+(T) 4.8697 Tj
+93 TJm
+(A,) 7.7469 Tj
+-360 TJm
+(OR) 11.0705 Tj
+-359 TJm
+(PR) 9.7474 Tj
+40 TJm
+(OFITS;) 24.3566 Tj
+-360 TJm
+(OR) 11.0705 Tj
+-360 TJm
+(B) 5.3161 Tj
+10 TJm
+(USINESS) 32.3267 Tj
+-360 TJm
+(INTERR) 28.78 Tj
+40 TJm
+(UPTION\)) 31.8724 Tj
+-360 TJm
+(HO) 11.5088 Tj
+35 TJm
+(WEVER) 28.3337 Tj
+-360 TJm
+(CA) 11.0705 Tj
+55 TJm
+(USED) 20.8099 Tj
+-359 TJm
+(AND) 17.2632 Tj
+-360 TJm
+(ON) 11.5088 Tj
+-360 TJm
+(ANY) 17.2632 Tj
+-360 TJm
+(THEOR) 26.5643 Tj
+65 TJm
+(Y) 5.7544 Tj
+-360 TJm
+(OF) 10.1858 Tj
+-360 TJm
+(LIABI) 21.2483 Tj
+1 TJm
+(LITY) 18.1479 Tj
+128 TJm
+(,) 1.9925 Tj
+72 463.378 Td
+(WHETHER) 38.9578 Tj
+-247 TJm
+(IN) 8.4085 Tj
+-247 TJm
+(CONTRA) 32.7651 Tj
+40 TJm
+(CT) 10.1858 Tj
+74 TJm
+(,) 1.9925 Tj
+-247 TJm
+(STRICT) 27.457 Tj
+-247 TJm
+(LIABILITY) 39.3962 Tj
+129 TJm
+(,) 1.9925 Tj
+-247 TJm
+(O) 5.7544 Tj
+1 TJm
+(R) 5.3161 Tj
+-247 TJm
+(T) 4.8697 Tj
+18 TJm
+(OR) 11.0705 Tj
+60 TJm
+(T) 4.8697 Tj
+-247 TJm
+(\(INCLUDING) 46.92 Tj
+-247 TJm
+(NEGLIGENCE) 50.4667 Tj
+-247 TJm
+(OR) 11.0705 Tj
+-247 TJm
+(O) 5.7544 Tj
+40 TJm
+(THER) 20.8099 Tj
+55 TJm
+(WISE\)) 22.133 Tj
+-247 TJm
+(ARISING) 32.3188 Tj
+-247 TJm
+(IN) 8.4085 Tj
+-247 TJm
+(ANY) 17.2632 Tj
+-247 TJm
+(W) 7.5238 Tj
+120 TJm
+(A) 5.7544 Tj
+105 TJm
+(Y) 5.7544 Tj
+-247 TJm
+(OUT) 16.3786 Tj
+72 453.814 Td
+(OF) 10.1858 Tj
+-250 TJm
+(THE) 15.4939 Tj
+-250 TJm
+(USE) 15.0555 Tj
+-250 TJm
+(OF) 10.1858 Tj
+-250 TJm
+(THIS) 17.7096 Tj
+-250 TJm
+(SOFTW) 27.0107 Tj
+120 TJm
+(ARE,) 17.9327 Tj
+-250 TJm
+(EVEN) 21.2483 Tj
+-250 TJm
+(IF) 7.0854 Tj
+-250 TJm
+(AD) 11.5088 Tj
+40 TJm
+(VISED) 23.464 Tj
+-250 TJm
+(OF) 10.1858 Tj
+-250 TJm
+(THE) 15.4939 Tj
+-250 TJm
+(POSSIBILITY) 47.8206 Tj
+-250 TJm
+(OF) 10.1858 Tj
+-250 TJm
+(SUCH) 21.2563 Tj
+-250 TJm
+(D) 5.7544 Tj
+40 TJm
+(AMA) 18.5942 Tj
+40 TJm
+(GE.) 12.6167 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 436.279 Td
+(P) 4.4314 Tj
+92 TJm
+(A) 5.7544 Tj
+111 TJm
+(TENTS:) 27.0107 Tj
+-296 TJm
+(T) 4.8697 Tj
+80 TJm
+(o) 3.9851 Tj
+-295 TJm
+(the) 9.7395 Tj
+-296 TJm
+(best) 12.8398 Tj
+-295 TJm
+(of) 6.6391 Tj
+-296 TJm
+(my) 10.1858 Tj
+-295 TJm
+(kno) 11.9552 Tj
+25 TJm
+(wledge,) 25.0102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+208.544 436.279 Td
+/F124_0 7.9701 Tf
+(bzip2) 23.9103 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+234.81 436.279 Td
+/F122_0 7.9701 Tf
+(and) 11.5088 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+248.674 436.279 Td
+/F124_0 7.9701 Tf
+(libbzip2) 38.2565 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+289.286 436.279 Td
+/F122_0 7.9701 Tf
+(do) 7.9701 Tj
+-296 TJm
+(not) 10.1858 Tj
+-295 TJm
+(use) 10.6241 Tj
+-296 TJm
+(an) 7.5238 Tj
+15 TJm
+(y) 3.9851 Tj
+-295 TJm
+(patented) 27.0027 Tj
+-296 TJm
+(algorithms.) 36.0886 Tj
+-893 TJm
+(Ho) 9.7395 Tj
+25 TJm
+(we) 9.2931 Tj
+25 TJm
+(v) 3.9851 Tj
+15 TJm
+(er) 6.1928 Tj
+40 TJm
+(,) 1.9925 Tj
+-307 TJm
+(I) 2.654 Tj
+-295 TJm
+(do) 7.9701 Tj
+-296 TJm
+(not) 10.1858 Tj
+-295 TJm
+(ha) 7.5238 Tj
+20 TJm
+(v) 3.9851 Tj
+15 TJm
+(e) 3.5387 Tj
+-296 TJm
+(the) 9.7395 Tj
+-295 TJm
+(resources) 30.0951 Tj
+-296 TJm
+(to) 6.2007 Tj
+72 426.715 Td
+(carry) 16.3706 Tj
+-250 TJm
+(out) 10.1858 Tj
+-250 TJm
+(a) 3.5387 Tj
+-250 TJm
+(patent) 19.4789 Tj
+-250 TJm
+(search.) 22.3482 Tj
+-620 TJm
+(Therefore) 31.4181 Tj
+-250 TJm
+(I) 2.654 Tj
+-250 TJm
+(cannot) 21.2483 Tj
+-250 TJm
+(gi) 6.2007 Tj
+25 TJm
+(v) 3.9851 Tj
+15 TJm
+(e) 3.5387 Tj
+-250 TJm
+(an) 7.5238 Tj
+15 TJm
+(y) 3.9851 Tj
+-250 TJm
+(guarantee) 30.9798 Tj
+-250 TJm
+(of) 6.6391 Tj
+-250 TJm
+(the) 9.7395 Tj
+-250 TJm
+(abo) 11.5088 Tj
+15 TJm
+(v) 3.9851 Tj
+15 TJm
+(e) 3.5387 Tj
+-250 TJm
+(statement.) 32.5419 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 3 3
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 707.441 Td
+/F116_0 17.2154 Tf
+(T) 10.5186 Tj
+80 TJm
+(ab) 20.0904 Tj
+10 TJm
+(le) 14.3576 Tj
+-278 TJm
+(of) 16.2513 Tj
+-278 TJm
+(Contents) 74.5943 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 686.878 Td
+/F122_0 9.9626 Tf
+(1.) 7.472 Tj
+-310 TJm
+(Introduction) 49.2551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.733 686.878 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 686.878 Td
+/F122_0 9.9626 Tf
+(1) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 674.923 Td
+(2.) 7.472 Tj
+-310 TJm
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+167.054 674.923 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 674.923 Td
+/F122_0 9.9626 Tf
+(2) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 662.968 Td
+(2.1.) 14.9439 Tj
+-310 TJm
+(N) 7.193 Tj
+35 TJm
+(AME) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+132.691 662.968 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 662.968 Td
+/F122_0 9.9626 Tf
+(2) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 651.013 Td
+(2.2.) 14.9439 Tj
+-310 TJm
+(SYNOPSIS) 47.0534 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+150.582 651.013 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 651.013 Td
+/F122_0 9.9626 Tf
+(2) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 639.058 Td
+(2.3.) 14.9439 Tj
+-310 TJm
+(DESCRIPTION) 64.7569 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+168.29 639.058 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 639.058 Td
+/F122_0 9.9626 Tf
+(3) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 627.103 Td
+(2.4.) 14.9439 Tj
+-310 TJm
+(OPTIONS) 42.0621 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.873 627.103 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 627.103 Td
+/F122_0 9.9626 Tf
+(4) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 615.147 Td
+(2.5.) 14.9439 Tj
+-310 TJm
+(MEMOR) 37.6387 Tj
+65 TJm
+(Y) 7.193 Tj
+-250 TJm
+(MAN) 23.2427 Tj
+35 TJm
+(A) 7.193 Tj
+40 TJm
+(GEMENT) 41.5042 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.412 615.147 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 615.147 Td
+/F122_0 9.9626 Tf
+(5) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 603.192 Td
+(2.6.) 14.9439 Tj
+-310 TJm
+(RECO) 26.5703 Tj
+50 TJm
+(VERING) 37.6287 Tj
+-250 TJm
+(D) 7.193 Tj
+40 TJm
+(A) 7.193 Tj
+111 TJm
+(T) 6.0871 Tj
+93 TJm
+(A) 7.193 Tj
+-250 TJm
+(FR) 12.1843 Tj
+40 TJm
+(OM) 16.0497 Tj
+-250 TJm
+(D) 7.193 Tj
+40 TJm
+(AMA) 23.2427 Tj
+40 TJm
+(GED) 20.4731 Tj
+-250 TJm
+(FILES) 26.5703 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+308.464 603.192 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 603.192 Td
+/F122_0 9.9626 Tf
+(6) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 591.237 Td
+(2.7.) 14.9439 Tj
+-310 TJm
+(PERFORMANCE) 73.6236 Tj
+-250 TJm
+(NO) 14.386 Tj
+40 TJm
+(TES) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+211.958 591.237 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 591.237 Td
+/F122_0 9.9626 Tf
+(6) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 579.282 Td
+(2.8.) 14.9439 Tj
+-310 TJm
+(CA) 13.8381 Tj
+135 TJm
+(VEA) 20.4731 Tj
+111 TJm
+(TS) 11.6264 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+148.799 579.282 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 579.282 Td
+/F122_0 9.9626 Tf
+(7) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 567.327 Td
+(2.9.) 14.9439 Tj
+-310 TJm
+(A) 7.193 Tj
+55 TJm
+(UTHOR) 34.3112 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.32 567.327 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 567.327 Td
+/F122_0 9.9626 Tf
+(7) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 555.372 Td
+(3.) 7.472 Tj
+-310 TJm
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+160.049 555.372 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+224.856 555.372 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 555.372 Td
+/F122_0 9.9626 Tf
+(8) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 543.416 Td
+(3.1.) 14.9439 Tj
+-310 TJm
+(T) 6.0871 Tj
+80 TJm
+(op-le) 20.4731 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(structure) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+179.997 543.416 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 543.416 Td
+/F122_0 9.9626 Tf
+(8) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 531.461 Td
+(3.1.1.) 22.4159 Tj
+-310 TJm
+(Lo) 11.0684 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(summary) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+192.866 531.461 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 531.461 Td
+/F122_0 9.9626 Tf
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 519.506 Td
+(3.1.2.) 22.4159 Tj
+-310 TJm
+(High-le) 30.4357 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(summary) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.822 519.506 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 519.506 Td
+/F122_0 9.9626 Tf
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 507.551 Td
+(3.1.3.) 22.4159 Tj
+-310 TJm
+(Utility) 26.0223 Tj
+-250 TJm
+(functions) 37.0808 Tj
+-250 TJm
+(summary) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.582 507.551 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 507.551 Td
+/F122_0 9.9626 Tf
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 495.596 Td
+(3.2.) 14.9439 Tj
+-310 TJm
+(Error) 21.0211 Tj
+-250 TJm
+(handling) 34.8691 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+162.611 495.596 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 495.596 Td
+/F122_0 9.9626 Tf
+(10) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 483.64 Td
+(3.3.) 14.9439 Tj
+-310 TJm
+(Lo) 11.0684 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+181.045 483.64 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 483.64 Td
+/F122_0 9.9626 Tf
+(11) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 471.685 Td
+(3.3.1.) 22.4159 Tj
+-310 TJm
+(BZ2_bzCompressInit) 85.7879 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+197.762 471.685 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 471.685 Td
+/F122_0 9.9626 Tf
+(11) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 459.73 Td
+(3.3.2.) 22.4159 Tj
+-310 TJm
+(BZ2_bzCompress) 71.9499 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+184.201 459.73 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 459.73 Td
+/F122_0 9.9626 Tf
+(13) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 447.775 Td
+(3.3.3.) 22.4159 Tj
+-310 TJm
+(BZ2_bzCompressEnd) 87.9996 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+198.868 447.775 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 447.775 Td
+/F122_0 9.9626 Tf
+(16) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 435.82 Td
+(3.3.4.) 22.4159 Tj
+-310 TJm
+(BZ2_bzDecompressInit) 95.1827 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+206.887 435.82 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 435.82 Td
+/F122_0 9.9626 Tf
+(16) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 423.865 Td
+(3.3.5.) 22.4159 Tj
+-310 TJm
+(BZ2_bzDecompress) 81.3446 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.326 423.865 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 423.865 Td
+/F122_0 9.9626 Tf
+(17) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 411.909 Td
+(3.3.6.) 22.4159 Tj
+-310 TJm
+(BZ2_bzDecompressEnd) 97.3944 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.207 411.909 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 411.909 Td
+/F122_0 9.9626 Tf
+(18) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 399.954 Td
+(3.4.) 14.9439 Tj
+-310 TJm
+(High-le) 30.4357 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+184.216 399.954 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 399.954 Td
+/F122_0 9.9626 Tf
+(18) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 387.999 Td
+(3.4.1.) 22.4159 Tj
+-310 TJm
+(BZ2_bzReadOpen) 74.1516 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+185.302 387.999 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 387.999 Td
+/F122_0 9.9626 Tf
+(19) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 376.044 Td
+(3.4.2.) 22.4159 Tj
+-310 TJm
+(BZ2_bzRead) 52.5726 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+163.443 376.044 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 376.044 Td
+/F122_0 9.9626 Tf
+(20) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 364.089 Td
+(3.4.3.) 22.4159 Tj
+-310 TJm
+(BZ2_bzReadGetUnused) 97.3944 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.207 364.089 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 364.089 Td
+/F122_0 9.9626 Tf
+(21) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 352.134 Td
+(3.4.4.) 22.4159 Tj
+-310 TJm
+(BZ2_bzReadClose) 75.2674 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.074 352.134 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 352.134 Td
+/F122_0 9.9626 Tf
+(22) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 340.178 Td
+(3.4.5.) 22.4159 Tj
+-310 TJm
+(BZ2_bzWriteOpen) 76.3633 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.622 340.178 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 340.178 Td
+/F122_0 9.9626 Tf
+(22) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 328.223 Td
+(3.4.6.) 22.4159 Tj
+-310 TJm
+(BZ2_bzWrite) 54.7843 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.763 328.223 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 328.223 Td
+/F122_0 9.9626 Tf
+(23) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 316.268 Td
+(3.4.7.) 22.4159 Tj
+-310 TJm
+(BZ2_bzWriteClose) 77.4791 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+189.179 316.268 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 316.268 Td
+/F122_0 9.9626 Tf
+(23) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 304.313 Td
+(3.4.8.) 22.4159 Tj
+-310 TJm
+(Handling) 37.0808 Tj
+-250 TJm
+(embedded) 40.9463 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(streams) 30.4357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.601 304.313 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 304.313 Td
+/F122_0 9.9626 Tf
+(24) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 292.358 Td
+(3.4.9.) 22.4159 Tj
+-310 TJm
+(Standard) 35.417 Tj
+-250 TJm
+(\002le-reading/writing) 77.4791 Tj
+-250 TJm
+(code) 18.8094 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+247.564 292.358 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 292.358 Td
+/F122_0 9.9626 Tf
+(25) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 280.403 Td
+(3.5.) 14.9439 Tj
+-310 TJm
+(Utility) 26.0223 Tj
+-250 TJm
+(functions) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+170.645 280.403 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 280.403 Td
+/F122_0 9.9626 Tf
+(26) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 268.447 Td
+(3.5.1.) 22.4159 Tj
+-310 TJm
+(BZ2_bzBuf) 47.0434 Tj
+25 TJm
+(fT) 9.4047 Tj
+80 TJm
+(oBuf) 19.9252 Tj
+25 TJm
+(fCompress) 43.1679 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+229.488 268.447 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 268.447 Td
+/F122_0 9.9626 Tf
+(26) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 256.492 Td
+(3.5.2.) 22.4159 Tj
+-310 TJm
+(BZ2_bzBuf) 47.0434 Tj
+25 TJm
+(fT) 9.4047 Tj
+80 TJm
+(oBuf) 19.9252 Tj
+25 TJm
+(fDecompress) 52.5627 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+238.613 256.492 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 256.492 Td
+/F122_0 9.9626 Tf
+(27) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 244.537 Td
+(3.6.) 14.9439 Tj
+-310 TJm
+(zlib) 14.9439 Tj
+-250 TJm
+(compatibility) 53.1405 Tj
+-250 TJm
+(functions) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+215.06 244.537 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 244.537 Td
+/F122_0 9.9626 Tf
+(28) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 232.582 Td
+(3.7.) 14.9439 Tj
+-310 TJm
+(Using) 23.8007 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(stdio-free) 38.1767 Tj
+-250 TJm
+(en) 9.4047 Tj
+40 TJm
+(vironment) 40.9562 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+282.092 232.582 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 232.582 Td
+/F122_0 9.9626 Tf
+(28) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 220.627 Td
+(3.7.1.) 22.4159 Tj
+-310 TJm
+(Getting) 29.8878 Tj
+-250 TJm
+(rid) 11.0684 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(stdio) 19.3773 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.492 220.627 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 220.627 Td
+/F122_0 9.9626 Tf
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 208.671 Td
+(3.7.2.) 22.4159 Tj
+-310 TJm
+(Critical) 29.8878 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(handling) 34.8691 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+201.629 208.671 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 208.671 Td
+/F122_0 9.9626 Tf
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 196.716 Td
+(3.8.) 14.9439 Tj
+-310 TJm
+(Making) 30.9936 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(W) 9.4047 Tj
+40 TJm
+(indo) 17.7135 Tj
+25 TJm
+(ws) 11.0684 Tj
+-250 TJm
+(DLL) 19.3673 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.243 196.716 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 196.716 Td
+/F122_0 9.9626 Tf
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 184.761 Td
+(4.) 7.472 Tj
+-310 TJm
+(Miscellanea) 48.1393 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+144.898 184.761 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 184.761 Td
+/F122_0 9.9626 Tf
+(31) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 172.806 Td
+(4.1.) 14.9439 Tj
+-310 TJm
+(Limitations) 45.9475 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(format) 26.5603 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+269.154 172.806 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 172.806 Td
+/F122_0 9.9626 Tf
+(31) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 160.851 Td
+(4.2.) 14.9439 Tj
+-310 TJm
+(Portability) 42.0721 Tj
+-250 TJm
+(issues) 23.8007 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.03 160.851 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 160.851 Td
+/F122_0 9.9626 Tf
+(32) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 148.896 Td
+(4.3.) 14.9439 Tj
+-310 TJm
+(Reporting) 39.8504 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ugs) 13.8381 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.115 148.896 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 148.896 Td
+/F122_0 9.9626 Tf
+(32) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 136.94 Td
+(4.4.) 14.9439 Tj
+-310 TJm
+(Did) 14.9439 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(get) 12.1743 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(right) 18.8194 Tj
+-250 TJm
+(package?) 37.0609 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+229.109 136.94 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 136.94 Td
+/F122_0 9.9626 Tf
+(33) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 124.985 Td
+(4.5.) 14.9439 Tj
+-310 TJm
+(Further) 29.3299 Tj
+-250 TJm
+(Reading) 33.2053 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+170.361 124.985 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 124.985 Td
+/F122_0 9.9626 Tf
+(34) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+536.068 50.852 Td
+(iii) 8.3088 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 1 4
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 701.916 Td
+/F116_0 24.7902 Tf
+(1.) 20.675 Tj
+-278 TJm
+(Intr) 39.937 Tj
+20 TJm
+(oduction) 104.6642 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 679.998 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.507 679.998 Td
+/F122_0 9.9626 Tf
+(compresses) 45.9276 Tj
+-263 TJm
+(\002les) 16.6077 Tj
+-263 TJm
+(using) 21.589 Tj
+-263 TJm
+(the) 12.1743 Tj
+-262 TJm
+(Burro) 23.2427 Tj
+25 TJm
+(ws-Wheeler) 48.1293 Tj
+-263 TJm
+(block-sorting) 53.1305 Tj
+-263 TJm
+(te) 7.193 Tj
+15 TJm
+(xt) 7.7509 Tj
+-263 TJm
+(compression) 50.3609 Tj
+-263 TJm
+(algorithm,) 41.2352 Tj
+-266 TJm
+(and) 14.386 Tj
+-263 TJm
+(Huf) 15.4918 Tj
+25 TJm
+(fman) 20.4731 Tj
+-263 TJm
+(coding.) 29.6088 Tj
+72 668.043 Td
+(Compression) 52.5826 Tj
+-203 TJm
+(is) 6.6451 Tj
+-204 TJm
+(generally) 37.0708 Tj
+-203 TJm
+(considerably) 50.9089 Tj
+-203 TJm
+(better) 22.6848 Tj
+-204 TJm
+(t) 2.7696 Tj
+1 TJm
+(han) 14.386 Tj
+-204 TJm
+(that) 14.9439 Tj
+-203 TJm
+(achie) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ed) 9.4047 Tj
+-203 TJm
+(by) 9.9626 Tj
+-204 TJm
+(more) 20.4731 Tj
+-203 TJm
+(con) 14.386 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(entional) 32.0995 Tj
+-203 TJm
+(LZ77/LZ78-based) 73.0458 Tj
+-204 TJm
+(compressors,) 52.2937 Tj
+72 656.087 Td
+(and) 14.386 Tj
+-250 TJm
+(approaches) 44.8118 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(performance) 50.341 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(PPM) 19.9352 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(amily) 22.6948 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(statistical) 37.6387 Tj
+-250 TJm
+(compressors.) 52.2937 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 634.17 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+105.074 634.17 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-320 TJm
+(b) 4.9813 Tj
+20 TJm
+(uilt) 13.2901 Tj
+-319 TJm
+(on) 9.9626 Tj
+-320 TJm
+(top) 12.7322 Tj
+-320 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+176.712 634.17 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+224.533 634.17 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-337 TJm
+(a) 4.4234 Tj
+-320 TJm
+(\003e) 9.9626 Tj
+15 TJm
+(xible) 19.9252 Tj
+-320 TJm
+(library) 26.5603 Tj
+-319 TJm
+(for) 11.6164 Tj
+-320 TJm
+(handling) 34.8691 Tj
+-320 TJm
+(compressed) 47.0334 Tj
+-320 TJm
+(data) 16.5977 Tj
+-319 TJm
+(in) 7.7509 Tj
+-320 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+449.816 634.17 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+482.889 634.17 Td
+/F122_0 9.9626 Tf
+(format.) 29.0509 Tj
+-1039 TJm
+(This) 17.7135 Tj
+72 622.214 Td
+(manual) 29.3299 Tj
+-316 TJm
+(describes) 37.0708 Tj
+-316 TJm
+(both) 17.7135 Tj
+-317 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-316 TJm
+(to) 7.7509 Tj
+-316 TJm
+(use) 13.2801 Tj
+-316 TJm
+(the) 12.1743 Tj
+-316 TJm
+(program) 33.7533 Tj
+-316 TJm
+(and) 14.386 Tj
+-317 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-316 TJm
+(to) 7.7509 Tj
+-316 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-316 TJm
+(with) 17.7135 Tj
+-316 TJm
+(the) 12.1743 Tj
+-317 TJm
+(library) 26.5603 Tj
+-316 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace.) 15.7608 Tj
+-1017 TJm
+(Most) 20.4831 Tj
+-316 TJm
+(of) 8.2988 Tj
+-316 TJm
+(the) 12.1743 Tj
+-317 TJm
+(manual) 29.3299 Tj
+-316 TJm
+(is) 6.6451 Tj
+72 610.259 Td
+(de) 9.4047 Tj
+25 TJm
+(v) 4.9813 Tj
+20 TJm
+(oted) 17.1556 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(program,) 36.2439 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(good) 19.9252 Tj
+-250 TJm
+(ne) 9.4047 Tj
+25 TJm
+(ws) 11.0684 Tj
+-250 TJm
+(if) 6.0871 Tj
+-250 TJm
+(your) 18.2614 Tj
+-250 TJm
+(interest) 29.3299 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(only) 17.7135 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(program.) 36.2439 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 578.379 Td
+(\225) 3.4869 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-450 TJm
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-278 TJm
+(to) 7.7509 Tj
+-278 TJm
+(use) 13.2801 Tj
+-277 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-278 TJm
+([2]) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-278 TJm
+(describes) 37.0708 Tj
+-278 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-278 TJm
+(to) 7.7509 Tj
+-278 TJm
+(use) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+256.282 578.379 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+286.17 578.379 Td
+/F122_0 9.9626 Tf
+(;) 2.7696 Tj
+-292 TJm
+(this) 14.396 Tj
+-278 TJm
+(is) 6.6451 Tj
+-277 TJm
+(the) 12.1743 Tj
+-278 TJm
+(only) 17.7135 Tj
+-278 TJm
+(part) 15.4918 Tj
+-278 TJm
+(you) 14.9439 Tj
+-278 TJm
+(need) 18.8094 Tj
+-278 TJm
+(to) 7.7509 Tj
+-277 TJm
+(read) 17.1456 Tj
+-278 TJm
+(if) 6.0871 Tj
+-278 TJm
+(you) 14.9439 Tj
+-278 TJm
+(just) 14.396 Tj
+-278 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-277 TJm
+(to) 7.7509 Tj
+-278 TJm
+(kno) 14.9439 Tj
+25 TJm
+(w) 7.193 Tj
+81.963 566.424 Td
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(operate) 29.3199 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(program.) 36.2439 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 544.506 Td
+(\225) 3.4869 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-450 TJm
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(libbzip2) 32.6574 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+([8]) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(describes) 37.0708 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(programming) 54.2364 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(aces) 17.1456 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(detail,) 24.6275 Tj
+-250 TJm
+(and) 14.386 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 522.588 Td
+(\225) 3.4869 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-450 TJm
+(Miscellanea) 48.1393 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+([31]) 16.5977 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(records) 29.3199 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(miscellaneous) 56.4481 Tj
+-250 TJm
+(notes) 21.031 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(I) 3.3175 Tj
+-250 TJm
+(thought) 30.4457 Tj
+-250 TJm
+(ought) 22.6948 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(recorded) 34.8492 Tj
+-250 TJm
+(some) 21.031 Tj
+25 TJm
+(where.) 26.8293 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.852 Td
+(1) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 2 5
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 701.916 Td
+/F116_0 24.7902 Tf
+(2.) 20.675 Tj
+-278 TJm
+(Ho) 33.0453 Tj
+15 TJm
+(w) 19.2868 Tj
+-278 TJm
+(to) 23.4019 Tj
+-278 TJm
+(use) 42.7135 Tj
+-278 TJm
+(bzip2) 63.3638 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 656.35 Td
+/F116_0 17.2154 Tf
+(T) 10.5186 Tj
+80 TJm
+(ab) 20.0904 Tj
+10 TJm
+(le) 14.3576 Tj
+-278 TJm
+(of) 16.2513 Tj
+-278 TJm
+(Contents) 74.5943 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 635.788 Td
+/F122_0 9.9626 Tf
+(2.1.) 14.9439 Tj
+-310 TJm
+(N) 7.193 Tj
+35 TJm
+(AME) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+132.691 635.788 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 635.788 Td
+/F122_0 9.9626 Tf
+(2) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 623.832 Td
+(2.2.) 14.9439 Tj
+-310 TJm
+(SYNOPSIS) 47.0534 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+150.582 623.832 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 623.832 Td
+/F122_0 9.9626 Tf
+(2) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 611.877 Td
+(2.3.) 14.9439 Tj
+-310 TJm
+(DESCRIPTION) 64.7569 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+168.29 611.877 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 611.877 Td
+/F122_0 9.9626 Tf
+(3) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 599.922 Td
+(2.4.) 14.9439 Tj
+-310 TJm
+(OPTIONS) 42.0621 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.873 599.922 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 599.922 Td
+/F122_0 9.9626 Tf
+(4) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 587.967 Td
+(2.5.) 14.9439 Tj
+-310 TJm
+(MEMOR) 37.6387 Tj
+65 TJm
+(Y) 7.193 Tj
+-250 TJm
+(MAN) 23.2427 Tj
+35 TJm
+(A) 7.193 Tj
+40 TJm
+(GEMENT) 41.5042 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.412 587.967 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 587.967 Td
+/F122_0 9.9626 Tf
+(5) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 576.012 Td
+(2.6.) 14.9439 Tj
+-310 TJm
+(RECO) 26.5703 Tj
+50 TJm
+(VERING) 37.6287 Tj
+-250 TJm
+(D) 7.193 Tj
+40 TJm
+(A) 7.193 Tj
+111 TJm
+(T) 6.0871 Tj
+93 TJm
+(A) 7.193 Tj
+-250 TJm
+(FR) 12.1843 Tj
+40 TJm
+(OM) 16.0497 Tj
+-250 TJm
+(D) 7.193 Tj
+40 TJm
+(AMA) 23.2427 Tj
+40 TJm
+(GED) 20.4731 Tj
+-250 TJm
+(FILES) 26.5703 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+308.464 576.012 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 576.012 Td
+/F122_0 9.9626 Tf
+(6) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 564.057 Td
+(2.7.) 14.9439 Tj
+-310 TJm
+(PERFORMANCE) 73.6236 Tj
+-250 TJm
+(NO) 14.386 Tj
+40 TJm
+(TES) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+211.958 564.057 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 564.057 Td
+/F122_0 9.9626 Tf
+(6) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 552.101 Td
+(2.8.) 14.9439 Tj
+-310 TJm
+(CA) 13.8381 Tj
+135 TJm
+(VEA) 20.4731 Tj
+111 TJm
+(TS) 11.6264 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+148.799 552.101 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 552.101 Td
+/F122_0 9.9626 Tf
+(7) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 540.146 Td
+(2.9.) 14.9439 Tj
+-310 TJm
+(A) 7.193 Tj
+55 TJm
+(UTHOR) 34.3112 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.32 540.146 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 540.146 Td
+/F122_0 9.9626 Tf
+(7) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 508.266 Td
+(This) 17.7135 Tj
+-250 TJm
+(chapter) 29.3199 Tj
+-250 TJm
+(contains) 33.2053 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(cop) 14.386 Tj
+10 TJm
+(y) 4.9813 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+213.837 508.266 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+246.215 508.266 Td
+/F122_0 9.9626 Tf
+(man) 17.1556 Tj
+-250 TJm
+(page,) 21.3 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(nothing) 30.4457 Tj
+-250 TJm
+(else.) 17.9825 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 473.513 Td
+/F116_0 20.6585 Tf
+(2.1.) 34.4584 Tj
+-278 TJm
+(NAME) 60.8186 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 441.632 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 441.632 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+112.349 441.632 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+117.33 441.632 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.664 441.632 Td
+/F122_0 9.9626 Tf
+(-) 3.3175 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(block-sorting) 53.1305 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(compressor) 45.9276 Tj
+40 TJm
+(,) 2.4907 Tj
+-250 TJm
+(v1.0.6) 24.9065 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 419.715 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 419.715 Td
+/F124_0 9.9626 Tf
+(bzcat) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+114.839 419.715 Td
+/F122_0 9.9626 Tf
+(-) 3.3175 Tj
+-250 TJm
+(decompresses) 55.3323 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(stdout) 24.3586 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 397.797 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 397.797 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+156.682 397.797 Td
+/F122_0 9.9626 Tf
+(-) 3.3175 Tj
+-250 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ers) 11.6164 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(damaged) 35.965 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 353.081 Td
+/F116_0 20.6585 Tf
+(2.2.) 34.4584 Tj
+-278 TJm
+(SYNOPSIS) 105.6269 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 321.201 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 321.201 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+114.839 321.201 Td
+/F122_0 9.9626 Tf
+([) 3.3175 Tj
+-250 TJm
+(-cdfkqstvzVL123456789) 100.164 Tj
+-250 TJm
+(]) 3.3175 Tj
+-250 TJm
+([) 3.3175 Tj
+-250 TJm
+(\002lenames) 38.1866 Tj
+-250 TJm
+(...) 7.472 Tj
+-620 TJm
+(]) 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 299.283 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 299.283 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+126.795 299.283 Td
+/F122_0 9.9626 Tf
+([) 3.3175 Tj
+-250 TJm
+(-fkvsVL) 33.7533 Tj
+-250 TJm
+(]) 3.3175 Tj
+-250 TJm
+([) 3.3175 Tj
+-250 TJm
+(\002lenames) 38.1866 Tj
+-250 TJm
+(...) 7.472 Tj
+-620 TJm
+(]) 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 277.365 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 277.365 Td
+/F124_0 9.9626 Tf
+(bzcat) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+114.839 277.365 Td
+/F122_0 9.9626 Tf
+([) 3.3175 Tj
+-250 TJm
+(-s) 7.193 Tj
+-250 TJm
+(]) 3.3175 Tj
+-250 TJm
+([) 3.3175 Tj
+-250 TJm
+(\002lenames) 38.1866 Tj
+-250 TJm
+(...) 7.472 Tj
+-620 TJm
+(]) 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 255.447 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 255.447 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+156.683 255.447 Td
+/F122_0 9.9626 Tf
+(\002lename) 34.3112 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.852 Td
+(2) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 3 6
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+477.109 749.245 Td
+/F122_0 9.9626 Tf
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 704.93 Td
+/F116_0 20.6585 Tf
+(2.3.) 34.4584 Tj
+-278 TJm
+(DESCRIPTION) 141.1802 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 683.012 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.56 683.012 Td
+/F122_0 9.9626 Tf
+(compresses) 45.9276 Tj
+-268 TJm
+(\002les) 16.6077 Tj
+-268 TJm
+(using) 21.589 Tj
+-268 TJm
+(the) 12.1743 Tj
+-269 TJm
+(Burro) 23.2427 Tj
+25 TJm
+(ws-Wheeler) 48.1293 Tj
+-268 TJm
+(block) 22.1369 Tj
+-268 TJm
+(sorting) 27.6761 Tj
+-268 TJm
+(te) 7.193 Tj
+15 TJm
+(xt) 7.7509 Tj
+-268 TJm
+(compression) 50.3609 Tj
+-268 TJm
+(algorithm,) 41.2352 Tj
+-273 TJm
+(and) 14.386 Tj
+-268 TJm
+(Huf) 15.4918 Tj
+25 TJm
+(fman) 20.4731 Tj
+-268 TJm
+(coding.) 29.6088 Tj
+72 671.057 Td
+(Compression) 52.5826 Tj
+-203 TJm
+(is) 6.6451 Tj
+-204 TJm
+(generally) 37.0708 Tj
+-203 TJm
+(considerably) 50.9089 Tj
+-203 TJm
+(better) 22.6848 Tj
+-204 TJm
+(t) 2.7696 Tj
+1 TJm
+(han) 14.386 Tj
+-204 TJm
+(that) 14.9439 Tj
+-203 TJm
+(achie) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ed) 9.4047 Tj
+-203 TJm
+(by) 9.9626 Tj
+-204 TJm
+(more) 20.4731 Tj
+-203 TJm
+(con) 14.386 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(entional) 32.0995 Tj
+-203 TJm
+(LZ77/LZ78-based) 73.0458 Tj
+-204 TJm
+(compressors,) 52.2937 Tj
+72 659.101 Td
+(and) 14.386 Tj
+-250 TJm
+(approaches) 44.8118 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(performance) 50.341 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(PPM) 19.9352 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(amily) 22.6948 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(statistical) 37.6387 Tj
+-250 TJm
+(compressors.) 52.2937 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 637.184 Td
+(The) 15.4918 Tj
+-250 TJm
+(command-line) 57.5539 Tj
+-250 TJm
+(options) 29.3399 Tj
+-250 TJm
+(are) 12.1643 Tj
+-250 TJm
+(deliberately) 47.0334 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-250 TJm
+(similar) 27.6761 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(those) 21.031 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(GNU) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+364.869 637.184 Td
+/F124_0 9.9626 Tf
+(gzip) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+388.779 637.184 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(are) 12.1643 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(identical.) 36.8018 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 615.266 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+105.175 615.266 Td
+/F122_0 9.9626 Tf
+(e) 4.4234 Tj
+15 TJm
+(xpects) 25.4544 Tj
+-330 TJm
+(a) 4.4234 Tj
+-330 TJm
+(list) 12.1843 Tj
+-330 TJm
+(of) 8.2988 Tj
+-330 TJm
+(\002le) 12.7322 Tj
+-329 TJm
+(names) 25.4544 Tj
+-330 TJm
+(to) 7.7509 Tj
+-330 TJm
+(accompan) 40.3884 Tj
+15 TJm
+(y) 4.9813 Tj
+-330 TJm
+(the) 12.1743 Tj
+-330 TJm
+(command-line) 57.5539 Tj
+-330 TJm
+(\003ags.) 21.31 Tj
+-1099 TJm
+(Each) 19.9152 Tj
+-330 TJm
+(\002le) 12.7322 Tj
+-330 TJm
+(is) 6.6451 Tj
+-330 TJm
+(replaced) 33.7433 Tj
+-330 TJm
+(by) 9.9626 Tj
+-330 TJm
+(a) 4.4234 Tj
+-330 TJm
+(compressed) 47.0334 Tj
+72 603.311 Td
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-349 TJm
+(of) 8.2988 Tj
+-348 TJm
+(itself,) 22.4159 Tj
+-373 TJm
+(with) 17.7135 Tj
+-349 TJm
+(the) 12.1743 Tj
+-349 TJm
+(name) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+204.444 603.311 Td
+/F124_0 9.9626 Tf
+(original_name.bz2) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+306.063 603.311 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1212 TJm
+(Each) 19.9152 Tj
+-348 TJm
+(compressed) 47.0334 Tj
+-349 TJm
+(\002le) 12.7322 Tj
+-348 TJm
+(has) 13.2801 Tj
+-349 TJm
+(the) 12.1743 Tj
+-348 TJm
+(same) 20.4731 Tj
+-349 TJm
+(modi\002cation) 50.3709 Tj
+-349 TJm
+(date,) 19.0883 Tj
+72 591.356 Td
+(permissions,) 50.092 Tj
+-344 TJm
+(and,) 16.8766 Tj
+-344 TJm
+(when) 21.579 Tj
+-325 TJm
+(possible,) 35.1481 Tj
+-344 TJm
+(o) 4.9813 Tj
+25 TJm
+(wnership) 36.5229 Tj
+-325 TJm
+(as) 8.2988 Tj
+-325 TJm
+(the) 12.1743 Tj
+-326 TJm
+(corresponding) 56.996 Tj
+-325 TJm
+(original,) 33.4843 Tj
+-344 TJm
+(so) 8.8568 Tj
+-325 TJm
+(that) 14.9439 Tj
+-325 TJm
+(these) 20.4731 Tj
+-325 TJm
+(properties) 39.8404 Tj
+-325 TJm
+(can) 13.8281 Tj
+-326 TJm
+(be) 9.4047 Tj
+-325 TJm
+(correctly) 35.4071 Tj
+72 579.4 Td
+(restored) 32.0895 Tj
+-308 TJm
+(at) 7.193 Tj
+-308 TJm
+(decompression) 59.7656 Tj
+-307 TJm
+(time.) 20.2042 Tj
+-484 TJm
+(File) 15.5018 Tj
+-308 TJm
+(name) 21.579 Tj
+-308 TJm
+(handling) 34.8691 Tj
+-308 TJm
+(is) 6.6451 Tj
+-307 TJm
+(nai) 12.1743 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-308 TJm
+(in) 7.7509 Tj
+-308 TJm
+(the) 12.1743 Tj
+-308 TJm
+(sense) 21.579 Tj
+-308 TJm
+(that) 14.9439 Tj
+-308 TJm
+(there) 19.9152 Tj
+-307 TJm
+(is) 6.6451 Tj
+-308 TJm
+(no) 9.9626 Tj
+-308 TJm
+(mechanism) 45.3796 Tj
+-308 TJm
+(for) 11.6164 Tj
+-308 TJm
+(preserving) 42.0521 Tj
+72 567.445 Td
+(original) 30.9936 Tj
+-334 TJm
+(\002le) 12.7322 Tj
+-333 TJm
+(names,) 27.9451 Tj
+-355 TJm
+(permissions,) 50.092 Tj
+-355 TJm
+(o) 4.9813 Tj
+25 TJm
+(wnerships) 40.3983 Tj
+-333 TJm
+(or) 8.2988 Tj
+-334 TJm
+(dates) 20.4731 Tj
+-334 TJm
+(in) 7.7509 Tj
+-333 TJm
+(\002lesystems) 44.2838 Tj
+-334 TJm
+(which) 24.3486 Tj
+-334 TJm
+(lack) 16.5977 Tj
+-333 TJm
+(these) 20.4731 Tj
+-334 TJm
+(concepts,) 37.3498 Tj
+-355 TJm
+(or) 8.2988 Tj
+-333 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-334 TJm
+(serious) 28.224 Tj
+-334 TJm
+(\002le) 12.7322 Tj
+72 555.49 Td
+(name) 21.579 Tj
+-250 TJm
+(length) 24.9065 Tj
+-250 TJm
+(restrictions,) 46.7644 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(as) 8.2988 Tj
+-250 TJm
+(MS-DOS.) 40.1294 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 533.572 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.379 533.572 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+121.255 533.572 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+165.589 533.572 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault) 14.9439 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(erwrite) 28.2141 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xisting) 27.1282 Tj
+-250 TJm
+(\002les.) 19.0983 Tj
+-620 TJm
+(If) 6.6351 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(happen,) 31.2626 Tj
+-250 TJm
+(specify) 28.772 Tj
+-250 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+495.977 533.572 Td
+/F124_0 9.9626 Tf
+(-f) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+510.423 533.572 Td
+/F122_0 9.9626 Tf
+(\003ag.) 17.4346 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 511.654 Td
+(If) 6.6351 Tj
+-284 TJm
+(no) 9.9626 Tj
+-285 TJm
+(\002le) 12.7322 Tj
+-284 TJm
+(names) 25.4544 Tj
+-284 TJm
+(are) 12.1643 Tj
+-284 TJm
+(speci\002ed,) 37.9077 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.935 511.654 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+226.655 511.654 Td
+/F122_0 9.9626 Tf
+(compresses) 45.9276 Tj
+-284 TJm
+(from) 19.3673 Tj
+-285 TJm
+(standard) 33.7533 Tj
+-284 TJm
+(input) 20.4831 Tj
+-284 TJm
+(to) 7.7509 Tj
+-284 TJm
+(standard) 33.7533 Tj
+-285 TJm
+(output.) 27.9551 Tj
+-825 TJm
+(In) 8.2988 Tj
+-285 TJm
+(this) 14.396 Tj
+-284 TJm
+(case,) 19.6363 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+491.778 511.654 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+524.499 511.654 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+72 499.699 Td
+(decline) 28.772 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(write) 20.4731 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(terminal,) 35.696 Tj
+-250 TJm
+(as) 8.2988 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(entirely) 30.4357 Tj
+-250 TJm
+(incomprehensible) 70.8341 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(therefore) 35.955 Tj
+-250 TJm
+(pointless.) 37.9177 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 477.781 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+116.176 477.781 Td
+/F122_0 9.9626 Tf
+(\(or) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+130.125 477.781 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+-600 TJm
+(-d) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+177.946 477.781 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-234 TJm
+(decompresses) 55.3323 Tj
+-234 TJm
+(all) 9.9626 Tj
+-234 TJm
+(speci\002ed) 35.417 Tj
+-235 TJm
+(\002les.) 19.0983 Tj
+-609 TJm
+(Files) 19.3773 Tj
+-234 TJm
+(which) 24.3486 Tj
+-234 TJm
+(were) 19.3573 Tj
+-234 TJm
+(not) 12.7322 Tj
+-235 TJm
+(created) 28.762 Tj
+-234 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+445.012 477.781 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+477.233 477.781 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-234 TJm
+(be) 9.4047 Tj
+-234 TJm
+(detected) 33.1954 Tj
+72 465.826 Td
+(and) 14.386 Tj
+-280 TJm
+(i) 2.7696 Tj
+1 TJm
+(gnored,) 30.1568 Tj
+-287 TJm
+(and) 14.386 Tj
+-280 TJm
+(a) 4.4234 Tj
+-279 TJm
+(w) 7.193 Tj
+10 TJm
+(arning) 25.4544 Tj
+-280 TJm
+(issued.) 27.3972 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.033 465.826 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+248.705 465.826 Td
+/F122_0 9.9626 Tf
+(attempts) 33.7633 Tj
+-279 TJm
+(to) 7.7509 Tj
+-280 TJm
+(guess) 22.1369 Tj
+-279 TJm
+(the) 12.1743 Tj
+-280 TJm
+(\002lename) 34.3112 Tj
+-279 TJm
+(for) 11.6164 Tj
+-280 TJm
+(the) 12.1743 Tj
+-279 TJm
+(decompressed) 56.4381 Tj
+-280 TJm
+(\002le) 12.7322 Tj
+-279 TJm
+(from) 19.3673 Tj
+-280 TJm
+(that) 14.9439 Tj
+-279 TJm
+(of) 8.2988 Tj
+-280 TJm
+(the) 12.1743 Tj
+72 453.871 Td
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(as) 8.2988 Tj
+-250 TJm
+(follo) 18.8194 Tj
+25 TJm
+(ws:) 13.8381 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 421.991 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 421.991 Td
+/F124_0 9.9626 Tf
+(filename.bz2) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+162.66 421.991 Td
+/F122_0 9.9626 Tf
+(becomes) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.01 421.991 Td
+/F124_0 9.9626 Tf
+(filename) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 400.073 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 400.073 Td
+/F124_0 9.9626 Tf
+(filename.bz) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+156.682 400.073 Td
+/F122_0 9.9626 Tf
+(becomes) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+194.032 400.073 Td
+/F124_0 9.9626 Tf
+(filename) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 378.155 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 378.155 Td
+/F124_0 9.9626 Tf
+(filename.tbz2) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+162.66 378.155 Td
+/F122_0 9.9626 Tf
+(becomes) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.01 378.155 Td
+/F124_0 9.9626 Tf
+(filename.tar) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 356.237 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 356.237 Td
+/F124_0 9.9626 Tf
+(filename.tbz) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+162.66 356.237 Td
+/F122_0 9.9626 Tf
+(becomes) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.01 356.237 Td
+/F124_0 9.9626 Tf
+(filename.tar) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 334.319 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 334.319 Td
+/F124_0 9.9626 Tf
+(anyothername) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+162.66 334.319 Td
+/F122_0 9.9626 Tf
+(becomes) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.01 334.319 Td
+/F124_0 9.9626 Tf
+(anyothername.out) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 312.402 Td
+/F122_0 9.9626 Tf
+(If) 6.6351 Tj
+-342 TJm
+(the) 12.1743 Tj
+-342 TJm
+(\002le) 12.7322 Tj
+-342 TJm
+(does) 18.2614 Tj
+-342 TJm
+(n) 4.9813 Tj
+-1 TJm
+(ot) 7.7509 Tj
+-342 TJm
+(end) 14.386 Tj
+-342 TJm
+(in) 7.7509 Tj
+-342 TJm
+(one) 14.386 Tj
+-342 TJm
+(of) 8.2988 Tj
+-342 TJm
+(the) 12.1743 Tj
+-342 TJm
+(recognised) 43.158 Tj
+-342 TJm
+(endings,) 33.4843 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+309.305 312.402 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+333.215 312.402 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+339.344 312.402 Td
+/F124_0 9.9626 Tf
+(.bz) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+357.276 312.402 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.405 312.402 Td
+/F124_0 9.9626 Tf
+(.tbz2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+396.702 312.402 Td
+/F122_0 9.9626 Tf
+(or) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+408.409 312.402 Td
+/F124_0 9.9626 Tf
+(.tbz) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+432.319 312.402 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+438.448 312.402 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+471.744 312.402 Td
+/F122_0 9.9626 Tf
+(complains) 40.9562 Tj
+-342 TJm
+(that) 14.9439 Tj
+-342 TJm
+(it) 5.5392 Tj
+72 300.446 Td
+(cannot) 26.5603 Tj
+-250 TJm
+(guess) 22.1369 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(name) 21.579 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(original) 30.9936 Tj
+-250 TJm
+(\002le,) 15.2229 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(uses) 17.1556 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(original) 30.9936 Tj
+-250 TJm
+(name) 21.579 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+370.009 300.446 Td
+/F124_0 9.9626 Tf
+(.out) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+396.41 300.446 Td
+/F122_0 9.9626 Tf
+(appended.) 40.6673 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 278.529 Td
+(As) 11.0684 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(compression,) 52.8516 Tj
+-250 TJm
+(supplying) 39.3025 Tj
+-250 TJm
+(no) 9.9626 Tj
+-250 TJm
+(\002lenames) 38.1866 Tj
+-250 TJm
+(causes) 26.0024 Tj
+-250 TJm
+(decompression) 59.7656 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(standard) 33.7533 Tj
+-250 TJm
+(input) 20.4831 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(standard) 33.7533 Tj
+-250 TJm
+(output.) 27.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 256.611 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+116.409 256.611 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-257 TJm
+(correctly) 35.4071 Tj
+-258 TJm
+(decompress) 47.0334 Tj
+-257 TJm
+(a) 4.4234 Tj
+-258 TJm
+(\002le) 12.7322 Tj
+-257 TJm
+(which) 24.3486 Tj
+-258 TJm
+(is) 6.6451 Tj
+-257 TJm
+(the) 12.1743 Tj
+-258 TJm
+(concatenation) 55.3323 Tj
+-257 TJm
+(of) 8.2988 Tj
+-258 TJm
+(tw) 9.9626 Tj
+10 TJm
+(o) 4.9813 Tj
+-258 TJm
+(or) 8.2988 Tj
+-257 TJm
+(more) 20.4731 Tj
+-258 TJm
+(compressed) 47.0334 Tj
+-257 TJm
+(\002les.) 19.0983 Tj
+-665 TJm
+(The) 15.4918 Tj
+-258 TJm
+(result) 22.1369 Tj
+-257 TJm
+(is) 6.6451 Tj
+72 244.656 Td
+(the) 12.1743 Tj
+-239 TJm
+(concatenation) 55.3323 Tj
+-238 TJm
+(of) 8.2988 Tj
+-239 TJm
+(the) 12.1743 Tj
+-239 TJm
+(corresponding) 56.996 Tj
+-239 TJm
+(uncompressed) 56.996 Tj
+-238 TJm
+(\002les.) 19.0983 Tj
+-613 TJm
+(Inte) 15.4918 Tj
+15 TJm
+(grity) 18.8194 Tj
+-238 TJm
+(testing) 26.5703 Tj
+-239 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+382.247 244.656 Td
+/F124_0 9.9626 Tf
+(-t) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+394.202 244.656 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-239 TJm
+(of) 8.2988 Tj
+-238 TJm
+(concatenated) 52.0048 Tj
+-239 TJm
+(compressed) 47.0334 Tj
+-239 TJm
+(\002les) 16.6077 Tj
+-239 TJm
+(is) 6.6451 Tj
+72 232.7 Td
+(also) 16.0497 Tj
+-250 TJm
+(supported.) 41.7831 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 210.783 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-399 TJm
+(can) 13.8281 Tj
+-399 TJm
+(also) 16.0497 Tj
+-399 TJm
+(compress) 37.6287 Tj
+-400 TJm
+(or) 8.2988 Tj
+-399 TJm
+(decompress) 47.0334 Tj
+-399 TJm
+(\002les) 16.6077 Tj
+-399 TJm
+(to) 7.7509 Tj
+-399 TJm
+(the) 12.1743 Tj
+-399 TJm
+(standard) 33.7533 Tj
+-399 TJm
+(output) 25.4644 Tj
+-399 TJm
+(by) 9.9626 Tj
+-400 TJm
+(gi) 7.7509 Tj
+25 TJm
+(ving) 17.7135 Tj
+-399 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+409.67 210.783 Td
+/F124_0 9.9626 Tf
+(-c) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+425.602 210.783 Td
+/F122_0 9.9626 Tf
+(\003ag.) 17.4346 Tj
+-757 TJm
+(Multiple) 34.3212 Tj
+-400 TJm
+(\002l) 8.3088 Tj
+1 TJm
+(es) 8.2988 Tj
+-400 TJm
+(may) 17.1556 Tj
+-399 TJm
+(be) 9.4047 Tj
+72 198.827 Td
+(compressed) 47.0334 Tj
+-367 TJm
+(and) 14.386 Tj
+-367 TJm
+(decompressed) 56.4381 Tj
+-367 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-367 TJm
+(this.) 16.8866 Tj
+-1321 TJm
+(The) 15.4918 Tj
+-367 TJm
+(resulting) 34.8691 Tj
+-367 TJm
+(outputs) 29.3399 Tj
+-367 TJm
+(are) 12.1643 Tj
+-367 TJm
+(fed) 12.7222 Tj
+-367 TJm
+(sequentially) 48.1492 Tj
+-366 TJm
+(to) 7.7509 Tj
+-367 TJm
+(stdout.) 26.8492 Tj
+-1322 TJm
+(Compression) 52.5826 Tj
+-367 TJm
+(of) 8.2988 Tj
+72 186.872 Td
+(multiple) 33.2153 Tj
+-289 TJm
+(\002les) 16.6077 Tj
+-289 TJm
+(in) 7.7509 Tj
+-289 TJm
+(this) 14.396 Tj
+-289 TJm
+(manner) 29.8778 Tj
+-288 TJm
+(generates) 37.6188 Tj
+-289 TJm
+(a) 4.4234 Tj
+-289 TJm
+(stream) 26.5603 Tj
+-289 TJm
+(containing) 42.0621 Tj
+-289 TJm
+(multiple) 33.2153 Tj
+-289 TJm
+(compressed) 47.0334 Tj
+-289 TJm
+(\002le) 12.7322 Tj
+-289 TJm
+(representations.) 62.8042 Tj
+-853 TJm
+(Such) 19.9252 Tj
+-289 TJm
+(a) 4.4234 Tj
+-289 TJm
+(stream) 26.5603 Tj
+72 174.917 Td
+(can) 13.8281 Tj
+-391 TJm
+(be) 9.4047 Tj
+-391 TJm
+(decompressed) 56.4381 Tj
+-390 TJm
+(correctly) 35.4071 Tj
+-391 TJm
+(only) 17.7135 Tj
+-391 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+238.116 174.917 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+271.898 174.917 Td
+/F122_0 9.9626 Tf
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-391 TJm
+(0.9.0) 19.9252 Tj
+-391 TJm
+(or) 8.2988 Tj
+-390 TJm
+(later) 17.7035 Tj
+55 TJm
+(.) 2.4907 Tj
+-733 TJm
+(Earlier) 27.1082 Tj
+-391 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-391 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+448.071 174.917 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+481.852 174.917 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-391 TJm
+(stop) 16.6077 Tj
+-391 TJm
+(after) 18.2515 Tj
+72 162.962 Td
+(decompressing) 59.7656 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\002rst) 15.5018 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 141.044 Td
+/F124_0 9.9626 Tf
+(bzcat) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.379 141.044 Td
+/F122_0 9.9626 Tf
+(\(or) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+118.486 141.044 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+-600 TJm
+(-dc) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.284 141.044 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-250 TJm
+(decompresses) 55.3323 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(speci\002ed) 35.417 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(standard) 33.7533 Tj
+-250 TJm
+(output.) 27.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 119.126 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.866 119.126 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-299 TJm
+(read) 17.1456 Tj
+-299 TJm
+(ar) 7.7409 Tj
+18 TJm
+(guments) 33.7633 Tj
+-299 TJm
+(from) 19.3673 Tj
+-299 TJm
+(the) 12.1743 Tj
+-299 TJm
+(en) 9.4047 Tj
+40 TJm
+(vironment) 40.9562 Tj
+-298 TJm
+(v) 4.9813 Tj
+25 TJm
+(ariables) 30.9837 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+316.903 119.126 Td
+/F124_0 9.9626 Tf
+(BZIP2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+349.769 119.126 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+367.133 119.126 Td
+/F124_0 9.9626 Tf
+(BZIP) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+391.043 119.126 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-299 TJm
+(in) 7.7509 Tj
+-299 TJm
+(that) 14.9439 Tj
+-299 TJm
+(order) 21.0211 Tj
+40 TJm
+(,) 2.4907 Tj
+-311 TJm
+(and) 14.386 Tj
+-299 TJm
+(will) 15.5018 Tj
+-299 TJm
+(process) 29.8778 Tj
+-299 TJm
+(them) 19.9252 Tj
+72 107.171 Td
+(before) 25.4445 Tj
+-250 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(ar) 7.7409 Tj
+18 TJm
+(guments) 33.7633 Tj
+-250 TJm
+(read) 17.1456 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(command) 39.2925 Tj
+-250 TJm
+(line.) 17.4346 Tj
+-310 TJm
+(This) 17.7135 Tj
+-250 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(con) 14.386 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(enient) 24.3486 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(supply) 26.5703 Tj
+-250 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault) 14.9439 Tj
+-250 TJm
+(ar) 7.7409 Tj
+18 TJm
+(guments.) 36.2539 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 85.253 Td
+(Compression) 52.5826 Tj
+-294 TJm
+(is) 6.6451 Tj
+-294 TJm
+(al) 7.193 Tj
+10 TJm
+(w) 7.193 Tj
+10 TJm
+(ays) 13.2801 Tj
+-294 TJm
+(performed,) 43.9849 Tj
+-305 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-294 TJm
+(if) 6.0871 Tj
+-294 TJm
+(the) 12.1743 Tj
+-294 TJm
+(compressed) 47.0334 Tj
+-294 TJm
+(\002le) 12.7322 Tj
+-293 TJm
+(is) 6.6451 Tj
+-294 TJm
+(slightly) 29.8978 Tj
+-294 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ger) 12.7222 Tj
+-294 TJm
+(than) 17.1556 Tj
+-294 TJm
+(the) 12.1743 Tj
+-294 TJm
+(original.) 33.4843 Tj
+-884 TJm
+(Files) 19.3773 Tj
+-294 TJm
+(of) 8.2988 Tj
+-294 TJm
+(less) 14.9439 Tj
+-294 TJm
+(than) 17.1556 Tj
+72 73.298 Td
+(about) 22.1369 Tj
+-246 TJm
+(one) 14.386 Tj
+-246 TJm
+(hundred) 32.6474 Tj
+-245 TJm
+(bytes) 21.031 Tj
+-246 TJm
+(tend) 17.1556 Tj
+-246 TJm
+(to) 7.7509 Tj
+-246 TJm
+(get) 12.1743 Tj
+-246 TJm
+(l) 2.7696 Tj
+1 TJm
+(ar) 7.7409 Tj
+18 TJm
+(ger) 12.7222 Tj
+40 TJm
+(,) 2.4907 Tj
+-247 TJm
+(since) 20.4731 Tj
+-246 TJm
+(the) 12.1743 Tj
+-246 TJm
+(compression) 50.3609 Tj
+-245 TJm
+(mechanism) 45.3796 Tj
+-246 TJm
+(has) 13.2801 Tj
+-246 TJm
+(a) 4.4234 Tj
+-246 TJm
+(constant) 33.2053 Tj
+-246 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(erhead) 26.5503 Tj
+-245 TJm
+(in) 7.7509 Tj
+-246 TJm
+(the) 12.1743 Tj
+-246 TJm
+(re) 7.7409 Tj
+15 TJm
+(gion) 17.7135 Tj
+-246 TJm
+(of) 8.2988 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.951 Td
+(3) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 4 7
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+477.109 749.245 Td
+/F122_0 9.9626 Tf
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(50) 9.9626 Tj
+-264 TJm
+(bytes.) 23.5217 Tj
+-351 TJm
+(Random) 33.7633 Tj
+-264 TJm
+(dat) 12.1743 Tj
+1 TJm
+(a) 4.4234 Tj
+-264 TJm
+(\(including) 40.9562 Tj
+-264 TJm
+(the) 12.1743 Tj
+-264 TJm
+(output) 25.4644 Tj
+-263 TJm
+(of) 8.2988 Tj
+-264 TJm
+(most) 19.3773 Tj
+-264 TJm
+(\002le) 12.7322 Tj
+-263 TJm
+(compressors\)) 53.1206 Tj
+-264 TJm
+(is) 6.6451 Tj
+-264 TJm
+(coded) 23.7907 Tj
+-263 TJm
+(at) 7.193 Tj
+-264 TJm
+(about) 22.1369 Tj
+-264 TJm
+(8.05) 17.4346 Tj
+-263 TJm
+(bits) 14.396 Tj
+-264 TJm
+(per) 12.7222 Tj
+-264 TJm
+(byte,) 19.6462 Tj
+-267 TJm
+(gi) 7.7509 Tj
+25 TJm
+(ving) 17.7135 Tj
+-264 TJm
+(an) 9.4047 Tj
+72 698.082 Td
+(e) 4.4234 Tj
+15 TJm
+(xpansion) 35.9749 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(around) 27.6661 Tj
+-250 TJm
+(0.5%.) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 676.283 Td
+(As) 11.0684 Tj
+-268 TJm
+(a) 4.4234 Tj
+-268 TJm
+(self-check) 40.9363 Tj
+-269 TJm
+(for) 11.6164 Tj
+-268 TJm
+(your) 18.2614 Tj
+-268 TJm
+(protection,) 42.889 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+217.273 676.283 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+249.833 676.283 Td
+/F122_0 9.9626 Tf
+(uses) 17.1556 Tj
+-268 TJm
+(32-bit) 23.8007 Tj
+-268 TJm
+(CRCs) 23.8106 Tj
+-269 TJm
+(to) 7.7509 Tj
+-268 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-268 TJm
+(sure) 16.5977 Tj
+-268 TJm
+(that) 14.9439 Tj
+-268 TJm
+(the) 12.1743 Tj
+-269 TJm
+(decompressed) 56.4381 Tj
+-268 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-268 TJm
+(of) 8.2988 Tj
+-268 TJm
+(a) 4.4234 Tj
+-268 TJm
+(\002le) 12.7322 Tj
+-269 TJm
+(is) 6.6451 Tj
+72 664.328 Td
+(identical) 34.3112 Tj
+-200 TJm
+(to) 7.7509 Tj
+-199 TJm
+(the) 12.1743 Tj
+-200 TJm
+(original.) 33.4843 Tj
+-586 TJm
+(This) 17.7135 Tj
+-200 TJm
+(guards) 26.5603 Tj
+-199 TJm
+(ag) 9.4047 Tj
+5 TJm
+(ainst) 18.8194 Tj
+-200 TJm
+(corruption) 41.5042 Tj
+-199 TJm
+(of) 8.2988 Tj
+-200 TJm
+(the) 12.1743 Tj
+-200 TJm
+(compressed) 47.0334 Tj
+-199 TJm
+(data,) 19.0883 Tj
+-210 TJm
+(and) 14.386 Tj
+-199 TJm
+(ag) 9.4047 Tj
+5 TJm
+(ainst) 18.8194 Tj
+-200 TJm
+(undetected) 43.158 Tj
+-200 TJm
+(b) 4.9813 Tj
+20 TJm
+(ugs) 13.8381 Tj
+-199 TJm
+(in) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+510.112 664.328 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 652.373 Td
+/F122_0 9.9626 Tf
+(\(hopefully) 41.5042 Tj
+-275 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-274 TJm
+(unlik) 20.4831 Tj
+10 TJm
+(ely\).) 17.9825 Tj
+-384 TJm
+(The) 15.4918 Tj
+-275 TJm
+(chances) 31.5316 Tj
+-275 TJm
+(of) 8.2988 Tj
+-275 TJm
+(data) 16.5977 Tj
+-274 TJm
+(corruption) 41.5042 Tj
+-275 TJm
+(going) 22.6948 Tj
+-275 TJm
+(undetected) 43.158 Tj
+-274 TJm
+(is) 6.6451 Tj
+-275 TJm
+(microscopic,) 51.1878 Tj
+-281 TJm
+(about) 22.1369 Tj
+-275 TJm
+(one) 14.386 Tj
+-274 TJm
+(chance) 27.6562 Tj
+-275 TJm
+(in) 7.7509 Tj
+-275 TJm
+(four) 16.5977 Tj
+72 640.417 Td
+(billion) 26.0223 Tj
+-279 TJm
+(for) 11.6164 Tj
+-279 TJm
+(each) 18.2515 Tj
+-279 TJm
+(\002le) 12.7322 Tj
+-280 TJm
+(processed.) 41.7732 Tj
+-795 TJm
+(Be) 11.0684 Tj
+-279 TJm
+(a) 4.4234 Tj
+15 TJm
+(w) 7.193 Tj
+10 TJm
+(are,) 14.655 Tj
+-286 TJm
+(though,) 30.1668 Tj
+-287 TJm
+(that) 14.9439 Tj
+-279 TJm
+(the) 12.1743 Tj
+-279 TJm
+(check) 23.2328 Tj
+-279 TJm
+(occurs) 26.0024 Tj
+-279 TJm
+(upon) 19.9252 Tj
+-279 TJm
+(decompression,) 62.2563 Tj
+-287 TJm
+(so) 8.8568 Tj
+-279 TJm
+(it) 5.5392 Tj
+-279 TJm
+(can) 13.8281 Tj
+-279 TJm
+(only) 17.7135 Tj
+-280 TJm
+(tell) 12.7322 Tj
+-279 TJm
+(you) 14.9439 Tj
+72 628.462 Td
+(that) 14.9439 Tj
+-237 TJm
+(something) 41.5142 Tj
+-236 TJm
+(is) 6.6451 Tj
+-237 TJm
+(wrong.) 27.9451 Tj
+-611 TJm
+(It) 6.0871 Tj
+-237 TJm
+(can') 17.1456 Tj
+18 TJm
+(t) 2.7696 Tj
+-237 TJm
+(help) 17.1556 Tj
+-237 TJm
+(you) 14.9439 Tj
+-236 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-237 TJm
+(the) 12.1743 Tj
+-237 TJm
+(original) 30.9936 Tj
+-237 TJm
+(uncompressed) 56.996 Tj
+-236 TJm
+(data.) 19.0883 Tj
+-612 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-236 TJm
+(can) 13.8281 Tj
+-237 TJm
+(use) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+458.159 628.462 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+532.249 628.462 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+72 616.507 Td
+(try) 11.0684 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(damaged) 35.965 Tj
+-250 TJm
+(\002les.) 19.0983 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 594.708 Td
+(Return) 27.1182 Tj
+-298 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+-406 TJm
+(0) 4.9813 Tj
+-298 TJm
+(for) 11.6164 Tj
+-298 TJm
+(a) 4.4234 Tj
+-298 TJm
+(normal) 28.224 Tj
+-298 TJm
+(e) 4.4234 Tj
+15 TJm
+(xit,) 13.0112 Tj
+-310 TJm
+(1) 4.9813 Tj
+-298 TJm
+(for) 11.6164 Tj
+-297 TJm
+(en) 9.4047 Tj
+40 TJm
+(vironmental) 48.1492 Tj
+-298 TJm
+(problems) 37.0808 Tj
+-298 TJm
+(\(\002le) 16.0497 Tj
+-298 TJm
+(not) 12.7322 Tj
+-298 TJm
+(found,) 25.7334 Tj
+-310 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+25 TJm
+(alid) 14.9439 Tj
+-298 TJm
+(\003ags,) 21.31 Tj
+-310 TJm
+(I/O) 13.2801 Tj
+-298 TJm
+(errors,) 25.7234 Tj
+-310 TJm
+(etc.\),) 19.9152 Tj
+-310 TJm
+(2) 4.9813 Tj
+-298 TJm
+(to) 7.7509 Tj
+72 582.753 Td
+(indicate) 31.5416 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(corrupt) 28.772 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le,) 15.2229 Tj
+-250 TJm
+(3) 4.9813 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(internal) 30.4357 Tj
+-250 TJm
+(consistenc) 41.5042 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(\(e) 7.7409 Tj
+15 TJm
+(g,) 7.472 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug\)) 13.2801 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(caused) 27.1082 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+443.065 582.753 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+475.444 582.753 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(panic.) 24.0696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 548.118 Td
+/F116_0 20.6585 Tf
+(2.4.) 34.4584 Tj
+-278 TJm
+(OPTIONS) 92.9839 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 516.475 Td
+/F124_0 9.9626 Tf
+(-c) 11.9551 Tj
+-600 TJm
+(--stdout) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 504.52 Td
+/F122_0 9.9626 Tf
+(Compress) 39.8504 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(decompress) 47.0334 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(standard) 33.7533 Tj
+-250 TJm
+(output.) 27.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 478.854 Td
+/F124_0 9.9626 Tf
+(-d) 11.9551 Tj
+-600 TJm
+(--decompress) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 466.899 Td
+/F122_0 9.9626 Tf
+(F) 5.5392 Tj
+15 TJm
+(orce) 17.1456 Tj
+-296 TJm
+(decompression.) 62.2563 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.214 466.899 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+230.102 466.899 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+235.659 466.899 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+280.454 466.899 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+297.791 466.899 Td
+/F124_0 9.9626 Tf
+(bzcat) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+330.631 466.899 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-296 TJm
+(really) 22.6848 Tj
+-296 TJm
+(the) 12.1743 Tj
+-297 TJm
+(same) 20.4731 Tj
+-296 TJm
+(program,) 36.2439 Tj
+-308 TJm
+(and) 14.386 Tj
+-296 TJm
+(the) 12.1743 Tj
+-296 TJm
+(decision) 33.2053 Tj
+-297 TJm
+(about) 22.1369 Tj
+108 454.944 Td
+(what) 19.3673 Tj
+-303 TJm
+(actions) 28.224 Tj
+-303 TJm
+(to) 7.7509 Tj
+-303 TJm
+(tak) 12.1743 Tj
+10 TJm
+(e) 4.4234 Tj
+-303 TJm
+(is) 6.6451 Tj
+-303 TJm
+(done) 19.3673 Tj
+-303 TJm
+(on) 9.9626 Tj
+-304 TJm
+(the) 12.1743 Tj
+-303 TJm
+(basis) 19.9252 Tj
+-303 TJm
+(of) 8.2988 Tj
+-303 TJm
+(which) 24.3486 Tj
+-303 TJm
+(name) 21.579 Tj
+-303 TJm
+(is) 6.6451 Tj
+-303 TJm
+(used.) 20.7521 Tj
+-939 TJm
+(This) 17.7135 Tj
+-303 TJm
+(\003ag) 14.9439 Tj
+-303 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(errides) 27.1082 Tj
+-303 TJm
+(that) 14.9439 Tj
+-303 TJm
+(mechanism,) 47.8703 Tj
+-316 TJm
+(and) 14.386 Tj
+108 442.988 Td
+(forces) 24.3386 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(decompress.) 49.5241 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 417.323 Td
+/F124_0 9.9626 Tf
+(-z) 11.9551 Tj
+-600 TJm
+(--compress) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 405.368 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-250 TJm
+(complement) 49.2551 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+187.969 405.368 Td
+/F124_0 9.9626 Tf
+(-d) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+199.924 405.368 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+-310 TJm
+(forces) 24.3386 Tj
+-250 TJm
+(compression,) 52.8516 Tj
+-250 TJm
+(re) 7.7409 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(ardless) 27.6661 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+20 TJm
+(okation) 29.8878 Tj
+-250 TJm
+(name.) 24.0696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 379.702 Td
+/F124_0 9.9626 Tf
+(-t) 11.9551 Tj
+-600 TJm
+(--test) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 367.747 Td
+/F122_0 9.9626 Tf
+(Check) 25.4544 Tj
+-270 TJm
+(inte) 14.9439 Tj
+15 TJm
+(grity) 18.8194 Tj
+-271 TJm
+(of) 8.2988 Tj
+-270 TJm
+(the) 12.1743 Tj
+-271 TJm
+(speci\002ed) 35.417 Tj
+-270 TJm
+(\002le\(s\),) 25.7334 Tj
+-276 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-270 TJm
+(don') 18.2614 Tj
+18 TJm
+(t) 2.7696 Tj
+-270 TJm
+(decompress) 47.0334 Tj
+-271 TJm
+(them.) 22.4159 Tj
+-742 TJm
+(This) 17.7135 Tj
+-271 TJm
+(really) 22.6848 Tj
+-270 TJm
+(performs) 35.965 Tj
+-270 TJm
+(a) 4.4234 Tj
+-271 TJm
+(trial) 16.0497 Tj
+-270 TJm
+(decompres-) 46.4755 Tj
+108 355.792 Td
+(sion) 16.6077 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(thro) 16.0497 Tj
+25 TJm
+(ws) 11.0684 Tj
+-250 TJm
+(a) 4.4234 Tj
+15 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(result.) 24.6275 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 330.126 Td
+/F124_0 9.9626 Tf
+(-f) 11.9551 Tj
+-600 TJm
+(--force) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 318.171 Td
+/F122_0 9.9626 Tf
+(F) 5.5392 Tj
+15 TJm
+(orce) 17.1456 Tj
+-338 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(erwrite) 28.2141 Tj
+-339 TJm
+(of) 8.2988 Tj
+-338 TJm
+(output) 25.4644 Tj
+-338 TJm
+(\002les.) 19.0983 Tj
+-1150 TJm
+(Normally) 38.1866 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+289.831 318.171 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+323.089 318.171 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-338 TJm
+(not) 12.7322 Tj
+-339 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(erwrite) 28.2141 Tj
+-338 TJm
+(e) 4.4234 Tj
+15 TJm
+(xisting) 27.1282 Tj
+-338 TJm
+(output) 25.4644 Tj
+-338 TJm
+(\002les.) 19.0983 Tj
+-1150 TJm
+(Also) 18.8194 Tj
+-339 TJm
+(forces) 24.3386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 306.215 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+140.379 306.215 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(break) 22.1269 Tj
+-250 TJm
+(hard) 17.7035 Tj
+-250 TJm
+(links) 19.3773 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(\002les,) 19.0983 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(otherwise) 38.7346 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ouldn') 26.0123 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(do.) 12.4533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 284.416 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+141.211 284.416 Td
+/F122_0 9.9626 Tf
+(normally) 35.9749 Tj
+-334 TJm
+(declines) 32.6474 Tj
+-333 TJm
+(to) 7.7509 Tj
+-334 TJm
+(decompress) 47.0334 Tj
+-333 TJm
+(\002les) 16.6077 Tj
+-334 TJm
+(which) 24.3486 Tj
+-333 TJm
+(don') 18.2614 Tj
+18 TJm
+(t) 2.7696 Tj
+-334 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-333 TJm
+(the) 12.1743 Tj
+-334 TJm
+(correct) 27.6562 Tj
+-333 TJm
+(magic) 24.3486 Tj
+-334 TJm
+(header) 26.5503 Tj
+-333 TJm
+(bytes.) 23.5217 Tj
+-561 TJm
+(If) 6.6351 Tj
+-334 TJm
+(forced) 25.4445 Tj
+108 272.461 Td
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+111.318 272.461 Td
+/F124_0 9.9626 Tf
+(-f) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+123.273 272.461 Td
+/F122_0 9.9626 Tf
+(\),) 5.8082 Tj
+-250 TJm
+(ho) 9.9626 Tj
+25 TJm
+(we) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+40 TJm
+(,) 2.4907 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(pass) 17.1556 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+-250 TJm
+(through) 30.9936 Tj
+-250 TJm
+(unmodi\002ed.) 47.8803 Tj
+-310 TJm
+(This) 17.7135 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(GNU) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+412.585 272.461 Td
+/F124_0 9.9626 Tf
+(gzip) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+438.986 272.461 Td
+/F122_0 9.9626 Tf
+(beha) 18.8094 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(es.) 10.7895 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 246.795 Td
+/F124_0 9.9626 Tf
+(-k) 11.9551 Tj
+-600 TJm
+(--keep) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 234.84 Td
+/F122_0 9.9626 Tf
+(K) 7.193 Tj
+25 TJm
+(eep) 13.8281 Tj
+-250 TJm
+(\(don') 21.579 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(delete\)) 27.1082 Tj
+-250 TJm
+(input) 20.4831 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+-250 TJm
+(during) 26.0123 Tj
+-250 TJm
+(compression) 50.3609 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(decompression.) 62.2563 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 209.174 Td
+/F124_0 9.9626 Tf
+(-s) 11.9551 Tj
+-600 TJm
+(--small) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 197.219 Td
+/F122_0 9.9626 Tf
+(Reduce) 29.8778 Tj
+-347 TJm
+(memory) 33.2053 Tj
+-347 TJm
+(usage,) 25.1755 Tj
+-371 TJm
+(for) 11.6164 Tj
+-346 TJm
+(compression,) 52.8516 Tj
+-371 TJm
+(decompression) 59.7656 Tj
+-347 TJm
+(and) 14.386 Tj
+-347 TJm
+(testing.) 29.0609 Tj
+-1201 TJm
+(Files) 19.3773 Tj
+-347 TJm
+(are) 12.1643 Tj
+-347 TJm
+(decompressed) 56.4381 Tj
+-346 TJm
+(and) 14.386 Tj
+-347 TJm
+(tested) 23.2427 Tj
+108 185.264 Td
+(using) 21.589 Tj
+-388 TJm
+(a) 4.4234 Tj
+-388 TJm
+(modi\002ed) 35.427 Tj
+-388 TJm
+(algorithm) 38.7446 Tj
+-389 TJm
+(which) 24.3486 Tj
+-388 TJm
+(only) 17.7135 Tj
+-388 TJm
+(requires) 32.0895 Tj
+-388 TJm
+(2.5) 12.4533 Tj
+-388 TJm
+(bytes) 21.031 Tj
+-388 TJm
+(per) 12.7222 Tj
+-388 TJm
+(block) 22.1369 Tj
+-389 TJm
+(byte.) 19.6462 Tj
+-1448 TJm
+(This) 17.7135 Tj
+-389 TJm
+(means) 25.4544 Tj
+-388 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-388 TJm
+(\002le) 12.7322 Tj
+-388 TJm
+(can) 13.8281 Tj
+-388 TJm
+(be) 9.4047 Tj
+108 173.309 Td
+(decompressed) 56.4381 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(2300k) 24.9065 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(memory) 33.2053 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(albeit) 22.1369 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(about) 22.1369 Tj
+-250 TJm
+(half) 15.4918 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(normal) 28.224 Tj
+-250 TJm
+(speed.) 25.1755 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 151.51 Td
+(During) 28.224 Tj
+-252 TJm
+(compr) 25.4544 Tj
+1 TJm
+(ession,) 27.3972 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+194.091 151.51 Td
+/F124_0 9.9626 Tf
+(-s) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+208.551 151.51 Td
+/F122_0 9.9626 Tf
+(selects) 26.5603 Tj
+-252 TJm
+(a) 4.4234 Tj
+-251 TJm
+(block) 22.1369 Tj
+-252 TJm
+(size) 15.4918 Tj
+-251 TJm
+(of) 8.2988 Tj
+-252 TJm
+(200k,) 22.4159 Tj
+-251 TJm
+(which) 24.3486 Tj
+-252 TJm
+(limits) 22.7048 Tj
+-251 TJm
+(memory) 33.2053 Tj
+-252 TJm
+(use) 13.2801 Tj
+-251 TJm
+(to) 7.7509 Tj
+-252 TJm
+(around) 27.6661 Tj
+-251 TJm
+(the) 12.1743 Tj
+-252 TJm
+(same) 20.4731 Tj
+-251 TJm
+(\002gure,) 25.7334 Tj
+-252 TJm
+(at) 7.193 Tj
+108 139.554 Td
+(the) 12.1743 Tj
+-287 TJm
+(e) 4.4234 Tj
+15 TJm
+(xpense) 27.6661 Tj
+-287 TJm
+(of) 8.2988 Tj
+-288 TJm
+(your) 18.2614 Tj
+-287 TJm
+(compression) 50.3609 Tj
+-287 TJm
+(ratio.) 20.7521 Tj
+-843 TJm
+(In) 8.2988 Tj
+-287 TJm
+(short,) 22.4159 Tj
+-297 TJm
+(if) 6.0871 Tj
+-287 TJm
+(your) 18.2614 Tj
+-287 TJm
+(machine) 33.7533 Tj
+-287 TJm
+(is) 6.6451 Tj
+-287 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w) 7.193 Tj
+-287 TJm
+(on) 9.9626 Tj
+-288 TJm
+(memory) 33.2053 Tj
+-287 TJm
+(\(8) 8.2988 Tj
+-287 TJm
+(me) 12.1743 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(abytes) 25.4544 Tj
+-287 TJm
+(or) 8.2988 Tj
+-287 TJm
+(less\),) 20.7521 Tj
+108 127.599 Td
+(use) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+123.771 127.599 Td
+/F124_0 9.9626 Tf
+(-s) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+138.217 127.599 Td
+/F122_0 9.9626 Tf
+(for) 11.6164 Tj
+-250 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(erything.) 35.696 Tj
+-620 TJm
+(See) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+(MEMOR) 37.6387 Tj
+65 TJm
+(Y) 7.193 Tj
+-250 TJm
+(MAN) 23.2427 Tj
+35 TJm
+(A) 7.193 Tj
+40 TJm
+(GEMENT) 41.5042 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+([5]) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(belo) 17.1556 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 101.933 Td
+/F124_0 9.9626 Tf
+(-q) 11.9551 Tj
+-600 TJm
+(--quiet) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 89.978 Td
+/F122_0 9.9626 Tf
+(Suppress) 35.9749 Tj
+-221 TJm
+(non-essential) 52.5726 Tj
+-220 TJm
+(w) 7.193 Tj
+10 TJm
+(arning) 25.4544 Tj
+-221 TJm
+(messages.) 40.1194 Tj
+-300 TJm
+(Messages) 38.7346 Tj
+-221 TJm
+(pertaining) 40.3983 Tj
+-221 TJm
+(to) 7.7509 Tj
+-220 TJm
+(I/O) 13.2801 Tj
+-221 TJm
+(errors) 23.2328 Tj
+-221 TJm
+(and) 14.386 Tj
+-220 TJm
+(other) 20.4731 Tj
+-221 TJm
+(critical) 27.6661 Tj
+-221 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ents) 16.0497 Tj
+-221 TJm
+(wi) 9.9626 Tj
+1 TJm
+(ll) 5.5392 Tj
+-221 TJm
+(not) 12.7322 Tj
+108 78.023 Td
+(be) 9.4047 Tj
+-250 TJm
+(suppressed.) 46.2065 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.852 Td
+(4) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 5 8
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+477.109 749.245 Td
+/F122_0 9.9626 Tf
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F124_0 9.9626 Tf
+(-v) 11.9551 Tj
+-600 TJm
+(--verbose) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 698.082 Td
+/F122_0 9.9626 Tf
+(V) 7.193 Tj
+111 TJm
+(erbose) 26.0024 Tj
+-323 TJm
+(mode) 22.1369 Tj
+-322 TJm
+(--) 6.6351 Tj
+-323 TJm
+(sho) 13.8381 Tj
+25 TJm
+(w) 7.193 Tj
+-322 TJm
+(the) 12.1743 Tj
+-323 TJm
+(compression) 50.3609 Tj
+-323 TJm
+(ratio) 18.2614 Tj
+-322 TJm
+(for) 11.6164 Tj
+-323 TJm
+(each) 18.2515 Tj
+-322 TJm
+(\002le) 12.7322 Tj
+-323 TJm
+(processed.) 41.7732 Tj
+-1056 TJm
+(Further) 29.3299 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+430.015 698.082 Td
+/F124_0 9.9626 Tf
+(-v) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+441.97 698.082 Td
+/F122_0 9.9626 Tf
+(') 3.3175 Tj
+55 TJm
+(s) 3.8755 Tj
+-323 TJm
+(increase) 32.6375 Tj
+-322 TJm
+(the) 12.1743 Tj
+-323 TJm
+(v) 4.9813 Tj
+15 TJm
+(erbosity) 32.0995 Tj
+108 686.127 Td
+(le) 7.193 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el,) 9.6836 Tj
+-250 TJm
+(spe) 13.2801 Tj
+25 TJm
+(wing) 19.9252 Tj
+-250 TJm
+(out) 12.7322 Tj
+-250 TJm
+(lots) 14.396 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(information) 47.0434 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(primarily) 37.0808 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(interest) 29.3299 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(diagnostic) 40.9562 Tj
+-250 TJm
+(purposes.) 37.9077 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 660.224 Td
+/F124_0 9.9626 Tf
+(-L) 11.9551 Tj
+-600 TJm
+(--license) 53.798 Tj
+-600 TJm
+(-V) 11.9551 Tj
+-600 TJm
+(--version) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 648.269 Td
+/F122_0 9.9626 Tf
+(Display) 30.9936 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(softw) 22.1369 Tj
+10 TJm
+(are) 12.1643 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion,) 26.8392 Tj
+-250 TJm
+(license) 27.6661 Tj
+-250 TJm
+(terms) 22.1369 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(conditions.) 44.0048 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 622.366 Td
+/F124_0 9.9626 Tf
+(-1) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+86.446 622.366 Td
+/F122_0 9.9626 Tf
+(\(or) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+100.553 622.366 Td
+/F124_0 9.9626 Tf
+(--fast) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+136.418 622.366 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+152.468 622.366 Td
+/F124_0 9.9626 Tf
+(-9) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.914 622.366 Td
+/F122_0 9.9626 Tf
+(\(or) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+181.021 622.366 Td
+/F124_0 9.9626 Tf
+(-best) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.909 622.366 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 610.411 Td
+(Set) 12.7322 Tj
+-288 TJm
+(the) 12.1743 Tj
+-289 TJm
+(block) 22.1369 Tj
+-288 TJm
+(size) 15.4918 Tj
+-288 TJm
+(to) 7.7509 Tj
+-288 TJm
+(100) 14.9439 Tj
+-289 TJm
+(k,) 7.472 Tj
+-298 TJm
+(200) 14.9439 Tj
+-288 TJm
+(k) 4.9813 Tj
+-288 TJm
+(...) 7.472 Tj
+-850 TJm
+(900) 14.9439 Tj
+-288 TJm
+(k) 4.9813 Tj
+-288 TJm
+(when) 21.579 Tj
+-289 TJm
+(compressing.) 52.8516 Tj
+-849 TJm
+(Has) 15.4918 Tj
+-289 TJm
+(no) 9.9626 Tj
+-288 TJm
+(ef) 7.7409 Tj
+25 TJm
+(fect) 14.9339 Tj
+-288 TJm
+(when) 21.579 Tj
+-288 TJm
+(decompressing.) 62.2563 Tj
+-850 TJm
+(See) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+108 598.456 Td
+(MEMOR) 37.6387 Tj
+65 TJm
+(Y) 7.193 Tj
+-297 TJm
+(MAN) 23.2427 Tj
+35 TJm
+(A) 7.193 Tj
+40 TJm
+(GEMENT) 41.5042 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-297 TJm
+([5]) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-298 TJm
+(belo) 17.1556 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(.) 2.4907 Tj
+-904 TJm
+(The) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+297.278 598.456 Td
+/F124_0 9.9626 Tf
+(--fast) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+336.106 598.456 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+353.454 598.456 Td
+/F124_0 9.9626 Tf
+(--best) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+392.281 598.456 Td
+/F122_0 9.9626 Tf
+(aliases) 26.5603 Tj
+-297 TJm
+(are) 12.1643 Tj
+-298 TJm
+(primarily) 37.0808 Tj
+-297 TJm
+(for) 11.6164 Tj
+-297 TJm
+(GNU) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+516.09 598.456 Td
+/F124_0 9.9626 Tf
+(gzip) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 586.501 Td
+/F122_0 9.9626 Tf
+(compatibility) 53.1405 Tj
+65 TJm
+(.) 2.4907 Tj
+-356 TJm
+(In) 8.2988 Tj
+-265 TJm
+(particular) 38.1767 Tj
+40 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+220.423 586.501 Td
+/F124_0 9.9626 Tf
+(--fast) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+258.932 586.501 Td
+/F122_0 9.9626 Tf
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-265 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-266 TJm
+(things) 24.3586 Tj
+-265 TJm
+(signi\002cantly) 49.2651 Tj
+-265 TJm
+(f) 3.3175 Tj
+10 TJm
+(aster) 18.8094 Tj
+55 TJm
+(.) 2.4907 Tj
+-712 TJm
+(And) 17.1556 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+444.622 586.501 Td
+/F124_0 9.9626 Tf
+(--best) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+483.131 586.501 Td
+/F122_0 9.9626 Tf
+(merely) 27.6661 Tj
+-265 TJm
+(selects) 26.5603 Tj
+108 574.545 Td
+(the) 12.1743 Tj
+-250 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault) 14.9439 Tj
+-250 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 548.643 Td
+/F124_0 9.9626 Tf
+(--) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 536.688 Td
+/F122_0 9.9626 Tf
+(T) 6.0871 Tj
+35 TJm
+(reats) 18.8094 Tj
+-261 TJm
+(all) 9.9626 Tj
+-261 TJm
+(subsequent) 44.2738 Tj
+-260 TJm
+(ar) 7.7409 Tj
+18 TJm
+(guments) 33.7633 Tj
+-261 TJm
+(as) 8.2988 Tj
+-261 TJm
+(\002le) 12.7322 Tj
+-261 TJm
+(names,) 27.9451 Tj
+-263 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-261 TJm
+(if) 6.0871 Tj
+-261 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-260 TJm
+(start) 17.1556 Tj
+-261 TJm
+(with) 17.7135 Tj
+-261 TJm
+(a) 4.4234 Tj
+-261 TJm
+(dash.) 20.7521 Tj
+-685 TJm
+(This) 17.7135 Tj
+-260 TJm
+(is) 6.6451 Tj
+-261 TJm
+(so) 8.8568 Tj
+-261 TJm
+(you) 14.9439 Tj
+-261 TJm
+(can) 13.8281 Tj
+-260 TJm
+(handle) 26.5603 Tj
+-261 TJm
+(\002les) 16.6077 Tj
+108 524.732 Td
+(with) 17.7135 Tj
+-250 TJm
+(names) 25.4544 Tj
+-250 TJm
+(be) 9.4047 Tj
+15 TJm
+(ginning) 30.4457 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(dash,) 20.7521 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xample:) 32.0995 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+302.27 524.732 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+-600 TJm
+(--) 11.9551 Tj
+-600 TJm
+(-myfilename) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+421.821 524.732 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 498.83 Td
+/F124_0 9.9626 Tf
+(--repetitive-fast) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+178.6 498.83 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.563 498.83 Td
+/F124_0 9.9626 Tf
+(--repetitive-best) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 486.874 Td
+/F122_0 9.9626 Tf
+(These) 23.7907 Tj
+-207 TJm
+(\003ags) 18.8194 Tj
+-206 TJm
+(are) 12.1643 Tj
+-207 TJm
+(redundant) 39.8404 Tj
+-207 TJm
+(in) 7.7509 Tj
+-206 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-207 TJm
+(0.9.5) 19.9252 Tj
+-207 TJm
+(and) 14.386 Tj
+-206 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e.) 6.914 Tj
+-591 TJm
+(The) 15.4918 Tj
+15 TJm
+(y) 4.9813 Tj
+-207 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vided) 22.1369 Tj
+-207 TJm
+(some) 21.031 Tj
+-207 TJm
+(coa) 13.8281 Tj
+1 TJm
+(rse) 11.6164 Tj
+-207 TJm
+(control) 28.224 Tj
+-207 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-207 TJm
+(the) 12.1743 Tj
+-206 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+108 474.919 Td
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-251 TJm
+(sorting) 27.6761 Tj
+-250 TJm
+(algorithm) 38.7446 Tj
+-250 TJm
+(in) 7.7509 Tj
+-251 TJm
+(earlier) 25.4445 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions,) 30.7147 Tj
+-250 TJm
+(which) 24.3486 Tj
+-251 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(sometimes) 42.62 Tj
+-250 TJm
+(useful.) 26.8392 Tj
+-622 TJm
+(0.9.5) 19.9252 Tj
+-251 TJm
+(and) 14.386 Tj
+-250 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-251 TJm
+(an) 9.4047 Tj
+-250 TJm
+(impro) 23.8007 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ed) 9.4047 Tj
+108 462.964 Td
+(algorithm) 38.7446 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(renders) 29.3199 Tj
+-250 TJm
+(these) 20.4731 Tj
+-250 TJm
+(\003ags) 18.8194 Tj
+-250 TJm
+(irrele) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ant.) 14.6649 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 414.264 Td
+/F116_0 20.6585 Tf
+(2.5.) 34.4584 Tj
+-278 TJm
+(MEMOR) 79.184 Tj
+50 TJm
+(Y) 13.7792 Tj
+-278 TJm
+(MANA) 61.9548 Tj
+50 TJm
+(GEMENT) 88.3771 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 392.346 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.454 392.346 Td
+/F122_0 9.9626 Tf
+(compresses) 45.9276 Tj
+-258 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-257 TJm
+(\002les) 16.6077 Tj
+-258 TJm
+(in) 7.7509 Tj
+-257 TJm
+(blocks.) 28.503 Tj
+-666 TJm
+(The) 15.4918 Tj
+-257 TJm
+(block) 22.1369 Tj
+-258 TJm
+(size) 15.4918 Tj
+-258 TJm
+(af) 7.7409 Tj
+25 TJm
+(fects) 18.8094 Tj
+-257 TJm
+(both) 17.7135 Tj
+-258 TJm
+(the) 12.1743 Tj
+-257 TJm
+(compression) 50.3609 Tj
+-258 TJm
+(ratio) 18.2614 Tj
+-257 TJm
+(achie) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ed,) 11.8953 Tj
+-260 TJm
+(and) 14.386 Tj
+-258 TJm
+(the) 12.1743 Tj
+-257 TJm
+(amount) 29.8878 Tj
+72 380.391 Td
+(of) 8.2988 Tj
+-215 TJm
+(memory) 33.2053 Tj
+-215 TJm
+(needed) 28.2141 Tj
+-215 TJm
+(for) 11.6164 Tj
+-215 TJm
+(compression) 50.3609 Tj
+-214 TJm
+(and) 14.386 Tj
+-215 TJm
+(decompression.) 62.2563 Tj
+-597 TJm
+(The) 15.4918 Tj
+-215 TJm
+(\003ags) 18.8194 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+337.719 380.391 Td
+/F124_0 9.9626 Tf
+(-1) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+351.815 380.391 Td
+/F122_0 9.9626 Tf
+(through) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+384.95 380.391 Td
+/F124_0 9.9626 Tf
+(-9) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+399.046 380.391 Td
+/F122_0 9.9626 Tf
+(specify) 28.772 Tj
+-215 TJm
+(the) 12.1743 Tj
+-215 TJm
+(block) 22.1369 Tj
+-215 TJm
+(size) 15.4918 Tj
+-215 TJm
+(to) 7.7509 Tj
+-214 TJm
+(be) 9.4047 Tj
+-215 TJm
+(100,000) 32.3785 Tj
+72 368.435 Td
+(bytes) 21.031 Tj
+-278 TJm
+(through) 30.9936 Tj
+-277 TJm
+(900,000) 32.3785 Tj
+-278 TJm
+(bytes) 21.031 Tj
+-278 TJm
+(\(the) 15.4918 Tj
+-277 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault\)) 18.2614 Tj
+-278 TJm
+(respecti) 30.9837 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ely) 12.1743 Tj
+65 TJm
+(.) 2.4907 Tj
+-786 TJm
+(At) 9.9626 Tj
+-278 TJm
+(decompression) 59.7656 Tj
+-278 TJm
+(time,) 20.2042 Tj
+-284 TJm
+(the) 12.1743 Tj
+-278 TJm
+(block) 22.1369 Tj
+-278 TJm
+(size) 15.4918 Tj
+-277 TJm
+(used) 18.2614 Tj
+-278 TJm
+(for) 11.6164 Tj
+-278 TJm
+(compression) 50.3609 Tj
+72 356.48 Td
+(is) 6.6451 Tj
+-243 TJm
+(read) 17.1456 Tj
+-242 TJm
+(from) 19.3673 Tj
+-243 TJm
+(the) 12.1743 Tj
+-242 TJm
+(header) 26.5503 Tj
+-243 TJm
+(of) 8.2988 Tj
+-242 TJm
+(the) 12.1743 Tj
+-243 TJm
+(compressed) 47.0334 Tj
+-242 TJm
+(\002le,) 15.2229 Tj
+-244 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+275.174 356.48 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+319.433 356.48 Td
+/F122_0 9.9626 Tf
+(then) 17.1556 Tj
+-243 TJm
+(all) 9.9626 Tj
+1 TJm
+(o) 4.9813 Tj
+-1 TJm
+(c) 4.4234 Tj
+1 TJm
+(ates) 15.4918 Tj
+-243 TJm
+(itself) 19.9252 Tj
+-242 TJm
+(just) 14.396 Tj
+-243 TJm
+(enough) 29.3299 Tj
+-243 TJm
+(memory) 33.2053 Tj
+-242 TJm
+(to) 7.7509 Tj
+-243 TJm
+(decompress) 47.0334 Tj
+72 344.525 Td
+(the) 12.1743 Tj
+-303 TJm
+(\002le.) 15.2229 Tj
+-940 TJm
+(Since) 22.1369 Tj
+-304 TJm
+(block) 22.1369 Tj
+-303 TJm
+(sizes) 19.3673 Tj
+-303 TJm
+(are) 12.1643 Tj
+-303 TJm
+(stored) 24.3486 Tj
+-304 TJm
+(in) 7.7509 Tj
+-303 TJm
+(compressed) 47.0334 Tj
+-303 TJm
+(\002les,) 19.0983 Tj
+-317 TJm
+(it) 5.5392 Tj
+-303 TJm
+(follo) 18.8194 Tj
+25 TJm
+(ws) 11.0684 Tj
+-304 TJm
+(that) 14.9439 Tj
+-303 TJm
+(the) 12.1743 Tj
+-303 TJm
+(\003ags) 18.8194 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+406.35 344.525 Td
+/F124_0 9.9626 Tf
+(-1) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+421.327 344.525 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+432.1 344.525 Td
+/F124_0 9.9626 Tf
+(-9) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+447.077 344.525 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-303 TJm
+(irrele) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ant) 12.1743 Tj
+-304 TJm
+(to) 7.7509 Tj
+-303 TJm
+(and) 14.386 Tj
+-303 TJm
+(so) 8.8568 Tj
+72 332.57 Td
+(ignored) 30.4357 Tj
+-250 TJm
+(during) 26.0123 Tj
+-250 TJm
+(decompression.) 62.2563 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 310.652 Td
+(Compression) 52.5826 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(decompression) 59.7656 Tj
+-250 TJm
+(requirements,) 54.5054 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(bytes,) 23.5217 Tj
+-250 TJm
+(can) 13.8281 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(estimated) 38.1866 Tj
+-250 TJm
+(as:) 11.0684 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 247.723] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 299.131 Td
+/F124_0 9.9626 Tf
+(Compression:) 71.7307 Tj
+-1278 TJm
+(400k) 23.9102 Tj
+-426 TJm
+(+) 5.9776 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(8) 5.9776 Tj
+-426 TJm
+(x) 5.9776 Tj
+-426 TJm
+(block) 29.8878 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(\)) 5.9776 Tj
+90 275.22 Td
+(Decompression:) 83.6858 Tj
+-426 TJm
+(100k) 23.9102 Tj
+-426 TJm
+(+) 5.9776 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(4) 5.9776 Tj
+-426 TJm
+(x) 5.9776 Tj
+-426 TJm
+(block) 29.8878 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(\),) 11.9551 Tj
+-426 TJm
+(or) 11.9551 Tj
+153.66 263.265 Td
+(100k) 23.9102 Tj
+-426 TJm
+(+) 5.9776 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(2.5) 17.9327 Tj
+-426 TJm
+(x) 5.9776 Tj
+-426 TJm
+(block) 29.8878 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 225.805 Td
+/F122_0 9.9626 Tf
+(Lar) 13.8281 Tj
+18 TJm
+(ger) 12.7222 Tj
+-292 TJm
+(block) 22.1369 Tj
+-292 TJm
+(sizes) 19.3673 Tj
+-291 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-292 TJm
+(rapidly) 28.224 Tj
+-292 TJm
+(diminishing) 47.6113 Tj
+-292 TJm
+(mar) 15.4918 Tj
+18 TJm
+(ginal) 19.9252 Tj
+-291 TJm
+(returns.) 30.1568 Tj
+-871 TJm
+(Most) 20.4831 Tj
+-292 TJm
+(of) 8.2988 Tj
+-291 TJm
+(the) 12.1743 Tj
+-292 TJm
+(compression) 50.3609 Tj
+-292 TJm
+(comes) 25.4544 Tj
+-292 TJm
+(from) 19.3673 Tj
+-291 TJm
+(the) 12.1743 Tj
+-292 TJm
+(\002rst) 15.5018 Tj
+-292 TJm
+(tw) 9.9626 Tj
+10 TJm
+(o) 4.9813 Tj
+-292 TJm
+(or) 8.2988 Tj
+72 213.85 Td
+(three) 19.9152 Tj
+-232 TJm
+(hundred) 32.6474 Tj
+-232 TJm
+(k) 4.9813 Tj
+-232 TJm
+(of) 8.2988 Tj
+-232 TJm
+(block) 22.1369 Tj
+-232 TJm
+(size,) 17.9825 Tj
+-235 TJm
+(a) 4.4234 Tj
+-232 TJm
+(f) 3.3175 Tj
+10 TJm
+(act) 11.6164 Tj
+-232 TJm
+(w) 7.193 Tj
+10 TJm
+(orth) 16.0497 Tj
+-232 TJm
+(bearing) 29.8778 Tj
+-232 TJm
+(in) 7.7509 Tj
+-232 TJm
+(mind) 20.4831 Tj
+-232 TJm
+(when) 21.579 Tj
+-231 TJm
+(using) 21.589 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+354.025 213.85 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+386.223 213.85 Td
+/F122_0 9.9626 Tf
+(on) 9.9626 Tj
+-232 TJm
+(small) 21.589 Tj
+-232 TJm
+(machines.) 40.1194 Tj
+-304 TJm
+(It) 6.0871 Tj
+-232 TJm
+(is) 6.6451 Tj
+-232 TJm
+(also) 16.0497 Tj
+-231 TJm
+(important) 38.7446 Tj
+72 201.895 Td
+(to) 7.7509 Tj
+-250 TJm
+(appreciate) 40.9363 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(decompression) 59.7656 Tj
+-250 TJm
+(memory) 33.2053 Tj
+-250 TJm
+(requirement) 48.1393 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(set) 11.0684 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(compression) 50.3609 Tj
+-250 TJm
+(time) 17.7135 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(choice) 26.0024 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(block) 22.1369 Tj
+-250 TJm
+(size.) 17.9825 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 179.977 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-388 TJm
+(\002les) 16.6077 Tj
+-389 TJm
+(compressed) 47.0334 Tj
+-388 TJm
+(with) 17.7135 Tj
+-389 TJm
+(the) 12.1743 Tj
+-388 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault) 14.9439 Tj
+-389 TJm
+(900k) 19.9252 Tj
+-388 TJm
+(block) 22.1369 Tj
+-389 TJm
+(size,) 17.9825 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+302.002 179.977 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+347.716 179.977 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-388 TJm
+(require) 28.2141 Tj
+-389 TJm
+(about) 22.1369 Tj
+-388 TJm
+(3700) 19.9252 Tj
+-389 TJm
+(kbytes) 26.0123 Tj
+-388 TJm
+(to) 7.7509 Tj
+-389 TJm
+(decompress.) 49.5241 Tj
+72 168.022 Td
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-424 TJm
+(support) 29.8878 Tj
+-425 TJm
+(decompression) 59.7656 Tj
+-424 TJm
+(of) 8.2988 Tj
+-424 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-425 TJm
+(\002l) 8.3088 Tj
+1 TJm
+(e) 4.4234 Tj
+-425 TJm
+(on) 9.9626 Tj
+-424 TJm
+(a) 4.4234 Tj
+-424 TJm
+(4) 4.9813 Tj
+-425 TJm
+(me) 12.1743 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(abyte) 21.579 Tj
+-424 TJm
+(machine,) 36.2439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+348.272 168.022 Td
+/F124_0 9.9626 Tf
+(bunzip2) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+394.342 168.022 Td
+/F122_0 9.9626 Tf
+(has) 13.2801 Tj
+-424 TJm
+(an) 9.4047 Tj
+-425 TJm
+(option) 25.4644 Tj
+-424 TJm
+(to) 7.7509 Tj
+-424 TJm
+(decompress) 47.0334 Tj
+-424 TJm
+(using) 21.589 Tj
+72 156.067 Td
+(approximately) 57.5539 Tj
+-281 TJm
+(half) 15.4918 Tj
+-281 TJm
+(this) 14.396 Tj
+-280 TJm
+(amount) 29.8878 Tj
+-281 TJm
+(of) 8.2988 Tj
+-281 TJm
+(memory) 33.2053 Tj
+65 TJm
+(,) 2.4907 Tj
+-288 TJm
+(about) 22.1369 Tj
+-281 TJm
+(2300) 19.9252 Tj
+-281 TJm
+(kbytes.) 28.503 Tj
+-805 TJm
+(Decompression) 61.9773 Tj
+-280 TJm
+(speed) 22.6848 Tj
+-281 TJm
+(is) 6.6451 Tj
+-281 TJm
+(also) 16.0497 Tj
+-281 TJm
+(halv) 17.1556 Tj
+15 TJm
+(ed,) 11.8953 Tj
+-288 TJm
+(so) 8.8568 Tj
+-281 TJm
+(you) 14.9439 Tj
+-281 TJm
+(should) 26.5703 Tj
+72 144.112 Td
+(use) 13.2801 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(option) 25.4644 Tj
+-250 TJm
+(only) 17.7135 Tj
+-250 TJm
+(where) 24.3386 Tj
+-250 TJm
+(necessary) 38.7246 Tj
+65 TJm
+(.) 2.4907 Tj
+-620 TJm
+(The) 15.4918 Tj
+-250 TJm
+(rele) 14.9339 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ant) 12.1743 Tj
+-250 TJm
+(\003ag) 14.9439 Tj
+-250 TJm
+(is) 6.6451 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+305.024 144.112 Td
+/F124_0 9.9626 Tf
+(-s) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+316.979 144.112 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 122.194 Td
+(In) 8.2988 Tj
+-204 TJm
+(general,) 31.8106 Tj
+-214 TJm
+(try) 11.0684 Tj
+-204 TJm
+(and) 14.386 Tj
+-205 TJm
+(use) 13.2801 Tj
+-204 TJm
+(the) 12.1743 Tj
+-204 TJm
+(lar) 10.5105 Tj
+18 TJm
+(gest) 16.0497 Tj
+-205 TJm
+(block) 22.1369 Tj
+-204 TJm
+(size) 15.4918 Tj
+-205 TJm
+(memory) 33.2053 Tj
+-204 TJm
+(constraints) 43.1679 Tj
+-204 TJm
+(allo) 14.9439 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(,) 2.4907 Tj
+-214 TJm
+(since) 20.4731 Tj
+-204 TJm
+(that) 14.9439 Tj
+-205 TJm
+(maximises) 42.62 Tj
+-204 TJm
+(the) 12.1743 Tj
+-204 TJm
+(compression) 50.3609 Tj
+-205 TJm
+(achie) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ed.) 11.8953 Tj
+72 110.239 Td
+(Compression) 52.5826 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(decompression) 59.7656 Tj
+-250 TJm
+(speed) 22.6848 Tj
+-250 TJm
+(are) 12.1643 Tj
+-250 TJm
+(virtually) 33.7633 Tj
+-250 TJm
+(unaf) 17.7035 Tj
+25 TJm
+(fected) 24.3386 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(block) 22.1369 Tj
+-250 TJm
+(size.) 17.9825 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 88.321 Td
+(Another) 32.6474 Tj
+-296 TJm
+(signi\002cant) 41.5142 Tj
+-296 TJm
+(point) 20.4831 Tj
+-295 TJm
+(applies) 28.224 Tj
+-296 TJm
+(to) 7.7509 Tj
+-296 TJm
+(\002les) 16.6077 Tj
+-296 TJm
+(which) 24.3486 Tj
+-296 TJm
+(\002t) 8.3088 Tj
+-296 TJm
+(in) 7.7509 Tj
+-296 TJm
+(a) 4.4234 Tj
+-295 TJm
+(single) 23.8007 Tj
+-296 TJm
+(block) 22.1369 Tj
+-296 TJm
+(--) 6.6351 Tj
+-296 TJm
+(that) 14.9439 Tj
+-296 TJm
+(means) 25.4544 Tj
+-296 TJm
+(most) 19.3773 Tj
+-295 TJm
+(\002les) 16.6077 Tj
+-296 TJm
+(you') 18.2614 Tj
+50 TJm
+(d) 4.9813 Tj
+-296 TJm
+(encounter) 39.2825 Tj
+-296 TJm
+(using) 21.589 Tj
+-296 TJm
+(a) 4.4234 Tj
+72 76.366 Td
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-290 TJm
+(block) 22.1369 Tj
+-290 TJm
+(size.) 17.9825 Tj
+-859 TJm
+(The) 15.4918 Tj
+-290 TJm
+(amount) 29.8878 Tj
+-290 TJm
+(of) 8.2988 Tj
+-290 TJm
+(real) 14.9339 Tj
+-290 TJm
+(memory) 33.2053 Tj
+-289 TJm
+(touched) 31.5416 Tj
+-290 TJm
+(is) 6.6451 Tj
+-290 TJm
+(proportional) 49.2551 Tj
+-290 TJm
+(to) 7.7509 Tj
+-290 TJm
+(the) 12.1743 Tj
+-290 TJm
+(size) 15.4918 Tj
+-290 TJm
+(of) 8.2988 Tj
+-290 TJm
+(the) 12.1743 Tj
+-289 TJm
+(\002le,) 15.2229 Tj
+-300 TJm
+(since) 20.4731 Tj
+-290 TJm
+(the) 12.1743 Tj
+-290 TJm
+(\002le) 12.7322 Tj
+-290 TJm
+(is) 6.6451 Tj
+-290 TJm
+(smaller) 29.3299 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.951 Td
+(5) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 6 9
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+477.109 749.245 Td
+/F122_0 9.9626 Tf
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(than) 17.1556 Tj
+-362 TJm
+(a) 4.4234 Tj
+-362 TJm
+(block.) 24.6275 Tj
+-1293 TJm
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-362 TJm
+(e) 4.4234 Tj
+15 TJm
+(xample,) 31.8205 Tj
+-390 TJm
+(compressing) 50.3609 Tj
+-362 TJm
+(a) 4.4234 Tj
+-362 TJm
+(\002le) 12.7322 Tj
+-362 TJm
+(20,000) 27.3972 Tj
+-362 TJm
+(bytes) 21.031 Tj
+-362 TJm
+(long) 17.7135 Tj
+-362 TJm
+(with) 17.7135 Tj
+-362 TJm
+(the) 12.1743 Tj
+-362 TJm
+(\003ag) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+406.528 710.037 Td
+/F124_0 9.9626 Tf
+(-9) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+422.09 710.037 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-362 TJm
+(cause) 22.1269 Tj
+-362 TJm
+(the) 12.1743 Tj
+-362 TJm
+(compressor) 45.9276 Tj
+-362 TJm
+(to) 7.7509 Tj
+72 698.082 Td
+(allocate) 30.9837 Tj
+-271 TJm
+(around) 27.6661 Tj
+-272 TJm
+(7600k) 24.9065 Tj
+-271 TJm
+(of) 8.2988 Tj
+-272 TJm
+(memory) 33.2053 Tj
+65 TJm
+(,) 2.4907 Tj
+-277 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-271 TJm
+(only) 17.7135 Tj
+-272 TJm
+(touch) 22.1369 Tj
+-271 TJm
+(400k) 19.9252 Tj
+-272 TJm
+(+) 5.6189 Tj
+-271 TJm
+(20000) 24.9065 Tj
+-272 TJm
+(*) 4.9813 Tj
+-271 TJm
+(8) 4.9813 Tj
+-272 TJm
+(=) 5.6189 Tj
+-271 TJm
+(560) 14.9439 Tj
+-272 TJm
+(kbytes) 26.0123 Tj
+-271 TJm
+(of) 8.2988 Tj
+-272 TJm
+(it.) 8.0299 Tj
+-748 TJm
+(Similarly) 37.0908 Tj
+65 TJm
+(,) 2.4907 Tj
+-277 TJm
+(the) 12.1743 Tj
+-272 TJm
+(decompressor) 55.3323 Tj
+72 686.127 Td
+(will) 15.5018 Tj
+-250 TJm
+(allocate) 30.9837 Tj
+-250 TJm
+(3700k) 24.9065 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(only) 17.7135 Tj
+-250 TJm
+(touch) 22.1369 Tj
+-250 TJm
+(100k) 19.9252 Tj
+-250 TJm
+(+) 5.6189 Tj
+-250 TJm
+(20000) 24.9065 Tj
+-250 TJm
+(*) 4.9813 Tj
+-250 TJm
+(4) 4.9813 Tj
+-250 TJm
+(=) 5.6189 Tj
+-250 TJm
+(180) 14.9439 Tj
+-250 TJm
+(kbytes.) 28.503 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 664.209 Td
+(Here) 19.3573 Tj
+-293 TJm
+(is) 6.6451 Tj
+-294 TJm
+(a) 4.4234 Tj
+-293 TJm
+(table) 19.3673 Tj
+-294 TJm
+(which) 24.3486 Tj
+-293 TJm
+(summarises) 47.0434 Tj
+-294 TJm
+(the) 12.1743 Tj
+-293 TJm
+(maximum) 40.4083 Tj
+-294 TJm
+(memory) 33.2053 Tj
+-293 TJm
+(usage) 22.6848 Tj
+-294 TJm
+(for) 11.6164 Tj
+-293 TJm
+(dif) 11.0684 Tj
+25 TJm
+(ferent) 23.2328 Tj
+-294 TJm
+(block) 22.1369 Tj
+-293 TJm
+(sizes.) 21.8579 Tj
+-881 TJm
+(Also) 18.8194 Tj
+-293 TJm
+(recorded) 34.8492 Tj
+-294 TJm
+(is) 6.6451 Tj
+-293 TJm
+(the) 12.1743 Tj
+-294 TJm
+(total) 17.7135 Tj
+72 652.254 Td
+(compressed) 47.0334 Tj
+-289 TJm
+(size) 15.4918 Tj
+-289 TJm
+(for) 11.6164 Tj
+-289 TJm
+(14) 9.9626 Tj
+-289 TJm
+(\002les) 16.6077 Tj
+-290 TJm
+(of) 8.2988 Tj
+-289 TJm
+(the) 12.1743 Tj
+-289 TJm
+(Calg) 18.8194 Tj
+5 TJm
+(ary) 12.7222 Tj
+-289 TJm
+(T) 6.0871 Tj
+70 TJm
+(e) 4.4234 Tj
+15 TJm
+(xt) 7.7509 Tj
+-289 TJm
+(Compression) 52.5826 Tj
+-289 TJm
+(Corpus) 28.782 Tj
+-289 TJm
+(totalling) 33.2153 Tj
+-289 TJm
+(3,141,622) 39.8504 Tj
+-290 TJm
+(bytes.) 23.5217 Tj
+-854 TJm
+(This) 17.7135 Tj
+-290 TJm
+(column) 29.8878 Tj
+-289 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+72 640.299 Td
+(some) 21.031 Tj
+-253 TJm
+(feel) 14.9339 Tj
+-253 TJm
+(for) 11.6164 Tj
+-253 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-253 TJm
+(compression) 50.3609 Tj
+-253 TJm
+(v) 4.9813 Tj
+25 TJm
+(aries) 18.8094 Tj
+-253 TJm
+(with) 17.7135 Tj
+-253 TJm
+(block) 22.1369 Tj
+-253 TJm
+(size.) 17.9825 Tj
+-638 TJm
+(These) 23.7907 Tj
+-253 TJm
+(\002gures) 27.1182 Tj
+-253 TJm
+(tend) 17.1556 Tj
+-254 TJm
+(to) 7.7509 Tj
+-253 TJm
+(understate) 40.9463 Tj
+-253 TJm
+(the) 12.1743 Tj
+-253 TJm
+(adv) 14.386 Tj
+25 TJm
+(antage) 26.0024 Tj
+-253 TJm
+(of) 8.2988 Tj
+-253 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ger) 12.7222 Tj
+-253 TJm
+(block) 22.1369 Tj
+72 628.344 Td
+(sizes) 19.3673 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ger) 12.7222 Tj
+-250 TJm
+(\002les,) 19.0983 Tj
+-250 TJm
+(since) 20.4731 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(Corpus) 28.782 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(dominated) 42.0621 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(smaller) 29.3299 Tj
+-250 TJm
+(\002les.) 19.0983 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 469.773] cm
+0 0 468 155.417 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+123.952 616.822 Td
+/F124_0 9.9626 Tf
+(Compress) 47.8205 Tj
+-1278 TJm
+(Decompress) 59.7756 Tj
+-1278 TJm
+(Decompress) 59.7756 Tj
+-1278 TJm
+(Corpus) 35.8654 Tj
+90 604.867 Td
+(Flag) 23.9102 Tj
+-2130 TJm
+(usage) 29.8878 Tj
+-2556 TJm
+(usage) 29.8878 Tj
+-2982 TJm
+(-s) 11.9551 Tj
+-426 TJm
+(usage) 29.8878 Tj
+-2130 TJm
+(Size) 23.9102 Tj
+94.244 580.957 Td
+(-1) 11.9551 Tj
+-2556 TJm
+(1200k) 29.8878 Tj
+-2982 TJm
+(500k) 23.9102 Tj
+-3834 TJm
+(350k) 23.9102 Tj
+-2556 TJm
+(914704) 35.8654 Tj
+94.244 569.001 Td
+(-2) 11.9551 Tj
+-2556 TJm
+(2000k) 29.8878 Tj
+-2982 TJm
+(900k) 23.9102 Tj
+-3834 TJm
+(600k) 23.9102 Tj
+-2556 TJm
+(877703) 35.8654 Tj
+94.244 557.046 Td
+(-3) 11.9551 Tj
+-2556 TJm
+(2800k) 29.8878 Tj
+-2556 TJm
+(1300k) 29.8878 Tj
+-3834 TJm
+(850k) 23.9102 Tj
+-2556 TJm
+(860338) 35.8654 Tj
+94.244 545.091 Td
+(-4) 11.9551 Tj
+-2556 TJm
+(3600k) 29.8878 Tj
+-2556 TJm
+(1700k) 29.8878 Tj
+-3408 TJm
+(1100k) 29.8878 Tj
+-2556 TJm
+(846899) 35.8654 Tj
+94.244 533.136 Td
+(-5) 11.9551 Tj
+-2556 TJm
+(4400k) 29.8878 Tj
+-2556 TJm
+(2100k) 29.8878 Tj
+-3408 TJm
+(1350k) 29.8878 Tj
+-2556 TJm
+(845160) 35.8654 Tj
+94.244 521.181 Td
+(-6) 11.9551 Tj
+-2556 TJm
+(5200k) 29.8878 Tj
+-2556 TJm
+(2500k) 29.8878 Tj
+-3408 TJm
+(1600k) 29.8878 Tj
+-2556 TJm
+(838626) 35.8654 Tj
+94.244 509.225 Td
+(-7) 11.9551 Tj
+-2556 TJm
+(6100k) 29.8878 Tj
+-2556 TJm
+(2900k) 29.8878 Tj
+-3408 TJm
+(1850k) 29.8878 Tj
+-2556 TJm
+(834096) 35.8654 Tj
+94.244 497.27 Td
+(-8) 11.9551 Tj
+-2556 TJm
+(6800k) 29.8878 Tj
+-2556 TJm
+(3300k) 29.8878 Tj
+-3408 TJm
+(2100k) 29.8878 Tj
+-2556 TJm
+(828642) 35.8654 Tj
+94.244 485.315 Td
+(-9) 11.9551 Tj
+-2556 TJm
+(7600k) 29.8878 Tj
+-2556 TJm
+(3700k) 29.8878 Tj
+-3408 TJm
+(2350k) 29.8878 Tj
+-2556 TJm
+(828642) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 435.021 Td
+/F116_0 20.6585 Tf
+(2.6.) 34.4584 Tj
+-278 TJm
+(RECO) 59.6824 Tj
+50 TJm
+(VERING) 79.2047 Tj
+-278 TJm
+(D) 14.9154 Tj
+40 TJm
+(A) 14.9154 Tj
+90 TJm
+(T) 12.6223 Tj
+90 TJm
+(A) 14.9154 Tj
+-278 TJm
+(FR) 27.5378 Tj
+20 TJm
+(OM) 33.2808 Tj
+-278 TJm
+(D) 14.9154 Tj
+40 TJm
+(AMA) 47.0394 Tj
+50 TJm
+(GED) 44.767 Tj
+72 410.23 Td
+(FILES) 58.5462 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 388.312 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+105.138 388.312 Td
+/F122_0 9.9626 Tf
+(compresses) 45.9276 Tj
+-326 TJm
+(\002les) 16.6077 Tj
+-326 TJm
+(in) 7.7509 Tj
+-326 TJm
+(blocks,) 28.503 Tj
+-346 TJm
+(usually) 28.782 Tj
+-326 TJm
+(900kbytes) 40.9562 Tj
+-326 TJm
+(long.) 20.2042 Tj
+-1077 TJm
+(Each) 19.9152 Tj
+-326 TJm
+(block) 22.1369 Tj
+-326 TJm
+(is) 6.6451 Tj
+-327 TJm
+(handled) 31.5416 Tj
+-326 TJm
+(independently) 56.4481 Tj
+65 TJm
+(.) 2.4907 Tj
+-1077 TJm
+(If) 6.6351 Tj
+-326 TJm
+(a) 4.4234 Tj
+-326 TJm
+(media) 24.3486 Tj
+-326 TJm
+(or) 8.2988 Tj
+72 376.357 Td
+(transmission) 50.3709 Tj
+-319 TJm
+(error) 19.3573 Tj
+-318 TJm
+(causes) 26.0024 Tj
+-319 TJm
+(a) 4.4234 Tj
+-318 TJm
+(multi-block) 46.4955 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+234.519 376.357 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+261.603 376.357 Td
+/F122_0 9.9626 Tf
+(\002le) 12.7322 Tj
+-319 TJm
+(to) 7.7509 Tj
+-318 TJm
+(become) 30.9837 Tj
+-319 TJm
+(damaged,) 38.4556 Tj
+-336 TJm
+(i) 2.7696 Tj
+1 TJm
+(t) 2.7696 Tj
+-319 TJm
+(may) 17.1556 Tj
+-319 TJm
+(be) 9.4047 Tj
+-318 TJm
+(possible) 32.6574 Tj
+-319 TJm
+(to) 7.7509 Tj
+-318 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-319 TJm
+(data) 16.5977 Tj
+-319 TJm
+(from) 19.3673 Tj
+-318 TJm
+(the) 12.1743 Tj
+72 364.402 Td
+(undamaged) 45.9276 Tj
+-250 TJm
+(blocks) 26.0123 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\002le.) 15.2229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 342.484 Td
+(The) 15.4918 Tj
+-358 TJm
+(compressed) 47.0334 Tj
+-357 TJm
+(representation) 56.4381 Tj
+-358 TJm
+(of) 8.2988 Tj
+-357 TJm
+(each) 18.2515 Tj
+-358 TJm
+(block) 22.1369 Tj
+-358 TJm
+(is) 6.6451 Tj
+-357 TJm
+(delimited) 37.6387 Tj
+-358 TJm
+(by) 9.9626 Tj
+-357 TJm
+(a) 4.4234 Tj
+-358 TJm
+(48-bit) 23.8007 Tj
+-358 TJm
+(pattern,) 30.1568 Tj
+-384 TJm
+(which) 24.3486 Tj
+-358 TJm
+(mak) 17.1556 Tj
+10 TJm
+(es) 8.2988 Tj
+-357 TJm
+(it) 5.5392 Tj
+-358 TJm
+(possible) 32.6574 Tj
+-357 TJm
+(to) 7.7509 Tj
+-358 TJm
+(\002nd) 15.5018 Tj
+-358 TJm
+(the) 12.1743 Tj
+72 330.529 Td
+(block) 22.1369 Tj
+-286 TJm
+(boundaries) 43.7159 Tj
+-286 TJm
+(with) 17.7135 Tj
+-285 TJm
+(reasonable) 42.6001 Tj
+-286 TJm
+(certainty) 34.8591 Tj
+65 TJm
+(.) 2.4907 Tj
+-835 TJm
+(Each) 19.9152 Tj
+-285 TJm
+(block) 22.1369 Tj
+-286 TJm
+(also) 16.0497 Tj
+-286 TJm
+(carries) 26.5503 Tj
+-286 TJm
+(its) 9.4147 Tj
+-285 TJm
+(o) 4.9813 Tj
+25 TJm
+(wn) 12.1743 Tj
+-286 TJm
+(32-bit) 23.8007 Tj
+-286 TJm
+(CRC,) 22.4258 Tj
+-286 TJm
+(so) 8.8568 Tj
+-285 TJm
+(damaged) 35.965 Tj
+-286 TJm
+(blocks) 26.0123 Tj
+-286 TJm
+(can) 13.8281 Tj
+-286 TJm
+(be) 9.4047 Tj
+72 318.574 Td
+(distinguished) 53.1405 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(undamaged) 45.9276 Tj
+-250 TJm
+(ones.) 20.7521 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 296.656 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+146.448 296.656 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-273 TJm
+(a) 4.4234 Tj
+-272 TJm
+(simple) 26.5703 Tj
+-273 TJm
+(program) 33.7533 Tj
+-273 TJm
+(whose) 25.4544 Tj
+-272 TJm
+(purpose) 31.5416 Tj
+-273 TJm
+(is) 6.6451 Tj
+-273 TJm
+(to) 7.7509 Tj
+-272 TJm
+(search) 25.4445 Tj
+-273 TJm
+(for) 11.6164 Tj
+-273 TJm
+(blocks) 26.0123 Tj
+-272 TJm
+(in) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+392.655 296.656 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+419.282 296.656 Td
+/F122_0 9.9626 Tf
+(\002les,) 19.0983 Tj
+-278 TJm
+(and) 14.386 Tj
+-273 TJm
+(write) 20.4731 Tj
+-273 TJm
+(each) 18.2515 Tj
+-272 TJm
+(block) 22.1369 Tj
+-273 TJm
+(out) 12.7322 Tj
+72 284.701 Td
+(into) 15.5018 Tj
+-255 TJm
+(i) 2.7696 Tj
+1 TJm
+(ts) 6.6451 Tj
+-255 TJm
+(o) 4.9813 Tj
+25 TJm
+(wn) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+121.429 284.701 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+147.875 284.701 Td
+/F122_0 9.9626 Tf
+(\002le.) 15.2229 Tj
+-647 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-255 TJm
+(can) 13.8281 Tj
+-254 TJm
+(then) 17.1556 Tj
+-255 TJm
+(use) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+240.01 284.701 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+-600 TJm
+(-t) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+290.367 284.701 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-254 TJm
+(test) 13.8381 Tj
+-255 TJm
+(the) 12.1743 Tj
+-254 TJm
+(inte) 14.9439 Tj
+15 TJm
+(grity) 18.8194 Tj
+-255 TJm
+(of) 8.2988 Tj
+-254 TJm
+(the) 12.1743 Tj
+-255 TJm
+(resulting) 34.8691 Tj
+-254 TJm
+(\002les,) 19.0983 Tj
+-256 TJm
+(and) 14.386 Tj
+-255 TJm
+(decompress) 47.0334 Tj
+-254 TJm
+(those) 21.031 Tj
+72 272.746 Td
+(which) 24.3486 Tj
+-250 TJm
+(are) 12.1643 Tj
+-250 TJm
+(undamaged.) 48.4182 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 250.828 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+150.099 250.828 Td
+/F122_0 9.9626 Tf
+(tak) 12.1743 Tj
+10 TJm
+(es) 8.2988 Tj
+-639 TJm
+(a) 4.4234 Tj
+-639 TJm
+(single) 23.8007 Tj
+-639 TJm
+(ar) 7.7409 Tj
+18 TJm
+(gument,) 32.3785 Tj
+-737 TJm
+(the) 12.1743 Tj
+-639 TJm
+(name) 21.579 Tj
+-639 TJm
+(of) 8.2988 Tj
+-639 TJm
+(the) 12.1743 Tj
+-639 TJm
+(damaged) 35.965 Tj
+-639 TJm
+(\002le,) 15.2229 Tj
+-737 TJm
+(and) 14.386 Tj
+-639 TJm
+(writes) 24.3486 Tj
+-639 TJm
+(a) 4.4234 Tj
+-639 TJm
+(number) 30.4357 Tj
+-639 TJm
+(of) 8.2988 Tj
+-640 TJm
+(\002) 5.5392 Tj
+1 TJm
+(les) 11.0684 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 238.873 Td
+/F124_0 9.9626 Tf
+(rec0001file.bz2) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.664 238.873 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.072 238.873 Td
+/F124_0 9.9626 Tf
+(rec0002file.bz2) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+258.736 238.873 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-494 TJm
+(etc,) 14.107 Tj
+-493 TJm
+(containing) 42.0621 Tj
+-445 TJm
+(the) 12.1743 Tj
+-445 TJm
+(e) 4.4234 Tj
+15 TJm
+(xtracted) 32.0895 Tj
+-445 TJm
+(blocks.) 28.503 Tj
+-1789 TJm
+(The) 15.4918 Tj
+-445 TJm
+(output) 25.4644 Tj
+-445 TJm
+(\002lenames) 38.1866 Tj
+-445 TJm
+(are) 12.1643 Tj
+72 226.918 Td
+(designed) 35.417 Tj
+-337 TJm
+(so) 8.8568 Tj
+-337 TJm
+(that) 14.9439 Tj
+-337 TJm
+(the) 12.1743 Tj
+-337 TJm
+(use) 13.2801 Tj
+-337 TJm
+(of) 8.2988 Tj
+-337 TJm
+(wildc) 22.1369 Tj
+1 TJm
+(ards) 16.5977 Tj
+-337 TJm
+(in) 7.7509 Tj
+-337 TJm
+(subsequent) 44.2738 Tj
+-337 TJm
+(processing) 42.61 Tj
+-337 TJm
+(--) 6.6351 Tj
+-337 TJm
+(for) 11.6164 Tj
+-337 TJm
+(e) 4.4234 Tj
+15 TJm
+(xample,) 31.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+396.538 226.918 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+-600 TJm
+(-dc) 17.9327 Tj
+-600 TJm
+(rec) 17.9327 Tj
+474.247 225.174 Td
+(*) 5.9776 Tj
+480.224 226.918 Td
+(file.bz2) 47.8205 Tj
+-600 TJm
+(>) 5.9776 Tj
+72 214.962 Td
+(recovered_data) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+158.177 214.962 Td
+/F122_0 9.9626 Tf
+(--) 6.6351 Tj
+-250 TJm
+(lists) 16.0597 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(correct) 27.6562 Tj
+-250 TJm
+(order) 21.0211 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 193.045 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.93 193.045 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-221 TJm
+(be) 9.4047 Tj
+-220 TJm
+(of) 8.2988 Tj
+-221 TJm
+(most) 19.3773 Tj
+-221 TJm
+(use) 13.2801 Tj
+-220 TJm
+(dealing) 29.3299 Tj
+-221 TJm
+(with) 17.7135 Tj
+-221 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+307.229 193.045 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+333.338 193.045 Td
+/F122_0 9.9626 Tf
+(\002les,) 19.0983 Tj
+-227 TJm
+(as) 8.2988 Tj
+-220 TJm
+(these) 20.4731 Tj
+-221 TJm
+(will) 15.5018 Tj
+-221 TJm
+(contain) 29.3299 Tj
+-220 TJm
+(man) 17.1556 Tj
+15 TJm
+(y) 4.9813 Tj
+-221 TJm
+(blocks.) 28.503 Tj
+-600 TJm
+(It) 6.0871 Tj
+-221 TJm
+(is) 6.6451 Tj
+-221 TJm
+(clearly) 27.1082 Tj
+72 181.089 Td
+(futile) 21.031 Tj
+-289 TJm
+(to) 7.7509 Tj
+-289 TJm
+(use) 13.2801 Tj
+-289 TJm
+(it) 5.5392 Tj
+-289 TJm
+(on) 9.9626 Tj
+-289 TJm
+(damaged) 35.965 Tj
+-289 TJm
+(single-block) 49.2551 Tj
+-290 TJm
+(\002les) 16.6077 Tj
+1 TJm
+(,) 2.4907 Tj
+-299 TJm
+(since) 20.4731 Tj
+-289 TJm
+(a) 4.4234 Tj
+-290 TJm
+(damaged) 35.965 Tj
+-289 TJm
+(block) 22.1369 Tj
+-289 TJm
+(cannot) 26.5603 Tj
+-289 TJm
+(be) 9.4047 Tj
+-289 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ered.) 19.6363 Tj
+-854 TJm
+(If) 6.6351 Tj
+-289 TJm
+(you) 14.9439 Tj
+-290 TJm
+(wish) 18.8194 Tj
+-289 TJm
+(to) 7.7509 Tj
+-289 TJm
+(minimise) 37.0908 Tj
+72 169.134 Td
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-320 TJm
+(potential) 34.8691 Tj
+-320 TJm
+(data) 16.5977 Tj
+-319 TJm
+(loss) 15.5018 Tj
+-320 TJm
+(through) 30.9936 Tj
+-320 TJm
+(media) 24.3486 Tj
+-320 TJm
+(or) 8.2988 Tj
+-319 TJm
+(transmission) 50.3709 Tj
+-320 TJm
+(errors,) 25.7234 Tj
+-337 TJm
+(you) 14.9439 Tj
+-320 TJm
+(might) 23.2527 Tj
+-320 TJm
+(consider) 33.7533 Tj
+-320 TJm
+(compressing) 50.3609 Tj
+-319 TJm
+(with) 17.7135 Tj
+-320 TJm
+(a) 4.4234 Tj
+-320 TJm
+(smaller) 29.3299 Tj
+-320 TJm
+(block) 22.1369 Tj
+72 157.179 Td
+(size.) 17.9825 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 122.426 Td
+/F116_0 20.6585 Tf
+(2.7.) 34.4584 Tj
+-278 TJm
+(PERFORMANCE) 161.818 Tj
+-278 TJm
+(NO) 30.9878 Tj
+40 TJm
+(TES) 40.1808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 100.508 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-305 TJm
+(sorting) 27.6761 Tj
+-304 TJm
+(phase) 22.6848 Tj
+-305 TJm
+(of) 8.2988 Tj
+-304 TJm
+(compression) 50.3609 Tj
+-305 TJm
+(g) 4.9813 Tj
+5 TJm
+(athers) 23.7907 Tj
+-304 TJm
+(together) 32.6474 Tj
+-305 TJm
+(similar) 27.6761 Tj
+-304 TJm
+(strings) 26.5703 Tj
+-305 TJm
+(in) 7.7509 Tj
+-304 TJm
+(the) 12.1743 Tj
+-305 TJm
+(\002le.) 15.2229 Tj
+-947 TJm
+(Because) 33.1954 Tj
+-305 TJm
+(of) 8.2988 Tj
+-304 TJm
+(this,) 16.8866 Tj
+-319 TJm
+(\002les) 16.6077 Tj
+-304 TJm
+(containing) 42.0621 Tj
+-305 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+72 88.553 Td
+(long) 17.7135 Tj
+-286 TJm
+(runs) 17.1556 Tj
+-285 TJm
+(of) 8.2988 Tj
+-286 TJm
+(repeated) 33.7433 Tj
+-285 TJm
+(symbols,) 35.706 Tj
+-295 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-286 TJm
+("aabaabaabaab) 59.3771 Tj
+-285 TJm
+(...") 11.5367 Tj
+-571 TJm
+(\(repeated) 37.0609 Tj
+-286 TJm
+(se) 8.2988 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(eral) 14.9339 Tj
+-286 TJm
+(hundred) 32.6474 Tj
+-285 TJm
+(times\)) 24.9065 Tj
+-286 TJm
+(may) 17.1556 Tj
+-286 TJm
+(com) 17.1556 Tj
+1 TJm
+(press) 20.4731 Tj
+-286 TJm
+(more) 20.4731 Tj
+-286 TJm
+(slo) 11.6264 Tj
+25 TJm
+(wly) 14.9439 Tj
+72 76.598 Td
+(than) 17.1556 Tj
+-322 TJm
+(normal.) 30.7147 Tj
+-524 TJm
+(V) 7.193 Tj
+111 TJm
+(ersions) 28.224 Tj
+-322 TJm
+(0.9.5) 19.9252 Tj
+-321 TJm
+(and) 14.386 Tj
+-322 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-322 TJm
+(f) 3.3175 Tj
+10 TJm
+(are) 12.1643 Tj
+-321 TJm
+(much) 22.1369 Tj
+-322 TJm
+(better) 22.6848 Tj
+-321 TJm
+(than) 17.1556 Tj
+-322 TJm
+(pre) 12.7222 Tj
+25 TJm
+(vious) 21.589 Tj
+-321 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-322 TJm
+(in) 7.7509 Tj
+-322 TJm
+(this) 14.396 Tj
+-321 TJm
+(respect.) 30.7047 Tj
+-1050 TJm
+(The) 15.4918 Tj
+-321 TJm
+(ratio) 18.2614 Tj
+-322 TJm
+(between) 33.1954 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.951 Td
+(6) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 7 10
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+477.109 749.245 Td
+/F122_0 9.9626 Tf
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(w) 7.193 Tj
+10 TJm
+(orst-case) 35.4071 Tj
+-289 TJm
+(and) 14.386 Tj
+-290 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(erage-case) 42.0322 Tj
+-289 TJm
+(compression) 50.3609 Tj
+-290 TJm
+(time) 17.7135 Tj
+-289 TJm
+(is) 6.6451 Tj
+-290 TJm
+(in) 7.7509 Tj
+-289 TJm
+(the) 12.1743 Tj
+-290 TJm
+(re) 7.7409 Tj
+15 TJm
+(gion) 17.7135 Tj
+-289 TJm
+(of) 8.2988 Tj
+-289 TJm
+(10:1.) 20.2042 Tj
+-857 TJm
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-290 TJm
+(pre) 12.7222 Tj
+25 TJm
+(vious) 21.589 Tj
+-289 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions,) 30.7147 Tj
+-299 TJm
+(this) 14.396 Tj
+-290 TJm
+(\002gure) 23.2427 Tj
+-289 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-290 TJm
+(more) 20.4731 Tj
+72 698.082 Td
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-250 TJm
+(100:1.) 25.1855 Tj
+-620 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-250 TJm
+(can) 13.8281 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+186.002 698.082 Td
+/F124_0 9.9626 Tf
+(-vvvv) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+218.38 698.082 Td
+/F122_0 9.9626 Tf
+(option) 25.4644 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(monitor) 31.5516 Tj
+-250 TJm
+(progress) 33.7533 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(great) 19.9152 Tj
+-250 TJm
+(detail,) 24.6275 Tj
+-250 TJm
+(if) 6.0871 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ant.) 14.6649 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 676.164 Td
+(Decompression) 61.9773 Tj
+-250 TJm
+(speed) 22.6848 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(unaf) 17.7035 Tj
+25 TJm
+(fected) 24.3386 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(these) 20.4731 Tj
+-250 TJm
+(phenomena.) 48.4182 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 654.247 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.863 654.247 Td
+/F122_0 9.9626 Tf
+(usually) 28.782 Tj
+-299 TJm
+(allocates) 34.8591 Tj
+-298 TJm
+(se) 8.2988 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(eral) 14.9339 Tj
+-299 TJm
+(me) 12.1743 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(abytes) 25.4544 Tj
+-298 TJm
+(of) 8.2988 Tj
+-299 TJm
+(memory) 33.2053 Tj
+-299 TJm
+(to) 7.7509 Tj
+-298 TJm
+(operate) 29.3199 Tj
+-299 TJm
+(in,) 10.2416 Tj
+-311 TJm
+(and) 14.386 Tj
+-298 TJm
+(then) 17.1556 Tj
+-299 TJm
+(char) 17.1456 Tj
+18 TJm
+(ges) 13.2801 Tj
+-298 TJm
+(all) 9.9626 Tj
+-299 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-299 TJm
+(it) 5.5392 Tj
+-298 TJm
+(in) 7.7509 Tj
+-299 TJm
+(a) 4.4234 Tj
+-298 TJm
+(f) 3.3175 Tj
+10 TJm
+(airly) 18.2614 Tj
+-299 TJm
+(random) 30.4357 Tj
+72 642.291 Td
+(f) 3.3175 Tj
+10 TJm
+(ashion.) 28.503 Tj
+-743 TJm
+(This) 17.7135 Tj
+-270 TJm
+(means) 25.4544 Tj
+-271 TJm
+(that) 14.9439 Tj
+-270 TJm
+(performance,) 52.8317 Tj
+-276 TJm
+(both) 17.7135 Tj
+-270 TJm
+(for) 11.6164 Tj
+-271 TJm
+(compressing) 50.3609 Tj
+-270 TJm
+(and) 14.386 Tj
+-271 TJm
+(decompressing,) 62.2563 Tj
+-275 TJm
+(is) 6.6451 Tj
+-271 TJm
+(lar) 10.5105 Tj
+18 TJm
+(gely) 17.1556 Tj
+-270 TJm
+(determined) 44.8217 Tj
+-271 TJm
+(by) 9.9626 Tj
+-270 TJm
+(the) 12.1743 Tj
+-271 TJm
+(speed) 22.6848 Tj
+72 630.336 Td
+(at) 7.193 Tj
+-294 TJm
+(which) 24.3486 Tj
+-294 TJm
+(your) 18.2614 Tj
+-294 TJm
+(machine) 33.7533 Tj
+-295 TJm
+(ca) 8.8468 Tj
+1 TJm
+(n) 4.9813 Tj
+-295 TJm
+(service) 28.2141 Tj
+-294 TJm
+(cache) 22.6749 Tj
+-294 TJm
+(misses.) 29.0609 Tj
+-442 TJm
+(Because) 33.1954 Tj
+-294 TJm
+(of) 8.2988 Tj
+-294 TJm
+(this,) 16.8866 Tj
+-306 TJm
+(small) 21.589 Tj
+-294 TJm
+(changes) 32.0895 Tj
+-294 TJm
+(to) 7.7509 Tj
+-294 TJm
+(the) 12.1743 Tj
+-294 TJm
+(code) 18.8094 Tj
+-294 TJm
+(to) 7.7509 Tj
+-294 TJm
+(reduce) 26.5503 Tj
+-294 TJm
+(the) 12.1743 Tj
+-295 TJm
+(miss) 18.2714 Tj
+-294 TJm
+(rate) 14.9339 Tj
+72 618.381 Td
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-253 TJm
+(been) 18.8094 Tj
+-253 TJm
+(observ) 26.5603 Tj
+15 TJm
+(ed) 9.4047 Tj
+-253 TJm
+(to) 7.7509 Tj
+-253 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-253 TJm
+(disproportionately) 73.0557 Tj
+-253 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-253 TJm
+(performance) 50.341 Tj
+-253 TJm
+(impro) 23.8007 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ements.) 30.7147 Tj
+-639 TJm
+(I) 3.3175 Tj
+-253 TJm
+(imagine) 32.0995 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+438.909 618.381 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+471.318 618.381 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-253 TJm
+(perform) 32.0895 Tj
+-253 TJm
+(best) 16.0497 Tj
+72 606.426 Td
+(on) 9.9626 Tj
+-250 TJm
+(machines) 37.6287 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-250 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-250 TJm
+(caches.) 29.041 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 571.673 Td
+/F116_0 20.6585 Tf
+(2.8.) 34.4584 Tj
+-278 TJm
+(CA) 29.8309 Tj
+80 TJm
+(VEA) 42.4739 Tj
+90 TJm
+(TS) 26.4016 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 549.755 Td
+/F122_0 9.9626 Tf
+(I/O) 13.2801 Tj
+-268 TJm
+(error) 19.3573 Tj
+-267 TJm
+(messages) 37.6287 Tj
+-268 TJm
+(are) 12.1643 Tj
+-268 TJm
+(not) 12.7322 Tj
+-268 TJm
+(as) 8.2988 Tj
+-267 TJm
+(helpful) 28.224 Tj
+-268 TJm
+(as) 8.2988 Tj
+-268 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-267 TJm
+(could) 22.1369 Tj
+-268 TJm
+(be.) 11.8953 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+293.313 549.755 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+325.868 549.755 Td
+/F122_0 9.9626 Tf
+(tries) 17.1556 Tj
+-268 TJm
+(hard) 17.7035 Tj
+-267 TJm
+(to) 7.7509 Tj
+-268 TJm
+(detect) 23.7907 Tj
+-268 TJm
+(I/O) 13.2801 Tj
+-268 TJm
+(errors) 23.2328 Tj
+-267 TJm
+(and) 14.386 Tj
+-268 TJm
+(e) 4.4234 Tj
+15 TJm
+(xit) 10.5205 Tj
+-268 TJm
+(cleanly) 28.772 Tj
+65 TJm
+(,) 2.4907 Tj
+-272 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-268 TJm
+(the) 12.1743 Tj
+72 537.8 Td
+(details) 26.0123 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(what) 19.3673 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(problem) 33.2053 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(sometimes) 42.62 Tj
+-250 TJm
+(seem) 20.4731 Tj
+-250 TJm
+(rather) 23.2328 Tj
+-250 TJm
+(misleading.) 46.2165 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 515.882 Td
+(This) 17.7135 Tj
+-280 TJm
+(manual) 29.3299 Tj
+-279 TJm
+(page) 18.8094 Tj
+-280 TJm
+(pertains) 31.5416 Tj
+-280 TJm
+(to) 7.7509 Tj
+-279 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-280 TJm
+(1.0.6) 19.9252 Tj
+-280 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+256.84 515.882 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+286.728 515.882 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-798 TJm
+(Compressed) 49.2551 Tj
+-280 TJm
+(data) 16.5977 Tj
+-279 TJm
+(created) 28.762 Tj
+-280 TJm
+(by) 9.9626 Tj
+-280 TJm
+(this) 14.396 Tj
+-279 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-280 TJm
+(is) 6.6451 Tj
+-280 TJm
+(entirely) 30.4357 Tj
+-279 TJm
+(forw) 18.8094 Tj
+10 TJm
+(ards) 16.5977 Tj
+72 503.927 Td
+(and) 14.386 Tj
+-294 TJm
+(backw) 26.0024 Tj
+10 TJm
+(ards) 16.5977 Tj
+-293 TJm
+(compatible) 44.2738 Tj
+-294 TJm
+(with) 17.7135 Tj
+-294 TJm
+(the) 12.1743 Tj
+-293 TJm
+(pre) 12.7222 Tj
+25 TJm
+(vious) 21.589 Tj
+-294 TJm
+(public) 24.9065 Tj
+-294 TJm
+(releases,) 34.0223 Tj
+-304 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-294 TJm
+(0.1pl2,) 27.6761 Tj
+-305 TJm
+(0.9.0) 19.9252 Tj
+-293 TJm
+(and) 14.386 Tj
+-294 TJm
+(0.9.5,) 22.4159 Tj
+-305 TJm
+(1.0.0,) 22.4159 Tj
+-304 TJm
+(1.0.1,) 22.4159 Tj
+-305 TJm
+(1.0.2) 19.9252 Tj
+-294 TJm
+(and) 14.386 Tj
+72 491.972 Td
+(1.0.3,) 22.4159 Tj
+-263 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-260 TJm
+(with) 17.7135 Tj
+-260 TJm
+(the) 12.1743 Tj
+-260 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-260 TJm
+(e) 4.4234 Tj
+15 TJm
+(xception:) 37.0808 Tj
+-330 TJm
+(0.9.0) 19.9252 Tj
+-260 TJm
+(and) 14.386 Tj
+-260 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-260 TJm
+(can) 13.8281 Tj
+-260 TJm
+(correctly) 35.4071 Tj
+-260 TJm
+(decompress) 47.0334 Tj
+-260 TJm
+(multiple) 33.2153 Tj
+-260 TJm
+(concatenated) 52.0048 Tj
+-260 TJm
+(compressed) 47.0334 Tj
+72 480.017 Td
+(\002les.) 19.0983 Tj
+-310 TJm
+(0.1pl2) 25.1855 Tj
+-250 TJm
+(cannot) 26.5603 Tj
+-250 TJm
+(do) 9.9626 Tj
+-250 TJm
+(this;) 17.1656 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(stop) 16.6077 Tj
+-250 TJm
+(after) 18.2515 Tj
+-250 TJm
+(decompressing) 59.7656 Tj
+-250 TJm
+(just) 14.396 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\002rst) 15.5018 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 458.099 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+146.174 458.099 Td
+/F122_0 9.9626 Tf
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-245 TJm
+(prior) 19.3673 Tj
+-245 TJm
+(to) 7.7509 Tj
+-245 TJm
+(1.0.2) 19.9252 Tj
+-246 TJm
+(used) 18.2614 Tj
+-245 TJm
+(32-bit) 23.8007 Tj
+-245 TJm
+(inte) 14.9439 Tj
+15 TJm
+(gers) 16.5977 Tj
+-245 TJm
+(to) 7.7509 Tj
+-245 TJm
+(represent) 36.5129 Tj
+-245 TJm
+(bit) 10.5205 Tj
+-246 TJm
+(positions) 35.9849 Tj
+-245 TJm
+(in) 7.7509 Tj
+-245 TJm
+(compressed) 47.0334 Tj
+-245 TJm
+(\002les,) 19.0983 Tj
+-246 TJm
+(so) 8.8568 Tj
+-245 TJm
+(it) 5.5392 Tj
+-245 TJm
+(could) 22.1369 Tj
+72 446.144 Td
+(not) 12.7322 Tj
+-384 TJm
+(handle) 26.5603 Tj
+-383 TJm
+(compressed) 47.0334 Tj
+-384 TJm
+(\002les) 16.6077 Tj
+-383 TJm
+(more) 20.4731 Tj
+-384 TJm
+(than) 17.1556 Tj
+-383 TJm
+(512) 14.9439 Tj
+-384 TJm
+(me) 12.1743 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(abytes) 25.4544 Tj
+-383 TJm
+(long.) 20.2042 Tj
+-1421 TJm
+(V) 7.193 Tj
+111 TJm
+(ersions) 28.224 Tj
+-384 TJm
+(1.0.2) 19.9252 Tj
+-383 TJm
+(and) 14.386 Tj
+-384 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-384 TJm
+(use) 13.2801 Tj
+-383 TJm
+(64-bit) 23.8007 Tj
+-384 TJm
+(ints) 14.396 Tj
+-383 TJm
+(on) 9.9626 Tj
+-384 TJm
+(some) 21.031 Tj
+72 434.189 Td
+(platforms) 38.1866 Tj
+-245 TJm
+(which) 24.3486 Tj
+-246 TJm
+(support) 29.8878 Tj
+-245 TJm
+(them) 19.9252 Tj
+-246 TJm
+(\(GNU) 24.8965 Tj
+-245 TJm
+(supported) 39.2925 Tj
+-245 TJm
+(tar) 10.5105 Tj
+18 TJm
+(gets,) 18.5404 Tj
+-247 TJm
+(and) 14.386 Tj
+-245 TJm
+(W) 9.4047 Tj
+40 TJm
+(indo) 17.7135 Tj
+25 TJm
+(ws\).) 16.8766 Tj
+-309 TJm
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-245 TJm
+(establish) 34.8691 Tj
+-245 TJm
+(whether) 32.0895 Tj
+-246 TJm
+(or) 8.2988 Tj
+-245 TJm
+(not) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+468.269 434.189 Td
+/F124_0 9.9626 Tf
+(bzip2recover) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 422.233 Td
+/F122_0 9.9626 Tf
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-255 TJm
+(b) 4.9813 Tj
+20 TJm
+(uilt) 13.2901 Tj
+-255 TJm
+(with) 17.7135 Tj
+-255 TJm
+(such) 18.2614 Tj
+-255 TJm
+(a) 4.4234 Tj
+-255 TJm
+(limitation,) 41.2452 Tj
+-256 TJm
+(run) 13.2801 Tj
+-255 TJm
+(it) 5.5392 Tj
+-255 TJm
+(without) 30.4457 Tj
+-255 TJm
+(ar) 7.7409 Tj
+18 TJm
+(guments.) 36.2539 Tj
+-325 TJm
+(In) 8.2988 Tj
+-255 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-256 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ent) 12.1743 Tj
+-255 TJm
+(you) 14.9439 Tj
+-255 TJm
+(can) 13.8281 Tj
+-255 TJm
+(b) 4.9813 Tj
+20 TJm
+(uild) 15.5018 Tj
+-255 TJm
+(yourself) 32.6474 Tj
+-255 TJm
+(an) 9.4047 Tj
+-255 TJm
+(unlimited) 38.1966 Tj
+-255 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-255 TJm
+(if) 6.0871 Tj
+72 410.278 Td
+(you) 14.9439 Tj
+-250 TJm
+(can) 13.8281 Tj
+-250 TJm
+(recompile) 39.8404 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+176.318 410.278 Td
+/F124_0 9.9626 Tf
+(MaybeUInt64) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+244.562 410.278 Td
+/F122_0 9.9626 Tf
+(set) 11.0684 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(unsigned) 35.9749 Tj
+-250 TJm
+(64-bit) 23.8007 Tj
+-250 TJm
+(inte) 14.9439 Tj
+15 TJm
+(ger) 12.7222 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 375.525 Td
+/F116_0 20.6585 Tf
+(2.9.) 34.4584 Tj
+-278 TJm
+(A) 14.9154 Tj
+50 TJm
+(UTHOR) 73.441 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 353.607 Td
+/F122_0 9.9626 Tf
+(Julian) 23.8007 Tj
+-250 TJm
+(Se) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(ard,) 15.2129 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+132.801 353.607 Td
+/F124_0 9.9626 Tf
+(jseward@bzip.org) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 331.69 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-299 TJm
+(ideas) 20.4731 Tj
+-300 TJm
+(embodied) 39.2925 Tj
+-299 TJm
+(in) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.942 331.69 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+199.813 331.69 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-299 TJm
+(du) 9.9626 Tj
+-1 TJm
+(e) 4.4234 Tj
+-299 TJm
+(to) 7.7509 Tj
+-299 TJm
+(\(at) 10.5105 Tj
+-300 TJm
+(least\)) 21.579 Tj
+-299 TJm
+(the) 12.1743 Tj
+-300 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-299 TJm
+(people:) 29.3299 Tj
+-409 TJm
+(Michael) 32.6474 Tj
+-300 TJm
+(Burro) 23.2427 Tj
+25 TJm
+(ws) 11.0684 Tj
+-299 TJm
+(and) 14.386 Tj
+-300 TJm
+(Da) 11.6164 Tj
+20 TJm
+(vid) 12.7322 Tj
+-299 TJm
+(Wheeler) 33.7433 Tj
+-299 TJm
+(\(for) 14.9339 Tj
+72 319.735 Td
+(the) 12.1743 Tj
+-312 TJm
+(block) 22.1369 Tj
+-313 TJm
+(sorting) 27.6761 Tj
+-312 TJm
+(transformation\),) 64.468 Tj
+-328 TJm
+(Da) 11.6164 Tj
+20 TJm
+(vid) 12.7322 Tj
+-312 TJm
+(Wheeler) 33.7433 Tj
+-313 TJm
+(\(ag) 12.7222 Tj
+5 TJm
+(ain,) 14.6649 Tj
+-327 TJm
+(for) 11.6164 Tj
+-313 TJm
+(the) 12.1743 Tj
+-312 TJm
+(Huf) 15.4918 Tj
+25 TJm
+(fman) 20.4731 Tj
+-312 TJm
+(coder\),) 27.9351 Tj
+-328 TJm
+(Peter) 20.4731 Tj
+-313 TJm
+(Fenwick) 34.3112 Tj
+-312 TJm
+(\(for) 14.9339 Tj
+-312 TJm
+(the) 12.1743 Tj
+-313 TJm
+(structured) 39.8404 Tj
+72 307.779 Td
+(coding) 27.1182 Tj
+-325 TJm
+(model) 24.9065 Tj
+-326 TJm
+(in) 7.7509 Tj
+-325 TJm
+(the) 12.1743 Tj
+-326 TJm
+(original) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+191.156 307.779 Td
+/F124_0 9.9626 Tf
+(bzip) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+215.067 307.779 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-344 TJm
+(and) 14.386 Tj
+-326 TJm
+(man) 17.1556 Tj
+15 TJm
+(y) 4.9813 Tj
+-325 TJm
+(re\002nements\),) 52.2937 Tj
+-345 TJm
+(and) 14.386 Tj
+-325 TJm
+(Alistair) 29.8878 Tj
+-326 TJm
+(Mof) 17.1556 Tj
+25 TJm
+(f) 3.3175 Tj
+10 TJm
+(at,) 9.6836 Tj
+-344 TJm
+(Radford) 32.6474 Tj
+-325 TJm
+(Neal) 18.8094 Tj
+-326 TJm
+(and) 14.386 Tj
+-325 TJm
+(Ian) 12.7222 Tj
+-326 TJm
+(W) 9.4047 Tj
+40 TJm
+(itten) 17.7135 Tj
+-325 TJm
+(\(for) 14.9339 Tj
+72 295.824 Td
+(the) 12.1743 Tj
+-277 TJm
+(arithmetic) 40.3983 Tj
+-277 TJm
+(coder) 22.1269 Tj
+-277 TJm
+(in) 7.7509 Tj
+-277 TJm
+(the) 12.1743 Tj
+-277 TJm
+(original) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+214.171 295.824 Td
+/F124_0 9.9626 Tf
+(bzip) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+238.082 295.824 Td
+/F122_0 9.9626 Tf
+(\).) 5.8082 Tj
+-782 TJm
+(I) 3.3175 Tj
+-277 TJm
+(am) 12.1743 Tj
+-276 TJm
+(much) 22.1369 Tj
+-277 TJm
+(indebted) 34.3112 Tj
+-277 TJm
+(for) 11.6164 Tj
+-277 TJm
+(their) 18.2614 Tj
+-277 TJm
+(help,) 19.6462 Tj
+-284 TJm
+(support) 29.8878 Tj
+-277 TJm
+(and) 14.386 Tj
+-277 TJm
+(advice.) 28.493 Tj
+-781 TJm
+(See) 14.386 Tj
+-277 TJm
+(the) 12.1743 Tj
+-277 TJm
+(manual) 29.3299 Tj
+72 283.869 Td
+(in) 7.7509 Tj
+-330 TJm
+(the) 12.1743 Tj
+-330 TJm
+(source) 26.0024 Tj
+-330 TJm
+(distrib) 25.4644 Tj
+20 TJm
+(ution) 20.4831 Tj
+-330 TJm
+(for) 11.6164 Tj
+-329 TJm
+(pointers) 32.0995 Tj
+-330 TJm
+(to) 7.7509 Tj
+-330 TJm
+(sources) 29.8778 Tj
+-330 TJm
+(of) 8.2988 Tj
+-330 TJm
+(documentation.) 61.7083 Tj
+-1099 TJm
+(Christian) 36.5329 Tj
+-330 TJm
+(v) 4.9813 Tj
+20 TJm
+(on) 9.9626 Tj
+-330 TJm
+(Roques) 29.8878 Tj
+-330 TJm
+(encouraged) 45.9176 Tj
+-330 TJm
+(me) 12.1743 Tj
+-330 TJm
+(to) 7.7509 Tj
+-330 TJm
+(look) 17.7135 Tj
+72 271.914 Td
+(for) 11.6164 Tj
+-271 TJm
+(f) 3.3175 Tj
+10 TJm
+(aster) 18.8094 Tj
+-271 TJm
+(sorting) 27.6761 Tj
+-271 TJm
+(algorithms,) 45.1107 Tj
+-276 TJm
+(so) 8.8568 Tj
+-272 TJm
+(as) 8.2988 Tj
+-271 TJm
+(to) 7.7509 Tj
+-271 TJm
+(speed) 22.6848 Tj
+-271 TJm
+(up) 9.9626 Tj
+-271 TJm
+(compression.) 52.8516 Tj
+-746 TJm
+(Bela) 18.2614 Tj
+-271 TJm
+(Lubkin) 28.782 Tj
+-271 TJm
+(encouraged) 45.9176 Tj
+-271 TJm
+(me) 12.1743 Tj
+-272 TJm
+(to) 7.7509 Tj
+-271 TJm
+(impro) 23.8007 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-271 TJm
+(the) 12.1743 Tj
+-271 TJm
+(w) 7.193 Tj
+10 TJm
+(orst-case) 35.4071 Tj
+72 259.959 Td
+(compression) 50.3609 Tj
+-340 TJm
+(performance.) 52.8317 Tj
+-580 TJm
+(Donna) 26.5603 Tj
+-339 TJm
+(Robinson) 38.1966 Tj
+-340 TJm
+(XMLised) 38.1866 Tj
+-340 TJm
+(the) 12.1743 Tj
+-340 TJm
+(documentation.) 61.7083 Tj
+-580 TJm
+(Man) 18.2614 Tj
+15 TJm
+(y) 4.9813 Tj
+-340 TJm
+(people) 26.5603 Tj
+-340 TJm
+(sent) 16.0497 Tj
+-339 TJm
+(patches,) 32.3685 Tj
+-363 TJm
+(helped) 26.5603 Tj
+-340 TJm
+(with) 17.7135 Tj
+72 248.003 Td
+(portability) 41.5142 Tj
+-250 TJm
+(problems,) 39.5714 Tj
+-250 TJm
+(lent) 14.9439 Tj
+-250 TJm
+(machines,) 40.1194 Tj
+-250 TJm
+(g) 4.9813 Tj
+5 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(advice) 26.0024 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(were) 19.3573 Tj
+-250 TJm
+(generally) 37.0708 Tj
+-250 TJm
+(helpful.) 30.7147 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+539.395 50.951 Td
+(7) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 8 11
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 75.786 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 701.916 Td
+/F116_0 24.7902 Tf
+(3.) 20.675 Tj
+-556 TJm
+(Pr) 26.1785 Tj
+20 TJm
+(ogramming) 134.9826 Tj
+-278 TJm
+(with) 49.5804 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+330.484 701.916 Td
+/F440_0 24.7902 Tf
+(libbzip2) 118.993 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 656.35 Td
+/F116_0 17.2154 Tf
+(T) 10.5186 Tj
+80 TJm
+(ab) 20.0904 Tj
+10 TJm
+(le) 14.3576 Tj
+-278 TJm
+(of) 16.2513 Tj
+-278 TJm
+(Contents) 74.5943 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 635.788 Td
+/F122_0 9.9626 Tf
+(3.1.) 14.9439 Tj
+-310 TJm
+(T) 6.0871 Tj
+80 TJm
+(op-le) 20.4731 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(structure) 34.8591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+179.997 635.788 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 635.788 Td
+/F122_0 9.9626 Tf
+(8) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 623.832 Td
+(3.1.1.) 22.4159 Tj
+-310 TJm
+(Lo) 11.0684 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(summary) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+192.866 623.832 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 623.832 Td
+/F122_0 9.9626 Tf
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 611.877 Td
+(3.1.2.) 22.4159 Tj
+-310 TJm
+(High-le) 30.4357 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(summary) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.822 611.877 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 611.877 Td
+/F122_0 9.9626 Tf
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 599.922 Td
+(3.1.3.) 22.4159 Tj
+-310 TJm
+(Utility) 26.0223 Tj
+-250 TJm
+(functions) 37.0808 Tj
+-250 TJm
+(summary) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.582 599.922 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.108 599.922 Td
+/F122_0 9.9626 Tf
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 587.967 Td
+(3.2.) 14.9439 Tj
+-310 TJm
+(Error) 21.0211 Tj
+-250 TJm
+(handling) 34.8691 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+162.611 587.967 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 587.967 Td
+/F122_0 9.9626 Tf
+(10) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 576.012 Td
+(3.3.) 14.9439 Tj
+-310 TJm
+(Lo) 11.0684 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+181.045 576.012 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 576.012 Td
+/F122_0 9.9626 Tf
+(11) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 564.057 Td
+(3.3.1.) 22.4159 Tj
+-310 TJm
+(BZ2_bzCompressInit) 85.7879 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+197.762 564.057 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 564.057 Td
+/F122_0 9.9626 Tf
+(11) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 552.101 Td
+(3.3.2.) 22.4159 Tj
+-310 TJm
+(BZ2_bzCompress) 71.9499 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+184.201 552.101 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 552.101 Td
+/F122_0 9.9626 Tf
+(13) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 540.146 Td
+(3.3.3.) 22.4159 Tj
+-310 TJm
+(BZ2_bzCompressEnd) 87.9996 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+198.868 540.146 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 540.146 Td
+/F122_0 9.9626 Tf
+(16) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 528.191 Td
+(3.3.4.) 22.4159 Tj
+-310 TJm
+(BZ2_bzDecompressInit) 95.1827 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+206.887 528.191 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 528.191 Td
+/F122_0 9.9626 Tf
+(16) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 516.236 Td
+(3.3.5.) 22.4159 Tj
+-310 TJm
+(BZ2_bzDecompress) 81.3446 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.326 516.236 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 516.236 Td
+/F122_0 9.9626 Tf
+(17) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 504.281 Td
+(3.3.6.) 22.4159 Tj
+-310 TJm
+(BZ2_bzDecompressEnd) 97.3944 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.207 504.281 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 504.281 Td
+/F122_0 9.9626 Tf
+(18) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 492.325 Td
+(3.4.) 14.9439 Tj
+-310 TJm
+(High-le) 30.4357 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+184.216 492.325 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 492.325 Td
+/F122_0 9.9626 Tf
+(18) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 480.37 Td
+(3.4.1.) 22.4159 Tj
+-310 TJm
+(BZ2_bzReadOpen) 74.1516 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+185.302 480.37 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 480.37 Td
+/F122_0 9.9626 Tf
+(19) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 468.415 Td
+(3.4.2.) 22.4159 Tj
+-310 TJm
+(BZ2_bzRead) 52.5726 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+163.443 468.415 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 468.415 Td
+/F122_0 9.9626 Tf
+(20) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 456.46 Td
+(3.4.3.) 22.4159 Tj
+-310 TJm
+(BZ2_bzReadGetUnused) 97.3944 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.207 456.46 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 456.46 Td
+/F122_0 9.9626 Tf
+(21) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 444.505 Td
+(3.4.4.) 22.4159 Tj
+-310 TJm
+(BZ2_bzReadClose) 75.2674 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.074 444.505 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 444.505 Td
+/F122_0 9.9626 Tf
+(22) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 432.55 Td
+(3.4.5.) 22.4159 Tj
+-310 TJm
+(BZ2_bzWriteOpen) 76.3633 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.622 432.55 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 432.55 Td
+/F122_0 9.9626 Tf
+(22) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 420.594 Td
+(3.4.6.) 22.4159 Tj
+-310 TJm
+(BZ2_bzWrite) 54.7843 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.763 420.594 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 420.594 Td
+/F122_0 9.9626 Tf
+(23) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 408.639 Td
+(3.4.7.) 22.4159 Tj
+-310 TJm
+(BZ2_bzWriteClose) 77.4791 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+189.179 408.639 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 408.639 Td
+/F122_0 9.9626 Tf
+(23) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 396.684 Td
+(3.4.8.) 22.4159 Tj
+-310 TJm
+(Handling) 37.0808 Tj
+-250 TJm
+(embedded) 40.9463 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(streams) 30.4357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.601 396.684 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 396.684 Td
+/F122_0 9.9626 Tf
+(24) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 384.729 Td
+(3.4.9.) 22.4159 Tj
+-310 TJm
+(Standard) 35.417 Tj
+-250 TJm
+(\002le-reading/writing) 77.4791 Tj
+-250 TJm
+(code) 18.8094 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+247.564 384.729 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 384.729 Td
+/F122_0 9.9626 Tf
+(25) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 372.774 Td
+(3.5.) 14.9439 Tj
+-310 TJm
+(Utility) 26.0223 Tj
+-250 TJm
+(functions) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+170.645 372.774 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 372.774 Td
+/F122_0 9.9626 Tf
+(26) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 360.819 Td
+(3.5.1.) 22.4159 Tj
+-310 TJm
+(BZ2_bzBuf) 47.0434 Tj
+25 TJm
+(fT) 9.4047 Tj
+80 TJm
+(oBuf) 19.9252 Tj
+25 TJm
+(fCompress) 43.1679 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+229.488 360.819 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 360.819 Td
+/F122_0 9.9626 Tf
+(26) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 348.863 Td
+(3.5.2.) 22.4159 Tj
+-310 TJm
+(BZ2_bzBuf) 47.0434 Tj
+25 TJm
+(fT) 9.4047 Tj
+80 TJm
+(oBuf) 19.9252 Tj
+25 TJm
+(fDecompress) 52.5627 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+238.613 348.863 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 348.863 Td
+/F122_0 9.9626 Tf
+(27) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 336.908 Td
+(3.6.) 14.9439 Tj
+-310 TJm
+(zlib) 14.9439 Tj
+-250 TJm
+(compatibility) 53.1405 Tj
+-250 TJm
+(functions) 37.0808 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+215.06 336.908 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 336.908 Td
+/F122_0 9.9626 Tf
+(28) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 324.953 Td
+(3.7.) 14.9439 Tj
+-310 TJm
+(Using) 23.8007 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(stdio-free) 38.1767 Tj
+-250 TJm
+(en) 9.4047 Tj
+40 TJm
+(vironment) 40.9562 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+282.092 324.953 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 324.953 Td
+/F122_0 9.9626 Tf
+(28) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 312.998 Td
+(3.7.1.) 22.4159 Tj
+-310 TJm
+(Getting) 29.8878 Tj
+-250 TJm
+(rid) 11.0684 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(stdio) 19.3773 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.492 312.998 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 312.998 Td
+/F122_0 9.9626 Tf
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 301.043 Td
+(3.7.2.) 22.4159 Tj
+-310 TJm
+(Critical) 29.8878 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(handling) 34.8691 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+201.629 301.043 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 301.043 Td
+/F122_0 9.9626 Tf
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 289.088 Td
+(3.8.) 14.9439 Tj
+-310 TJm
+(Making) 30.9936 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(W) 9.4047 Tj
+40 TJm
+(indo) 17.7135 Tj
+25 TJm
+(ws) 11.0684 Tj
+-250 TJm
+(DLL) 19.3673 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.243 289.088 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 289.088 Td
+/F122_0 9.9626 Tf
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 257.207 Td
+(This) 17.7135 Tj
+-250 TJm
+(chapter) 29.3199 Tj
+-250 TJm
+(describes) 37.0708 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(programming) 54.2364 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+282.448 257.207 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+330.269 257.207 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 235.289 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-273 TJm
+(general) 29.3199 Tj
+-272 TJm
+(background) 47.0334 Tj
+-273 TJm
+(information,) 49.534 Tj
+-278 TJm
+(particularly) 45.9276 Tj
+-273 TJm
+(about) 22.1369 Tj
+-273 TJm
+(memory) 33.2053 Tj
+-272 TJm
+(use) 13.2801 Tj
+-273 TJm
+(and) 14.386 Tj
+-273 TJm
+(performance) 50.341 Tj
+-272 TJm
+(aspects,) 31.2626 Tj
+-279 TJm
+(you') 18.2614 Tj
+50 TJm
+(d) 4.9813 Tj
+-272 TJm
+(be) 9.4047 Tj
+-273 TJm
+(well) 17.1556 Tj
+-273 TJm
+(advised) 30.4357 Tj
+72 223.334 Td
+(to) 7.7509 Tj
+-250 TJm
+(read) 17.1456 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+([2]) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(as) 8.2988 Tj
+-250 TJm
+(well.) 19.6462 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 188.581 Td
+/F116_0 20.6585 Tf
+(3.1.) 34.4584 Tj
+-278 TJm
+(T) 12.6223 Tj
+80 TJm
+(op-le) 49.3532 Tj
+15 TJm
+(vel) 28.7153 Tj
+-278 TJm
+(structure) 89.5339 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 166.663 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+123.608 166.663 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-380 TJm
+(a) 4.4234 Tj
+-380 TJm
+(\003e) 9.9626 Tj
+15 TJm
+(xible) 19.9252 Tj
+-381 TJm
+(library) 26.5603 Tj
+-380 TJm
+(for) 11.6164 Tj
+-380 TJm
+(compressing) 50.3609 Tj
+-380 TJm
+(and) 14.386 Tj
+-380 TJm
+(decompressing) 59.7656 Tj
+-380 TJm
+(data) 16.5977 Tj
+-381 TJm
+(in) 7.7509 Tj
+-380 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+405.291 166.663 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+438.966 166.663 Td
+/F122_0 9.9626 Tf
+(data) 16.5977 Tj
+-380 TJm
+(format.) 29.0509 Tj
+-1401 TJm
+(Although) 37.6387 Tj
+72 154.708 Td
+(packaged) 37.6188 Tj
+-285 TJm
+(as) 8.2988 Tj
+-284 TJm
+(a) 4.4234 Tj
+-285 TJm
+(single) 23.8007 Tj
+-285 TJm
+(entity) 22.6948 Tj
+65 TJm
+(,) 2.4907 Tj
+-293 TJm
+(it) 5.5392 Tj
+-285 TJm
+(helps) 21.031 Tj
+-285 TJm
+(to) 7.7509 Tj
+-284 TJm
+(re) 7.7409 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(ard) 12.7222 Tj
+-285 TJm
+(the) 12.1743 Tj
+-285 TJm
+(library) 26.5603 Tj
+-284 TJm
+(as) 8.2988 Tj
+-285 TJm
+(three) 19.9152 Tj
+-285 TJm
+(separate) 32.6375 Tj
+-284 TJm
+(parts:) 22.1369 Tj
+-380 TJm
+(the) 12.1743 Tj
+-285 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w) 7.193 Tj
+-284 TJm
+(le) 7.193 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-285 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace,) 15.7608 Tj
+-293 TJm
+(and) 14.386 Tj
+-285 TJm
+(the) 12.1743 Tj
+-285 TJm
+(high) 17.7135 Tj
+72 142.753 Td
+(le) 7.193 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace,) 15.7608 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(utility) 23.8106 Tj
+-250 TJm
+(functions.) 39.5714 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 120.835 Td
+(The) 15.4918 Tj
+-349 TJm
+(structure) 34.8591 Tj
+-349 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+141.082 120.835 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.903 120.835 Td
+/F122_0 9.9626 Tf
+(') 3.3175 Tj
+55 TJm
+(s) 3.8755 Tj
+-349 TJm
+(interf) 21.579 Tj
+10 TJm
+(aces) 17.1456 Tj
+-349 TJm
+(is) 6.6451 Tj
+-349 TJm
+(similar) 27.6761 Tj
+-349 TJm
+(to) 7.7509 Tj
+-349 TJm
+(that) 14.9439 Tj
+-349 TJm
+(of) 8.2988 Tj
+-349 TJm
+(Jean-loup) 38.7346 Tj
+-349 TJm
+(Gailly') 28.224 Tj
+55 TJm
+(s) 3.8755 Tj
+-349 TJm
+(and) 14.386 Tj
+-349 TJm
+(Mark) 21.579 Tj
+-349 TJm
+(Adler') 26.0024 Tj
+55 TJm
+(s) 3.8755 Tj
+-349 TJm
+(e) 4.4234 Tj
+15 TJm
+(xcellent) 31.5416 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+516.09 120.835 Td
+/F124_0 9.9626 Tf
+(zlib) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 108.88 Td
+/F122_0 9.9626 Tf
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 86.962 Td
+(All) 12.7322 Tj
+-242 TJm
+(e) 4.4234 Tj
+15 TJm
+(xternally) 35.417 Tj
+-242 TJm
+(visible) 26.5703 Tj
+-241 TJm
+(symbols) 33.2153 Tj
+-242 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-242 TJm
+(names) 25.4544 Tj
+-242 TJm
+(be) 9.4047 Tj
+15 TJm
+(ginning) 30.4457 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+284.687 86.962 Td
+/F124_0 9.9626 Tf
+(BZ2_) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+308.597 86.962 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-615 TJm
+(This) 17.7135 Tj
+-241 TJm
+(is) 6.6451 Tj
+-242 TJm
+(ne) 9.4047 Tj
+25 TJm
+(w) 7.193 Tj
+-242 TJm
+(in) 7.7509 Tj
+-242 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-242 TJm
+(1.0.) 14.9439 Tj
+-614 TJm
+(The) 15.4918 Tj
+-242 TJm
+(intention) 35.427 Tj
+-242 TJm
+(is) 6.6451 Tj
+-241 TJm
+(to) 7.7509 Tj
+-242 TJm
+(minimise) 37.0908 Tj
+72 75.007 Td
+(pollution) 35.9849 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(namespaces) 47.5814 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(clients.) 28.503 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+541.288 50.951 Td
+(8) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 9 12
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+420.96 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+498.449 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 75.786 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(part) 15.4918 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(need) 18.8094 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+240.567 710.037 Td
+/F124_0 9.9626 Tf
+(#include) 47.8205 Tj
+-600 TJm
+(<bzlib.h>) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+350.654 710.037 Td
+/F122_0 9.9626 Tf
+(into) 15.5018 Tj
+-250 TJm
+(your) 18.2614 Tj
+-250 TJm
+(sources.) 32.3685 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 679.416 Td
+/F116_0 17.2154 Tf
+(3.1.1.) 43.0729 Tj
+-278 TJm
+(Lo) 21.0372 Tj
+15 TJm
+(w-le) 33.484 Tj
+15 TJm
+(vel) 23.9294 Tj
+-278 TJm
+(summar) 66.9679 Tj
+-10 TJm
+(y) 9.5718 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 657.498 Td
+/F122_0 9.9626 Tf
+(This) 17.7135 Tj
+-212 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+-212 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vides) 21.031 Tj
+-212 TJm
+(services) 32.0895 Tj
+-212 TJm
+(for) 11.6164 Tj
+-212 TJm
+(compressing) 50.3609 Tj
+-212 TJm
+(and) 14.386 Tj
+-212 TJm
+(decompress) 47.0334 Tj
+1 TJm
+(ing) 12.7322 Tj
+-212 TJm
+(data) 16.5977 Tj
+-212 TJm
+(in) 7.7509 Tj
+-212 TJm
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+-595 TJm
+(There') 26.5503 Tj
+55 TJm
+(s) 3.8755 Tj
+-212 TJm
+(no) 9.9626 Tj
+-212 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vision) 24.3586 Tj
+-212 TJm
+(for) 11.6164 Tj
+-212 TJm
+(dealing) 29.3299 Tj
+72 645.543 Td
+(with) 17.7135 Tj
+-213 TJm
+(\002les,) 19.0983 Tj
+-220 TJm
+(streams) 30.4357 Tj
+-213 TJm
+(or) 8.2988 Tj
+-213 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-213 TJm
+(other) 20.4731 Tj
+-213 TJm
+(I/O) 13.2801 Tj
+-213 TJm
+(mechanisms,) 51.7457 Tj
+-221 TJm
+(just) 14.396 Tj
+-213 TJm
+(straight) 29.8878 Tj
+-213 TJm
+(memory-to-memory) 80.7967 Tj
+-213 TJm
+(w) 7.193 Tj
+10 TJm
+(ork.) 15.7708 Tj
+-595 TJm
+(In) 8.2988 Tj
+-213 TJm
+(f) 3.3175 Tj
+10 TJm
+(act,) 14.107 Tj
+-221 TJm
+(this) 14.396 Tj
+-213 TJm
+(part) 15.4918 Tj
+-213 TJm
+(of) 8.2988 Tj
+-213 TJm
+(the) 12.1743 Tj
+-213 TJm
+(library) 26.5603 Tj
+72 633.588 Td
+(can) 13.8281 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(compiled) 37.0808 Tj
+-250 TJm
+(without) 30.4457 Tj
+-250 TJm
+(inclusion) 36.5329 Tj
+-250 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+222.534 633.588 Td
+/F124_0 9.9626 Tf
+(stdio.h) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+264.377 633.588 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(may) 17.1556 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(helpful) 28.224 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(embedded) 40.9463 Tj
+-250 TJm
+(applications.) 50.6399 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 611.67 Td
+(The) 15.4918 Tj
+-250 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(part) 15.4918 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(has) 13.2801 Tj
+-250 TJm
+(no) 9.9626 Tj
+-250 TJm
+(global) 24.9065 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(ariables) 30.9837 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(therefore) 35.955 Tj
+-250 TJm
+(thread-safe.) 46.7445 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 589.752 Td
+(Six) 13.2901 Tj
+-875 TJm
+(routines) 32.0995 Tj
+-876 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-875 TJm
+(up) 9.9626 Tj
+-876 TJm
+(the) 12.1743 Tj
+-875 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w) 7.193 Tj
+-876 TJm
+(le) 7.193 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-875 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace:) 16.0398 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+308.791 589.752 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+416.387 589.752 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+429.158 589.752 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+512.844 589.752 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-1032 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 577.797 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressEnd) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+186.15 577.797 Td
+/F122_0 9.9626 Tf
+(for) 11.6164 Tj
+-1258 TJm
+(compression,) 52.8516 Tj
+-1510 TJm
+(and) 14.386 Tj
+-1257 TJm
+(a) 4.4234 Tj
+-1258 TJm
+(corresponding) 56.996 Tj
+-1258 TJm
+(trio) 13.8381 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+417.958 577.797 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressInit) 119.5512 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 577.797 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 565.842 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.707 565.842 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+192.158 565.842 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressEnd) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+310.798 565.842 Td
+/F122_0 9.9626 Tf
+(for) 11.6164 Tj
+-508 TJm
+(decompression.) 62.2563 Tj
+-2171 TJm
+(The) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+431.918 564.099 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+437.895 565.842 Td
+(Init) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+466.871 565.842 Td
+/F122_0 9.9626 Tf
+(functions) 37.0808 Tj
+-508 TJm
+(allocate) 30.9837 Tj
+72 553.887 Td
+(memory) 33.2053 Tj
+-574 TJm
+(for) 11.6164 Tj
+-573 TJm
+(compression/decompression) 112.8962 Tj
+-574 TJm
+(and) 14.386 Tj
+-574 TJm
+(do) 9.9626 Tj
+-573 TJm
+(other) 20.4731 Tj
+-574 TJm
+(initialisations,) 56.1891 Tj
+-654 TJm
+(whilst) 24.3586 Tj
+-574 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+419.503 552.143 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+425.48 553.887 Td
+(End) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+449.128 553.887 Td
+/F122_0 9.9626 Tf
+(functions) 37.0808 Tj
+-574 TJm
+(close) 20.4731 Tj
+-573 TJm
+(do) 9.9626 Tj
+25 TJm
+(wn) 12.1743 Tj
+72 541.932 Td
+(operations) 41.5042 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(release) 27.6562 Tj
+-250 TJm
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 520.014 Td
+(The) 15.4918 Tj
+-303 TJm
+(real) 14.9339 Tj
+-303 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-303 TJm
+(is) 6.6451 Tj
+-303 TJm
+(done) 19.3673 Tj
+-303 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+176.892 520.014 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+263.598 520.014 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+281.003 520.014 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+376.645 520.014 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-939 TJm
+(These) 23.7907 Tj
+-303 TJm
+(compress) 37.6287 Tj
+-303 TJm
+(and) 14.386 Tj
+-303 TJm
+(decompress) 47.0334 Tj
+-303 TJm
+(data) 16.5977 Tj
+72 508.059 Td
+(from) 19.3673 Tj
+-205 TJm
+(a) 4.4234 Tj
+-205 TJm
+(user) 16.5977 Tj
+20 TJm
+(-supplied) 37.0808 Tj
+-205 TJm
+(input) 20.4831 Tj
+-206 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-205 TJm
+(to) 7.7509 Tj
+-205 TJm
+(a) 4.4234 Tj
+-205 TJm
+(user) 16.5977 Tj
+20 TJm
+(-supplied) 37.0808 Tj
+-205 TJm
+(output) 25.4644 Tj
+-205 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+55 TJm
+(.) 2.4907 Tj
+-591 TJm
+(These) 23.7907 Tj
+-205 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fers) 14.9339 Tj
+-205 TJm
+(can) 13.8281 Tj
+-205 TJm
+(be) 9.4047 Tj
+-205 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-205 TJm
+(size;) 18.2614 Tj
+-220 TJm
+(arbitrary) 34.3012 Tj
+-206 TJm
+(quantities) 38.7446 Tj
+-205 TJm
+(of) 8.2988 Tj
+72 496.104 Td
+(data) 16.5977 Tj
+-258 TJm
+(are) 12.1643 Tj
+-258 TJm
+(handled) 31.5416 Tj
+-258 TJm
+(by) 9.9626 Tj
+-257 TJm
+(making) 29.8878 Tj
+-258 TJm
+(repeated) 33.7433 Tj
+-258 TJm
+(calls) 18.2614 Tj
+-258 TJm
+(to) 7.7509 Tj
+-258 TJm
+(these) 20.4731 Tj
+-258 TJm
+(functions.) 39.5714 Tj
+-667 TJm
+(This) 17.7135 Tj
+-258 TJm
+(is) 6.6451 Tj
+-258 TJm
+(a) 4.4234 Tj
+-257 TJm
+(\003e) 9.9626 Tj
+15 TJm
+(xible) 19.9252 Tj
+-258 TJm
+(mechanism) 45.3796 Tj
+-258 TJm
+(allo) 14.9439 Tj
+25 TJm
+(wing) 19.9252 Tj
+-258 TJm
+(a) 4.4234 Tj
+-258 TJm
+(consumer) 38.7346 Tj
+20 TJm
+(-pull) 18.8194 Tj
+72 484.148 Td
+(style) 18.8194 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(acti) 14.386 Tj
+25 TJm
+(vity) 15.5018 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(producer) 35.4071 Tj
+20 TJm
+(-push,) 24.6275 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(mixture) 30.9936 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(both.) 20.2042 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 453.527 Td
+/F116_0 17.2154 Tf
+(3.1.2.) 43.0729 Tj
+-278 TJm
+(High-le) 58.343 Tj
+15 TJm
+(vel) 23.9294 Tj
+-278 TJm
+(summar) 66.9679 Tj
+-10 TJm
+(y) 9.5718 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 431.609 Td
+/F122_0 9.9626 Tf
+(This) 17.7135 Tj
+-284 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+-284 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vides) 21.031 Tj
+-285 TJm
+(some) 21.031 Tj
+-284 TJm
+(handy) 24.3486 Tj
+-284 TJm
+(wrappers) 36.5129 Tj
+-284 TJm
+(around) 27.6661 Tj
+-284 TJm
+(the) 12.1743 Tj
+-284 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-285 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+-284 TJm
+(to) 7.7509 Tj
+-284 TJm
+(f) 3.3175 Tj
+10 TJm
+(acilitate) 31.5416 Tj
+-284 TJm
+(reading) 29.8778 Tj
+-284 TJm
+(and) 14.386 Tj
+-285 TJm
+(writ) 16.0497 Tj
+1 TJm
+(ing) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+510.112 431.609 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 419.654 Td
+/F122_0 9.9626 Tf
+(format) 26.5603 Tj
+-347 TJm
+(\002les) 16.6077 Tj
+-346 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+125.391 419.654 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+152.754 419.654 Td
+/F122_0 9.9626 Tf
+(\002les\).) 22.4159 Tj
+-1200 TJm
+(The) 15.4918 Tj
+-346 TJm
+(routines) 32.0995 Tj
+-347 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vide) 17.1556 Tj
+-346 TJm
+(hooks) 23.8007 Tj
+-347 TJm
+(to) 7.7509 Tj
+-346 TJm
+(f) 3.3175 Tj
+10 TJm
+(acilitate) 31.5416 Tj
+-347 TJm
+(reading) 29.8778 Tj
+-347 TJm
+(\002les) 16.6077 Tj
+-346 TJm
+(in) 7.7509 Tj
+-347 TJm
+(which) 24.3486 Tj
+-346 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+460.049 419.654 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+493.39 419.654 Td
+/F122_0 9.9626 Tf
+(data) 16.5977 Tj
+-347 TJm
+(stream) 26.5603 Tj
+72 407.699 Td
+(is) 6.6451 Tj
+-339 TJm
+(embedded) 40.9463 Tj
+-339 TJm
+(within) 25.4644 Tj
+-339 TJm
+(some) 21.031 Tj
+-339 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ger) 12.7222 Tj
+20 TJm
+(-scale) 23.2328 Tj
+-339 TJm
+(\002le) 12.7322 Tj
+-339 TJm
+(structure,) 37.3498 Tj
+-361 TJm
+(or) 8.2988 Tj
+-340 TJm
+(wher) 19.9152 Tj
+1 TJm
+(e) 4.4234 Tj
+-340 TJm
+(there) 19.9152 Tj
+-339 TJm
+(are) 12.1643 Tj
+-339 TJm
+(multiple) 33.2153 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+400.941 407.699 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+434.207 407.699 Td
+/F122_0 9.9626 Tf
+(data) 16.5977 Tj
+-339 TJm
+(streams) 30.4357 Tj
+-339 TJm
+(concatenated) 52.0048 Tj
+72 395.744 Td
+(end-to-end.) 45.6486 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 373.826 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-332 TJm
+(reading) 29.8778 Tj
+-333 TJm
+(\002les,) 19.0983 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+144.803 373.826 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadOpen) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+228.489 373.826 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+234.496 373.826 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.272 373.826 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+300.279 373.826 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+393.253 373.826 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+410.951 373.826 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadGetUnused) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+527.836 373.826 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+72 361.871 Td
+(supplied.) 36.2539 Tj
+-620 TJm
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-250 TJm
+(writing) 28.782 Tj
+-250 TJm
+(\002les,) 19.0983 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+183.471 361.871 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteOpen) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+273.135 361.871 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+278.116 361.871 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+346.36 361.871 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.237 361.871 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteFinish) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+467.346 361.871 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 339.953 Td
+(As) 11.0684 Tj
+-374 TJm
+(with) 17.7135 Tj
+-374 TJm
+(the) 12.1743 Tj
+-375 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-374 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-405 TJm
+(no) 9.9626 Tj
+-374 TJm
+(global) 24.9065 Tj
+-374 TJm
+(v) 4.9813 Tj
+25 TJm
+(ariables) 30.9837 Tj
+-375 TJm
+(are) 12.1643 Tj
+-374 TJm
+(used) 18.2614 Tj
+-374 TJm
+(so) 8.8568 Tj
+-374 TJm
+(the) 12.1743 Tj
+-374 TJm
+(library) 26.5603 Tj
+-375 TJm
+(is) 6.6451 Tj
+-374 TJm
+(per) 12.7222 Tj
+-374 TJm
+(se) 8.2988 Tj
+-374 TJm
+(thread-safe.) 46.7445 Tj
+-1365 TJm
+(Ho) 12.1743 Tj
+25 TJm
+(we) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+40 TJm
+(,) 2.4907 Tj
+-406 TJm
+(if) 6.0871 Tj
+-374 TJm
+(I/O) 13.2801 Tj
+72 327.998 Td
+(errors) 23.2328 Tj
+-267 TJm
+(occur) 22.1269 Tj
+-267 TJm
+(whilst) 24.3586 Tj
+-267 TJm
+(reading) 29.8778 Tj
+-267 TJm
+(or) 8.2988 Tj
+-267 TJm
+(writing) 28.782 Tj
+-267 TJm
+(the) 12.1743 Tj
+-268 TJm
+(underlying) 43.1679 Tj
+-267 TJm
+(compressed) 47.0334 Tj
+-267 TJm
+(\002les,) 19.0983 Tj
+-271 TJm
+(you) 14.9439 Tj
+-267 TJm
+(may) 17.1556 Tj
+-267 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-267 TJm
+(to) 7.7509 Tj
+-267 TJm
+(consult) 28.782 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+457.199 327.998 Td
+/F124_0 9.9626 Tf
+(errno) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+489.748 327.998 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-267 TJm
+(determine) 39.8404 Tj
+72 316.043 Td
+(the) 12.1743 Tj
+-366 TJm
+(cause) 22.1269 Tj
+-365 TJm
+(of) 8.2988 Tj
+-366 TJm
+(the) 12.1743 Tj
+-365 TJm
+(error) 19.3573 Tj
+55 TJm
+(.) 2.4907 Tj
+-1314 TJm
+(In) 8.2988 Tj
+-366 TJm
+(that) 14.9439 Tj
+-365 TJm
+(case,) 19.6363 Tj
+-395 TJm
+(you') 18.2614 Tj
+50 TJm
+(d) 4.9813 Tj
+-366 TJm
+(need) 18.8094 Tj
+-365 TJm
+(a) 4.4234 Tj
+-366 TJm
+(C) 6.6451 Tj
+-365 TJm
+(library) 26.5603 Tj
+-366 TJm
+(which) 24.3486 Tj
+-366 TJm
+(correctly) 35.4071 Tj
+-365 TJm
+(supports) 33.7633 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+431.668 316.043 Td
+/F124_0 9.9626 Tf
+(errno) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+465.199 316.043 Td
+/F122_0 9.9626 Tf
+(in) 7.7509 Tj
+-366 TJm
+(a) 4.4234 Tj
+-365 TJm
+(multithreaded) 55.3422 Tj
+72 304.088 Td
+(en) 9.4047 Tj
+40 TJm
+(vironment.) 43.4469 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 282.17 Td
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-243 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-243 TJm
+(the) 12.1743 Tj
+-242 TJm
+(library) 26.5603 Tj
+-243 TJm
+(a) 4.4234 Tj
+-243 TJm
+(little) 18.2714 Tj
+-242 TJm
+(simpler) 29.8878 Tj
+-243 TJm
+(and) 14.386 Tj
+-243 TJm
+(more) 20.4731 Tj
+-243 TJm
+(portable,) 35.1381 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+289.263 282.17 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadOpen) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+375.368 282.17 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+392.172 282.17 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteOpen) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+484.254 282.17 Td
+/F122_0 9.9626 Tf
+(require) 28.2141 Tj
+-243 TJm
+(you) 14.9439 Tj
+-243 TJm
+(to) 7.7509 Tj
+72 270.215 Td
+(pass) 17.1556 Tj
+-247 TJm
+(them) 19.9252 Tj
+-248 TJm
+(\002le) 12.7322 Tj
+-247 TJm
+(handles) 30.4357 Tj
+-247 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+165.421 270.215 Td
+/F124_0 9.9626 Tf
+(FILE) 23.9102 Tj
+189.331 268.471 Td
+(*) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+195.309 270.215 Td
+/F122_0 9.9626 Tf
+(s\)) 7.193 Tj
+-247 TJm
+(which) 24.3486 Tj
+-248 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-247 TJm
+(pre) 12.7222 Tj
+25 TJm
+(viously) 29.3399 Tj
+-247 TJm
+(been) 18.8094 Tj
+-248 TJm
+(opened) 28.772 Tj
+-247 TJm
+(for) 11.6164 Tj
+-247 TJm
+(reading) 29.8778 Tj
+-247 TJm
+(or) 8.2988 Tj
+-248 TJm
+(writing) 28.782 Tj
+-247 TJm
+(respecti) 30.9837 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ely) 12.1743 Tj
+65 TJm
+(.) 2.4907 Tj
+-618 TJm
+(That) 18.2614 Tj
+-248 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+20 TJm
+(oids) 16.6077 Tj
+72 258.259 Td
+(portability) 41.5142 Tj
+-272 TJm
+(problems) 37.0808 Tj
+-273 TJm
+(associated) 40.9463 Tj
+-272 TJm
+(with) 17.7135 Tj
+-272 TJm
+(\002le) 12.7322 Tj
+-273 TJm
+(operations) 41.5042 Tj
+-272 TJm
+(and) 14.386 Tj
+-272 TJm
+(\002le) 12.7322 Tj
+-273 TJm
+(attrib) 21.031 Tj
+20 TJm
+(utes,) 18.5404 Tj
+-278 TJm
+(whilst) 24.3586 Tj
+-272 TJm
+(not) 12.7322 Tj
+-272 TJm
+(being) 22.1369 Tj
+-273 TJm
+(much) 22.1369 Tj
+-272 TJm
+(of) 8.2988 Tj
+-273 TJm
+(an) 9.4047 Tj
+-272 TJm
+(imposition) 42.63 Tj
+-272 TJm
+(on) 9.9626 Tj
+-273 TJm
+(the) 12.1743 Tj
+72 246.304 Td
+(programmer) 49.2451 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 215.683 Td
+/F116_0 17.2154 Tf
+(3.1.3.) 43.0729 Tj
+-278 TJm
+(Utility) 47.8244 Tj
+-278 TJm
+(functions) 77.4693 Tj
+-278 TJm
+(summar) 66.9679 Tj
+-10 TJm
+(y) 9.5718 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 193.765 Td
+/F122_0 9.9626 Tf
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-273 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-273 TJm
+(simple) 26.5703 Tj
+-273 TJm
+(needs,) 25.1755 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+165.929 193.765 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffCompress) 143.4614 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+312.112 193.765 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+329.219 193.765 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffDecompress) 155.4166 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+487.357 193.765 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-273 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vided.) 24.6275 Tj
+72 181.81 Td
+(These) 23.7907 Tj
+-374 TJm
+(compress) 37.6287 Tj
+-373 TJm
+(data) 16.5977 Tj
+-374 TJm
+(in) 7.7509 Tj
+-373 TJm
+(memory) 33.2053 Tj
+-374 TJm
+(from) 19.3673 Tj
+-373 TJm
+(one) 14.386 Tj
+-374 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-373 TJm
+(to) 7.7509 Tj
+-374 TJm
+(another) 29.8778 Tj
+-374 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-373 TJm
+(in) 7.7509 Tj
+-374 TJm
+(a) 4.4234 Tj
+-373 TJm
+(single) 23.8007 Tj
+-374 TJm
+(function) 33.2053 Tj
+-373 TJm
+(call.) 16.8766 Tj
+-1362 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-373 TJm
+(should) 26.5703 Tj
+-374 TJm
+(assess) 24.3486 Tj
+72 169.855 Td
+(whether) 32.0895 Tj
+-344 TJm
+(these) 20.4731 Tj
+-343 TJm
+(functions) 37.0808 Tj
+-344 TJm
+(ful\002ll) 22.1469 Tj
+-344 TJm
+(your) 18.2614 Tj
+-343 TJm
+(memory-to-memory) 80.7967 Tj
+-344 TJm
+(compression/decompression) 112.8962 Tj
+-343 TJm
+(requirements) 52.0147 Tj
+-344 TJm
+(before) 25.4445 Tj
+-344 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(esting) 23.8007 Tj
+72 157.9 Td
+(ef) 7.7409 Tj
+25 TJm
+(fort) 14.386 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(understanding) 56.4481 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(more) 20.4731 Tj
+-250 TJm
+(general) 29.3199 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(more) 20.4731 Tj
+-250 TJm
+(comple) 29.3299 Tj
+15 TJm
+(x) 4.9813 Tj
+-250 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace.) 15.7608 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 135.982 Td
+(Y) 7.193 Tj
+110 TJm
+(oshioka) 30.9936 Tj
+-423 TJm
+(Tsuneo) 29.3299 Tj
+-422 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+150.161 135.982 Td
+/F124_0 9.9626 Tf
+(tsuneo@rr.iij4u.or.jp) 125.5288 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+275.69 135.982 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-423 TJm
+(has) 13.2801 Tj
+-422 TJm
+(contrib) 28.224 Tj
+20 TJm
+(uted) 17.1556 Tj
+-423 TJm
+(some) 21.031 Tj
+-423 TJm
+(functions) 37.0808 Tj
+-422 TJm
+(to) 7.7509 Tj
+-423 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-423 TJm
+(better) 22.6848 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+476.462 135.982 Td
+/F124_0 9.9626 Tf
+(zlib) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+504.583 135.982 Td
+/F122_0 9.9626 Tf
+(compati-) 35.417 Tj
+72 124.027 Td
+(bility) 21.041 Tj
+65 TJm
+(.) 2.4907 Tj
+-1446 TJm
+(These) 23.7907 Tj
+-388 TJm
+(functions) 37.0808 Tj
+-387 TJm
+(are) 12.1643 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.914 124.027 Td
+/F124_0 9.9626 Tf
+(BZ2_bzopen) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+253.689 124.027 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+260.385 124.027 Td
+/F124_0 9.9626 Tf
+(BZ2_bzread) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+320.161 124.027 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+326.857 124.027 Td
+/F124_0 9.9626 Tf
+(BZ2_bzwrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+392.611 124.027 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+399.307 124.027 Td
+/F124_0 9.9626 Tf
+(BZ2_bzflush) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+465.06 124.027 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+471.756 124.027 Td
+/F124_0 9.9626 Tf
+(BZ2_bzclose) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 124.027 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 112.072 Td
+/F124_0 9.9626 Tf
+(BZ2_bzerror) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+140.408 112.072 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+157.449 112.072 Td
+/F124_0 9.9626 Tf
+(BZ2_bzlibVersion) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+253.091 112.072 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-719 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-266 TJm
+(may) 17.1556 Tj
+-267 TJm
+(\002nd) 15.5018 Tj
+-266 TJm
+(these) 20.4731 Tj
+-267 TJm
+(functions) 37.0808 Tj
+-266 TJm
+(more) 20.4731 Tj
+-267 TJm
+(con) 14.386 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(enient) 24.3486 Tj
+-266 TJm
+(for) 11.6164 Tj
+-267 TJm
+(simple) 26.5703 Tj
+-266 TJm
+(\002le) 12.7322 Tj
+-267 TJm
+(reading) 29.8778 Tj
+72 100.116 Td
+(and) 14.386 Tj
+-270 TJm
+(writ) 16.0497 Tj
+1 TJm
+(ing,) 15.2229 Tj
+-275 TJm
+(than) 17.1556 Tj
+-269 TJm
+(those) 21.031 Tj
+-270 TJm
+(in) 7.7509 Tj
+-269 TJm
+(the) 12.1743 Tj
+-270 TJm
+(high-le) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-269 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace.) 15.7608 Tj
+-737 TJm
+(These) 23.7907 Tj
+-270 TJm
+(functions) 37.0808 Tj
+-269 TJm
+(are) 12.1643 Tj
+-270 TJm
+(not) 12.7322 Tj
+-269 TJm
+(\(yet\)) 18.8094 Tj
+-270 TJm
+(of) 8.2988 Tj
+25 TJm
+(\002cially) 27.6761 Tj
+-269 TJm
+(part) 15.4918 Tj
+-270 TJm
+(of) 8.2988 Tj
+-269 TJm
+(the) 12.1743 Tj
+-270 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-274 TJm
+(and) 14.386 Tj
+-270 TJm
+(are) 12.1643 Tj
+72 88.161 Td
+(minimally) 40.9662 Tj
+-291 TJm
+(documented) 48.6972 Tj
+-291 TJm
+(here.) 19.6363 Tj
+-867 TJm
+(If) 6.6351 Tj
+-291 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-291 TJm
+(break,) 24.6176 Tj
+-301 TJm
+(you) 14.9439 Tj
+-291 TJm
+(get) 12.1743 Tj
+-292 TJm
+(to) 7.7509 Tj
+-291 TJm
+(k) 4.9813 Tj
+10 TJm
+(eep) 13.8281 Tj
+-291 TJm
+(all) 9.9626 Tj
+-291 TJm
+(the) 12.1743 Tj
+-291 TJm
+(pieces.) 27.3872 Tj
+-433 TJm
+(I) 3.3175 Tj
+-291 TJm
+(hope) 19.3673 Tj
+-291 TJm
+(to) 7.7509 Tj
+-291 TJm
+(document) 39.2925 Tj
+-292 TJm
+(them) 19.9252 Tj
+-291 TJm
+(properly) 33.7533 Tj
+-291 TJm
+(when) 21.579 Tj
+72 76.206 Td
+(time) 17.7135 Tj
+-250 TJm
+(permits.) 32.3785 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+541.288 51.071 Td
+(9) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 10 13
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(Y) 7.193 Tj
+110 TJm
+(oshioka) 30.9936 Tj
+-250 TJm
+(also) 16.0497 Tj
+-250 TJm
+(contrib) 28.224 Tj
+20 TJm
+(uted) 17.1556 Tj
+-250 TJm
+(modi\002cations) 54.2464 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(allo) 14.9439 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(uilt) 13.2901 Tj
+-250 TJm
+(as) 8.2988 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(W) 9.4047 Tj
+40 TJm
+(indo) 17.7135 Tj
+25 TJm
+(ws) 11.0684 Tj
+-250 TJm
+(DLL.) 21.8579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 675.504 Td
+/F116_0 20.6585 Tf
+(3.2.) 34.4584 Tj
+-278 TJm
+(Err) 29.8515 Tj
+20 TJm
+(or) 20.6585 Tj
+-278 TJm
+(handling) 86.084 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 653.805 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-214 TJm
+(library) 26.5603 Tj
+-215 TJm
+(is) 6.6451 Tj
+-214 TJm
+(designed) 35.417 Tj
+-215 TJm
+(to) 7.7509 Tj
+-214 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-215 TJm
+(cleanly) 28.772 Tj
+-214 TJm
+(in) 7.7509 Tj
+-215 TJm
+(all) 9.9626 Tj
+-214 TJm
+(situations,) 40.6873 Tj
+-222 TJm
+(including) 37.6387 Tj
+-214 TJm
+(the) 12.1743 Tj
+-215 TJm
+(w) 7.193 Tj
+10 TJm
+(orst-case) 35.4071 Tj
+-214 TJm
+(situation) 34.3212 Tj
+-215 TJm
+(of) 8.2988 Tj
+-214 TJm
+(decompressing) 59.7656 Tj
+-215 TJm
+(random) 30.4357 Tj
+72 641.85 Td
+(data.) 19.0883 Tj
+-764 TJm
+(I'm) 14.386 Tj
+-274 TJm
+(not) 12.7322 Tj
+-275 TJm
+(100%) 23.2427 Tj
+-274 TJm
+(sure) 16.5977 Tj
+-274 TJm
+(that) 14.9439 Tj
+-274 TJm
+(it) 5.5392 Tj
+-274 TJm
+(can) 13.8281 Tj
+-274 TJm
+(al) 7.193 Tj
+10 TJm
+(w) 7.193 Tj
+10 TJm
+(ays) 13.2801 Tj
+-274 TJm
+(do) 9.9626 Tj
+-274 TJm
+(this,) 16.8866 Tj
+-280 TJm
+(so) 8.8568 Tj
+-274 TJm
+(you) 14.9439 Tj
+-274 TJm
+(might) 23.2527 Tj
+-274 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-274 TJm
+(to) 7.7509 Tj
+-274 TJm
+(add) 14.386 Tj
+-274 TJm
+(a) 4.4234 Tj
+-275 TJm
+(s) 3.8755 Tj
+1 TJm
+(ignal) 19.9252 Tj
+-275 TJm
+(handler) 29.8778 Tj
+-274 TJm
+(to) 7.7509 Tj
+-274 TJm
+(catch) 21.0211 Tj
+-274 TJm
+(se) 8.2988 Tj
+15 TJm
+(gmentation) 44.8317 Tj
+72 629.895 Td
+(violations) 39.3025 Tj
+-273 TJm
+(during) 26.0123 Tj
+-273 TJm
+(decompression) 59.7656 Tj
+-273 TJm
+(if) 6.0871 Tj
+-273 TJm
+(you) 14.9439 Tj
+-273 TJm
+(are) 12.1643 Tj
+-273 TJm
+(feeling) 27.6661 Tj
+-274 TJm
+(especiall) 34.8591 Tj
+1 TJm
+(y) 4.9813 Tj
+-274 TJm
+(paranoid.) 37.3498 Tj
+-758 TJm
+(I) 3.3175 Tj
+-273 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-273 TJm
+(be) 9.4047 Tj
+-273 TJm
+(interested) 38.7346 Tj
+-273 TJm
+(in) 7.7509 Tj
+-274 TJm
+(hearing) 29.8778 Tj
+-273 TJm
+(more) 20.4731 Tj
+-273 TJm
+(about) 22.1369 Tj
+72 617.939 Td
+(the) 12.1743 Tj
+-250 TJm
+(rob) 13.2801 Tj
+20 TJm
+(ustness) 28.782 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(corrupted) 38.1767 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(data.) 19.0883 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 596.241 Td
+(V) 7.193 Tj
+111 TJm
+(ersion) 24.3486 Tj
+-251 TJm
+(1.0.3) 19.9252 Tj
+-251 TJm
+(more) 20.4731 Tj
+-251 TJm
+(rob) 13.2801 Tj
+20 TJm
+(ust) 11.6264 Tj
+-251 TJm
+(in) 7.7509 Tj
+-251 TJm
+(this) 14.396 Tj
+-251 TJm
+(respect) 28.2141 Tj
+-252 TJm
+(than) 17.1556 Tj
+-251 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-251 TJm
+(pre) 12.7222 Tj
+25 TJm
+(vious) 21.589 Tj
+-251 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion.) 26.8392 Tj
+-626 TJm
+(In) 8.2988 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(estig) 18.8194 Tj
+5 TJm
+(ations) 23.8007 Tj
+-251 TJm
+(with) 17.7135 Tj
+-251 TJm
+(V) 7.193 Tj
+111 TJm
+(algrind) 28.224 Tj
+-251 TJm
+(\(a) 7.7409 Tj
+-252 TJm
+(tool) 15.5018 Tj
+-251 TJm
+(for) 11.6164 Tj
+-251 TJm
+(detecting) 36.5229 Tj
+72 584.285 Td
+(problems) 37.0808 Tj
+-422 TJm
+(with) 17.7135 Tj
+-421 TJm
+(memory) 33.2053 Tj
+-422 TJm
+(management\)) 54.2264 Tj
+-421 TJm
+(indicate) 31.5416 Tj
+-422 TJm
+(that,) 17.4346 Tj
+-464 TJm
+(at) 7.193 Tj
+-422 TJm
+(least) 18.2614 Tj
+-421 TJm
+(for) 11.6164 Tj
+-422 TJm
+(the) 12.1743 Tj
+-422 TJm
+(f) 3.3175 Tj
+1 TJm
+(e) 4.4234 Tj
+25 TJm
+(w) 7.193 Tj
+-422 TJm
+(\002les) 16.6077 Tj
+-422 TJm
+(I) 3.3175 Tj
+-421 TJm
+(tested,) 25.7334 Tj
+-464 TJm
+(all) 9.9626 Tj
+-422 TJm
+(single-bit) 37.6387 Tj
+-422 TJm
+(errors) 23.2328 Tj
+-421 TJm
+(in) 7.7509 Tj
+-422 TJm
+(the) 12.1743 Tj
+72 572.33 Td
+(decompressed) 56.4381 Tj
+-342 TJm
+(data) 16.5977 Tj
+-341 TJm
+(are) 12.1643 Tj
+-342 TJm
+(caught) 26.5603 Tj
+-342 TJm
+(properly) 33.7533 Tj
+65 TJm
+(,) 2.4907 Tj
+-365 TJm
+(with) 17.7135 Tj
+-341 TJm
+(no) 9.9626 Tj
+-342 TJm
+(se) 8.2988 Tj
+15 TJm
+(gmentation) 44.8317 Tj
+-342 TJm
+(f) 3.3175 Tj
+10 TJm
+(aults,) 21.31 Tj
+-365 TJm
+(no) 9.9626 Tj
+-341 TJm
+(uses) 17.1556 Tj
+-342 TJm
+(of) 8.2988 Tj
+-342 TJm
+(uninitialised) 49.2651 Tj
+-342 TJm
+(data,) 19.0883 Tj
+-364 TJm
+(no) 9.9626 Tj
+-342 TJm
+(out) 12.7322 Tj
+-342 TJm
+(of) 8.2988 Tj
+-342 TJm
+(range) 22.1269 Tj
+72 560.375 Td
+(reads) 21.0211 Tj
+-261 TJm
+(or) 8.2988 Tj
+-260 TJm
+(writes,) 26.8392 Tj
+-263 TJm
+(and) 14.386 Tj
+-261 TJm
+(no) 9.9626 Tj
+-261 TJm
+(in\002nit) 23.8106 Tj
+1 TJm
+(e) 4.4234 Tj
+-261 TJm
+(looping) 30.4457 Tj
+-261 TJm
+(in) 7.7509 Tj
+-260 TJm
+(the) 12.1743 Tj
+-261 TJm
+(decompressor) 55.3323 Tj
+55 TJm
+(.) 2.4907 Tj
+-342 TJm
+(So) 10.5205 Tj
+-260 TJm
+(it') 8.8568 Tj
+55 TJm
+(s) 3.8755 Tj
+-261 TJm
+(certainly) 34.8591 Tj
+-260 TJm
+(pretty) 23.2427 Tj
+-261 TJm
+(rob) 13.2801 Tj
+20 TJm
+(ust,) 14.117 Tj
+-263 TJm
+(although) 34.8691 Tj
+-261 TJm
+(I) 3.3175 Tj
+-260 TJm
+(w) 7.193 Tj
+10 TJm
+(ouldn') 26.0123 Tj
+18 TJm
+(t) 2.7696 Tj
+-261 TJm
+(claim) 22.1369 Tj
+72 548.42 Td
+(it) 5.5392 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(totally) 25.4644 Tj
+-250 TJm
+(bombproof.) 46.7644 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 526.721 Td
+(The) 15.4918 Tj
+-282 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+105.84 526.721 Td
+/F124_0 9.9626 Tf
+(bzlib.h) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+150.491 526.721 Td
+/F122_0 9.9626 Tf
+(contains) 33.2053 Tj
+-282 TJm
+(all) 9.9626 Tj
+-282 TJm
+(de\002nitions) 42.0721 Tj
+-282 TJm
+(needed) 28.2141 Tj
+-281 TJm
+(to) 7.7509 Tj
+-282 TJm
+(use) 13.2801 Tj
+-282 TJm
+(the) 12.1743 Tj
+-282 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+-811 TJm
+(In) 8.2988 Tj
+-282 TJm
+(particular) 38.1767 Tj
+40 TJm
+(,) 2.4907 Tj
+-290 TJm
+(you) 14.9439 Tj
+-282 TJm
+(should) 26.5703 Tj
+-281 TJm
+(de\002nitely) 37.6387 Tj
+-282 TJm
+(not) 12.7322 Tj
+-282 TJm
+(include) 29.3299 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 514.766 Td
+/F124_0 9.9626 Tf
+(bzlib_private.h) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.664 514.766 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 493.067 Td
+(In) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.807 493.067 Td
+/F124_0 9.9626 Tf
+(bzlib.h) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+124.651 493.067 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-252 TJm
+(the) 12.1743 Tj
+-252 TJm
+(v) 4.9813 Tj
+25 TJm
+(arious) 24.3486 Tj
+-252 TJm
+(return) 23.7907 Tj
+-252 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-251 TJm
+(are) 12.1643 Tj
+-252 TJm
+(de\002ned.) 31.8205 Tj
+-631 TJm
+(The) 15.4918 Tj
+-252 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-252 TJm
+(list) 12.1843 Tj
+-251 TJm
+(is) 6.6451 Tj
+-252 TJm
+(not) 12.7322 Tj
+-252 TJm
+(intended) 34.3112 Tj
+-252 TJm
+(as) 8.2988 Tj
+-251 TJm
+(an) 9.4047 Tj
+-252 TJm
+(e) 4.4234 Tj
+15 TJm
+(xhausti) 28.782 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-252 TJm
+(description) 44.2738 Tj
+-252 TJm
+(of) 8.2988 Tj
+72 481.112 Td
+(the) 12.1743 Tj
+-236 TJm
+(circumstances) 56.4381 Tj
+-236 TJm
+(in) 7.7509 Tj
+-237 TJm
+(which) 24.3486 Tj
+-236 TJm
+(a) 4.4234 Tj
+-236 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-236 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-236 TJm
+(may) 17.1556 Tj
+-237 TJm
+(be) 9.4047 Tj
+-236 TJm
+(returned) 33.1954 Tj
+-236 TJm
+(--) 6.6351 Tj
+-236 TJm
+(those) 21.031 Tj
+-236 TJm
+(descriptions) 48.1492 Tj
+-236 TJm
+(are) 12.1643 Tj
+-237 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-236 TJm
+(later) 17.7035 Tj
+55 TJm
+(.) 2.4907 Tj
+-305 TJm
+(Rather) 26.5603 Tj
+40 TJm
+(,) 2.4907 Tj
+-239 TJm
+(it) 5.5392 Tj
+-236 TJm
+(is) 6.6451 Tj
+-237 TJm
+(intended) 34.3112 Tj
+-236 TJm
+(to) 7.7509 Tj
+72 469.157 Td
+(con) 14.386 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+15 TJm
+(y) 4.9813 Tj
+-266 TJm
+(the) 12.1743 Tj
+-265 TJm
+(rough) 23.2427 Tj
+-266 TJm
+(meaning) 34.3112 Tj
+-265 TJm
+(of) 8.2988 Tj
+-266 TJm
+(each) 18.2515 Tj
+-266 TJm
+(return) 23.7907 Tj
+-265 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue.) 19.0883 Tj
+-714 TJm
+(The) 15.4918 Tj
+-265 TJm
+(\002rst) 15.5018 Tj
+-266 TJm
+(\002) 5.5392 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-265 TJm
+(actions) 28.224 Tj
+-266 TJm
+(are) 12.1643 Tj
+-266 TJm
+(normal) 28.224 Tj
+-265 TJm
+(and) 14.386 Tj
+-266 TJm
+(not) 12.7322 Tj
+-265 TJm
+(intended) 34.3112 Tj
+-266 TJm
+(to) 7.7509 Tj
+-266 TJm
+(denote) 26.5603 Tj
+-265 TJm
+(an) 9.4047 Tj
+-266 TJm
+(error) 19.3573 Tj
+72 457.202 Td
+(situation.) 36.8118 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 425.759 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 413.804 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-250 TJm
+(requested) 38.1767 Tj
+-250 TJm
+(action) 24.3486 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(completed) 41.5042 Tj
+-250 TJm
+(successfully) 48.6972 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 388.34 Td
+/F124_0 9.9626 Tf
+(BZ_RUN_OK,) 59.7756 Tj
+-600 TJm
+(BZ_FLUSH_OK,) 71.7307 Tj
+-600 TJm
+(BZ_FINISH_OK) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 376.384 Td
+/F122_0 9.9626 Tf
+(In) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+118.789 376.384 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+202.476 376.384 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(requested) 38.1767 Tj
+-250 TJm
+(\003ush/\002nish/nothing-special) 108.4927 Tj
+-250 TJm
+(action) 24.3486 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(completed) 41.5042 Tj
+-250 TJm
+(successfully) 48.6972 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 350.92 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 338.965 Td
+/F122_0 9.9626 Tf
+(Compression) 52.5826 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(completed,) 43.9948 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(logical) 27.1182 Tj
+-250 TJm
+(stream) 26.5603 Tj
+-250 TJm
+(end) 14.386 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(detected) 33.1954 Tj
+-250 TJm
+(during) 26.0123 Tj
+-250 TJm
+(decompression.) 62.2563 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 303.756 Td
+(The) 15.4918 Tj
+-250 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-250 TJm
+(indicate) 31.5416 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(kind.) 20.2042 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 272.314 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 260.359 Td
+/F122_0 9.9626 Tf
+(Indicates) 35.965 Tj
+-386 TJm
+(that) 14.9439 Tj
+-385 TJm
+(the) 12.1743 Tj
+-386 TJm
+(library) 26.5603 Tj
+-386 TJm
+(has) 13.2801 Tj
+-386 TJm
+(been) 18.8094 Tj
+-385 TJm
+(improperly) 44.2738 Tj
+-386 TJm
+(compiled) 37.0808 Tj
+-386 TJm
+(on) 9.9626 Tj
+-386 TJm
+(your) 18.2614 Tj
+-385 TJm
+(platform) 34.3112 Tj
+-386 TJm
+(--) 6.6351 Tj
+-386 TJm
+(a) 4.4234 Tj
+-386 TJm
+(major) 23.2427 Tj
+-385 TJm
+(con\002guration) 53.1305 Tj
+-386 TJm
+(error) 19.3573 Tj
+55 TJm
+(.) 2.4907 Tj
+108 248.404 Td
+(Speci\002cally) 47.0434 Tj
+65 TJm
+(,) 2.4907 Tj
+-481 TJm
+(it) 5.5392 Tj
+-435 TJm
+(means) 25.4544 Tj
+-435 TJm
+(that) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+220.614 248.404 Td
+/F124_0 9.9626 Tf
+(sizeof\(char\)) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+292.345 248.404 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+299.628 248.404 Td
+/F124_0 9.9626 Tf
+(sizeof\(short\)) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+381.669 248.404 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+400.388 248.404 Td
+/F124_0 9.9626 Tf
+(sizeof\(int\)) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+470.474 248.404 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-435 TJm
+(not) 12.7322 Tj
+-435 TJm
+(1,) 7.472 Tj
+-481 TJm
+(2) 4.9813 Tj
+-435 TJm
+(and) 14.386 Tj
+108 236.448 Td
+(4) 4.9813 Tj
+-389 TJm
+(respecti) 30.9837 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ely) 12.1743 Tj
+65 TJm
+(,) 2.4907 Tj
+-424 TJm
+(as) 8.2988 Tj
+-390 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-389 TJm
+(should) 26.5703 Tj
+-389 TJm
+(be.) 11.8953 Tj
+-1456 TJm
+(Note) 19.3673 Tj
+-389 TJm
+(that) 14.9439 Tj
+-389 TJm
+(the) 12.1743 Tj
+-389 TJm
+(library) 26.5603 Tj
+-390 TJm
+(should) 26.5703 Tj
+-389 TJm
+(still) 14.9539 Tj
+-389 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-389 TJm
+(properly) 33.7533 Tj
+-390 TJm
+(on) 9.9626 Tj
+-389 TJm
+(64-bit) 23.8007 Tj
+-389 TJm
+(platforms) 38.1866 Tj
+108 224.493 Td
+(which) 24.3486 Tj
+-292 TJm
+(follo) 18.8194 Tj
+25 TJm
+(w) 7.193 Tj
+-292 TJm
+(the) 12.1743 Tj
+-292 TJm
+(LP64) 21.589 Tj
+-292 TJm
+(programming) 54.2364 Tj
+-293 TJm
+(model) 24.9065 Tj
+-292 TJm
+(--) 6.6351 Tj
+-292 TJm
+(that) 14.9439 Tj
+-292 TJm
+(is,) 9.1357 Tj
+-303 TJm
+(where) 24.3386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+355.279 224.493 Td
+/F124_0 9.9626 Tf
+(sizeof\(long\)) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+429.92 224.493 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+447.217 224.493 Td
+/F124_0 9.9626 Tf
+(sizeof\(void) 65.7532 Tj
+512.97 222.75 Td
+(*) 5.9776 Tj
+518.948 224.493 Td
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+527.836 224.493 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+108 212.538 Td
+(8.) 7.472 Tj
+-620 TJm
+(Under) 24.8965 Tj
+-250 TJm
+(LP64,) 24.0796 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+175.606 212.538 Td
+/F124_0 9.9626 Tf
+(sizeof\(int\)) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+243.85 212.538 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(still) 14.9539 Tj
+-250 TJm
+(4,) 7.472 Tj
+-250 TJm
+(so) 8.8568 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+291.74 212.538 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+339.561 212.538 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+433.458 212.538 Td
+/F124_0 9.9626 Tf
+(long) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+459.859 212.538 Td
+/F122_0 9.9626 Tf
+(type,) 19.6462 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(OK.) 16.8766 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 187.073 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 175.118 Td
+/F122_0 9.9626 Tf
+(When) 23.7907 Tj
+-291 TJm
+(using) 21.589 Tj
+-290 TJm
+(the) 12.1743 Tj
+-291 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-300 TJm
+(it) 5.5392 Tj
+-291 TJm
+(is) 6.6451 Tj
+-290 TJm
+(important) 38.7446 Tj
+-291 TJm
+(to) 7.7509 Tj
+-290 TJm
+(call) 14.386 Tj
+-291 TJm
+(the) 12.1743 Tj
+-290 TJm
+(functions) 37.0808 Tj
+-291 TJm
+(in) 7.7509 Tj
+-290 TJm
+(the) 12.1743 Tj
+-291 TJm
+(correct) 27.6562 Tj
+-290 TJm
+(sequence) 36.5129 Tj
+-291 TJm
+(and) 14.386 Tj
+-290 TJm
+(with) 17.7135 Tj
+-291 TJm
+(data) 16.5977 Tj
+-290 TJm
+(structures) 38.7346 Tj
+108 163.163 Td
+(\(b) 8.2988 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fers) 14.9339 Tj
+-206 TJm
+(etc\)) 14.9339 Tj
+-205 TJm
+(in) 7.7509 Tj
+-206 TJm
+(the) 12.1743 Tj
+-205 TJm
+(correct) 27.6562 Tj
+-206 TJm
+(states.) 24.6275 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+239.409 163.163 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+289.278 163.163 Td
+/F122_0 9.9626 Tf
+(checks) 27.1082 Tj
+-206 TJm
+(as) 8.2988 Tj
+-205 TJm
+(much) 22.1369 Tj
+-206 TJm
+(as) 8.2988 Tj
+-206 TJm
+(it) 5.5392 Tj
+-205 TJm
+(can) 13.8281 Tj
+-206 TJm
+(to) 7.7509 Tj
+-205 TJm
+(ensure) 26.0024 Tj
+-206 TJm
+(this) 14.396 Tj
+-206 TJm
+(is) 6.6451 Tj
+-205 TJm
+(happening,) 43.9948 Tj
+-215 TJm
+(and) 14.386 Tj
+-205 TJm
+(returns) 27.6661 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 151.208 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+213.27 151.208 Td
+/F122_0 9.9626 Tf
+(if) 6.0871 Tj
+-367 TJm
+(not.) 15.2229 Tj
+-659 TJm
+(Code) 21.031 Tj
+-367 TJm
+(which) 24.3486 Tj
+-367 TJm
+(complies) 35.9749 Tj
+-366 TJm
+(precisely) 35.965 Tj
+-367 TJm
+(with) 17.7135 Tj
+-366 TJm
+(the) 12.1743 Tj
+-367 TJm
+(function) 33.2053 Tj
+-366 TJm
+(semantics,) 41.7831 Tj
+-396 TJm
+(as) 8.2988 Tj
+-367 TJm
+(detailed) 31.5416 Tj
+108 139.253 Td
+(belo) 17.1556 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(ne) 9.4047 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-250 TJm
+(recei) 19.3573 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue;) 19.3673 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ent) 12.1743 Tj
+-250 TJm
+(denotes) 30.4357 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(uggy) 19.9252 Tj
+-250 TJm
+(code) 18.8094 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(estig) 18.8194 Tj
+5 TJm
+(ate.) 14.107 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 113.788 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 101.833 Td
+/F122_0 9.9626 Tf
+(Returned) 36.5229 Tj
+-434 TJm
+(when) 21.579 Tj
+-434 TJm
+(a) 4.4234 Tj
+-434 TJm
+(parameter) 39.8305 Tj
+-434 TJm
+(to) 7.7509 Tj
+-434 TJm
+(a) 4.4234 Tj
+-433 TJm
+(function) 33.2053 Tj
+-434 TJm
+(call) 14.386 Tj
+-434 TJm
+(is) 6.6451 Tj
+-434 TJm
+(out) 12.7322 Tj
+-434 TJm
+(of) 8.2988 Tj
+-434 TJm
+(range) 22.1269 Tj
+-434 TJm
+(or) 8.2988 Tj
+-434 TJm
+(otherwise) 38.7346 Tj
+-434 TJm
+(manifestly) 42.0621 Tj
+-434 TJm
+(incorrect.) 37.8977 Tj
+-1723 TJm
+(As) 11.0684 Tj
+108 89.878 Td
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+131.644 89.878 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+233.263 89.878 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-595 TJm
+(this) 14.396 Tj
+-596 TJm
+(denotes) 30.4357 Tj
+-595 TJm
+(a) 4.4234 Tj
+-595 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-596 TJm
+(in) 7.7509 Tj
+-595 TJm
+(the) 12.1743 Tj
+-595 TJm
+(client) 22.1369 Tj
+-595 TJm
+(code.) 21.3 Tj
+-2692 TJm
+(The) 15.4918 Tj
+-596 TJm
+(distinction) 42.0721 Tj
+-595 TJm
+(between) 33.1954 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 77.923 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+194.177 77.923 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+211.054 77.923 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+315.163 77.923 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(bit) 10.5205 Tj
+-250 TJm
+(hazy) 18.8094 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(still) 14.9539 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(orth) 16.0497 Tj
+-250 TJm
+(making.) 32.3785 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(10) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 11 14
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F124_0 9.9626 Tf
+(BZ_MEM_ERROR) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 698.082 Td
+/F122_0 9.9626 Tf
+(Returned) 36.5229 Tj
+-228 TJm
+(when) 21.579 Tj
+-227 TJm
+(a) 4.4234 Tj
+-228 TJm
+(request) 28.772 Tj
+-227 TJm
+(to) 7.7509 Tj
+-228 TJm
+(allocate) 30.9837 Tj
+-228 TJm
+(memory) 33.2053 Tj
+-227 TJm
+(f) 3.3175 Tj
+10 TJm
+(ailed.) 21.8579 Tj
+-605 TJm
+(Note) 19.3673 Tj
+-228 TJm
+(that) 14.9439 Tj
+-228 TJm
+(the) 12.1743 Tj
+-227 TJm
+(quantity) 32.6574 Tj
+-228 TJm
+(of) 8.2988 Tj
+-227 TJm
+(memory) 33.2053 Tj
+-228 TJm
+(needed) 28.2141 Tj
+-228 TJm
+(to) 7.7509 Tj
+-227 TJm
+(decompress) 47.0334 Tj
+108 686.127 Td
+(a) 4.4234 Tj
+-351 TJm
+(stream) 26.5603 Tj
+-352 TJm
+(cannot) 26.5603 Tj
+-351 TJm
+(be) 9.4047 Tj
+-352 TJm
+(determined) 44.8217 Tj
+-351 TJm
+(until) 18.2714 Tj
+-352 TJm
+(the) 12.1743 Tj
+-351 TJm
+(stream') 29.8778 Tj
+55 TJm
+(s) 3.8755 Tj
+-351 TJm
+(header) 26.5503 Tj
+-352 TJm
+(has) 13.2801 Tj
+-351 TJm
+(been) 18.8094 Tj
+-352 TJm
+(read.) 19.6363 Tj
+-1228 TJm
+(So) 10.5205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+426.471 686.127 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+525.614 686.127 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 674.172 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.13 674.172 Td
+/F122_0 9.9626 Tf
+(may) 17.1556 Tj
+-437 TJm
+(return) 23.7907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.784 674.172 Td
+/F124_0 9.9626 Tf
+(BZ_MEM_ERROR) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+297.867 674.172 Td
+/F122_0 9.9626 Tf
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-437 TJm
+(though) 27.6761 Tj
+-437 TJm
+(some) 21.031 Tj
+-437 TJm
+(of) 8.2988 Tj
+-437 TJm
+(the) 12.1743 Tj
+-437 TJm
+(compressed) 47.0334 Tj
+-437 TJm
+(data) 16.5977 Tj
+-437 TJm
+(has) 13.2801 Tj
+-437 TJm
+(been) 18.8094 Tj
+-437 TJm
+(read.) 19.6363 Tj
+108 662.217 Td
+(The) 15.4918 Tj
+-479 TJm
+(same) 20.4731 Tj
+-478 TJm
+(is) 6.6451 Tj
+-479 TJm
+(not) 12.7322 Tj
+-478 TJm
+(true) 15.4918 Tj
+-479 TJm
+(for) 11.6164 Tj
+-479 TJm
+(compression;) 53.1305 Tj
+-593 TJm
+(once) 18.8094 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+301.675 662.217 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+414.04 662.217 Td
+/F122_0 9.9626 Tf
+(or) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+427.107 662.217 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteOpen) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+521.539 662.217 Td
+/F122_0 9.9626 Tf
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+108 650.261 Td
+(successfully) 48.6972 Tj
+-250 TJm
+(completed,) 43.9948 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+205.672 650.261 Td
+/F124_0 9.9626 Tf
+(BZ_MEM_ERROR) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+279.894 650.261 Td
+/F122_0 9.9626 Tf
+(cannot) 26.5603 Tj
+-250 TJm
+(occur) 22.1269 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 624.359 Td
+/F124_0 9.9626 Tf
+(BZ_DATA_ERROR) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 612.404 Td
+/F122_0 9.9626 Tf
+(Returned) 36.5229 Tj
+-266 TJm
+(when) 21.579 Tj
+-265 TJm
+(a) 4.4234 Tj
+-266 TJm
+(data) 16.5977 Tj
+-265 TJm
+(inte) 14.9439 Tj
+15 TJm
+(grity) 18.8194 Tj
+-266 TJm
+(error) 19.3573 Tj
+-266 TJm
+(is) 6.6451 Tj
+-265 TJm
+(detected) 33.1954 Tj
+-266 TJm
+(during) 26.0123 Tj
+-265 TJm
+(decompression.) 62.2563 Tj
+-714 TJm
+(Most) 20.4831 Tj
+-266 TJm
+(importantl) 41.5142 Tj
+1 TJm
+(y) 4.9813 Tj
+64 TJm
+(,) 2.4907 Tj
+-269 TJm
+(this) 14.396 Tj
+-266 TJm
+(means) 25.4544 Tj
+-265 TJm
+(when) 21.579 Tj
+108 600.448 Td
+(stored) 24.3486 Tj
+-222 TJm
+(and) 14.386 Tj
+-223 TJm
+(computed) 39.2925 Tj
+-222 TJm
+(CRCs) 23.8106 Tj
+-222 TJm
+(for) 11.6164 Tj
+-222 TJm
+(the) 12.1743 Tj
+-223 TJm
+(data) 16.5977 Tj
+-222 TJm
+(do) 9.9626 Tj
+-222 TJm
+(not) 12.7322 Tj
+-222 TJm
+(match.) 26.8392 Tj
+-602 TJm
+(This) 17.7135 Tj
+-222 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-222 TJm
+(is) 6.6451 Tj
+-223 TJm
+(also) 16.0497 Tj
+-222 TJm
+(returned) 33.1954 Tj
+-222 TJm
+(upon) 19.9252 Tj
+-222 TJm
+(detection) 36.5229 Tj
+-223 TJm
+(of) 8.2988 Tj
+-222 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-222 TJm
+(other) 20.4731 Tj
+108 588.493 Td
+(anomaly) 34.3112 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(data.) 19.0883 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 562.59 Td
+/F124_0 9.9626 Tf
+(BZ_DATA_ERROR_MAGIC) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 550.635 Td
+/F122_0 9.9626 Tf
+(As) 11.0684 Tj
+-306 TJm
+(a) 4.4234 Tj
+-306 TJm
+(special) 27.6661 Tj
+-306 TJm
+(case) 17.1456 Tj
+-307 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+191.852 550.635 Td
+/F124_0 9.9626 Tf
+(BZ_DATA_ERROR) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+269.561 550.635 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-306 TJm
+(it) 5.5392 Tj
+-306 TJm
+(is) 6.6451 Tj
+-306 TJm
+(sometimes) 42.62 Tj
+-306 TJm
+(useful) 24.3486 Tj
+-307 TJm
+(to) 7.7509 Tj
+-306 TJm
+(kno) 14.9439 Tj
+25 TJm
+(w) 7.193 Tj
+-306 TJm
+(when) 21.579 Tj
+-306 TJm
+(the) 12.1743 Tj
+-306 TJm
+(compressed) 47.0334 Tj
+-306 TJm
+(stream) 26.5603 Tj
+-306 TJm
+(does) 18.2614 Tj
+108 538.68 Td
+(not) 12.7322 Tj
+-250 TJm
+(start) 17.1556 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(correct) 27.6562 Tj
+-250 TJm
+(magic) 24.3486 Tj
+-250 TJm
+(bytes) 21.031 Tj
+-250 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+261.562 538.68 Td
+/F124_0 9.9626 Tf
+('B') 17.9327 Tj
+-600 TJm
+('Z') 17.9327 Tj
+-600 TJm
+('h') 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+327.316 538.68 Td
+/F122_0 9.9626 Tf
+(\).) 5.8082 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 512.777 Td
+/F124_0 9.9626 Tf
+(BZ_IO_ERROR) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 500.822 Td
+/F122_0 9.9626 Tf
+(Returned) 36.5229 Tj
+-233 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.123 500.822 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.218 500.822 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+237.922 500.822 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+305.995 500.822 Td
+/F122_0 9.9626 Tf
+(when) 21.579 Tj
+-233 TJm
+(there) 19.9152 Tj
+-232 TJm
+(is) 6.6451 Tj
+-233 TJm
+(an) 9.4047 Tj
+-233 TJm
+(error) 19.3573 Tj
+-233 TJm
+(reading) 29.8778 Tj
+-232 TJm
+(or) 8.2988 Tj
+-233 TJm
+(writing) 28.782 Tj
+-233 TJm
+(in) 7.7509 Tj
+-233 TJm
+(the) 12.1743 Tj
+-232 TJm
+(compressed) 47.0334 Tj
+108 488.867 Td
+(\002le,) 15.2229 Tj
+-384 TJm
+(and) 14.386 Tj
+-357 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+158.511 488.867 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadOpen) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+245.755 488.867 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+263.698 488.867 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteOpen) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+356.92 488.867 Td
+/F122_0 9.9626 Tf
+(for) 11.6164 Tj
+-357 TJm
+(attempts) 33.7633 Tj
+-357 TJm
+(to) 7.7509 Tj
+-357 TJm
+(use) 13.2801 Tj
+-357 TJm
+(a) 4.4234 Tj
+-357 TJm
+(\002le) 12.7322 Tj
+-357 TJm
+(for) 11.6164 Tj
+-358 TJm
+(which) 24.3486 Tj
+-357 TJm
+(the) 12.1743 Tj
+-357 TJm
+(error) 19.3573 Tj
+108 476.912 Td
+(indicator) 35.417 Tj
+-260 TJm
+(\(viz,) 17.9825 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.603 476.912 Td
+/F124_0 9.9626 Tf
+(ferror\(f\)) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+220.401 476.912 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-260 TJm
+(is) 6.6451 Tj
+-260 TJm
+(set.) 13.5591 Tj
+-680 TJm
+(On) 12.1743 Tj
+-259 TJm
+(receipt) 27.1082 Tj
+-260 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+311.223 476.912 Td
+/F124_0 9.9626 Tf
+(BZ_IO_ERROR) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+376.976 476.912 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-260 TJm
+(the) 12.1743 Tj
+-260 TJm
+(caller) 22.1269 Tj
+-260 TJm
+(should) 26.5703 Tj
+-260 TJm
+(consult) 28.782 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+482.068 476.912 Td
+/F124_0 9.9626 Tf
+(errno) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+514.546 476.912 Td
+/F122_0 9.9626 Tf
+(and/or) 25.4544 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 464.956 Td
+/F124_0 9.9626 Tf
+(perror) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+146.356 464.956 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(acquire) 29.3199 Tj
+-250 TJm
+(operating-system) 68.6224 Tj
+-250 TJm
+(speci\002c) 30.4357 Tj
+-250 TJm
+(information) 47.0434 Tj
+-250 TJm
+(about) 22.1369 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(problem.) 35.696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 439.054 Td
+/F124_0 9.9626 Tf
+(BZ_UNEXPECTED_EOF) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 427.099 Td
+/F122_0 9.9626 Tf
+(Returned) 36.5229 Tj
+-250 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.467 427.099 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.733 427.099 Td
+/F122_0 9.9626 Tf
+(when) 21.579 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(\002nishes) 30.4457 Tj
+-250 TJm
+(before) 25.4445 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(logical) 27.1182 Tj
+-250 TJm
+(end) 14.386 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(stream) 26.5603 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(detected.) 35.686 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 401.196 Td
+/F124_0 9.9626 Tf
+(BZ_OUTBUFF_FULL) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+108 389.241 Td
+/F122_0 9.9626 Tf
+(Returned) 36.5229 Tj
+-258 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.632 389.241 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffCompress) 143.4614 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+305.668 389.241 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+322.627 389.241 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffDecompress) 155.4166 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+480.617 389.241 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-258 TJm
+(indicate) 31.5416 Tj
+-259 TJm
+(that) 14.9439 Tj
+108 377.285 Td
+(the) 12.1743 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(\002t) 8.3088 Tj
+-250 TJm
+(into) 15.5018 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-250 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vided.) 24.6275 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 328.585 Td
+/F116_0 20.6585 Tf
+(3.3.) 34.4584 Tj
+-278 TJm
+(Lo) 25.2447 Tj
+15 TJm
+(w-le) 40.1808 Tj
+15 TJm
+(vel) 28.7153 Tj
+-278 TJm
+(interface) 86.1046 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 297.964 Td
+/F116_0 17.2154 Tf
+(3.3.1.) 43.0729 Tj
+-278 TJm
+(BZ2_bzCompressInit) 171.2244 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.852 Td
+/F122_0 9.9626 Tf
+(11) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 12 15
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 445.031] cm
+0 0 468 274.969 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(typedef) 41.8429 Tj
+-426 TJm
+(struct) 35.8654 Tj
+-426 TJm
+({) 5.9776 Tj
+98.488 699.676 Td
+(char) 23.9102 Tj
+126.642 697.933 Td
+(*) 5.9776 Tj
+132.62 699.676 Td
+(next_in;) 47.8205 Tj
+98.488 687.721 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(avail_in;) 53.798 Tj
+98.488 675.766 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(total_in_lo32;) 83.6858 Tj
+98.488 663.811 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(total_in_hi32;) 83.6858 Tj
+98.488 639.9 Td
+(char) 23.9102 Tj
+126.642 638.157 Td
+(*) 5.9776 Tj
+132.62 639.9 Td
+(next_out;) 53.798 Tj
+98.488 627.945 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(avail_out;) 59.7756 Tj
+98.488 615.99 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(total_out_lo32;) 89.6634 Tj
+98.488 604.035 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(total_out_hi32;) 89.6634 Tj
+98.488 580.124 Td
+(void) 23.9102 Tj
+126.642 578.381 Td
+(*) 5.9776 Tj
+132.62 580.124 Td
+(state;) 35.8654 Tj
+98.488 556.214 Td
+(void) 23.9102 Tj
+126.642 554.471 Td
+(*) 5.9776 Tj
+132.62 556.214 Td
+(\() 5.9776 Tj
+138.597 554.471 Td
+(*) 5.9776 Tj
+144.575 556.214 Td
+(bzalloc\)\(void) 77.7083 Tj
+226.528 554.471 Td
+(*) 5.9776 Tj
+232.505 556.214 Td
+(,int,int\);) 59.7756 Tj
+98.488 544.259 Td
+(void) 23.9102 Tj
+-426 TJm
+(\() 5.9776 Tj
+132.62 542.515 Td
+(*) 5.9776 Tj
+138.597 544.259 Td
+(bzfree\)\(void) 71.7307 Tj
+214.572 542.515 Td
+(*) 5.9776 Tj
+220.55 544.259 Td
+(,void) 29.8878 Tj
+254.682 542.515 Td
+(*) 5.9776 Tj
+260.659 544.259 Td
+(\);) 11.9551 Tj
+98.488 532.304 Td
+(void) 23.9102 Tj
+126.642 530.56 Td
+(*) 5.9776 Tj
+132.62 532.304 Td
+(opaque;) 41.8429 Tj
+90 520.349 Td
+(}) 5.9776 Tj
+-426 TJm
+(bz_stream;) 59.7756 Tj
+90 496.438 Td
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzCompressInit) 107.5961 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bz_stream) 53.798 Tj
+292.281 494.695 Td
+(*) 5.9776 Tj
+298.259 496.438 Td
+(strm,) 29.8878 Tj
+196.099 484.483 Td
+(int) 17.9327 Tj
+-426 TJm
+(blockSize100k,) 83.6858 Tj
+196.099 472.528 Td
+(int) 17.9327 Tj
+-426 TJm
+(verbosity,) 59.7756 Tj
+196.099 460.573 Td
+(int) 17.9327 Tj
+-426 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 423.113 Td
+/F122_0 9.9626 Tf
+(Prepares) 34.3012 Tj
+-356 TJm
+(for) 11.6164 Tj
+-356 TJm
+(compression.) 52.8516 Tj
+-1256 TJm
+(The) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+209.41 423.113 Td
+/F124_0 9.9626 Tf
+(bz_stream) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+266.754 423.113 Td
+/F122_0 9.9626 Tf
+(structure) 34.8591 Tj
+-356 TJm
+(holds) 21.589 Tj
+-356 TJm
+(all) 9.9626 Tj
+-356 TJm
+(data) 16.5977 Tj
+-356 TJm
+(pertaining) 40.3983 Tj
+-356 TJm
+(to) 7.7509 Tj
+-356 TJm
+(the) 12.1743 Tj
+-356 TJm
+(compression) 50.3609 Tj
+-355 TJm
+(acti) 14.386 Tj
+25 TJm
+(vity) 15.5018 Tj
+65 TJm
+(.) 2.4907 Tj
+-1256 TJm
+(A) 7.193 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 411.158 Td
+/F124_0 9.9626 Tf
+(bz_stream) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+128.581 411.158 Td
+/F122_0 9.9626 Tf
+(structure) 34.8591 Tj
+-279 TJm
+(should) 26.5703 Tj
+-280 TJm
+(be) 9.4047 Tj
+-279 TJm
+(allocated) 35.965 Tj
+-279 TJm
+(and) 14.386 Tj
+-280 TJm
+(initialised) 39.3025 Tj
+-279 TJm
+(prior) 19.3673 Tj
+-279 TJm
+(to) 7.7509 Tj
+-279 TJm
+(the) 12.1743 Tj
+-280 TJm
+(call.) 16.8766 Tj
+-796 TJm
+(The) 15.4918 Tj
+-279 TJm
+(\002elds) 21.589 Tj
+-279 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+431.939 411.158 Td
+/F124_0 9.9626 Tf
+(bz_stream) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+488.52 411.158 Td
+/F122_0 9.9626 Tf
+(comprise) 36.5229 Tj
+-279 TJm
+(the) 12.1743 Tj
+72 399.203 Td
+(entirety) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(user) 16.5977 Tj
+20 TJm
+(-visible) 29.8878 Tj
+-250 TJm
+(data.) 19.0883 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+204.422 399.203 Td
+/F124_0 9.9626 Tf
+(state) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+236.8 399.203 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(pointer) 28.224 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(pri) 11.0684 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ate) 11.6164 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(structures) 38.7346 Tj
+-250 TJm
+(required) 33.1954 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(compression.) 52.8516 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 377.285 Td
+(Custom) 31.0036 Tj
+-372 TJm
+(memory) 33.2053 Tj
+-372 TJm
+(allocators) 38.7346 Tj
+-372 TJm
+(are) 12.1643 Tj
+-372 TJm
+(supported,) 41.7831 Tj
+-403 TJm
+(via) 12.1743 Tj
+-372 TJm
+(\002elds) 21.589 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+288.908 377.285 Td
+/F124_0 9.9626 Tf
+(bzalloc) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+330.751 377.285 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+337.253 377.285 Td
+/F124_0 9.9626 Tf
+(bzfree) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+373.118 377.285 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-403 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+397.714 377.285 Td
+/F124_0 9.9626 Tf
+(opaque) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+433.579 377.285 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1353 TJm
+(The) 15.4918 Tj
+-372 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+493.782 377.285 Td
+/F124_0 9.9626 Tf
+(opaque) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+533.355 377.285 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+72 365.33 Td
+(passed) 26.5603 Tj
+-306 TJm
+(to) 7.7509 Tj
+-306 TJm
+(as) 8.2988 Tj
+-306 TJm
+(the) 12.1743 Tj
+-306 TJm
+(\002rst) 15.5018 Tj
+-306 TJm
+(ar) 7.7409 Tj
+18 TJm
+(gument) 29.8878 Tj
+-306 TJm
+(to) 7.7509 Tj
+-306 TJm
+(all) 9.9626 Tj
+-306 TJm
+(calls) 18.2614 Tj
+-305 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+253.941 365.33 Td
+/F124_0 9.9626 Tf
+(bzalloc) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+298.832 365.33 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+316.266 365.33 Td
+/F124_0 9.9626 Tf
+(bzfree) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+352.132 365.33 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-320 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-306 TJm
+(is) 6.6451 Tj
+-306 TJm
+(otherwise) 38.7346 Tj
+-306 TJm
+(ignored) 30.4357 Tj
+-306 TJm
+(by) 9.9626 Tj
+-306 TJm
+(the) 12.1743 Tj
+-306 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+-955 TJm
+(The) 15.4918 Tj
+72 353.375 Td
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+89.431 353.375 Td
+/F124_0 9.9626 Tf
+(bzalloc) 41.8429 Tj
+-600 TJm
+(\() 5.9776 Tj
+-600 TJm
+(opaque,) 41.8429 Tj
+-600 TJm
+(n,) 11.9551 Tj
+-600 TJm
+(m) 5.9776 Tj
+-600 TJm
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+235.938 353.375 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-306 TJm
+(e) 4.4234 Tj
+15 TJm
+(xpected) 30.9837 Tj
+-305 TJm
+(to) 7.7509 Tj
+-306 TJm
+(return) 23.7907 Tj
+-306 TJm
+(a) 4.4234 Tj
+-305 TJm
+(pointer) 28.224 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+360.3 353.375 Td
+/F124_0 9.9626 Tf
+(p) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+369.322 353.375 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+380.118 353.375 Td
+/F124_0 9.9626 Tf
+(n) 5.9776 Tj
+392.073 351.631 Td
+(*) 5.9776 Tj
+404.029 353.375 Td
+(m) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+413.051 353.375 Td
+/F122_0 9.9626 Tf
+(bytes) 21.031 Tj
+-306 TJm
+(of) 8.2988 Tj
+-305 TJm
+(memory) 33.2053 Tj
+65 TJm
+(,) 2.4907 Tj
+-320 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+504.135 353.375 Td
+/F124_0 9.9626 Tf
+(bzfree) 35.8654 Tj
+72 341.42 Td
+(\() 5.9776 Tj
+-600 TJm
+(opaque,) 41.8429 Tj
+-600 TJm
+(p) 5.9776 Tj
+-600 TJm
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+152.199 341.42 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-250 TJm
+(free) 15.4819 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 319.502 Td
+(If) 6.6351 Tj
+-280 TJm
+(you) 14.9439 Tj
+-280 TJm
+(don') 18.2614 Tj
+18 TJm
+(t) 2.7696 Tj
+-280 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-279 TJm
+(to) 7.7509 Tj
+-280 TJm
+(use) 13.2801 Tj
+-280 TJm
+(a) 4.4234 Tj
+-280 TJm
+(custom) 28.782 Tj
+-280 TJm
+(memory) 33.2053 Tj
+-279 TJm
+(allocator) 34.8591 Tj
+40 TJm
+(,) 2.4907 Tj
+-288 TJm
+(set) 11.0684 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+299.9 319.502 Td
+/F124_0 9.9626 Tf
+(bzalloc) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+341.743 319.502 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+347.096 319.502 Td
+/F124_0 9.9626 Tf
+(bzfree) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+385.749 319.502 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+402.923 319.502 Td
+/F124_0 9.9626 Tf
+(opaque) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+441.576 319.502 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+452.115 319.502 Td
+/F124_0 9.9626 Tf
+(NULL) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+476.025 319.502 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-280 TJm
+(and) 14.386 Tj
+-280 TJm
+(the) 12.1743 Tj
+-280 TJm
+(library) 26.5603 Tj
+72 307.547 Td
+(will) 15.5018 Tj
+-250 TJm
+(then) 17.1556 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(standard) 33.7533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+176.318 307.547 Td
+/F124_0 9.9626 Tf
+(malloc) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+214.674 307.547 Td
+/F122_0 9.9626 Tf
+(/) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+219.934 307.547 Td
+/F124_0 9.9626 Tf
+(free) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+246.335 307.547 Td
+/F122_0 9.9626 Tf
+(routines.) 34.5901 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 285.629 Td
+(Before) 27.1082 Tj
+-362 TJm
+(calling) 27.1182 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+133.438 285.629 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+241.035 285.629 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-390 TJm
+(\002elds) 21.589 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+272.606 285.629 Td
+/F124_0 9.9626 Tf
+(bzalloc) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+314.449 285.629 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+320.825 285.629 Td
+/F124_0 9.9626 Tf
+(bzfree) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+360.296 285.629 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+378.289 285.629 Td
+/F124_0 9.9626 Tf
+(opaque) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+417.76 285.629 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-362 TJm
+(be) 9.4047 Tj
+-362 TJm
+(\002lled) 20.4831 Tj
+-362 TJm
+(appropriately) 53.1206 Tj
+65 TJm
+(,) 2.4907 Tj
+72 273.674 Td
+(as) 8.2988 Tj
+-322 TJm
+(just) 14.396 Tj
+-323 TJm
+(described.) 40.6673 Tj
+-1055 TJm
+(Upon) 22.1369 Tj
+-322 TJm
+(return,) 26.2813 Tj
+-341 TJm
+(the) 12.1743 Tj
+-322 TJm
+(internal) 30.4357 Tj
+-323 TJm
+(state) 18.2614 Tj
+-322 TJm
+(will) 15.5018 Tj
+-323 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-322 TJm
+(been) 18.8094 Tj
+-323 TJm
+(allocated) 35.965 Tj
+-322 TJm
+(and) 14.386 Tj
+-323 TJm
+(initialised,) 41.7931 Tj
+-340 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+459.801 273.674 Td
+/F124_0 9.9626 Tf
+(total_in_lo32) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 273.674 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 261.718 Td
+/F124_0 9.9626 Tf
+(total_in_hi32) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+149.709 261.718 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+155.006 261.718 Td
+/F124_0 9.9626 Tf
+(total_out_lo32) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+241.435 261.718 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+258.564 261.718 Td
+/F124_0 9.9626 Tf
+(total_out_hi32) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+344.994 261.718 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-275 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-276 TJm
+(been) 18.8094 Tj
+-275 TJm
+(set) 11.0684 Tj
+-275 TJm
+(to) 7.7509 Tj
+-276 TJm
+(zero.) 19.6363 Tj
+-772 TJm
+(These) 23.7907 Tj
+-275 TJm
+(four) 16.5977 Tj
+-275 TJm
+(\002elds) 21.589 Tj
+-276 TJm
+(are) 12.1643 Tj
+72 249.763 Td
+(used) 18.2614 Tj
+-340 TJm
+(by) 9.9626 Tj
+-339 TJm
+(the) 12.1743 Tj
+-340 TJm
+(library) 26.5603 Tj
+-339 TJm
+(to) 7.7509 Tj
+-340 TJm
+(inform) 27.1182 Tj
+-339 TJm
+(the) 12.1743 Tj
+-340 TJm
+(caller) 22.1269 Tj
+-339 TJm
+(of) 8.2988 Tj
+-340 TJm
+(the) 12.1743 Tj
+-339 TJm
+(total) 17.7135 Tj
+-340 TJm
+(amount) 29.8878 Tj
+-339 TJm
+(of) 8.2988 Tj
+-340 TJm
+(data) 16.5977 Tj
+-340 TJm
+(passed) 26.5603 Tj
+-339 TJm
+(into) 15.5018 Tj
+-340 TJm
+(and) 14.386 Tj
+-339 TJm
+(out) 12.7322 Tj
+-340 TJm
+(of) 8.2988 Tj
+-339 TJm
+(the) 12.1743 Tj
+-340 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-362 TJm
+(respecti) 30.9837 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ely) 12.1743 Tj
+65 TJm
+(.) 2.4907 Tj
+72 237.808 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-376 TJm
+(should) 26.5703 Tj
+-377 TJm
+(not) 12.7322 Tj
+-376 TJm
+(try) 11.0684 Tj
+-376 TJm
+(to) 7.7509 Tj
+-377 TJm
+(change) 28.2141 Tj
+-376 TJm
+(them.) 22.4159 Tj
+-1378 TJm
+(As) 11.0684 Tj
+-377 TJm
+(of) 8.2988 Tj
+-376 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-377 TJm
+(1.0,) 14.9439 Tj
+-408 TJm
+(64-bit) 23.8007 Tj
+-376 TJm
+(counts) 26.0123 Tj
+-376 TJm
+(are) 12.1643 Tj
+-377 TJm
+(maintained,) 46.7644 Tj
+-408 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-376 TJm
+(on) 9.9626 Tj
+-376 TJm
+(32-bit) 23.8007 Tj
+-377 TJm
+(platforms,) 40.6773 Tj
+72 225.853 Td
+(using) 21.589 Tj
+-371 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+113.148 225.853 Td
+/F124_0 9.9626 Tf
+(_hi32) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+146.729 225.853 Td
+/F122_0 9.9626 Tf
+(\002elds) 21.589 Tj
+-371 TJm
+(to) 7.7509 Tj
+-370 TJm
+(store) 19.3673 Tj
+-371 TJm
+(the) 12.1743 Tj
+-371 TJm
+(upper) 22.6848 Tj
+-370 TJm
+(32) 9.9626 Tj
+-371 TJm
+(bits) 14.396 Tj
+-370 TJm
+(of) 8.2988 Tj
+-371 TJm
+(the) 12.1743 Tj
+-371 TJm
+(count.) 24.6275 Tj
+-1344 TJm
+(So,) 13.0112 Tj
+-400 TJm
+(for) 11.6164 Tj
+-371 TJm
+(e) 4.4234 Tj
+15 TJm
+(xample,) 31.8205 Tj
+-401 TJm
+(the) 12.1743 Tj
+-371 TJm
+(total) 17.7135 Tj
+-370 TJm
+(amount) 29.8878 Tj
+-371 TJm
+(of) 8.2988 Tj
+-370 TJm
+(data) 16.5977 Tj
+-371 TJm
+(in) 7.7509 Tj
+-371 TJm
+(is) 6.6451 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 213.898 Td
+/F124_0 9.9626 Tf
+(\(total_in_hi32) 83.6858 Tj
+-600 TJm
+(<<) 11.9551 Tj
+-600 TJm
+(32\)) 17.9327 Tj
+-600 TJm
+(+) 5.9776 Tj
+-600 TJm
+(total_in_lo32) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+293.171 213.898 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 191.98 Td
+(P) 5.5392 Tj
+15 TJm
+(arameter) 34.8492 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+115.367 191.98 Td
+/F124_0 9.9626 Tf
+(blockSize100k) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+196.205 191.98 Td
+/F122_0 9.9626 Tf
+(speci\002es) 34.3112 Tj
+-314 TJm
+(the) 12.1743 Tj
+-314 TJm
+(block) 22.1369 Tj
+-314 TJm
+(size) 15.4918 Tj
+-314 TJm
+(to) 7.7509 Tj
+-314 TJm
+(be) 9.4047 Tj
+-314 TJm
+(used) 18.2614 Tj
+-314 TJm
+(for) 11.6164 Tj
+-314 TJm
+(compression.) 52.8516 Tj
+-1004 TJm
+(It) 6.0871 Tj
+-314 TJm
+(should) 26.5703 Tj
+-314 TJm
+(be) 9.4047 Tj
+-314 TJm
+(a) 4.4234 Tj
+-315 TJm
+(v) 4.9813 Tj
+25 TJm
+(al) 7.193 Tj
+1 TJm
+(u) 4.9813 Tj
+-1 TJm
+(e) 4.4234 Tj
+-314 TJm
+(between) 33.1954 Tj
+-314 TJm
+(1) 4.9813 Tj
+72 180.025 Td
+(and) 14.386 Tj
+-289 TJm
+(9) 4.9813 Tj
+-289 TJm
+(inclusi) 26.5703 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+-299 TJm
+(and) 14.386 Tj
+-289 TJm
+(the) 12.1743 Tj
+-289 TJm
+(actual) 23.7907 Tj
+-289 TJm
+(block) 22.1369 Tj
+-289 TJm
+(size) 15.4918 Tj
+-289 TJm
+(used) 18.2614 Tj
+-289 TJm
+(is) 6.6451 Tj
+-289 TJm
+(100000) 29.8878 Tj
+-289 TJm
+(x) 4.9813 Tj
+-289 TJm
+(this) 14.396 Tj
+-289 TJm
+(\002gure.) 25.7334 Tj
+-854 TJm
+(9) 4.9813 Tj
+-290 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-289 TJm
+(the) 12.1743 Tj
+-289 TJm
+(best) 16.0497 Tj
+-289 TJm
+(compression) 50.3609 Tj
+-289 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-289 TJm
+(tak) 12.1743 Tj
+10 TJm
+(es) 8.2988 Tj
+-289 TJm
+(most) 19.3773 Tj
+72 168.07 Td
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 146.152 Td
+(P) 5.5392 Tj
+15 TJm
+(arameter) 34.8492 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+115.095 146.152 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+171.75 146.152 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-287 TJm
+(be) 9.4047 Tj
+-286 TJm
+(set) 11.0684 Tj
+-287 TJm
+(to) 7.7509 Tj
+-287 TJm
+(a) 4.4234 Tj
+-287 TJm
+(number) 30.4357 Tj
+-286 TJm
+(between) 33.1954 Tj
+-287 TJm
+(0) 4.9813 Tj
+-287 TJm
+(and) 14.386 Tj
+-287 TJm
+(4) 4.9813 Tj
+-286 TJm
+(inclusi) 26.5703 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e.) 6.914 Tj
+-841 TJm
+(0) 4.9813 Tj
+-286 TJm
+(is) 6.6451 Tj
+-287 TJm
+(silent,) 24.0796 Tj
+-296 TJm
+(and) 14.386 Tj
+-287 TJm
+(greater) 27.6562 Tj
+-287 TJm
+(numbers) 34.3112 Tj
+-286 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+72 134.197 Td
+(increasingly) 48.6972 Tj
+-342 TJm
+(v) 4.9813 Tj
+15 TJm
+(erbose) 26.0024 Tj
+-342 TJm
+(monitoring/deb) 61.4394 Tj
+20 TJm
+(ugging) 27.6761 Tj
+-342 TJm
+(output.) 27.9551 Tj
+-1173 TJm
+(If) 6.6351 Tj
+-343 TJm
+(the) 12.1743 Tj
+-342 TJm
+(library) 26.5603 Tj
+-342 TJm
+(has) 13.2801 Tj
+-342 TJm
+(been) 18.8094 Tj
+-342 TJm
+(compiled) 37.0808 Tj
+-342 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+446.429 134.197 Td
+/F124_0 9.9626 Tf
+(-DBZ_NO_STDIO) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+524.138 134.197 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-342 TJm
+(no) 9.9626 Tj
+72 122.241 Td
+(such) 18.2614 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(appear) 26.5503 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(erbosity) 32.0995 Tj
+-250 TJm
+(setting.) 29.0609 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 100.324 Td
+(P) 5.5392 Tj
+15 TJm
+(arameter) 34.8492 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+116.619 100.324 Td
+/F124_0 9.9626 Tf
+(workFactor) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+180.775 100.324 Td
+/F122_0 9.9626 Tf
+(controls) 32.0995 Tj
+-440 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-439 TJm
+(the) 12.1743 Tj
+-440 TJm
+(compression) 50.3609 Tj
+-439 TJm
+(phase) 22.6848 Tj
+-440 TJm
+(beha) 18.8094 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-440 TJm
+(when) 21.579 Tj
+-439 TJm
+(presented) 38.1767 Tj
+-440 TJm
+(with) 17.7135 Tj
+-440 TJm
+(w) 7.193 Tj
+10 TJm
+(orst) 14.9439 Tj
+-439 TJm
+(case,) 19.6363 Tj
+-487 TJm
+(highly) 25.4644 Tj
+72 88.368 Td
+(repetiti) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+-433 TJm
+(input) 20.4831 Tj
+-396 TJm
+(data.) 19.0883 Tj
+-1496 TJm
+(If) 6.6351 Tj
+-396 TJm
+(compression) 50.3609 Tj
+-396 TJm
+(runs) 17.1556 Tj
+-397 TJm
+(i) 2.7696 Tj
+1 TJm
+(nto) 12.7322 Tj
+-397 TJm
+(dif) 11.0684 Tj
+25 TJm
+(\002culties) 31.5516 Tj
+-396 TJm
+(caused) 27.1082 Tj
+-396 TJm
+(by) 9.9626 Tj
+-396 TJm
+(repetiti) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-396 TJm
+(data,) 19.0883 Tj
+-432 TJm
+(the) 12.1743 Tj
+-397 TJm
+(library) 26.5603 Tj
+-396 TJm
+(switches) 34.3112 Tj
+-396 TJm
+(from) 19.3673 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.852 Td
+(12) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 13 16
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(the) 12.1743 Tj
+-255 TJm
+(standard) 33.7533 Tj
+-254 TJm
+(sorting) 27.6761 Tj
+-255 TJm
+(algorithm) 38.7446 Tj
+-254 TJm
+(to) 7.7509 Tj
+-255 TJm
+(a) 4.4234 Tj
+-255 TJm
+(f) 3.3175 Tj
+10 TJm
+(allback) 28.772 Tj
+-254 TJm
+(algorithm.) 41.2352 Tj
+-648 TJm
+(The) 15.4918 Tj
+-255 TJm
+(f) 3.3175 Tj
+10 TJm
+(allback) 28.772 Tj
+-254 TJm
+(is) 6.6451 Tj
+-255 TJm
+(slo) 11.6264 Tj
+25 TJm
+(wer) 14.9339 Tj
+-255 TJm
+(than) 17.1556 Tj
+-254 TJm
+(the) 12.1743 Tj
+-255 TJm
+(standard) 33.7533 Tj
+-254 TJm
+(algorithm) 38.7446 Tj
+-255 TJm
+(by) 9.9626 Tj
+-255 TJm
+(perhaps) 30.9837 Tj
+72 698.082 Td
+(a) 4.4234 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(actor) 19.9152 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(three,) 22.4059 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(al) 7.193 Tj
+10 TJm
+(w) 7.193 Tj
+10 TJm
+(ays) 13.2801 Tj
+-250 TJm
+(beha) 18.8094 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-250 TJm
+(reasonably) 43.158 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(no) 9.9626 Tj
+-250 TJm
+(matter) 25.4544 Tj
+-250 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(bad) 14.386 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(input.) 22.9738 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 676.268 Td
+(Lo) 11.0684 Tj
+25 TJm
+(wer) 14.9339 Tj
+-240 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-239 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+138.421 676.268 Td
+/F124_0 9.9626 Tf
+(workFactor) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.585 676.268 Td
+/F122_0 9.9626 Tf
+(reduce) 26.5503 Tj
+-240 TJm
+(the) 12.1743 Tj
+-239 TJm
+(amount) 29.8878 Tj
+-240 TJm
+(of) 8.2988 Tj
+-240 TJm
+(ef) 7.7409 Tj
+25 TJm
+(fort) 14.386 Tj
+-239 TJm
+(the) 12.1743 Tj
+-240 TJm
+(standard) 33.7533 Tj
+-240 TJm
+(algorithm) 38.7446 Tj
+-240 TJm
+(wi) 9.9626 Tj
+1 TJm
+(ll) 5.5392 Tj
+-240 TJm
+(e) 4.4234 Tj
+15 TJm
+(xpend) 24.3486 Tj
+-240 TJm
+(before) 25.4445 Tj
+-240 TJm
+(resorting) 35.417 Tj
+-239 TJm
+(to) 7.7509 Tj
+-240 TJm
+(the) 12.1743 Tj
+72 664.313 Td
+(f) 3.3175 Tj
+10 TJm
+(allback.) 31.2626 Tj
+-618 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-248 TJm
+(should) 26.5703 Tj
+-247 TJm
+(set) 11.0684 Tj
+-248 TJm
+(this) 14.396 Tj
+-247 TJm
+(parameter) 39.8305 Tj
+-248 TJm
+(carefully;) 38.1767 Tj
+-248 TJm
+(too) 12.7322 Tj
+-248 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(,) 2.4907 Tj
+-248 TJm
+(and) 14.386 Tj
+-247 TJm
+(man) 17.1556 Tj
+15 TJm
+(y) 4.9813 Tj
+-248 TJm
+(inputs) 24.3586 Tj
+-248 TJm
+(will) 15.5018 Tj
+-247 TJm
+(be) 9.4047 Tj
+-248 TJm
+(handled) 31.5416 Tj
+-247 TJm
+(by) 9.9626 Tj
+-248 TJm
+(the) 12.1743 Tj
+-247 TJm
+(f) 3.3175 Tj
+10 TJm
+(allback) 28.772 Tj
+-248 TJm
+(algorithm) 38.7446 Tj
+72 652.358 Td
+(and) 14.386 Tj
+-308 TJm
+(so) 8.8568 Tj
+-308 TJm
+(compress) 37.6287 Tj
+-308 TJm
+(rather) 23.2328 Tj
+-309 TJm
+(slo) 11.6264 Tj
+25 TJm
+(wly) 14.9439 Tj
+65 TJm
+(,) 2.4907 Tj
+-322 TJm
+(too) 12.7322 Tj
+-309 TJm
+(high,) 20.2042 Tj
+-322 TJm
+(and) 14.386 Tj
+-308 TJm
+(your) 18.2614 Tj
+-309 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(erage-to-w) 43.148 Tj
+10 TJm
+(orst) 14.9439 Tj
+-308 TJm
+(case) 17.1456 Tj
+-308 TJm
+(compression) 50.3609 Tj
+-308 TJm
+(times) 21.589 Tj
+-308 TJm
+(can) 13.8281 Tj
+-308 TJm
+(become) 30.9837 Tj
+-309 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-308 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge.) 11.8953 Tj
+72 640.402 Td
+(The) 15.4918 Tj
+-250 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault) 14.9439 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(30) 9.9626 Tj
+-250 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-250 TJm
+(reasonable) 42.6001 Tj
+-250 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+-250 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(wide) 19.3673 Tj
+-250 TJm
+(range) 22.1269 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(circumstances.) 58.9288 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 618.588 Td
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-250 TJm
+(range) 22.1269 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(0) 4.9813 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(250) 14.9439 Tj
+-250 TJm
+(inclusi) 26.5703 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e.) 6.914 Tj
+-620 TJm
+(0) 4.9813 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(special) 27.6661 Tj
+-250 TJm
+(case,) 19.6363 Tj
+-250 TJm
+(equi) 17.1556 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(alent) 19.3673 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(using) 21.589 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault) 14.9439 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(30.) 12.4533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 596.774 Td
+(Note) 19.3673 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(generated) 38.7246 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(same) 20.4731 Tj
+-250 TJm
+(re) 7.7409 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(ardless) 27.6661 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(whether) 32.0895 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(allback) 28.772 Tj
+-250 TJm
+(algorithm) 38.7446 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(used.) 20.7521 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 574.96 Td
+(Be) 11.0684 Tj
+-303 TJm
+(a) 4.4234 Tj
+15 TJm
+(w) 7.193 Tj
+10 TJm
+(are) 12.1643 Tj
+-303 TJm
+(also) 16.0497 Tj
+-303 TJm
+(that) 14.9439 Tj
+-303 TJm
+(this) 14.396 Tj
+-304 TJm
+(parameter) 39.8305 Tj
+-303 TJm
+(may) 17.1556 Tj
+-303 TJm
+(disappear) 38.1767 Tj
+-303 TJm
+(entirely) 30.4357 Tj
+-303 TJm
+(in) 7.7509 Tj
+-303 TJm
+(future) 23.7907 Tj
+-303 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-303 TJm
+(of) 8.2988 Tj
+-303 TJm
+(the) 12.1743 Tj
+-304 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+-938 TJm
+(In) 8.2988 Tj
+-303 TJm
+(principle) 35.417 Tj
+-303 TJm
+(it) 5.5392 Tj
+-304 TJm
+(should) 26.5703 Tj
+-303 TJm
+(be) 9.4047 Tj
+72 563.005 Td
+(possible) 32.6574 Tj
+-270 TJm
+(to) 7.7509 Tj
+-270 TJm
+(de) 9.4047 Tj
+25 TJm
+(vise) 16.0497 Tj
+-270 TJm
+(a) 4.4234 Tj
+-270 TJm
+(good) 19.9252 Tj
+-270 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-270 TJm
+(to) 7.7509 Tj
+-271 TJm
+(automat) 32.0995 Tj
+1 TJm
+(ically) 22.1369 Tj
+-271 TJm
+(choose) 27.6661 Tj
+-270 TJm
+(which) 24.3486 Tj
+-270 TJm
+(algorithm) 38.7446 Tj
+-270 TJm
+(to) 7.7509 Tj
+-270 TJm
+(use.) 15.7708 Tj
+-740 TJm
+(Such) 19.9252 Tj
+-270 TJm
+(a) 4.4234 Tj
+-270 TJm
+(mechanism) 45.3796 Tj
+-271 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-270 TJm
+(render) 25.4445 Tj
+-270 TJm
+(the) 12.1743 Tj
+72 551.049 Td
+(parameter) 39.8305 Tj
+-250 TJm
+(obsolete.) 35.696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 529.235 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 384.677] cm
+0 0 468 143.462 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 519.771 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+98.488 507.816 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(library) 41.8429 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(mis-compiled) 71.7307 Tj
+90 495.86 Td
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 483.905 Td
+(if) 11.9551 Tj
+-426 TJm
+(strm) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 471.95 Td
+(or) 11.9551 Tj
+-426 TJm
+(blockSize) 53.798 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(1) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(blockSize) 53.798 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(9) 5.9776 Tj
+98.488 459.995 Td
+(or) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(4) 5.9776 Tj
+98.488 448.04 Td
+(or) 11.9551 Tj
+-426 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(250) 17.9327 Tj
+90 436.085 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 424.129 Td
+(if) 11.9551 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(enough) 35.8654 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(available) 53.798 Tj
+90 412.174 Td
+(BZ_OK) 29.8878 Tj
+98.488 400.219 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 362.863 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 313.947] cm
+0 0 468 47.821 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 353.399 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+98.488 341.444 Td
+(if) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(returned) 47.8205 Tj
+98.488 329.488 Td
+(no) 11.9551 Tj
+-426 TJm
+(specific) 47.8205 Tj
+-426 TJm
+(action) 35.8654 Tj
+-426 TJm
+(needed) 35.8654 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(case) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(error) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 283.429 Td
+/F116_0 17.2154 Tf
+(3.3.2.) 43.0729 Tj
+-278 TJm
+(BZ2_bzCompress) 145.4013 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 254.959] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 270.501 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzCompress) 83.6858 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bz_stream) 53.798 Tj
+268.371 268.757 Td
+(*) 5.9776 Tj
+274.348 270.501 Td
+(strm,) 29.8878 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(action) 35.8654 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 233.145 Td
+/F122_0 9.9626 Tf
+(Pro) 13.8381 Tj
+15 TJm
+(vides) 21.031 Tj
+-222 TJm
+(more) 20.4731 Tj
+-221 TJm
+(input) 20.4831 Tj
+-222 TJm
+(and/or) 25.4544 Tj
+-222 TJm
+(output) 25.4644 Tj
+-222 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-221 TJm
+(space) 22.1269 Tj
+-222 TJm
+(for) 11.6164 Tj
+-222 TJm
+(the) 12.1743 Tj
+-221 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+-601 TJm
+(The) 15.4918 Tj
+-222 TJm
+(caller) 22.1269 Tj
+-222 TJm
+(maintains) 38.7446 Tj
+-222 TJm
+(input) 20.4831 Tj
+-221 TJm
+(and) 14.386 Tj
+-222 TJm
+(output) 25.4644 Tj
+-222 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fers,) 17.4246 Tj
+-227 TJm
+(and) 14.386 Tj
+-222 TJm
+(calls) 18.2614 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 221.19 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+158.177 221.19 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(transfer) 30.4258 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(between) 33.1954 Tj
+-250 TJm
+(them.) 22.4159 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 199.375 Td
+(Before) 27.1082 Tj
+-212 TJm
+(each) 18.2515 Tj
+-213 TJm
+(call) 14.386 Tj
+-212 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+147.961 199.375 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+231.647 199.375 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+236.329 199.375 Td
+/F124_0 9.9626 Tf
+(next_in) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+280.288 199.375 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-212 TJm
+(point) 20.4831 Tj
+-213 TJm
+(at) 7.193 Tj
+-212 TJm
+(the) 12.1743 Tj
+-213 TJm
+(data) 16.5977 Tj
+-212 TJm
+(to) 7.7509 Tj
+-213 TJm
+(be) 9.4047 Tj
+-212 TJm
+(compressed,) 49.5241 Tj
+-220 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+463.493 199.375 Td
+/F124_0 9.9626 Tf
+(avail_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+513.43 199.375 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+72 187.42 Td
+(indicate) 31.5416 Tj
+-246 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-247 TJm
+(m) 7.7509 Tj
+1 TJm
+(an) 9.4047 Tj
+14 TJm
+(y) 4.9813 Tj
+-246 TJm
+(bytes) 21.031 Tj
+-246 TJm
+(the) 12.1743 Tj
+-246 TJm
+(library) 26.5603 Tj
+-247 TJm
+(may) 17.1556 Tj
+-246 TJm
+(read.) 19.6363 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+259.242 187.42 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+345.382 187.42 Td
+/F122_0 9.9626 Tf
+(updates) 30.4357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+378.271 187.42 Td
+/F124_0 9.9626 Tf
+(next_in) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+420.114 187.42 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+425.066 187.42 Td
+/F124_0 9.9626 Tf
+(avail_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+475.34 187.42 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+492.179 187.42 Td
+/F124_0 9.9626 Tf
+(total_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 175.465 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(re\003ect) 24.8965 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(number) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(bytes) 21.031 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(has) 13.2801 Tj
+-250 TJm
+(read.) 19.6363 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 153.651 Td
+(Similarly) 37.0908 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+113.611 153.651 Td
+/F124_0 9.9626 Tf
+(next_out) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+164.072 153.651 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-265 TJm
+(point) 20.4831 Tj
+-265 TJm
+(to) 7.7509 Tj
+-265 TJm
+(a) 4.4234 Tj
+-265 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-265 TJm
+(in) 7.7509 Tj
+-265 TJm
+(which) 24.3486 Tj
+-265 TJm
+(the) 12.1743 Tj
+-265 TJm
+(compressed) 47.0334 Tj
+-265 TJm
+(data) 16.5977 Tj
+-265 TJm
+(is) 6.6451 Tj
+-265 TJm
+(to) 7.7509 Tj
+-265 TJm
+(be) 9.4047 Tj
+-265 TJm
+(placed,) 28.493 Tj
+-269 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+464.742 153.651 Td
+/F124_0 9.9626 Tf
+(avail_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+521.181 153.651 Td
+/F122_0 9.9626 Tf
+(indi-) 18.8194 Tj
+72 141.696 Td
+(cating) 24.3486 Tj
+-209 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-209 TJm
+(much) 22.1369 Tj
+-209 TJm
+(output) 25.4644 Tj
+-209 TJm
+(space) 22.1269 Tj
+-209 TJm
+(is) 6.6451 Tj
+-210 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+243.087 141.696 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+328.856 141.696 Td
+/F122_0 9.9626 Tf
+(updates) 30.4357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+361.375 141.696 Td
+/F124_0 9.9626 Tf
+(next_out) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+409.196 141.696 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+413.851 141.696 Td
+/F124_0 9.9626 Tf
+(avail_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+469.732 141.696 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+486.202 141.696 Td
+/F124_0 9.9626 Tf
+(total_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 129.74 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(re\003ect) 24.8965 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(number) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(bytes) 21.031 Tj
+-250 TJm
+(output.) 27.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 107.926 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-272 TJm
+(may) 17.1556 Tj
+-272 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vide) 17.1556 Tj
+-272 TJm
+(and) 14.386 Tj
+-272 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-272 TJm
+(as) 8.2988 Tj
+-272 TJm
+(little) 18.2714 Tj
+-272 TJm
+(or) 8.2988 Tj
+-272 TJm
+(as) 8.2988 Tj
+-272 TJm
+(much) 22.1369 Tj
+-271 TJm
+(data) 16.5977 Tj
+-272 TJm
+(as) 8.2988 Tj
+-272 TJm
+(you) 14.9439 Tj
+-272 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-272 TJm
+(on) 9.9626 Tj
+-272 TJm
+(each) 18.2515 Tj
+-272 TJm
+(call) 14.386 Tj
+-272 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+399.123 107.926 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+482.809 107.926 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-752 TJm
+(In) 8.2988 Tj
+-272 TJm
+(the) 12.1743 Tj
+-272 TJm
+(limit,) 21.32 Tj
+72 95.971 Td
+(it) 5.5392 Tj
+-266 TJm
+(is) 6.6451 Tj
+-265 TJm
+(acceptable) 42.0422 Tj
+-266 TJm
+(to) 7.7509 Tj
+-266 TJm
+(supply) 26.5703 Tj
+-266 TJm
+(and) 14.386 Tj
+-265 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-266 TJm
+(data) 16.5977 Tj
+-266 TJm
+(one) 14.386 Tj
+-265 TJm
+(byte) 17.1556 Tj
+-266 TJm
+(at) 7.193 Tj
+-266 TJm
+(a) 4.4234 Tj
+-266 TJm
+(time,) 20.2042 Tj
+-269 TJm
+(although) 34.8691 Tj
+-266 TJm
+(this) 14.396 Tj
+-266 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-265 TJm
+(be) 9.4047 Tj
+-266 TJm
+(terribly) 29.3299 Tj
+-266 TJm
+(inef) 15.4918 Tj
+25 TJm
+(\002cient.) 27.3972 Tj
+-714 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-266 TJm
+(should) 26.5703 Tj
+72 84.016 Td
+(al) 7.193 Tj
+10 TJm
+(w) 7.193 Tj
+10 TJm
+(ays) 13.2801 Tj
+-250 TJm
+(ensure) 26.0024 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(least) 18.2614 Tj
+-250 TJm
+(one) 14.386 Tj
+-250 TJm
+(byte) 17.1556 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(space) 22.1269 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable) 26.5603 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(each) 18.2515 Tj
+-250 TJm
+(call.) 16.8766 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(13) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 14 17
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(A) 7.193 Tj
+-250 TJm
+(second) 27.6661 Tj
+-250 TJm
+(purpose) 31.5416 Tj
+-250 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+156.662 710.037 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+242.839 710.037 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(request) 28.772 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(change) 28.2141 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(mode) 22.1369 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 688.12 Td
+(Conceptually) 53.1305 Tj
+65 TJm
+(,) 2.4907 Tj
+-217 TJm
+(a) 4.4234 Tj
+-210 TJm
+(compressed) 47.0334 Tj
+-209 TJm
+(stream) 26.5603 Tj
+-209 TJm
+(can) 13.8281 Tj
+-209 TJm
+(be) 9.4047 Tj
+-210 TJm
+(in) 7.7509 Tj
+-209 TJm
+(one) 14.386 Tj
+-209 TJm
+(of) 8.2988 Tj
+-209 TJm
+(four) 16.5977 Tj
+-210 TJm
+(states:) 24.9065 Tj
+-289 TJm
+(IDLE,) 25.1755 Tj
+-209 TJm
+(R) 6.6451 Tj
+40 TJm
+(UNNING,) 41.7732 Tj
+-210 TJm
+(FLUSHING) 49.2551 Tj
+-209 TJm
+(and) 14.386 Tj
+-209 TJm
+(FINISHING.) 52.2937 Tj
+-419 TJm
+(Be-) 14.386 Tj
+72 676.164 Td
+(fore) 16.0398 Tj
+-264 TJm
+(initialisation) 49.823 Tj
+-263 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+146.434 676.164 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+254.031 676.164 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-264 TJm
+(and) 14.386 Tj
+-263 TJm
+(after) 18.2515 Tj
+-264 TJm
+(termination) 45.9375 Tj
+-264 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+349.75 676.164 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressEnd) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+451.369 676.164 Td
+/F122_0 9.9626 Tf
+(\),) 5.8082 Tj
+-267 TJm
+(a) 4.4234 Tj
+-264 TJm
+(stream) 26.5603 Tj
+-264 TJm
+(is) 6.6451 Tj
+-263 TJm
+(re) 7.7409 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(arded) 22.1269 Tj
+72 664.209 Td
+(as) 8.2988 Tj
+-250 TJm
+(IDLE.) 25.1755 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 642.291 Td
+(Upon) 22.1369 Tj
+-389 TJm
+(initialisation) 49.823 Tj
+-390 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+155.036 642.291 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+262.632 642.291 Td
+/F122_0 9.9626 Tf
+(\),) 5.8082 Tj
+-424 TJm
+(the) 12.1743 Tj
+-390 TJm
+(stream) 26.5603 Tj
+-389 TJm
+(is) 6.6451 Tj
+-390 TJm
+(placed) 26.0024 Tj
+-389 TJm
+(in) 7.7509 Tj
+-389 TJm
+(the) 12.1743 Tj
+-390 TJm
+(R) 6.6451 Tj
+40 TJm
+(UNNING) 39.2825 Tj
+-389 TJm
+(state.) 20.7521 Tj
+-1457 TJm
+(Subsequent) 45.9375 Tj
+-389 TJm
+(calls) 18.2614 Tj
+72 630.336 Td
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+83.818 630.336 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+171.571 630.336 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-408 TJm
+(pass) 17.1556 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+223.431 630.336 Td
+/F124_0 9.9626 Tf
+(BZ_RUN) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+263.362 630.336 Td
+/F122_0 9.9626 Tf
+(as) 8.2988 Tj
+-408 TJm
+(the) 12.1743 Tj
+-409 TJm
+(request) 28.772 Tj
+1 TJm
+(ed) 9.4047 Tj
+-409 TJm
+(action;) 27.1182 Tj
+-487 TJm
+(other) 20.4731 Tj
+-408 TJm
+(actions) 28.224 Tj
+-409 TJm
+(are) 12.1643 Tj
+-408 TJm
+(ille) 12.7322 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(al) 7.193 Tj
+-408 TJm
+(and) 14.386 Tj
+-408 TJm
+(will) 15.5018 Tj
+-408 TJm
+(result) 22.1369 Tj
+-409 TJm
+(in) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 618.381 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+173.619 618.381 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 596.463 Td
+(At) 9.9626 Tj
+-279 TJm
+(some) 21.031 Tj
+-279 TJm
+(point,) 22.9738 Tj
+-286 TJm
+(the) 12.1743 Tj
+-279 TJm
+(calling) 27.1182 Tj
+-279 TJm
+(program) 33.7533 Tj
+-279 TJm
+(will) 15.5018 Tj
+-279 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-278 TJm
+(pro) 13.2801 Tj
+14 TJm
+(vi) 7.7509 Tj
+1 TJm
+(ded) 14.386 Tj
+-279 TJm
+(all) 9.9626 Tj
+-279 TJm
+(the) 12.1743 Tj
+-279 TJm
+(input) 20.4831 Tj
+-279 TJm
+(data) 16.5977 Tj
+-279 TJm
+(it) 5.5392 Tj
+-279 TJm
+(w) 7.193 Tj
+10 TJm
+(ants) 16.0497 Tj
+-279 TJm
+(to.) 10.2416 Tj
+-793 TJm
+(It) 6.0871 Tj
+-279 TJm
+(will) 15.5018 Tj
+-279 TJm
+(then) 17.1556 Tj
+-279 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-279 TJm
+(to) 7.7509 Tj
+-279 TJm
+(\002nish) 22.1469 Tj
+-279 TJm
+(up) 9.9626 Tj
+-279 TJm
+(--) 6.6351 Tj
+72 584.508 Td
+(in) 7.7509 Tj
+-287 TJm
+(ef) 7.7409 Tj
+25 TJm
+(fect,) 17.4246 Tj
+-297 TJm
+(asking) 26.0123 Tj
+-288 TJm
+(the) 12.1743 Tj
+-287 TJm
+(library) 26.5603 Tj
+-287 TJm
+(to) 7.7509 Tj
+-288 TJm
+(process) 29.8778 Tj
+-287 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-288 TJm
+(data) 16.5977 Tj
+-287 TJm
+(it) 5.5392 Tj
+-287 TJm
+(might) 23.2527 Tj
+-288 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-287 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fered) 20.4632 Tj
+-288 TJm
+(internally) 38.1866 Tj
+65 TJm
+(.) 2.4907 Tj
+-844 TJm
+(In) 8.2988 Tj
+-288 TJm
+(this) 14.396 Tj
+-287 TJm
+(state,) 20.7521 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+456.314 584.508 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 572.553 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-258 TJm
+(no) 9.9626 Tj
+-257 TJm
+(longer) 25.4544 Tj
+-258 TJm
+(attempt) 29.8878 Tj
+-258 TJm
+(to) 7.7509 Tj
+-258 TJm
+(read) 17.1456 Tj
+-257 TJm
+(data) 16.5977 Tj
+-258 TJm
+(from) 19.3673 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+234.208 572.553 Td
+/F124_0 9.9626 Tf
+(next_in) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+276.051 572.553 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-260 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-257 TJm
+(it) 5.5392 Tj
+-258 TJm
+(will) 15.5018 Tj
+-258 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-257 TJm
+(to) 7.7509 Tj
+-258 TJm
+(write) 20.4731 Tj
+-258 TJm
+(data) 16.5977 Tj
+-258 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+407.082 572.553 Td
+/F124_0 9.9626 Tf
+(next_out) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+454.902 572.553 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-666 TJm
+(Because) 33.1954 Tj
+-258 TJm
+(the) 12.1743 Tj
+-258 TJm
+(output) 25.4644 Tj
+72 560.598 Td
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-228 TJm
+(supplied) 33.7633 Tj
+-228 TJm
+(by) 9.9626 Tj
+-229 TJm
+(the) 12.1743 Tj
+-228 TJm
+(user) 16.5977 Tj
+-228 TJm
+(can) 13.8281 Tj
+-228 TJm
+(be) 9.4047 Tj
+-228 TJm
+(arbitrarily) 39.8404 Tj
+-229 TJm
+(sma) 16.0497 Tj
+1 TJm
+(ll,) 8.0299 Tj
+-233 TJm
+(the) 12.1743 Tj
+-228 TJm
+(\002nishing-up) 48.1592 Tj
+-228 TJm
+(operation) 37.6287 Tj
+-229 TJm
+(cannot) 26.5603 Tj
+-228 TJm
+(necessarily) 44.2638 Tj
+-228 TJm
+(be) 9.4047 Tj
+-228 TJm
+(done) 19.3673 Tj
+-228 TJm
+(with) 17.7135 Tj
+-229 TJm
+(a) 4.4234 Tj
+-228 TJm
+(single) 23.8007 Tj
+72 548.642 Td
+(call) 14.386 Tj
+-250 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+99.666 548.642 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+183.352 548.642 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 526.725 Td
+(Instead,) 31.2626 Tj
+-346 TJm
+(the) 12.1743 Tj
+-327 TJm
+(calling) 27.1182 Tj
+-326 TJm
+(program) 33.7533 Tj
+-327 TJm
+(passes) 25.4544 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+218.231 526.725 Td
+/F124_0 9.9626 Tf
+(BZ_FINISH) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+275.284 526.725 Td
+/F122_0 9.9626 Tf
+(as) 8.2988 Tj
+-327 TJm
+(an) 9.4047 Tj
+-327 TJm
+(acti) 14.386 Tj
+1 TJm
+(on) 9.9626 Tj
+-327 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+338.109 526.725 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+421.795 526.725 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1081 TJm
+(This) 17.7135 Tj
+-326 TJm
+(changes) 32.0895 Tj
+-327 TJm
+(the) 12.1743 Tj
+-327 TJm
+(stream') 29.8778 Tj
+55 TJm
+(s) 3.8755 Tj
+72 514.77 Td
+(state) 18.2614 Tj
+-291 TJm
+(to) 7.7509 Tj
+-290 TJm
+(FINISHING.) 52.2937 Tj
+-581 TJm
+(An) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-291 TJm
+(remaining) 40.3983 Tj
+-290 TJm
+(input) 20.4831 Tj
+-291 TJm
+(\(ie,) 13.0012 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+264.452 514.77 Td
+/F124_0 9.9626 Tf
+(next_in[0) 53.798 Tj
+-600 TJm
+(..) 11.9551 Tj
+-1200 TJm
+(avail_in-1]) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+413.892 514.77 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-291 TJm
+(is) 6.6451 Tj
+-290 TJm
+(compressed) 47.0334 Tj
+-291 TJm
+(and) 14.386 Tj
+-290 TJm
+(transferred) 43.148 Tj
+72 502.814 Td
+(to) 7.7509 Tj
+-421 TJm
+(the) 12.1743 Tj
+-421 TJm
+(output) 25.4644 Tj
+-421 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+55 TJm
+(.) 2.4907 Tj
+-1646 TJm
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-421 TJm
+(do) 9.9626 Tj
+-422 TJm
+(this) 14.396 Tj
+1 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+222.339 502.814 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+310.22 502.814 Td
+/F122_0 9.9626 Tf
+(must) 19.3773 Tj
+-421 TJm
+(be) 9.4047 Tj
+-421 TJm
+(called) 23.7907 Tj
+-421 TJm
+(repeatedly) 41.4942 Tj
+-421 TJm
+(until) 18.2714 Tj
+-421 TJm
+(all) 9.9626 Tj
+-421 TJm
+(the) 12.1743 Tj
+-421 TJm
+(output) 25.4644 Tj
+-421 TJm
+(has) 13.2801 Tj
+-421 TJm
+(been) 18.8094 Tj
+72 490.859 Td
+(consumed.) 42.889 Tj
+-1397 TJm
+(At) 9.9626 Tj
+-379 TJm
+(that) 14.9439 Tj
+-380 TJm
+(point,) 22.9738 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.346 490.859 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+275.813 490.859 Td
+/F122_0 9.9626 Tf
+(returns) 27.6661 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+307.259 490.859 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+384.968 490.859 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-379 TJm
+(and) 14.386 Tj
+-380 TJm
+(the) 12.1743 Tj
+-379 TJm
+(stream') 29.8778 Tj
+55 TJm
+(s) 3.8755 Tj
+-380 TJm
+(state) 18.2614 Tj
+-379 TJm
+(is) 6.6451 Tj
+-380 TJm
+(set) 11.0684 Tj
+-379 TJm
+(back) 18.8094 Tj
+-379 TJm
+(to) 7.7509 Tj
+72 478.904 Td
+(IDLE.) 25.1755 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+99.666 478.904 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressEnd) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.776 478.904 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-250 TJm
+(then) 17.1556 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(called.) 26.2813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 456.986 Td
+(Just) 15.5018 Tj
+-380 TJm
+(to) 7.7509 Tj
+-380 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-379 TJm
+(sure) 16.5977 Tj
+-380 TJm
+(the) 12.1743 Tj
+-380 TJm
+(calling) 27.1182 Tj
+-380 TJm
+(program) 33.7533 Tj
+-379 TJm
+(does) 18.2614 Tj
+-380 TJm
+(not) 12.7322 Tj
+-380 TJm
+(cheat,) 23.5117 Tj
+-412 TJm
+(the) 12.1743 Tj
+-380 TJm
+(library) 26.5603 Tj
+-380 TJm
+(mak) 17.1556 Tj
+10 TJm
+(es) 8.2988 Tj
+-379 TJm
+(a) 4.4234 Tj
+-380 TJm
+(note) 17.1556 Tj
+-380 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+415.708 456.986 Td
+/F124_0 9.9626 Tf
+(avail_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+467.312 456.986 Td
+/F122_0 9.9626 Tf
+(at) 7.193 Tj
+-380 TJm
+(the) 12.1743 Tj
+-380 TJm
+(time) 17.7135 Tj
+-379 TJm
+(of) 8.2988 Tj
+-380 TJm
+(the) 12.1743 Tj
+72 445.031 Td
+(\002rst) 15.5018 Tj
+-286 TJm
+(call) 14.386 Tj
+-286 TJm
+(t) 2.7696 Tj
+1 TJm
+(o) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+118.179 445.031 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+204.713 445.031 Td
+/F122_0 9.9626 Tf
+(which) 24.3486 Tj
+-286 TJm
+(has) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+248.035 445.031 Td
+/F124_0 9.9626 Tf
+(BZ_FINISH) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+304.68 445.031 Td
+/F122_0 9.9626 Tf
+(as) 8.2988 Tj
+-286 TJm
+(an) 9.4047 Tj
+-286 TJm
+(action) 24.3486 Tj
+-285 TJm
+(\(ie,) 13.0012 Tj
+-295 TJm
+(at) 7.193 Tj
+-286 TJm
+(the) 12.1743 Tj
+-286 TJm
+(time) 17.7135 Tj
+-285 TJm
+(the) 12.1743 Tj
+-286 TJm
+(program) 33.7533 Tj
+-286 TJm
+(has) 13.2801 Tj
+-286 TJm
+(announced) 43.158 Tj
+-285 TJm
+(its) 9.4147 Tj
+72 433.076 Td
+(intention) 35.427 Tj
+-292 TJm
+(to) 7.7509 Tj
+-292 TJm
+(not) 12.7322 Tj
+-291 TJm
+(supply) 26.5703 Tj
+-292 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-292 TJm
+(more) 20.4731 Tj
+-292 TJm
+(input\).) 26.2913 Tj
+-870 TJm
+(By) 11.6264 Tj
+-292 TJm
+(comparing) 42.61 Tj
+-292 TJm
+(this) 14.396 Tj
+-292 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-291 TJm
+(with) 17.7135 Tj
+-292 TJm
+(that) 14.9439 Tj
+-292 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+392.862 433.076 Td
+/F124_0 9.9626 Tf
+(avail_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+443.589 433.076 Td
+/F122_0 9.9626 Tf
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-292 TJm
+(subsequent) 44.2738 Tj
+-292 TJm
+(calls) 18.2614 Tj
+-291 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 421.121 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+155.686 421.121 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-247 TJm
+(the) 12.1743 Tj
+-247 TJm
+(library) 26.5603 Tj
+-246 TJm
+(can) 13.8281 Tj
+-247 TJm
+(detect) 23.7907 Tj
+-246 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-247 TJm
+(attem) 22.1369 Tj
+1 TJm
+(p) 4.9813 Tj
+-1 TJm
+(t) 2.7696 Tj
+1 TJm
+(s) 3.8755 Tj
+-247 TJm
+(to) 7.7509 Tj
+-246 TJm
+(slip) 14.396 Tj
+-247 TJm
+(in) 7.7509 Tj
+-246 TJm
+(more) 20.4731 Tj
+-247 TJm
+(data) 16.5977 Tj
+-246 TJm
+(to) 7.7509 Tj
+-247 TJm
+(compress.) 40.1194 Tj
+-617 TJm
+(An) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-247 TJm
+(calls) 18.2614 Tj
+-246 TJm
+(for) 11.6164 Tj
+-247 TJm
+(which) 24.3486 Tj
+-246 TJm
+(this) 14.396 Tj
+-247 TJm
+(is) 6.6451 Tj
+72 409.165 Td
+(detected) 33.1954 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(return) 23.7907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+151.959 409.165 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+253.578 409.165 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-500 TJm
+(This) 17.7135 Tj
+-250 TJm
+(indicates) 35.417 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(programming) 54.2364 Tj
+-250 TJm
+(mistak) 26.5703 Tj
+10 TJm
+(e) 4.4234 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(corrected.) 39.5515 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 387.248 Td
+(Instead) 28.772 Tj
+-224 TJm
+(of) 8.2988 Tj
+-223 TJm
+(asking) 26.0123 Tj
+-224 TJm
+(to) 7.7509 Tj
+-223 TJm
+(\002nish,) 24.6375 Tj
+-229 TJm
+(the) 12.1743 Tj
+-224 TJm
+(calling) 27.1182 Tj
+-223 TJm
+(program) 33.7533 Tj
+-224 TJm
+(may) 17.1556 Tj
+-224 TJm
+(ask) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+293.282 387.248 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+379.196 387.248 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-224 TJm
+(tak) 12.1743 Tj
+10 TJm
+(e) 4.4234 Tj
+-223 TJm
+(all) 9.9626 Tj
+-224 TJm
+(the) 12.1743 Tj
+-223 TJm
+(remaining) 40.3983 Tj
+-224 TJm
+(input,) 22.9738 Tj
+-229 TJm
+(compress) 37.6287 Tj
+72 375.293 Td
+(it) 5.5392 Tj
+-278 TJm
+(and) 14.386 Tj
+-278 TJm
+(terminate) 37.6287 Tj
+-278 TJm
+(the) 12.1743 Tj
+-278 TJm
+(current) 28.2141 Tj
+-277 TJm
+(\(Burro) 26.5603 Tj
+25 TJm
+(ws-Wheeler\)) 51.4469 Tj
+-278 TJm
+(compression) 50.3609 Tj
+-278 TJm
+(block.) 24.6275 Tj
+-787 TJm
+(Th) 11.0684 Tj
+-1 TJm
+(i) 2.7696 Tj
+1 TJm
+(s) 3.8755 Tj
+-278 TJm
+(could) 22.1369 Tj
+-278 TJm
+(be) 9.4047 Tj
+-278 TJm
+(useful) 24.3486 Tj
+-278 TJm
+(for) 11.6164 Tj
+-278 TJm
+(error) 19.3573 Tj
+-278 TJm
+(control) 28.224 Tj
+-278 TJm
+(purposes.) 37.9077 Tj
+72 363.337 Td
+(The) 15.4918 Tj
+-328 TJm
+(mechanism) 45.3796 Tj
+-328 TJm
+(is) 6.6451 Tj
+-328 TJm
+(analogous) 40.3983 Tj
+-328 TJm
+(to) 7.7509 Tj
+-328 TJm
+(that) 14.9439 Tj
+-328 TJm
+(for) 11.6164 Tj
+-328 TJm
+(\002nishing:) 37.6487 Tj
+-466 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+297.049 363.337 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+384.003 363.337 Td
+/F122_0 9.9626 Tf
+(with) 17.7135 Tj
+-328 TJm
+(an) 9.4047 Tj
+-328 TJm
+(action) 24.3486 Tj
+-328 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+456.841 363.337 Td
+/F124_0 9.9626 Tf
+(BZ_FLUSH) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+504.662 363.337 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-328 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+72 351.382 Td
+(output) 25.4644 Tj
+-445 TJm
+(data,) 19.0883 Tj
+-494 TJm
+(and) 14.386 Tj
+-446 TJm
+(persist) 26.0123 Tj
+-445 TJm
+(with) 17.7135 Tj
+-445 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+213.94 351.382 Td
+/F124_0 9.9626 Tf
+(BZ_FLUSH) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+266.195 351.382 Td
+/F122_0 9.9626 Tf
+(action) 24.3486 Tj
+-445 TJm
+(until) 18.2714 Tj
+-445 TJm
+(the) 12.1743 Tj
+-446 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+360.062 351.382 Td
+/F124_0 9.9626 Tf
+(BZ_RUN) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+400.362 351.382 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-445 TJm
+(returned.) 35.686 Tj
+-1792 TJm
+(As) 11.0684 Tj
+-445 TJm
+(with) 17.7135 Tj
+-445 TJm
+(\002nishing,) 37.3697 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 339.427 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+158.177 339.427 Td
+/F122_0 9.9626 Tf
+(detects) 27.6661 Tj
+-250 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(attempt) 29.8878 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vide) 17.1556 Tj
+-250 TJm
+(more) 20.4731 Tj
+-250 TJm
+(input) 20.4831 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(once) 18.8094 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\003ush) 19.3773 Tj
+-250 TJm
+(has) 13.2801 Tj
+-250 TJm
+(be) 9.4047 Tj
+15 TJm
+(gun.) 17.4346 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 317.509 Td
+(Once) 21.0211 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\003ush) 19.3773 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(complete,) 39.0135 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(stream) 26.5603 Tj
+-250 TJm
+(returns) 27.6661 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(normal) 28.224 Tj
+-250 TJm
+(R) 6.6451 Tj
+40 TJm
+(UNNING) 39.2825 Tj
+-250 TJm
+(state.) 20.7521 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 295.591 Td
+(This) 17.7135 Tj
+-344 TJm
+(all) 9.9626 Tj
+-343 TJm
+(sounds) 27.6761 Tj
+-344 TJm
+(pretty) 23.2427 Tj
+-344 TJm
+(comple) 29.3299 Tj
+15 TJm
+(x,) 7.472 Tj
+-367 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-344 TJm
+(isn') 14.9439 Tj
+18 TJm
+(t) 2.7696 Tj
+-344 TJm
+(really) 22.6848 Tj
+65 TJm
+(.) 2.4907 Tj
+-1182 TJm
+(Here') 22.6749 Tj
+55 TJm
+(s) 3.8755 Tj
+-344 TJm
+(a) 4.4234 Tj
+-344 TJm
+(table) 19.3673 Tj
+-343 TJm
+(which) 24.3486 Tj
+-344 TJm
+(sho) 13.8381 Tj
+25 TJm
+(ws) 11.0684 Tj
+-344 TJm
+(which) 24.3486 Tj
+-344 TJm
+(actions) 28.224 Tj
+-343 TJm
+(are) 12.1643 Tj
+-344 TJm
+(allo) 14.9439 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-344 TJm
+(in) 7.7509 Tj
+-344 TJm
+(each) 18.2515 Tj
+72 283.636 Td
+(state,) 20.7521 Tj
+-281 TJm
+(what) 19.3673 Tj
+-274 TJm
+(action) 24.3486 Tj
+-275 TJm
+(will) 15.5018 Tj
+-274 TJm
+(be) 9.4047 Tj
+-275 TJm
+(tak) 12.1743 Tj
+10 TJm
+(en,) 11.8953 Tj
+-280 TJm
+(what) 19.3673 Tj
+-275 TJm
+(the) 12.1743 Tj
+-274 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-275 TJm
+(state) 18.2614 Tj
+-274 TJm
+(is,) 9.1357 Tj
+-281 TJm
+(and) 14.386 Tj
+-274 TJm
+(what) 19.3673 Tj
+-275 TJm
+(the) 12.1743 Tj
+-275 TJm
+(non-error) 37.6188 Tj
+-274 TJm
+(return) 23.7907 Tj
+-275 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-274 TJm
+(are.) 14.655 Tj
+-767 TJm
+(Note) 19.3673 Tj
+-275 TJm
+(that) 14.9439 Tj
+-274 TJm
+(you) 14.9439 Tj
+-275 TJm
+(can') 17.1456 Tj
+18 TJm
+(t) 2.7696 Tj
+72 271.681 Td
+(e) 4.4234 Tj
+15 TJm
+(xplicitly) 33.2153 Tj
+-347 TJm
+(ask) 13.2801 Tj
+-348 TJm
+(what) 19.3673 Tj
+-347 TJm
+(state) 18.2614 Tj
+-348 TJm
+(the) 12.1743 Tj
+-347 TJm
+(stream) 26.5603 Tj
+-348 TJm
+(is) 6.6451 Tj
+-347 TJm
+(in,) 10.2416 Tj
+-372 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-347 TJm
+(nor) 13.2801 Tj
+-348 TJm
+(do) 9.9626 Tj
+-347 TJm
+(you) 14.9439 Tj
+-348 TJm
+(need) 18.8094 Tj
+-347 TJm
+(to) 7.7509 Tj
+-348 TJm
+(--) 6.6351 Tj
+-347 TJm
+(it) 5.5392 Tj
+-348 TJm
+(can) 13.8281 Tj
+-347 TJm
+(be) 9.4047 Tj
+-347 TJm
+(inferred) 31.5316 Tj
+-348 TJm
+(from) 19.3673 Tj
+-347 TJm
+(the) 12.1743 Tj
+-348 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-347 TJm
+(returned) 33.1954 Tj
+-348 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 259.726 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+155.686 259.726 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.852 Td
+(14) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 15 18
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 146.152] cm
+0 0 468 573.848 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(IDLE/any) 47.8205 Tj
+98.488 699.676 Td
+(Illegal.) 47.8205 Tj
+-852 TJm
+(IDLE) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(only) 23.9102 Tj
+-426 TJm
+(exists) 35.8654 Tj
+-426 TJm
+(after) 29.8878 Tj
+-426 TJm
+(BZ2_bzCompressEnd) 101.6185 Tj
+-426 TJm
+(or) 11.9551 Tj
+98.488 687.721 Td
+(before) 35.8654 Tj
+-426 TJm
+(BZ2_bzCompressInit.) 113.5736 Tj
+98.488 675.766 Td
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+90 651.856 Td
+(RUNNING/BZ_RUN) 83.6858 Tj
+98.488 639.9 Td
+(Compress) 47.8205 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(next_in) 41.8429 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(next_out) 47.8205 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(much) 23.9102 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(possible.) 53.798 Tj
+98.488 627.945 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(RUNNING) 41.8429 Tj
+98.488 615.99 Td
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_RUN_OK) 53.798 Tj
+90 592.08 Td
+(RUNNING/BZ_FLUSH) 95.641 Tj
+98.488 580.124 Td
+(Remember) 47.8205 Tj
+-426 TJm
+(current) 41.8429 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(next_in.) 47.8205 Tj
+-426 TJm
+(Compress) 47.8205 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(next_in) 41.8429 Tj
+98.488 568.169 Td
+(to) 11.9551 Tj
+-426 TJm
+(next_out) 47.8205 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(much) 23.9102 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(possible,) 53.798 Tj
+-426 TJm
+(but) 17.9327 Tj
+-426 TJm
+(do) 11.9551 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(accept) 35.8654 Tj
+-426 TJm
+(any) 17.9327 Tj
+-426 TJm
+(more) 23.9102 Tj
+-426 TJm
+(input.) 35.8654 Tj
+98.488 556.214 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(FLUSHING) 47.8205 Tj
+98.488 544.259 Td
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_FLUSH_OK) 65.7532 Tj
+90 520.349 Td
+(RUNNING/BZ_FINISH) 101.6185 Tj
+98.488 508.393 Td
+(Remember) 47.8205 Tj
+-426 TJm
+(current) 41.8429 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(next_in.) 47.8205 Tj
+-426 TJm
+(Compress) 47.8205 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(next_in) 41.8429 Tj
+98.488 496.438 Td
+(to) 11.9551 Tj
+-426 TJm
+(next_out) 47.8205 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(much) 23.9102 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(possible,) 53.798 Tj
+-426 TJm
+(but) 17.9327 Tj
+-426 TJm
+(do) 11.9551 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(accept) 35.8654 Tj
+-426 TJm
+(any) 17.9327 Tj
+-426 TJm
+(more) 23.9102 Tj
+-426 TJm
+(input.) 35.8654 Tj
+98.488 484.483 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(FINISHING) 53.798 Tj
+98.488 472.528 Td
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_FINISH_OK) 71.7307 Tj
+90 448.618 Td
+(FLUSHING/BZ_FLUSH) 101.6185 Tj
+98.488 436.662 Td
+(Compress) 47.8205 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(next_in) 41.8429 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(next_out) 47.8205 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(much) 23.9102 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(possible,) 53.798 Tj
+98.488 424.707 Td
+(but) 17.9327 Tj
+-426 TJm
+(do) 11.9551 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(accept) 35.8654 Tj
+-426 TJm
+(any) 17.9327 Tj
+-426 TJm
+(more) 23.9102 Tj
+-426 TJm
+(input.) 35.8654 Tj
+98.488 412.752 Td
+(If) 11.9551 Tj
+-426 TJm
+(all) 17.9327 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(existing) 47.8205 Tj
+-426 TJm
+(input) 29.8878 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(used) 23.9102 Tj
+-426 TJm
+(up) 11.9551 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(all) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+98.488 400.797 Td
+(output) 35.8654 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(removed) 41.8429 Tj
+106.976 388.842 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(RUNNING;) 47.8205 Tj
+-426 TJm
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_RUN_OK) 53.798 Tj
+98.488 376.887 Td
+(else) 23.9102 Tj
+106.976 364.931 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(FLUSHING;) 53.798 Tj
+-426 TJm
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_FLUSH_OK) 65.7532 Tj
+90 341.021 Td
+(FLUSHING/other) 83.6858 Tj
+98.488 329.066 Td
+(Illegal.) 47.8205 Tj
+98.488 317.111 Td
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+90 293.2 Td
+(FINISHING/BZ_FINISH) 113.5736 Tj
+98.488 281.245 Td
+(Compress) 47.8205 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(next_in) 41.8429 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(next_out) 47.8205 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(much) 23.9102 Tj
+-426 TJm
+(as) 11.9551 Tj
+-426 TJm
+(possible,) 53.798 Tj
+98.488 269.29 Td
+(but) 17.9327 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(accept) 35.8654 Tj
+-426 TJm
+(any) 17.9327 Tj
+-426 TJm
+(more) 23.9102 Tj
+-426 TJm
+(input.) 35.8654 Tj
+98.488 257.335 Td
+(If) 11.9551 Tj
+-426 TJm
+(all) 17.9327 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(existing) 47.8205 Tj
+-426 TJm
+(input) 29.8878 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(used) 23.9102 Tj
+-426 TJm
+(up) 11.9551 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(all) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+98.488 245.38 Td
+(output) 35.8654 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(removed) 41.8429 Tj
+106.976 233.424 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(IDLE;) 29.8878 Tj
+-426 TJm
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_STREAM_END) 77.7083 Tj
+98.488 221.469 Td
+(else) 23.9102 Tj
+106.976 209.514 Td
+(Next) 23.9102 Tj
+-426 TJm
+(state) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(FINISHING;) 59.7756 Tj
+-426 TJm
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_FINISH_OK) 71.7307 Tj
+90 185.604 Td
+(FINISHING/other) 89.6634 Tj
+98.488 173.649 Td
+(Illegal.) 47.8205 Tj
+98.488 161.693 Td
+(Return) 35.8654 Tj
+-426 TJm
+(value) 29.8878 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 124.234 Td
+/F122_0 9.9626 Tf
+(That) 18.2614 Tj
+-250 TJm
+(still) 14.9539 Tj
+-250 TJm
+(looks) 21.589 Tj
+-250 TJm
+(complicated?) 53.1206 Tj
+-620 TJm
+(W) 9.4047 Tj
+80 TJm
+(ell,) 12.4533 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(air) 10.5105 Tj
+-250 TJm
+(enough.) 31.8205 Tj
+-620 TJm
+(The) 15.4918 Tj
+-250 TJm
+(usual) 21.031 Tj
+-250 TJm
+(sequence) 36.5129 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(calls) 18.2614 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(compressing) 50.3609 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(load) 17.1556 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(is:) 9.4147 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 92.353 Td
+(1.) 7.472 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-510 TJm
+(Get) 14.386 Tj
+-250 TJm
+(started) 26.5603 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+153.175 92.353 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+260.771 92.353 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(15) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 16 19
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+74.491 710.037 Td
+/F122_0 9.9626 Tf
+(2.) 7.472 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-510 TJm
+(Sho) 15.5018 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-267 TJm
+(data) 16.5977 Tj
+-268 TJm
+(in) 7.7509 Tj
+-267 TJm
+(and) 14.386 Tj
+-268 TJm
+(shlurp) 24.9065 Tj
+-267 TJm
+(out) 12.7322 Tj
+-268 TJm
+(its) 9.4147 Tj
+-267 TJm
+(compressed) 47.0334 Tj
+-267 TJm
+(form) 19.3673 Tj
+-268 TJm
+(using) 21.589 Tj
+-267 TJm
+(zero) 17.1456 Tj
+-268 TJm
+(or) 8.2988 Tj
+-267 TJm
+(more) 20.4731 Tj
+-268 TJm
+(call) 14.386 Tj
+1 TJm
+(s) 3.8755 Tj
+-268 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+400.64 710.037 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+486.991 710.037 Td
+/F122_0 9.9626 Tf
+(with) 17.7135 Tj
+-267 TJm
+(action) 24.3486 Tj
+-268 TJm
+(=) 5.6189 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+83.955 698.082 Td
+/F124_0 9.9626 Tf
+(BZ_RUN) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+119.821 698.082 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 676.164 Td
+(3.) 7.472 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-510 TJm
+(Finish) 24.9165 Tj
+-276 TJm
+(up.) 12.4533 Tj
+-387 TJm
+(Repeatedly) 44.8217 Tj
+-276 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+195.722 676.164 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+282.156 676.164 Td
+/F122_0 9.9626 Tf
+(with) 17.7135 Tj
+-276 TJm
+(action) 24.3486 Tj
+-276 TJm
+(=) 5.6189 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+338.079 676.164 Td
+/F124_0 9.9626 Tf
+(BZ_FINISH) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+391.877 676.164 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-276 TJm
+(cop) 14.386 Tj
+10 TJm
+(ying) 17.7135 Tj
+-276 TJm
+(out) 12.7322 Tj
+-275 TJm
+(the) 12.1743 Tj
+-276 TJm
+(compressed) 47.0334 Tj
+-276 TJm
+(output,) 27.9551 Tj
+83.955 664.209 Td
+(until) 18.2714 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.717 664.209 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+184.916 664.209 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(returned.) 35.686 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 642.291 Td
+(4.) 7.472 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-510 TJm
+(Close) 22.6948 Tj
+-250 TJm
+(up) 9.9626 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(go) 9.9626 Tj
+-250 TJm
+(home.) 24.6275 Tj
+-620 TJm
+(Call) 16.6077 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.914 642.291 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressEnd) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+305.533 642.291 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 620.374 Td
+(If) 6.6351 Tj
+-269 TJm
+(the) 12.1743 Tj
+-270 TJm
+(data) 16.5977 Tj
+-269 TJm
+(you) 14.9439 Tj
+-270 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-269 TJm
+(to) 7.7509 Tj
+-270 TJm
+(compress) 37.6287 Tj
+-269 TJm
+(\002ts) 12.1843 Tj
+-270 TJm
+(into) 15.5018 Tj
+-269 TJm
+(your) 18.2614 Tj
+-270 TJm
+(input) 20.4831 Tj
+-269 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-270 TJm
+(all) 9.9626 Tj
+-269 TJm
+(at) 7.193 Tj
+-270 TJm
+(once,) 21.3 Tj
+-274 TJm
+(you) 14.9439 Tj
+-269 TJm
+(can) 13.8281 Tj
+-270 TJm
+(skip) 16.6077 Tj
+-269 TJm
+(the) 12.1743 Tj
+-270 TJm
+(calls) 18.2614 Tj
+-269 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+456.314 620.374 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+72 608.418 Td
+(\() 5.9776 Tj
+-600 TJm
+(...,) 23.9102 Tj
+-600 TJm
+(BZ_RUN) 35.8654 Tj
+-600 TJm
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+164.154 608.418 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+-250 TJm
+(just) 14.396 Tj
+-250 TJm
+(do) 9.9626 Tj
+-250 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+225.036 608.418 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+-600 TJm
+(\() 5.9776 Tj
+-600 TJm
+(...,) 23.9102 Tj
+-600 TJm
+(BZ_FINISH) 53.798 Tj
+-600 TJm
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+424.786 608.418 Td
+/F122_0 9.9626 Tf
+(calls.) 20.7521 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 586.501 Td
+(All) 12.7322 Tj
+-278 TJm
+(required) 33.1954 Tj
+-277 TJm
+(memory) 33.2053 Tj
+-278 TJm
+(is) 6.6451 Tj
+-277 TJm
+(allocated) 35.965 Tj
+-278 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+220.295 586.501 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+327.891 586.501 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-785 TJm
+(The) 15.4918 Tj
+-278 TJm
+(compression) 50.3609 Tj
+-277 TJm
+(library) 26.5603 Tj
+-278 TJm
+(can) 13.8281 Tj
+-277 TJm
+(accept) 25.4445 Tj
+-278 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-277 TJm
+(data) 16.5977 Tj
+-278 TJm
+(at) 7.193 Tj
+-278 TJm
+(all) 9.9626 Tj
+72 574.545 Td
+(\(ob) 13.2801 Tj
+15 TJm
+(viously\).) 35.1481 Tj
+-612 TJm
+(So) 10.5205 Tj
+-238 TJm
+(you) 14.9439 Tj
+-237 TJm
+(shouldn') 34.8691 Tj
+18 TJm
+(t) 2.7696 Tj
+-238 TJm
+(get) 12.1743 Tj
+-238 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-237 TJm
+(error) 19.3573 Tj
+-238 TJm
+(return) 23.7907 Tj
+-238 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+-238 TJm
+(from) 19.3673 Tj
+-237 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+339.287 574.545 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+425.342 574.545 Td
+/F122_0 9.9626 Tf
+(calls.) 20.7521 Tj
+-612 TJm
+(If) 6.6351 Tj
+-237 TJm
+(you) 14.9439 Tj
+-238 TJm
+(do,) 12.4533 Tj
+-240 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-238 TJm
+(will) 15.5018 Tj
+-238 TJm
+(be) 9.4047 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 562.59 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+173.619 562.59 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(indicate) 31.5416 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(your) 18.2614 Tj
+-250 TJm
+(programming.) 56.727 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 540.672 Td
+(T) 6.0871 Tj
+35 TJm
+(ri) 6.0871 Tj
+25 TJm
+(vial) 14.9439 Tj
+-250 TJm
+(other) 20.4731 Tj
+-250 TJm
+(possible) 32.6574 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 501.654] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 529.151 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 517.196 Td
+(if) 11.9551 Tj
+-426 TJm
+(strm) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL,) 29.8878 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(strm->s) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 471.033 Td
+/F116_0 17.2154 Tf
+(3.3.3.) 43.0729 Tj
+-278 TJm
+(BZ2_bzCompressEnd) 177.9212 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 442.563] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 458.104 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzCompressEnd) 101.6185 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bz_stream) 53.798 Tj
+286.303 456.361 Td
+(*) 5.9776 Tj
+292.281 458.104 Td
+(strm) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 420.645 Td
+/F122_0 9.9626 Tf
+(Releases) 34.8591 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(memory) 33.2053 Tj
+-250 TJm
+(associated) 40.9463 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(compression) 50.3609 Tj
+-250 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 398.727 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 361.766] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 389.263 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+-852 TJm
+(if) 11.9551 Tj
+-426 TJm
+(strm) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(strm->s) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+90 377.307 Td
+(BZ_OK) 29.8878 Tj
+-4686 TJm
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 331.145 Td
+/F116_0 17.2154 Tf
+(3.3.4.) 43.0729 Tj
+-278 TJm
+(BZ2_bzDecompressInit) 190.3679 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 302.674] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 318.216 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzDecompressInit) 119.5512 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bz_stream) 53.798 Tj
+304.236 316.473 Td
+(*) 5.9776 Tj
+310.214 318.216 Td
+(strm,) 29.8878 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(verbosity,) 59.7756 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(small) 29.8878 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 280.757 Td
+/F122_0 9.9626 Tf
+(Prepares) 34.3012 Tj
+-351 TJm
+(for) 11.6164 Tj
+-351 TJm
+(decompression.) 62.2563 Tj
+-1228 TJm
+(As) 11.0684 Tj
+-351 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+235.177 280.757 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+342.773 280.757 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-377 TJm
+(a) 4.4234 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+356.937 280.757 Td
+/F124_0 9.9626 Tf
+(bz_stream) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+414.235 280.757 Td
+/F122_0 9.9626 Tf
+(record) 25.4445 Tj
+-351 TJm
+(should) 26.5703 Tj
+-351 TJm
+(be) 9.4047 Tj
+-352 TJm
+(allocated) 35.965 Tj
+-351 TJm
+(and) 14.386 Tj
+72 268.801 Td
+(initialised) 39.3025 Tj
+-306 TJm
+(before) 25.4445 Tj
+-305 TJm
+(the) 12.1743 Tj
+-306 TJm
+(call.) 16.8766 Tj
+-953 TJm
+(Fields) 24.3586 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+211.833 268.801 Td
+/F124_0 9.9626 Tf
+(bzalloc) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+253.676 268.801 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+259.35 268.801 Td
+/F124_0 9.9626 Tf
+(bzfree) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+298.26 268.801 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+315.69 268.801 Td
+/F124_0 9.9626 Tf
+(opaque) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+354.6 268.801 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-306 TJm
+(be) 9.4047 Tj
+-305 TJm
+(set) 11.0684 Tj
+-306 TJm
+(if) 6.0871 Tj
+-305 TJm
+(a) 4.4234 Tj
+-306 TJm
+(custom) 28.782 Tj
+-305 TJm
+(memory) 33.2053 Tj
+-306 TJm
+(allocator) 34.8591 Tj
+-306 TJm
+(is) 6.6451 Tj
+72 256.846 Td
+(required,) 35.686 Tj
+-350 TJm
+(or) 8.2988 Tj
+-331 TJm
+(made) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+147.635 256.846 Td
+/F124_0 9.9626 Tf
+(NULL) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+174.836 256.846 Td
+/F122_0 9.9626 Tf
+(for) 11.6164 Tj
+-330 TJm
+(the) 12.1743 Tj
+-331 TJm
+(normal) 28.224 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+236.722 256.846 Td
+/F124_0 9.9626 Tf
+(malloc) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+275.878 256.846 Td
+/F122_0 9.9626 Tf
+(/) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+281.938 256.846 Td
+/F124_0 9.9626 Tf
+(free) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+309.139 256.846 Td
+/F122_0 9.9626 Tf
+(routines.) 34.5901 Tj
+-1102 TJm
+(Upon) 22.1369 Tj
+-330 TJm
+(return,) 26.2813 Tj
+-350 TJm
+(the) 12.1743 Tj
+-331 TJm
+(internal) 30.4357 Tj
+-330 TJm
+(state) 18.2614 Tj
+-330 TJm
+(will) 15.5018 Tj
+-330 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-331 TJm
+(been) 18.8094 Tj
+72 244.891 Td
+(initialised,) 41.7931 Tj
+-250 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+133.16 244.891 Td
+/F124_0 9.9626 Tf
+(total_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+183.471 244.891 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.348 244.891 Td
+/F124_0 9.9626 Tf
+(total_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+256.637 244.891 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(zero.) 19.6363 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 222.973 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(meaning) 34.3112 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(parameter) 39.8305 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+192.756 222.973 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+246.554 222.973 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(see) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+266.748 222.973 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+374.345 222.973 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 201.055 Td
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.497 201.055 Td
+/F124_0 9.9626 Tf
+(small) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+114.248 201.055 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-287 TJm
+(nonzero,) 34.5802 Tj
+-297 TJm
+(the) 12.1743 Tj
+-287 TJm
+(library) 26.5603 Tj
+-288 TJm
+(wil) 12.7322 Tj
+1 TJm
+(l) 2.7696 Tj
+-288 TJm
+(use) 13.2801 Tj
+-287 TJm
+(an) 9.4047 Tj
+-287 TJm
+(alternati) 32.6474 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-288 TJm
+(decompression) 59.7656 Tj
+-287 TJm
+(algorithm) 38.7446 Tj
+-287 TJm
+(which) 24.3486 Tj
+-288 TJm
+(uses) 17.1556 Tj
+-287 TJm
+(less) 14.9439 Tj
+-287 TJm
+(memory) 33.2053 Tj
+-287 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-288 TJm
+(at) 7.193 Tj
+-287 TJm
+(the) 12.1743 Tj
+72 189.1 Td
+(cost) 16.0497 Tj
+-289 TJm
+(of) 8.2988 Tj
+-290 TJm
+(decompressing) 59.7656 Tj
+-289 TJm
+(more) 20.4731 Tj
+-289 TJm
+(slo) 11.6264 Tj
+25 TJm
+(wly) 14.9439 Tj
+-290 TJm
+(\(roughly) 34.3112 Tj
+-289 TJm
+(speaking,) 37.9077 Tj
+-299 TJm
+(half) 15.4918 Tj
+-290 TJm
+(the) 12.1743 Tj
+-289 TJm
+(speed,) 25.1755 Tj
+-299 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-289 TJm
+(the) 12.1743 Tj
+-290 TJm
+(maximum) 40.4083 Tj
+-289 TJm
+(memory) 33.2053 Tj
+-289 TJm
+(requirement) 48.1393 Tj
+-290 TJm
+(drops) 22.1369 Tj
+72 177.145 Td
+(to) 7.7509 Tj
+-250 TJm
+(around) 27.6661 Tj
+-250 TJm
+(2300k\).) 30.7147 Tj
+-620 TJm
+(See) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+(Ho) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(bzip2) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+-250 TJm
+([2]) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 1] sc
+/DeviceRGB {} CS
+[0 0 1] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(more) 20.4731 Tj
+-250 TJm
+(information) 47.0434 Tj
+-250 TJm
+(on) 9.9626 Tj
+-250 TJm
+(memory) 33.2053 Tj
+-250 TJm
+(management.) 53.3995 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 155.227 Td
+(Note) 19.3673 Tj
+-289 TJm
+(that) 14.9439 Tj
+-290 TJm
+(the) 12.1743 Tj
+-289 TJm
+(amount) 29.8878 Tj
+-289 TJm
+(of) 8.2988 Tj
+-289 TJm
+(memory) 33.2053 Tj
+-290 TJm
+(needed) 28.2141 Tj
+-289 TJm
+(to) 7.7509 Tj
+-289 TJm
+(decompress) 47.0334 Tj
+-289 TJm
+(a) 4.4234 Tj
+-290 TJm
+(stream) 26.5603 Tj
+-289 TJm
+(cannot) 26.5603 Tj
+-289 TJm
+(be) 9.4047 Tj
+-289 TJm
+(determined) 44.8217 Tj
+-290 TJm
+(until) 18.2714 Tj
+-289 TJm
+(the) 12.1743 Tj
+-289 TJm
+(stream') 29.8778 Tj
+55 TJm
+(s) 3.8755 Tj
+-289 TJm
+(header) 26.5503 Tj
+-290 TJm
+(has) 13.2801 Tj
+72 143.272 Td
+(been) 18.8094 Tj
+-342 TJm
+(read,) 19.6363 Tj
+-366 TJm
+(so) 8.8568 Tj
+-342 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-342 TJm
+(if) 6.0871 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.081 143.272 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressInit) 119.5512 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+284.043 143.272 Td
+/F122_0 9.9626 Tf
+(succeeds,) 37.8977 Tj
+-365 TJm
+(a) 4.4234 Tj
+-343 TJm
+(subsequent) 44.2738 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+381.098 143.272 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+480.149 143.272 Td
+/F122_0 9.9626 Tf
+(could) 22.1369 Tj
+-342 TJm
+(f) 3.3175 Tj
+10 TJm
+(ail) 9.9626 Tj
+-343 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 131.317 Td
+/F124_0 9.9626 Tf
+(BZ_MEM_ERROR) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+143.731 131.317 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 109.399 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(16) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 17 20
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 624.359] cm
+0 0 468 95.641 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(library) 41.8429 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(mis-compiled) 71.7307 Tj
+90 687.721 Td
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 675.766 Td
+(if) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(small) 29.8878 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(&&) 11.9551 Tj
+-426 TJm
+(small) 29.8878 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(1) 5.9776 Tj
+-426 TJm
+(\)) 5.9776 Tj
+98.488 663.811 Td
+(or) 11.9551 Tj
+-426 TJm
+(\(verbosity) 59.7756 Tj
+-426 TJm
+(<;) 11.9551 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(||) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(4\)) 11.9551 Tj
+90 651.856 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 639.9 Td
+(if) 11.9551 Tj
+-426 TJm
+(insufficient) 71.7307 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(available) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 602.441 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 553.524] cm
+0 0 468 47.821 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 592.976 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+98.488 581.021 Td
+(if) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(returned) 47.8205 Tj
+98.488 569.066 Td
+(no) 11.9551 Tj
+-426 TJm
+(specific) 47.8205 Tj
+-426 TJm
+(action) 35.8654 Tj
+-426 TJm
+(required) 47.8205 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(case) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(error) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 522.903 Td
+/F116_0 17.2154 Tf
+(3.3.5.) 43.0729 Tj
+-278 TJm
+(BZ2_bzDecompress) 164.5448 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 494.433] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 509.975 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzDecompress) 95.641 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bz_stream) 53.798 Tj
+280.326 508.231 Td
+(*) 5.9776 Tj
+286.303 509.975 Td
+(strm) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 472.515 Td
+/F122_0 9.9626 Tf
+(Pro) 13.8381 Tj
+15 TJm
+(vides) 21.031 Tj
+-301 TJm
+(more) 20.4731 Tj
+-302 TJm
+(input) 20.4831 Tj
+-301 TJm
+(and/out) 29.8878 Tj
+-302 TJm
+(output) 25.4644 Tj
+-301 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-301 TJm
+(space) 22.1269 Tj
+-302 TJm
+(for) 11.6164 Tj
+-301 TJm
+(the) 12.1743 Tj
+-302 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+-928 TJm
+(The) 15.4918 Tj
+-301 TJm
+(caller) 22.1269 Tj
+-302 TJm
+(maintains) 38.7446 Tj
+-301 TJm
+(input) 20.4831 Tj
+-302 TJm
+(and) 14.386 Tj
+-301 TJm
+(output) 25.4644 Tj
+-301 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fers,) 17.4246 Tj
+-315 TJm
+(and) 14.386 Tj
+72 460.56 Td
+(uses) 17.1556 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.646 460.56 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+189.778 460.56 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(transfer) 30.4258 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(between) 33.1954 Tj
+-250 TJm
+(them.) 22.4159 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 438.642 Td
+(Before) 27.1082 Tj
+-498 TJm
+(each) 18.2515 Tj
+-499 TJm
+(call) 14.386 Tj
+-498 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.356 438.642 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+254.997 438.642 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+263.071 438.642 Td
+/F124_0 9.9626 Tf
+(next_in) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+309.879 438.642 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-498 TJm
+(point) 20.4831 Tj
+-499 TJm
+(at) 7.193 Tj
+-498 TJm
+(the) 12.1743 Tj
+-498 TJm
+(compressed) 47.0334 Tj
+-499 TJm
+(data,) 19.0883 Tj
+-560 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+492.179 438.642 Td
+/F124_0 9.9626 Tf
+(avail_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 426.687 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-308 TJm
+(indicate) 31.5416 Tj
+-308 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-309 TJm
+(man) 17.1556 Tj
+15 TJm
+(y) 4.9813 Tj
+-308 TJm
+(bytes) 21.031 Tj
+-308 TJm
+(the) 12.1743 Tj
+-308 TJm
+(library) 26.5603 Tj
+-308 TJm
+(may) 17.1556 Tj
+-309 TJm
+(read.) 19.6363 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.955 426.687 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+393.667 426.687 Td
+/F122_0 9.9626 Tf
+(updates) 30.4357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+427.173 426.687 Td
+/F124_0 9.9626 Tf
+(next_in) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+469.016 426.687 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+474.723 426.687 Td
+/F124_0 9.9626 Tf
+(avail_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+525.614 426.687 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 414.732 Td
+/F124_0 9.9626 Tf
+(total_in) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+122.311 414.732 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(re\003ect) 24.8965 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(number) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(bytes) 21.031 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(has) 13.2801 Tj
+-250 TJm
+(read.) 19.6363 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 392.814 Td
+(Similarly) 37.0908 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+113.799 392.814 Td
+/F124_0 9.9626 Tf
+(next_out) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+164.41 392.814 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-280 TJm
+(point) 20.4831 Tj
+-280 TJm
+(to) 7.7509 Tj
+-280 TJm
+(a) 4.4234 Tj
+-280 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-281 TJm
+(i) 2.7696 Tj
+1 TJm
+(n) 4.9813 Tj
+-281 TJm
+(which) 24.3486 Tj
+-280 TJm
+(the) 12.1743 Tj
+-280 TJm
+(uncompressed) 56.996 Tj
+-280 TJm
+(output) 25.4644 Tj
+-280 TJm
+(is) 6.6451 Tj
+-280 TJm
+(to) 7.7509 Tj
+-280 TJm
+(be) 9.4047 Tj
+-280 TJm
+(placed,) 28.493 Tj
+-288 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+486.202 392.814 Td
+/F124_0 9.9626 Tf
+(avail_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 380.859 Td
+/F122_0 9.9626 Tf
+(indicating) 39.8504 Tj
+-525 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-524 TJm
+(much) 22.1369 Tj
+-525 TJm
+(output) 25.4644 Tj
+-524 TJm
+(space) 22.1269 Tj
+-525 TJm
+(is) 6.6451 Tj
+-525 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+285.792 380.859 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+374.705 380.859 Td
+/F122_0 9.9626 Tf
+(updates) 30.4357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+410.367 380.859 Td
+/F124_0 9.9626 Tf
+(next_out) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+458.188 380.859 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+466.589 380.859 Td
+/F124_0 9.9626 Tf
+(avail_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+525.614 380.859 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 368.904 Td
+/F124_0 9.9626 Tf
+(total_out) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+128.289 368.904 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(re\003ect) 24.8965 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(number) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(bytes) 21.031 Tj
+-250 TJm
+(output.) 27.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 346.986 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-320 TJm
+(may) 17.1556 Tj
+-321 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vide) 17.1556 Tj
+-320 TJm
+(and) 14.386 Tj
+-321 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-320 TJm
+(as) 8.2988 Tj
+-321 TJm
+(little) 18.2714 Tj
+-320 TJm
+(or) 8.2988 Tj
+-320 TJm
+(as) 8.2988 Tj
+-321 TJm
+(much) 22.1369 Tj
+-320 TJm
+(data) 16.5977 Tj
+-321 TJm
+(as) 8.2988 Tj
+-320 TJm
+(you) 14.9439 Tj
+-321 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-320 TJm
+(on) 9.9626 Tj
+-320 TJm
+(each) 18.2515 Tj
+-321 TJm
+(call) 14.386 Tj
+-320 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+407.816 346.986 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+503.457 346.986 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1043 TJm
+(In) 8.2988 Tj
+-320 TJm
+(the) 12.1743 Tj
+72 335.031 Td
+(limit,) 21.32 Tj
+-295 TJm
+(it) 5.5392 Tj
+-286 TJm
+(is) 6.6451 Tj
+-287 TJm
+(acceptable) 42.0422 Tj
+-286 TJm
+(to) 7.7509 Tj
+-286 TJm
+(supply) 26.5703 Tj
+-286 TJm
+(and) 14.386 Tj
+-287 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-286 TJm
+(data) 16.5977 Tj
+-286 TJm
+(one) 14.386 Tj
+-286 TJm
+(byte) 17.1556 Tj
+-287 TJm
+(at) 7.193 Tj
+-286 TJm
+(a) 4.4234 Tj
+-286 TJm
+(time,) 20.2042 Tj
+-295 TJm
+(although) 34.8691 Tj
+-286 TJm
+(this) 14.396 Tj
+-287 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-286 TJm
+(be) 9.4047 Tj
+-286 TJm
+(terribly) 29.3299 Tj
+-286 TJm
+(inef) 15.4918 Tj
+25 TJm
+(\002cient.) 27.3972 Tj
+-838 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+72 323.076 Td
+(should) 26.5703 Tj
+-250 TJm
+(al) 7.193 Tj
+10 TJm
+(w) 7.193 Tj
+10 TJm
+(ays) 13.2801 Tj
+-250 TJm
+(ensure) 26.0024 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(least) 18.2614 Tj
+-250 TJm
+(one) 14.386 Tj
+-250 TJm
+(byte) 17.1556 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(space) 22.1269 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable) 26.5603 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(each) 18.2515 Tj
+-250 TJm
+(call.) 16.8766 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 301.158 Td
+(Use) 15.4918 Tj
+-250 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+100.772 301.158 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+198.904 301.158 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(simpler) 29.8878 Tj
+-250 TJm
+(than) 17.1556 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+260.064 301.158 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+343.75 301.158 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 279.24 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-346 TJm
+(should) 26.5703 Tj
+-347 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vide) 17.1556 Tj
+-346 TJm
+(input) 20.4831 Tj
+-346 TJm
+(and) 14.386 Tj
+-346 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-347 TJm
+(output) 25.4644 Tj
+-346 TJm
+(as) 8.2988 Tj
+-346 TJm
+(described) 38.1767 Tj
+-346 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+-371 TJm
+(and) 14.386 Tj
+-346 TJm
+(repeatedly) 41.4942 Tj
+-346 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+422.638 279.24 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+521.729 279.24 Td
+/F122_0 9.9626 Tf
+(until) 18.2714 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 267.285 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+152.314 267.285 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-262 TJm
+(returned.) 35.686 Tj
+-344 TJm
+(Appearance) 47.5714 Tj
+-262 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+261.767 267.285 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+342.081 267.285 Td
+/F122_0 9.9626 Tf
+(denotes) 30.4357 Tj
+-262 TJm
+(that) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+392.672 267.285 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+490.919 267.285 Td
+/F122_0 9.9626 Tf
+(has) 13.2801 Tj
+-262 TJm
+(detected) 33.1954 Tj
+72 255.33 Td
+(the) 12.1743 Tj
+-212 TJm
+(logical) 27.1182 Tj
+-212 TJm
+(end) 14.386 Tj
+-211 TJm
+(of) 8.2988 Tj
+-212 TJm
+(the) 12.1743 Tj
+-212 TJm
+(compressed) 47.0334 Tj
+-212 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+237.858 255.33 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+335.609 255.33 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-212 TJm
+(not) 12.7322 Tj
+-212 TJm
+(produce) 32.0895 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+402.263 255.33 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+482.082 255.33 Td
+/F122_0 9.9626 Tf
+(until) 18.2714 Tj
+-212 TJm
+(all) 9.9626 Tj
+-212 TJm
+(output) 25.4644 Tj
+72 243.375 Td
+(data) 16.5977 Tj
+-256 TJm
+(has) 13.2801 Tj
+-256 TJm
+(been) 18.8094 Tj
+-255 TJm
+(placed) 26.0024 Tj
+-256 TJm
+(into) 15.5018 Tj
+-256 TJm
+(the) 12.1743 Tj
+-256 TJm
+(output) 25.4644 Tj
+-256 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+40 TJm
+(,) 2.4907 Tj
+-257 TJm
+(so) 8.8568 Tj
+-256 TJm
+(once) 18.8094 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+278.979 243.375 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+359.236 243.375 Td
+/F122_0 9.9626 Tf
+(appears,) 32.9164 Tj
+-257 TJm
+(you) 14.9439 Tj
+-256 TJm
+(are) 12.1643 Tj
+-256 TJm
+(guaranteed) 43.7059 Tj
+-256 TJm
+(to) 7.7509 Tj
+-255 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-256 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable) 26.5603 Tj
+72 231.419 Td
+(all) 9.9626 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(decompressed) 56.4381 Tj
+-250 TJm
+(output,) 27.9551 Tj
+-250 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+205.369 231.419 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressEnd) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+321.433 231.419 Td
+/F122_0 9.9626 Tf
+(can) 13.8281 Tj
+-250 TJm
+(safely) 23.7907 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(called.) 26.2813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 209.502 Td
+(If) 6.6351 Tj
+-250 TJm
+(case) 17.1456 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue,) 19.0883 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+261.259 209.502 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressEnd) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+377.323 209.502 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(clean) 21.0211 Tj
+-250 TJm
+(up) 9.9626 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(release) 27.6562 Tj
+-250 TJm
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 187.584 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(17) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 18 21
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 540.672] cm
+0 0 468 179.328 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(strm) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(strm->s) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 687.721 Td
+(or) 11.9551 Tj
+-426 TJm
+(strm->avail_out) 89.6634 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(1) 5.9776 Tj
+90 675.766 Td
+(BZ_DATA_ERROR) 77.7083 Tj
+98.488 663.811 Td
+(if) 11.9551 Tj
+-426 TJm
+(a) 5.9776 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(integrity) 53.798 Tj
+-426 TJm
+(error) 29.8878 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(detected) 47.8205 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(stream) 35.8654 Tj
+90 651.856 Td
+(BZ_DATA_ERROR_MAGIC) 113.5736 Tj
+98.488 639.9 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(stream) 35.8654 Tj
+-426 TJm
+(doesn't) 41.8429 Tj
+-426 TJm
+(begin) 29.8878 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(right) 29.8878 Tj
+-426 TJm
+(magic) 29.8878 Tj
+-426 TJm
+(bytes) 29.8878 Tj
+90 627.945 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 615.99 Td
+(if) 11.9551 Tj
+-426 TJm
+(there) 29.8878 Tj
+-426 TJm
+(wasn't) 35.8654 Tj
+-426 TJm
+(enough) 35.8654 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(available) 53.798 Tj
+90 604.035 Td
+(BZ_STREAM_END) 77.7083 Tj
+98.488 592.08 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(logical) 41.8429 Tj
+-426 TJm
+(end) 17.9327 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(stream) 35.8654 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(detected) 47.8205 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(all) 17.9327 Tj
+98.488 580.124 Td
+(output) 35.8654 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(consumed,) 53.798 Tj
+-426 TJm
+(eg) 11.9551 Tj
+-426 TJm
+(s-->avail_out) 77.7083 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+90 568.169 Td
+(BZ_OK) 29.8878 Tj
+98.488 556.214 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 518.755 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 457.883] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 509.29 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+98.488 497.335 Td
+(if) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(returned) 47.8205 Tj
+90 485.38 Td
+(BZ2_bzDecompressEnd) 113.5736 Tj
+98.488 473.425 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 427.262 Td
+/F116_0 17.2154 Tf
+(3.3.6.) 43.0729 Tj
+-278 TJm
+(BZ2_bzDecompressEnd) 197.0647 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 398.792] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 414.334 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzDecompressEnd) 113.5736 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bz_stream) 53.798 Tj
+298.259 412.59 Td
+(*) 5.9776 Tj
+304.236 414.334 Td
+(strm) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 376.874 Td
+/F122_0 9.9626 Tf
+(Releases) 34.8591 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(memory) 33.2053 Tj
+-250 TJm
+(associated) 40.9463 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(decompression) 59.7656 Tj
+-250 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 354.956 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 294.085] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 345.492 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 333.537 Td
+(if) 11.9551 Tj
+-426 TJm
+(strm) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(strm->s) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+90 321.581 Td
+(BZ_OK) 29.8878 Tj
+98.488 309.626 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 272.167 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 247.161] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+98.488 262.702 Td
+/F124_0 9.9626 Tf
+(None.) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 212.408 Td
+/F116_0 20.6585 Tf
+(3.4.) 34.4584 Tj
+-278 TJm
+(High-le) 70.0117 Tj
+15 TJm
+(vel) 28.7153 Tj
+-278 TJm
+(interface) 86.1046 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 190.49 Td
+/F122_0 9.9626 Tf
+(This) 17.7135 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+-250 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vides) 21.031 Tj
+-250 TJm
+(functions) 37.0808 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(reading) 29.8778 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(writing) 28.782 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+300.292 190.49 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+332.67 190.49 Td
+/F122_0 9.9626 Tf
+(format) 26.5603 Tj
+-250 TJm
+(\002les.) 19.0983 Tj
+-620 TJm
+(First,) 20.7621 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(general) 29.3199 Tj
+-250 TJm
+(points.) 26.8492 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 158.609 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(All) 12.7322 Tj
+-353 TJm
+(of) 8.2988 Tj
+-352 TJm
+(the) 12.1743 Tj
+-353 TJm
+(functions) 37.0808 Tj
+-352 TJm
+(tak) 12.1743 Tj
+10 TJm
+(e) 4.4234 Tj
+-353 TJm
+(an) 9.4047 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+199.726 158.609 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+217.658 156.866 Td
+(*) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+227.149 158.609 Td
+/F122_0 9.9626 Tf
+(\002rst) 15.5018 Tj
+-353 TJm
+(ar) 7.7409 Tj
+18 TJm
+(gument,) 32.3785 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+289.871 158.609 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+331.715 158.609 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1236 TJm
+(After) 21.0211 Tj
+-352 TJm
+(each) 18.2515 Tj
+-353 TJm
+(call,) 16.8766 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+413.457 158.609 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+458.813 158.609 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-353 TJm
+(be) 9.4047 Tj
+-352 TJm
+(consulted) 38.1866 Tj
+81.963 146.654 Td
+(\002rst) 15.5018 Tj
+-371 TJm
+(to) 7.7509 Tj
+-371 TJm
+(determine) 39.8404 Tj
+-372 TJm
+(the) 12.1743 Tj
+-371 TJm
+(outcome) 34.3112 Tj
+-371 TJm
+(of) 8.2988 Tj
+-371 TJm
+(the) 12.1743 Tj
+-372 TJm
+(call.) 16.8766 Tj
+-1347 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+278.539 146.654 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+324.081 146.654 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+334.424 146.654 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+364.312 146.654 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-371 TJm
+(the) 12.1743 Tj
+-372 TJm
+(call) 14.386 Tj
+-371 TJm
+(completed) 41.5042 Tj
+-371 TJm
+(successfully) 48.6972 Tj
+65 TJm
+(,) 2.4907 Tj
+-402 TJm
+(and) 14.386 Tj
+-371 TJm
+(only) 17.7135 Tj
+81.963 134.699 Td
+(then) 17.1556 Tj
+-292 TJm
+(should) 26.5703 Tj
+-293 TJm
+(the) 12.1743 Tj
+-292 TJm
+(return) 23.7907 Tj
+-292 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-293 TJm
+(of) 8.2988 Tj
+-292 TJm
+(the) 12.1743 Tj
+-292 TJm
+(function) 33.2053 Tj
+-293 TJm
+(\(if) 9.4047 Tj
+-292 TJm
+(an) 9.4047 Tj
+15 TJm
+(y\)) 8.2988 Tj
+-292 TJm
+(be) 9.4047 Tj
+-293 TJm
+(consulted.) 40.6773 Tj
+-874 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.994 134.699 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+408.749 134.699 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+418.307 134.699 Td
+/F124_0 9.9626 Tf
+(BZ_IO_ERROR) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+484.06 134.699 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-292 TJm
+(there) 19.9152 Tj
+-293 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-292 TJm
+(an) 9.4047 Tj
+81.963 122.744 Td
+(error) 19.3573 Tj
+-279 TJm
+(reading/writ) 48.6972 Tj
+1 TJm
+(ing) 12.7322 Tj
+-279 TJm
+(the) 12.1743 Tj
+-279 TJm
+(underlying) 43.1679 Tj
+-278 TJm
+(compressed) 47.0334 Tj
+-279 TJm
+(\002le,) 15.2229 Tj
+-285 TJm
+(and) 14.386 Tj
+-279 TJm
+(you) 14.9439 Tj
+-279 TJm
+(should) 26.5703 Tj
+-278 TJm
+(then) 17.1556 Tj
+-279 TJm
+(consult) 28.782 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+412.785 122.744 Td
+/F124_0 9.9626 Tf
+(errno) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+445.448 122.744 Td
+/F122_0 9.9626 Tf
+(/) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+450.993 122.744 Td
+/F124_0 9.9626 Tf
+(perror) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+489.634 122.744 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-279 TJm
+(determine) 39.8404 Tj
+81.963 110.789 Td
+(the) 12.1743 Tj
+-376 TJm
+(cause) 22.1269 Tj
+-376 TJm
+(of) 8.2988 Tj
+-377 TJm
+(the) 12.1743 Tj
+-376 TJm
+(dif) 11.0684 Tj
+25 TJm
+(\002culty) 25.4644 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.58 110.789 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+249.171 110.789 Td
+/F122_0 9.9626 Tf
+(may) 17.1556 Tj
+-376 TJm
+(also) 16.0497 Tj
+-376 TJm
+(be) 9.4047 Tj
+-377 TJm
+(set) 11.0684 Tj
+-376 TJm
+(to) 7.7509 Tj
+-376 TJm
+(v) 4.9813 Tj
+25 TJm
+(arious) 24.3486 Tj
+-376 TJm
+(other) 20.4731 Tj
+-377 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues;) 23.2427 Tj
+-439 TJm
+(precise) 28.2141 Tj
+-376 TJm
+(details) 26.0123 Tj
+-376 TJm
+(are) 12.1643 Tj
+-377 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-376 TJm
+(on) 9.9626 Tj
+-376 TJm
+(a) 4.4234 Tj
+81.963 98.834 Td
+(per) 12.7222 Tj
+20 TJm
+(-function) 36.5229 Tj
+-250 TJm
+(basis) 19.9252 Tj
+-250 TJm
+(belo) 17.1556 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(18) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 19 22
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+74.491 710.037 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.793 710.037 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+136.332 710.037 Td
+/F122_0 9.9626 Tf
+(indicates) 35.417 Tj
+-271 TJm
+(an) 9.4047 Tj
+-270 TJm
+(error) 19.3573 Tj
+-271 TJm
+(\(ie,) 13.0012 Tj
+-276 TJm
+(an) 9.4047 Tj
+15 TJm
+(ything) 25.4644 Tj
+-271 TJm
+(e) 4.4234 Tj
+15 TJm
+(xcept) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+290.317 710.037 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+322.901 710.037 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+339.984 710.037 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+417.693 710.037 Td
+/F122_0 9.9626 Tf
+(\),) 5.8082 Tj
+-271 TJm
+(you) 14.9439 Tj
+-270 TJm
+(should) 26.5703 Tj
+-271 TJm
+(immediately) 49.813 Tj
+-271 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 698.082 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+173.971 698.082 Td
+/F122_0 9.9626 Tf
+(\(or) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+187.932 698.082 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteClose) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+283.573 698.082 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-238 TJm
+(depending) 41.5042 Tj
+-236 TJm
+(on) 9.9626 Tj
+-235 TJm
+(whether) 32.0895 Tj
+-235 TJm
+(you) 14.9439 Tj
+-236 TJm
+(are) 12.1643 Tj
+-235 TJm
+(attempting) 42.62 Tj
+-235 TJm
+(to) 7.7509 Tj
+-236 TJm
+(read) 17.1456 Tj
+-235 TJm
+(or) 8.2988 Tj
+-235 TJm
+(to) 7.7509 Tj
+-236 TJm
+(write\)) 23.7907 Tj
+-235 TJm
+(to) 7.7509 Tj
+81.963 686.127 Td
+(free) 15.4819 Tj
+-309 TJm
+(up) 9.9626 Tj
+-309 TJm
+(all) 9.9626 Tj
+-309 TJm
+(resources) 37.6188 Tj
+-310 TJm
+(associated) 40.9463 Tj
+-309 TJm
+(with) 17.7135 Tj
+-309 TJm
+(the) 12.1743 Tj
+-309 TJm
+(stream.) 29.0509 Tj
+-975 TJm
+(Once) 21.0211 Tj
+-309 TJm
+(an) 9.4047 Tj
+-310 TJm
+(error) 19.3573 Tj
+-309 TJm
+(has) 13.2801 Tj
+-309 TJm
+(been) 18.8094 Tj
+-309 TJm
+(indicated,) 39.0135 Tj
+-324 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+-309 TJm
+(of) 8.2988 Tj
+-309 TJm
+(all) 9.9626 Tj
+-310 TJm
+(calls) 18.2614 Tj
+-309 TJm
+(e) 4.4234 Tj
+15 TJm
+(xcept) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 674.172 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+175.035 674.172 Td
+/F122_0 9.9626 Tf
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+178.352 674.172 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteClose) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+273.994 674.172 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-342 TJm
+(is) 6.6451 Tj
+-342 TJm
+(unde\002ned.) 41.7831 Tj
+-1173 TJm
+(The) 15.4918 Tj
+-342 TJm
+(implication) 45.3896 Tj
+-342 TJm
+(is) 6.6451 Tj
+-342 TJm
+(that) 14.9439 Tj
+-342 TJm
+(\(1\)) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+455.366 674.172 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+500.617 674.172 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-342 TJm
+(be) 9.4047 Tj
+81.963 662.217 Td
+(check) 23.2328 Tj
+10 TJm
+(ed) 9.4047 Tj
+-331 TJm
+(after) 18.2515 Tj
+-331 TJm
+(each) 18.2515 Tj
+-331 TJm
+(call,) 16.8766 Tj
+-351 TJm
+(and) 14.386 Tj
+-331 TJm
+(\(2\)) 11.6164 Tj
+-331 TJm
+(if) 6.0871 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+223.255 662.217 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+268.396 662.217 Td
+/F122_0 9.9626 Tf
+(indicates) 35.417 Tj
+-331 TJm
+(an) 9.4047 Tj
+-331 TJm
+(error) 19.3573 Tj
+40 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+344.762 662.217 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+437.724 662.217 Td
+/F122_0 9.9626 Tf
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+441.041 662.217 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteClose) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+536.682 662.217 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+81.963 650.261 Td
+(should) 26.5703 Tj
+-250 TJm
+(then) 17.1556 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(called) 23.7907 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(clean) 21.0211 Tj
+-250 TJm
+(up.) 12.4533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 628.344 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(The) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+100.186 628.344 Td
+/F124_0 9.9626 Tf
+(FILE) 23.9102 Tj
+124.097 626.6 Td
+(*) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+132.308 628.344 Td
+/F122_0 9.9626 Tf
+(ar) 7.7409 Tj
+18 TJm
+(guments) 33.7633 Tj
+-224 TJm
+(passed) 26.5603 Tj
+-224 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+214.645 628.344 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadOpen) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+300.565 628.344 Td
+/F122_0 9.9626 Tf
+(/) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+305.569 628.344 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteOpen) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+397.466 628.344 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-224 TJm
+(be) 9.4047 Tj
+-224 TJm
+(set) 11.0684 Tj
+-225 TJm
+(to) 7.7509 Tj
+-224 TJm
+(binary) 25.4544 Tj
+-224 TJm
+(mode.) 24.6275 Tj
+-603 TJm
+(Most) 20.4831 Tj
+81.963 616.389 Td
+(Unix) 19.9252 Tj
+-269 TJm
+(systems) 31.5516 Tj
+-270 TJm
+(will) 15.5018 Tj
+-269 TJm
+(do) 9.9626 Tj
+-269 TJm
+(this) 14.396 Tj
+-270 TJm
+(by) 9.9626 Tj
+-269 TJm
+(def) 12.7222 Tj
+10 TJm
+(ault,) 17.4346 Tj
+-274 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-270 TJm
+(ot) 7.7509 Tj
+1 TJm
+(her) 12.7222 Tj
+-270 TJm
+(platforms,) 40.6773 Tj
+-274 TJm
+(including) 37.6387 Tj
+-269 TJm
+(W) 9.4047 Tj
+40 TJm
+(indo) 17.7135 Tj
+25 TJm
+(ws) 11.0684 Tj
+-270 TJm
+(and) 14.386 Tj
+-269 TJm
+(Mac,) 20.1942 Tj
+-274 TJm
+(will) 15.5018 Tj
+-270 TJm
+(not.) 15.2229 Tj
+-736 TJm
+(If) 6.6351 Tj
+-269 TJm
+(you) 14.9439 Tj
+-269 TJm
+(omit) 18.2714 Tj
+-270 TJm
+(this,) 16.8866 Tj
+81.963 604.433 Td
+(you) 14.9439 Tj
+-250 TJm
+(may) 17.1556 Tj
+-250 TJm
+(encounter) 39.2825 Tj
+-250 TJm
+(problems) 37.0808 Tj
+-250 TJm
+(when) 21.579 Tj
+-250 TJm
+(mo) 12.7322 Tj
+15 TJm
+(ving) 17.7135 Tj
+-250 TJm
+(code) 18.8094 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(ne) 9.4047 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(platforms.) 40.6773 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 582.516 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(Memory) 34.3112 Tj
+-369 TJm
+(allocation) 39.2925 Tj
+-370 TJm
+(requests) 32.6474 Tj
+-369 TJm
+(are) 12.1643 Tj
+-370 TJm
+(handled) 31.5416 Tj
+-369 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+264.468 582.516 Td
+/F124_0 9.9626 Tf
+(malloc) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+304.014 582.516 Td
+/F122_0 9.9626 Tf
+(/) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+310.465 582.516 Td
+/F124_0 9.9626 Tf
+(free) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+334.376 582.516 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1337 TJm
+(At) 9.9626 Tj
+-370 TJm
+(present) 28.772 Tj
+-369 TJm
+(there) 19.9152 Tj
+-370 TJm
+(is) 6.6451 Tj
+-369 TJm
+(no) 9.9626 Tj
+-370 TJm
+(f) 3.3175 Tj
+10 TJm
+(acility) 24.9065 Tj
+-369 TJm
+(for) 11.6164 Tj
+-370 TJm
+(user) 16.5977 Tj
+20 TJm
+(-de\002ned) 32.6474 Tj
+81.963 570.56 Td
+(memory) 33.2053 Tj
+-250 TJm
+(allocators) 38.7346 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(I/O) 13.2801 Tj
+-250 TJm
+(functions) 37.0808 Tj
+-250 TJm
+(\(could) 25.4544 Tj
+-250 TJm
+(easily) 23.2427 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(added,) 26.2813 Tj
+-250 TJm
+(though\).) 33.4843 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 529.977 Td
+/F116_0 17.2154 Tf
+(3.4.1.) 43.0729 Tj
+-278 TJm
+(BZ2_bzReadOpen) 147.3122 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 453.686] cm
+0 0 468 71.731 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 517.048 Td
+/F124_0 9.9626 Tf
+(typedef) 41.8429 Tj
+-426 TJm
+(void) 23.9102 Tj
+-426 TJm
+(BZFILE;) 41.8429 Tj
+90 493.138 Td
+(BZFILE) 35.8654 Tj
+130.109 491.394 Td
+(*) 5.9776 Tj
+136.087 493.138 Td
+(BZ2_bzReadOpen\() 89.6634 Tj
+-426 TJm
+(int) 17.9327 Tj
+252.171 491.394 Td
+(*) 5.9776 Tj
+258.149 493.138 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(FILE) 23.9102 Tj
+338.368 491.394 Td
+(*) 5.9776 Tj
+344.346 493.138 Td
+(f,) 11.9551 Tj
+191.855 481.183 Td
+(int) 17.9327 Tj
+-426 TJm
+(verbosity,) 59.7756 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(small,) 35.8654 Tj
+191.855 469.228 Td
+(void) 23.9102 Tj
+220.01 467.484 Td
+(*) 5.9776 Tj
+225.987 469.228 Td
+(unused,) 41.8429 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(nUnused) 41.8429 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 431.768 Td
+/F122_0 9.9626 Tf
+(Prepare) 30.4258 Tj
+-290 TJm
+(to) 7.7509 Tj
+-289 TJm
+(read) 17.1456 Tj
+-290 TJm
+(compressed) 47.0334 Tj
+-290 TJm
+(data) 16.5977 Tj
+-289 TJm
+(from) 19.3673 Tj
+-290 TJm
+(\002le) 12.7322 Tj
+-289 TJm
+(handle) 26.5603 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+272.697 431.768 Td
+/F124_0 9.9626 Tf
+(f) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+278.675 431.768 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+285.439 431.768 Td
+/F124_0 9.9626 Tf
+(f) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.302 431.768 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-290 TJm
+(refer) 18.7994 Tj
+-289 TJm
+(to) 7.7509 Tj
+-290 TJm
+(a) 4.4234 Tj
+-290 TJm
+(\002le) 12.7322 Tj
+-289 TJm
+(which) 24.3486 Tj
+-290 TJm
+(has) 13.2801 Tj
+-290 TJm
+(been) 18.8094 Tj
+-289 TJm
+(opened) 28.772 Tj
+-290 TJm
+(for) 11.6164 Tj
+-289 TJm
+(reading,) 32.3685 Tj
+-300 TJm
+(and) 14.386 Tj
+72 419.813 Td
+(for) 11.6164 Tj
+-306 TJm
+(which) 24.3486 Tj
+-305 TJm
+(the) 12.1743 Tj
+-306 TJm
+(error) 19.3573 Tj
+-306 TJm
+(indicator) 35.417 Tj
+-305 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+193.457 419.813 Td
+/F124_0 9.9626 Tf
+(ferror\(f\)) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+247.255 419.813 Td
+/F122_0 9.9626 Tf
+(\)is) 9.9626 Tj
+-306 TJm
+(not) 12.7322 Tj
+-305 TJm
+(set.) 13.5591 Tj
+-954 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+308.784 419.813 Td
+/F124_0 9.9626 Tf
+(small) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+341.717 419.813 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-306 TJm
+(1,) 7.472 Tj
+-319 TJm
+(the) 12.1743 Tj
+-306 TJm
+(library) 26.5603 Tj
+-306 TJm
+(wil) 12.7322 Tj
+1 TJm
+(l) 2.7696 Tj
+-306 TJm
+(try) 11.0684 Tj
+-306 TJm
+(to) 7.7509 Tj
+-305 TJm
+(decompress) 47.0334 Tj
+-306 TJm
+(using) 21.589 Tj
+-306 TJm
+(less) 14.9439 Tj
+72 407.858 Td
+(memory) 33.2053 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xpense) 27.6661 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(speed.) 25.1755 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 385.94 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-227 TJm
+(reasons) 29.8778 Tj
+-227 TJm
+(e) 4.4234 Tj
+15 TJm
+(xplained) 34.3112 Tj
+-228 TJm
+(belo) 17.1556 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+189.193 385.94 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+251.232 385.94 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-227 TJm
+(decompress) 47.0334 Tj
+-227 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+332.732 385.94 Td
+/F124_0 9.9626 Tf
+(nUnused) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+376.838 385.94 Td
+/F122_0 9.9626 Tf
+(bytes) 21.031 Tj
+-227 TJm
+(starting) 29.8878 Tj
+-227 TJm
+(at) 7.193 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+441.74 385.94 Td
+/F124_0 9.9626 Tf
+(unused) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+477.605 385.94 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-232 TJm
+(before) 25.4445 Tj
+-227 TJm
+(starting) 29.8878 Tj
+72 373.985 Td
+(to) 7.7509 Tj
+-280 TJm
+(read) 17.1456 Tj
+-279 TJm
+(from) 19.3673 Tj
+-280 TJm
+(the) 12.1743 Tj
+-279 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+155.094 373.985 Td
+/F124_0 9.9626 Tf
+(f) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.072 373.985 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-797 TJm
+(At) 9.9626 Tj
+-280 TJm
+(most) 19.3773 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+206.414 373.985 Td
+/F124_0 9.9626 Tf
+(BZ_MAX_UNUSED) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+286.907 373.985 Td
+/F122_0 9.9626 Tf
+(bytes) 21.031 Tj
+-280 TJm
+(may) 17.1556 Tj
+-279 TJm
+(be) 9.4047 Tj
+-280 TJm
+(supplied) 33.7633 Tj
+-279 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-280 TJm
+(this.) 16.8866 Tj
+-797 TJm
+(If) 6.6351 Tj
+-279 TJm
+(this) 14.396 Tj
+-280 TJm
+(f) 3.3175 Tj
+10 TJm
+(acility) 24.9065 Tj
+-279 TJm
+(is) 6.6451 Tj
+-280 TJm
+(not) 12.7322 Tj
+-279 TJm
+(required,) 35.686 Tj
+72 362.03 Td
+(you) 14.9439 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(pass) 17.1556 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+138.141 362.03 Td
+/F124_0 9.9626 Tf
+(NULL) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+164.542 362.03 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+181.419 362.03 Td
+/F124_0 9.9626 Tf
+(0) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+189.887 362.03 Td
+/F122_0 9.9626 Tf
+(for) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.994 362.03 Td
+/F124_0 9.9626 Tf
+(unused) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+242.35 362.03 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+-250 TJm
+(n) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+264.208 362.03 Td
+/F124_0 9.9626 Tf
+(Unused) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+302.565 362.03 Td
+/F122_0 9.9626 Tf
+(respecti) 30.9837 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ely) 12.1743 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 340.112 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(meaning) 34.3112 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(parameters) 43.7059 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+196.631 340.112 Td
+/F124_0 9.9626 Tf
+(small) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+229.01 340.112 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+245.887 340.112 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+299.685 340.112 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(see) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+319.879 340.112 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressInit) 119.5512 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+439.431 340.112 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 318.194 Td
+(The) 15.4918 Tj
+-402 TJm
+(amount) 29.8878 Tj
+-402 TJm
+(of) 8.2988 Tj
+-402 TJm
+(memory) 33.2053 Tj
+-402 TJm
+(needed) 28.2141 Tj
+-402 TJm
+(to) 7.7509 Tj
+-402 TJm
+(decompress) 47.0334 Tj
+-402 TJm
+(a) 4.4234 Tj
+-401 TJm
+(\002le) 12.7322 Tj
+-402 TJm
+(cannot) 26.5603 Tj
+-402 TJm
+(be) 9.4047 Tj
+-402 TJm
+(determined) 44.8217 Tj
+-402 TJm
+(until) 18.2714 Tj
+-402 TJm
+(the) 12.1743 Tj
+-402 TJm
+(\002le') 16.0497 Tj
+55 TJm
+(s) 3.8755 Tj
+-402 TJm
+(header) 26.5503 Tj
+-402 TJm
+(has) 13.2801 Tj
+-402 TJm
+(been) 18.8094 Tj
+-402 TJm
+(read.) 19.6363 Tj
+72 306.239 Td
+(So) 10.5205 Tj
+-492 TJm
+(it) 5.5392 Tj
+-491 TJm
+(is) 6.6451 Tj
+-492 TJm
+(possible) 32.6574 Tj
+-492 TJm
+(that) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.797 306.239 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadOpen) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+255.381 306.239 Td
+/F122_0 9.9626 Tf
+(returns) 27.6661 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+287.946 306.239 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+322.729 306.239 Td
+/F122_0 9.9626 Tf
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-492 TJm
+(a) 4.4234 Tj
+-491 TJm
+(subsequent) 44.2738 Tj
+-492 TJm
+(call) 14.386 Tj
+-492 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+431.135 306.239 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+495.81 306.239 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-492 TJm
+(return) 23.7907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 294.284 Td
+/F124_0 9.9626 Tf
+(BZ_MEM_ERROR) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+143.731 294.284 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 272.366 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 272.366 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 272.366 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 101.84] cm
+0 0 468 167.372 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 260.844 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+98.488 248.889 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(library) 41.8429 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(mis-compiled) 71.7307 Tj
+90 236.934 Td
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 224.979 Td
+(if) 11.9551 Tj
+-426 TJm
+(f) 5.9776 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 213.023 Td
+(or) 11.9551 Tj
+-426 TJm
+(small) 29.8878 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(neither) 41.8429 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(nor) 17.9327 Tj
+-426 TJm
+(1) 5.9776 Tj
+98.488 201.068 Td
+(or) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(unused) 35.8654 Tj
+-426 TJm
+(==) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(&&) 11.9551 Tj
+-426 TJm
+(nUnused) 41.8429 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(\)) 5.9776 Tj
+98.488 189.113 Td
+(or) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(unused) 35.8654 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(&&) 11.9551 Tj
+-426 TJm
+(!\(0) 17.9327 Tj
+-426 TJm
+(<=) 11.9551 Tj
+-426 TJm
+(nUnused) 41.8429 Tj
+-426 TJm
+(<=) 11.9551 Tj
+-426 TJm
+(BZ_MAX_UNUSED\)) 83.6858 Tj
+-426 TJm
+(\)) 5.9776 Tj
+90 177.158 Td
+(BZ_IO_ERROR) 65.7532 Tj
+98.488 165.203 Td
+(if) 11.9551 Tj
+-426 TJm
+(ferror\(f\)) 53.798 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(nonzero) 41.8429 Tj
+90 153.248 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 141.292 Td
+(if) 11.9551 Tj
+-426 TJm
+(insufficient) 71.7307 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(available) 53.798 Tj
+90 129.337 Td
+(BZ_OK) 29.8878 Tj
+98.488 117.382 Td
+(otherwise.) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 79.922 Td
+/F122_0 9.9626 Tf
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 51.071 Td
+(19) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 20 23
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 660.224] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(Pointer) 41.8429 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(an) 11.9551 Tj
+-426 TJm
+(abstract) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+90 687.721 Td
+(NULL) 23.9102 Tj
+98.488 675.766 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 638.306 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 577.435] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 628.842 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+98.488 616.887 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+90 604.932 Td
+(BZ2_bzClose) 65.7532 Tj
+98.488 592.976 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 546.814 Td
+/F116_0 17.2154 Tf
+(3.4.2.) 43.0729 Tj
+-278 TJm
+(BZ2_bzRead) 103.3096 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 519.841] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 535.383 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzRead) 59.7756 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(int) 17.9327 Tj
+208.595 533.639 Td
+(*) 5.9776 Tj
+214.572 535.383 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+306.747 533.639 Td
+(*) 5.9776 Tj
+312.724 535.383 Td
+(b,) 11.9551 Tj
+-426 TJm
+(void) 23.9102 Tj
+357.078 533.639 Td
+(*) 5.9776 Tj
+363.055 535.383 Td
+(buf,) 23.9102 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(len) 17.9327 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 497.923 Td
+/F122_0 9.9626 Tf
+(Reads) 24.3486 Tj
+-285 TJm
+(up) 9.9626 Tj
+-284 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+122.569 497.923 Td
+/F124_0 9.9626 Tf
+(len) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+143.337 497.923 Td
+/F122_0 9.9626 Tf
+(\(uncompressed\)) 63.6311 Tj
+-285 TJm
+(bytes) 21.031 Tj
+-284 TJm
+(from) 19.3673 Tj
+-285 TJm
+(the) 12.1743 Tj
+-284 TJm
+(compressed) 47.0334 Tj
+-285 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+336.319 497.923 Td
+/F124_0 9.9626 Tf
+(b) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+345.132 497.923 Td
+/F122_0 9.9626 Tf
+(into) 15.5018 Tj
+-285 TJm
+(the) 12.1743 Tj
+-284 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+405.205 497.923 Td
+/F124_0 9.9626 Tf
+(buf) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+423.137 497.923 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-828 TJm
+(If) 6.6351 Tj
+-284 TJm
+(the) 12.1743 Tj
+-285 TJm
+(read) 17.1456 Tj
+-285 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-284 TJm
+(successful,) 43.4369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 485.968 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+117.36 485.968 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-353 TJm
+(set) 11.0684 Tj
+-353 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+153.374 485.968 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+186.778 485.968 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+-353 TJm
+(the) 12.1743 Tj
+-353 TJm
+(number) 30.4357 Tj
+-353 TJm
+(of) 8.2988 Tj
+-353 TJm
+(bytes) 21.031 Tj
+-353 TJm
+(read) 17.1456 Tj
+-353 TJm
+(is) 6.6451 Tj
+-353 TJm
+(returned.) 35.686 Tj
+-1238 TJm
+(If) 6.6351 Tj
+-353 TJm
+(the) 12.1743 Tj
+-353 TJm
+(logical) 27.1182 Tj
+-353 TJm
+(end-of-stream) 55.8802 Tj
+-353 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-353 TJm
+(detected,) 35.686 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 474.013 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+116.795 474.013 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-296 TJm
+(be) 9.4047 Tj
+-297 TJm
+(set) 11.0684 Tj
+-296 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.328 474.013 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+250.037 474.013 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-296 TJm
+(and) 14.386 Tj
+-297 TJm
+(the) 12.1743 Tj
+-296 TJm
+(number) 30.4357 Tj
+-296 TJm
+(of) 8.2988 Tj
+-297 TJm
+(bytes) 21.031 Tj
+-296 TJm
+(read) 17.1456 Tj
+-296 TJm
+(is) 6.6451 Tj
+-296 TJm
+(returned.) 35.686 Tj
+-898 TJm
+(All) 12.7322 Tj
+-297 TJm
+(other) 20.4731 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+470 474.013 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+514.795 474.013 Td
+/F122_0 9.9626 Tf
+(v) 4.9813 Tj
+25 TJm
+(alues) 20.4731 Tj
+72 462.058 Td
+(denote) 26.5603 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(error) 19.3573 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 440.14 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+134.224 440.14 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-246 TJm
+(supply) 26.5703 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+181.193 440.14 Td
+/F124_0 9.9626 Tf
+(len) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+201.575 440.14 Td
+/F122_0 9.9626 Tf
+(bytes,) 23.5217 Tj
+-247 TJm
+(unless) 24.9065 Tj
+-245 TJm
+(the) 12.1743 Tj
+-246 TJm
+(logical) 27.1182 Tj
+-246 TJm
+(stream) 26.5603 Tj
+-246 TJm
+(end) 14.386 Tj
+-245 TJm
+(is) 6.6451 Tj
+-246 TJm
+(detected) 33.1954 Tj
+-246 TJm
+(or) 8.2988 Tj
+-246 TJm
+(an) 9.4047 Tj
+-245 TJm
+(error) 19.3573 Tj
+-246 TJm
+(occurs.) 28.493 Tj
+-617 TJm
+(Because) 33.1954 Tj
+-246 TJm
+(of) 8.2988 Tj
+-246 TJm
+(this,) 16.8866 Tj
+-247 TJm
+(it) 5.5392 Tj
+72 428.185 Td
+(is) 6.6451 Tj
+-231 TJm
+(possible) 32.6574 Tj
+-231 TJm
+(to) 7.7509 Tj
+-231 TJm
+(detect) 23.7907 Tj
+-231 TJm
+(the) 12.1743 Tj
+-231 TJm
+(stream) 26.5603 Tj
+-231 TJm
+(end) 14.386 Tj
+-232 TJm
+(by) 9.9626 Tj
+-231 TJm
+(observing) 39.2925 Tj
+-231 TJm
+(when) 21.579 Tj
+-231 TJm
+(the) 12.1743 Tj
+-231 TJm
+(number) 30.4357 Tj
+-231 TJm
+(of) 8.2988 Tj
+-231 TJm
+(bytes) 21.031 Tj
+-231 TJm
+(returned) 33.1954 Tj
+-231 TJm
+(is) 6.6451 Tj
+-231 TJm
+(less) 14.9439 Tj
+-231 TJm
+(than) 17.1556 Tj
+-232 TJm
+(the) 12.1743 Tj
+-231 TJm
+(number) 30.4357 Tj
+-231 TJm
+(requested.) 40.6673 Tj
+72 416.23 Td
+(Ne) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ertheless,) 37.3498 Tj
+-309 TJm
+(this) 14.396 Tj
+-297 TJm
+(is) 6.6451 Tj
+-298 TJm
+(re) 7.7409 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(arded) 22.1269 Tj
+-297 TJm
+(as) 8.2988 Tj
+-297 TJm
+(inadvisable;) 48.1492 Tj
+-321 TJm
+(you) 14.9439 Tj
+-298 TJm
+(should) 26.5703 Tj
+-297 TJm
+(instead) 28.224 Tj
+-297 TJm
+(check) 23.2328 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+360.631 416.23 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+405.437 416.23 Td
+/F122_0 9.9626 Tf
+(after) 18.2515 Tj
+-297 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-298 TJm
+(call) 14.386 Tj
+-297 TJm
+(and) 14.386 Tj
+-297 TJm
+(w) 7.193 Tj
+10 TJm
+(atch) 16.5977 Tj
+-298 TJm
+(out) 12.7322 Tj
+-297 TJm
+(for) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 404.275 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+149.709 404.275 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 382.357 Td
+(Internally) 38.7346 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+117.541 382.357 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+181.786 382.357 Td
+/F122_0 9.9626 Tf
+(copies) 25.4544 Tj
+-449 TJm
+(data) 16.5977 Tj
+-448 TJm
+(from) 19.3673 Tj
+-449 TJm
+(the) 12.1743 Tj
+-448 TJm
+(compressed) 47.0334 Tj
+-449 TJm
+(\002le) 12.7322 Tj
+-449 TJm
+(in) 7.7509 Tj
+-448 TJm
+(chunks) 28.224 Tj
+-449 TJm
+(of) 8.2988 Tj
+-448 TJm
+(size) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+419.602 382.357 Td
+/F124_0 9.9626 Tf
+(BZ_MAX_UNUSED) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+501.778 382.357 Td
+/F122_0 9.9626 Tf
+(bytes) 21.031 Tj
+-449 TJm
+(be-) 12.7222 Tj
+72 370.402 Td
+(fore) 16.0398 Tj
+-414 TJm
+(decompressing) 59.7656 Tj
+-414 TJm
+(it.) 8.0299 Tj
+-1605 TJm
+(If) 6.6351 Tj
+-415 TJm
+(the) 12.1743 Tj
+-414 TJm
+(\002le) 12.7322 Tj
+-414 TJm
+(contains) 33.2053 Tj
+-414 TJm
+(more) 20.4731 Tj
+-414 TJm
+(bytes) 21.031 Tj
+-415 TJm
+(than) 17.1556 Tj
+-414 TJm
+(strictly) 27.6761 Tj
+-414 TJm
+(needed) 28.2141 Tj
+-414 TJm
+(to) 7.7509 Tj
+-414 TJm
+(reach) 21.569 Tj
+-414 TJm
+(the) 12.1743 Tj
+-415 TJm
+(logical) 27.1182 Tj
+-414 TJm
+(end-of-stream,) 58.3709 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 358.446 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+134.749 358.446 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-298 TJm
+(almost) 26.5703 Tj
+-299 TJm
+(certainly) 34.8591 Tj
+-298 TJm
+(read) 17.1456 Tj
+-299 TJm
+(some) 21.031 Tj
+-298 TJm
+(of) 8.2988 Tj
+-299 TJm
+(the) 12.1743 Tj
+-298 TJm
+(trailing) 28.782 Tj
+-299 TJm
+(data) 16.5977 Tj
+-298 TJm
+(before) 25.4445 Tj
+-298 TJm
+(signalling) 39.3025 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+413.162 358.446 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_END) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+502.826 358.446 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-597 TJm
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-298 TJm
+(col-) 15.4918 Tj
+72 346.491 Td
+(lect) 14.386 Tj
+-242 TJm
+(the) 12.1743 Tj
+-242 TJm
+(read) 17.1456 Tj
+-243 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-242 TJm
+(unused) 28.224 Tj
+-242 TJm
+(data) 16.5977 Tj
+-242 TJm
+(once) 18.8094 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+208.759 346.491 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_END) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+300.835 346.491 Td
+/F122_0 9.9626 Tf
+(has) 13.2801 Tj
+-242 TJm
+(appeared,) 38.4457 Tj
+-244 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+374.201 346.491 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadGetUnused) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+490.188 346.491 Td
+/F122_0 9.9626 Tf
+(immediately) 49.813 Tj
+72 334.536 Td
+(before) 25.4445 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+99.935 334.536 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+189.599 334.536 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 312.618 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 312.618 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 312.618 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(20) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 21 24
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 456.986] cm
+0 0 468 263.014 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(buf) 17.9327 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(len) 17.9327 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+90 687.721 Td
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+98.488 675.766 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(opened) 35.8654 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(BZ2_bzWriteOpen) 89.6634 Tj
+90 663.811 Td
+(BZ_IO_ERROR) 65.7532 Tj
+98.488 651.856 Td
+(if) 11.9551 Tj
+-426 TJm
+(there) 29.8878 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(an) 11.9551 Tj
+-426 TJm
+(error) 29.8878 Tj
+-426 TJm
+(reading) 41.8429 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(file) 23.9102 Tj
+90 639.9 Td
+(BZ_UNEXPECTED_EOF) 101.6185 Tj
+98.488 627.945 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(file) 23.9102 Tj
+-426 TJm
+(ended) 29.8878 Tj
+-426 TJm
+(before) 35.8654 Tj
+98.488 615.99 Td
+(the) 17.9327 Tj
+-426 TJm
+(logical) 41.8429 Tj
+-426 TJm
+(end-of-stream) 77.7083 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(detected) 47.8205 Tj
+90 604.035 Td
+(BZ_DATA_ERROR) 77.7083 Tj
+98.488 592.08 Td
+(if) 11.9551 Tj
+-426 TJm
+(a) 5.9776 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(integrity) 53.798 Tj
+-426 TJm
+(error) 29.8878 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(detected) 47.8205 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(stream) 35.8654 Tj
+90 580.124 Td
+(BZ_DATA_ERROR_MAGIC) 113.5736 Tj
+98.488 568.169 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(stream) 35.8654 Tj
+-426 TJm
+(does) 23.9102 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(begin) 29.8878 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(requisite) 53.798 Tj
+-426 TJm
+(header) 35.8654 Tj
+-426 TJm
+(bytes) 29.8878 Tj
+98.488 556.214 Td
+(\(ie,) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(a) 5.9776 Tj
+-426 TJm
+(bzip2) 29.8878 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(file\).) 35.8654 Tj
+-852 TJm
+(This) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(really) 35.8654 Tj
+98.488 544.259 Td
+(a) 5.9776 Tj
+-426 TJm
+(special) 41.8429 Tj
+-426 TJm
+(case) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(BZ_DATA_ERROR.) 83.6858 Tj
+90 532.304 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 520.349 Td
+(if) 11.9551 Tj
+-426 TJm
+(insufficient) 71.7307 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(available) 53.798 Tj
+90 508.393 Td
+(BZ_STREAM_END) 77.7083 Tj
+98.488 496.438 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(logical) 41.8429 Tj
+-426 TJm
+(end) 17.9327 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(stream) 35.8654 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(detected.) 53.798 Tj
+90 484.483 Td
+(BZ_OK) 29.8878 Tj
+98.488 472.528 Td
+(otherwise.) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 435.068 Td
+/F122_0 9.9626 Tf
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 374.197] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 425.604 Td
+/F124_0 9.9626 Tf
+(number) 35.8654 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(bytes) 29.8878 Tj
+-426 TJm
+(read) 23.9102 Tj
+98.488 413.649 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(BZ_STREAM_END) 77.7083 Tj
+90 401.694 Td
+(undefined) 53.798 Tj
+98.488 389.739 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 352.279 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 267.497] cm
+0 0 468 83.686 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 342.815 Td
+/F124_0 9.9626 Tf
+(collect) 41.8429 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(buf,) 23.9102 Tj
+-426 TJm
+(then) 23.9102 Tj
+-426 TJm
+(BZ2_bzRead) 59.7756 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(BZ2_bzReadClose) 89.6634 Tj
+98.488 330.859 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+90 318.904 Td
+(collect) 41.8429 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(buf,) 23.9102 Tj
+-426 TJm
+(then) 23.9102 Tj
+-426 TJm
+(BZ2_bzReadClose) 89.6634 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(BZ2_bzReadGetUnused) 113.5736 Tj
+98.488 306.949 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_SEQUENCE_END) 89.6634 Tj
+90 294.994 Td
+(BZ2_bzReadClose) 89.6634 Tj
+98.488 283.039 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 236.876 Td
+/F116_0 17.2154 Tf
+(3.4.3.) 43.0729 Tj
+-278 TJm
+(BZ2_bzReadGetUn) 154.9558 Tj
+10 TJm
+(used) 40.1807 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 197.948] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 225.445 Td
+/F124_0 9.9626 Tf
+(void) 23.9102 Tj
+-426 TJm
+(BZ2_bzReadGetUnused\() 119.5512 Tj
+-426 TJm
+(int) 17.9327 Tj
+259.883 223.702 Td
+(*) 5.9776 Tj
+270.104 225.445 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+362.278 223.702 Td
+(*) 5.9776 Tj
+368.256 225.445 Td
+(b,) 11.9551 Tj
+200.343 213.49 Td
+(void) 23.9102 Tj
+224.254 211.747 Td
+(**) 11.9551 Tj
+240.453 213.49 Td
+(unused,) 41.8429 Tj
+-426 TJm
+(int) 17.9327 Tj
+304.473 211.747 Td
+(*) 5.9776 Tj
+314.694 213.49 Td
+(nUnused) 41.8429 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 176.031 Td
+/F122_0 9.9626 Tf
+(Returns) 30.9936 Tj
+-435 TJm
+(data) 16.5977 Tj
+-435 TJm
+(which) 24.3486 Tj
+-435 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-435 TJm
+(read) 17.1456 Tj
+-435 TJm
+(from) 19.3673 Tj
+-435 TJm
+(the) 12.1743 Tj
+-435 TJm
+(compressed) 47.0334 Tj
+-435 TJm
+(\002le) 12.7322 Tj
+-435 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-435 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-435 TJm
+(not) 12.7322 Tj
+-435 TJm
+(needed) 28.2141 Tj
+-435 TJm
+(to) 7.7509 Tj
+-435 TJm
+(get) 12.1743 Tj
+-435 TJm
+(to) 7.7509 Tj
+-435 TJm
+(the) 12.1743 Tj
+-435 TJm
+(logical) 27.1182 Tj
+-435 TJm
+(end-of-stream.) 58.3709 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 162.332 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+77.978 164.075 Td
+(unused) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+117.2 164.075 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-337 TJm
+(set) 11.0684 Tj
+-337 TJm
+(to) 7.7509 Tj
+-337 TJm
+(the) 12.1743 Tj
+-337 TJm
+(address) 29.8778 Tj
+-337 TJm
+(of) 8.2988 Tj
+-336 TJm
+(the) 12.1743 Tj
+-337 TJm
+(data,) 19.0883 Tj
+-359 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+269.089 162.332 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+275.067 164.075 Td
+(nUnused) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+320.267 164.075 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-337 TJm
+(the) 12.1743 Tj
+-337 TJm
+(number) 30.4357 Tj
+-337 TJm
+(of) 8.2988 Tj
+-337 TJm
+(bytes.) 23.5217 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+427.247 162.332 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+433.225 164.075 Td
+(nUnused) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+478.425 164.075 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-337 TJm
+(be) 9.4047 Tj
+-337 TJm
+(set) 11.0684 Tj
+-337 TJm
+(to) 7.7509 Tj
+-337 TJm
+(a) 4.4234 Tj
+72 152.12 Td
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-250 TJm
+(between) 33.1954 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+131.506 152.12 Td
+/F124_0 9.9626 Tf
+(0) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+139.975 152.12 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+156.851 152.12 Td
+/F124_0 9.9626 Tf
+(BZ_MAX_UNUSED) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+237.05 152.12 Td
+/F122_0 9.9626 Tf
+(inclusi) 26.5703 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e.) 6.914 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 130.202 Td
+(This) 17.7135 Tj
+-882 TJm
+(function) 33.2053 Tj
+-883 TJm
+(may) 17.1556 Tj
+-882 TJm
+(only) 17.7135 Tj
+-883 TJm
+(be) 9.4047 Tj
+-882 TJm
+(called) 23.7907 Tj
+-883 TJm
+(once) 18.8094 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+271.332 130.202 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+339.9 130.202 Td
+/F122_0 9.9626 Tf
+(has) 13.2801 Tj
+-882 TJm
+(signalled) 35.9749 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+406.737 130.202 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+493.231 130.202 Td
+/F122_0 9.9626 Tf
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-882 TJm
+(before) 25.4445 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 118.247 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.664 118.247 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 96.329 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 96.329 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 96.329 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.852 Td
+(21) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 22 25
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 612.403] cm
+0 0 468 107.597 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 687.721 Td
+(or) 11.9551 Tj
+-426 TJm
+(unused) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(nUnused) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+90 675.766 Td
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+98.488 663.811 Td
+(if) 11.9551 Tj
+-426 TJm
+(BZ_STREAM_END) 77.7083 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(not) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(signalled) 53.798 Tj
+98.488 651.856 Td
+(or) 11.9551 Tj
+-426 TJm
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(opened) 35.8654 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(BZ2_bzWriteOpen) 89.6634 Tj
+90 639.9 Td
+(BZ_OK) 29.8878 Tj
+98.488 627.945 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 590.486 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 565.48] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 581.021 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 534.858 Td
+/F116_0 17.2154 Tf
+(3.4.4.) 43.0729 Tj
+-278 TJm
+(BZ2_bzReadClose) 150.1871 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 507.886] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 523.428 Td
+/F124_0 9.9626 Tf
+(void) 23.9102 Tj
+-426 TJm
+(BZ2_bzReadClose) 89.6634 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(int) 17.9327 Tj
+244.46 521.684 Td
+(*) 5.9776 Tj
+250.438 523.428 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+342.612 521.684 Td
+(*) 5.9776 Tj
+348.59 523.428 Td
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 485.968 Td
+/F122_0 9.9626 Tf
+(Releases) 34.8591 Tj
+-430 TJm
+(all) 9.9626 Tj
+-429 TJm
+(memory) 33.2053 Tj
+-430 TJm
+(pertaining) 40.3983 Tj
+-429 TJm
+(to) 7.7509 Tj
+-430 TJm
+(the) 12.1743 Tj
+-429 TJm
+(compressed) 47.0334 Tj
+-430 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+304.352 485.968 Td
+/F124_0 9.9626 Tf
+(b) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+310.33 485.968 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+321.276 485.968 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+415.22 485.968 Td
+/F122_0 9.9626 Tf
+(does) 18.2614 Tj
+-430 TJm
+(not) 12.7322 Tj
+-429 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+473.438 485.968 Td
+/F124_0 9.9626 Tf
+(fclose) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+513.583 485.968 Td
+/F122_0 9.9626 Tf
+(on) 9.9626 Tj
+-430 TJm
+(the) 12.1743 Tj
+72 474.013 Td
+(underlying) 43.1679 Tj
+-264 TJm
+(\002le) 12.7322 Tj
+-264 TJm
+(handle,) 29.0509 Tj
+-267 TJm
+(so) 8.8568 Tj
+-264 TJm
+(you) 14.9439 Tj
+-264 TJm
+(should) 26.5703 Tj
+-264 TJm
+(do) 9.9626 Tj
+-264 TJm
+(that) 14.9439 Tj
+-264 TJm
+(yourself) 32.6474 Tj
+-264 TJm
+(if) 6.0871 Tj
+-263 TJm
+(appropriate.) 47.8603 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+348.653 474.013 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+440.946 474.013 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-264 TJm
+(be) 9.4047 Tj
+-264 TJm
+(called) 23.7907 Tj
+-264 TJm
+(to) 7.7509 Tj
+-264 TJm
+(clean) 21.0211 Tj
+72 462.058 Td
+(up) 9.9626 Tj
+-250 TJm
+(after) 18.2515 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(situations.) 40.6873 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 440.14 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 440.14 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 440.14 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 377.211] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 428.618 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+98.488 416.663 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(opened) 35.8654 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(BZ2_bzOpenWrite) 89.6634 Tj
+90 404.708 Td
+(BZ_OK) 29.8878 Tj
+98.488 392.753 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 355.293 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 330.287] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 345.829 Td
+/F124_0 9.9626 Tf
+(none) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 299.666 Td
+/F116_0 17.2154 Tf
+(3.4.5.) 43.0729 Tj
+-278 TJm
+(BZ2_bzWriteOpen) 148.259 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 247.286] cm
+0 0 468 47.821 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 286.738 Td
+/F124_0 9.9626 Tf
+(BZFILE) 35.8654 Tj
+130.109 284.994 Td
+(*) 5.9776 Tj
+136.087 286.738 Td
+(BZ2_bzWriteOpen\() 95.641 Tj
+-426 TJm
+(int) 17.9327 Tj
+258.149 284.994 Td
+(*) 5.9776 Tj
+264.127 286.738 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(FILE) 23.9102 Tj
+344.346 284.994 Td
+(*) 5.9776 Tj
+350.323 286.738 Td
+(f,) 11.9551 Tj
+196.099 274.783 Td
+(int) 17.9327 Tj
+-426 TJm
+(blockSize100k,) 83.6858 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(verbosity,) 59.7756 Tj
+196.099 262.827 Td
+(int) 17.9327 Tj
+-426 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 225.368 Td
+/F122_0 9.9626 Tf
+(Prepare) 30.4258 Tj
+-268 TJm
+(to) 7.7509 Tj
+-269 TJm
+(write) 20.4731 Tj
+-268 TJm
+(compressed) 47.0334 Tj
+-269 TJm
+(data) 16.5977 Tj
+-268 TJm
+(to) 7.7509 Tj
+-269 TJm
+(\002le) 12.7322 Tj
+-268 TJm
+(handle) 26.5603 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+262.72 225.368 Td
+/F124_0 9.9626 Tf
+(f) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+268.698 225.368 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+274.829 225.368 Td
+/F124_0 9.9626 Tf
+(f) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+283.481 225.368 Td
+/F122_0 9.9626 Tf
+(should) 26.5703 Tj
+-268 TJm
+(refer) 18.7994 Tj
+-269 TJm
+(to) 7.7509 Tj
+-268 TJm
+(a) 4.4234 Tj
+-269 TJm
+(\002le) 12.7322 Tj
+-268 TJm
+(which) 24.3486 Tj
+-269 TJm
+(has) 13.2801 Tj
+-268 TJm
+(been) 18.8094 Tj
+-269 TJm
+(opened) 28.772 Tj
+-268 TJm
+(for) 11.6164 Tj
+-269 TJm
+(writing,) 31.2726 Tj
+-273 TJm
+(and) 14.386 Tj
+-268 TJm
+(for) 11.6164 Tj
+72 213.413 Td
+(which) 24.3486 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(indicator) 35.417 Tj
+-250 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+176.577 213.413 Td
+/F124_0 9.9626 Tf
+(ferror\(f\)) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+230.375 213.413 Td
+/F122_0 9.9626 Tf
+(\)is) 9.9626 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(set.) 13.5591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 191.495 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-223 TJm
+(the) 12.1743 Tj
+-224 TJm
+(meaning) 34.3112 Tj
+-223 TJm
+(of) 8.2988 Tj
+-224 TJm
+(parameters) 43.7059 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+195.306 191.495 Td
+/F124_0 9.9626 Tf
+(blockSize100k) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+273.015 191.495 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+277.784 191.495 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+333.808 191.495 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+350.42 191.495 Td
+/F124_0 9.9626 Tf
+(workFactor) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+410.196 191.495 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-229 TJm
+(see) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+429.913 191.495 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 191.495 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 169.577 Td
+(All) 12.7322 Tj
+-382 TJm
+(required) 33.1954 Tj
+-382 TJm
+(memory) 33.2053 Tj
+-382 TJm
+(is) 6.6451 Tj
+-382 TJm
+(allocated) 35.965 Tj
+-383 TJm
+(at) 7.193 Tj
+-382 TJm
+(this) 14.396 Tj
+-382 TJm
+(stage,) 22.9638 Tj
+-415 TJm
+(so) 8.8568 Tj
+-382 TJm
+(if) 6.0871 Tj
+-382 TJm
+(the) 12.1743 Tj
+-382 TJm
+(call) 14.386 Tj
+-382 TJm
+(completes) 40.3983 Tj
+-382 TJm
+(successfully) 48.6972 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+424.691 169.577 Td
+/F124_0 9.9626 Tf
+(BZ_MEM_ERROR) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+500.228 169.577 Td
+/F122_0 9.9626 Tf
+(cannot) 26.5603 Tj
+-382 TJm
+(be) 9.4047 Tj
+72 157.622 Td
+(signalled) 35.9749 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(subsequent) 44.2738 Tj
+-250 TJm
+(call) 14.386 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+203.715 157.622 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+269.468 157.622 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 135.704 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 135.704 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 135.704 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.852 Td
+(22) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 23 26
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 576.538] cm
+0 0 468 143.462 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(library) 41.8429 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(mis-compiled) 71.7307 Tj
+90 687.721 Td
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 675.766 Td
+(if) 11.9551 Tj
+-426 TJm
+(f) 5.9776 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 663.811 Td
+(or) 11.9551 Tj
+-426 TJm
+(blockSize100k) 77.7083 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(1) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(blockSize100k) 77.7083 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(9) 5.9776 Tj
+90 651.856 Td
+(BZ_IO_ERROR) 65.7532 Tj
+98.488 639.9 Td
+(if) 11.9551 Tj
+-426 TJm
+(ferror\(f\)) 53.798 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(nonzero) 41.8429 Tj
+90 627.945 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 615.99 Td
+(if) 11.9551 Tj
+-426 TJm
+(insufficient) 71.7307 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(available) 53.798 Tj
+90 604.035 Td
+(BZ_OK) 29.8878 Tj
+98.488 592.08 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 554.62 Td
+/F122_0 9.9626 Tf
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 493.749] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 545.156 Td
+/F124_0 9.9626 Tf
+(Pointer) 41.8429 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(an) 11.9551 Tj
+-426 TJm
+(abstract) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+98.488 533.201 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+90 521.245 Td
+(NULL) 23.9102 Tj
+98.488 509.29 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 471.831 Td
+/F122_0 9.9626 Tf
+(Allo) 17.7135 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able) 16.5977 Tj
+-250 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(actions:) 30.9936 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 387.049] cm
+0 0 468 83.686 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 462.366 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWrite) 65.7532 Tj
+98.488 450.411 Td
+(if) 11.9551 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+98.488 438.456 Td
+(\(you) 23.9102 Tj
+-426 TJm
+(could) 29.8878 Tj
+-426 TJm
+(go) 11.9551 Tj
+-426 TJm
+(directly) 47.8205 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(BZ2_bzWriteClose,) 101.6185 Tj
+-426 TJm
+(but) 17.9327 Tj
+-426 TJm
+(this) 23.9102 Tj
+-426 TJm
+(would) 29.8878 Tj
+-426 TJm
+(be) 11.9551 Tj
+-426 TJm
+(pretty) 35.8654 Tj
+485.506 434.212 Td
+/F548_0 9.9626 Tf
+( ) 9.9626 Tj
+493.808 434.212 Td
+/F230_0 9.9626 Tf
+(-) 2.7676 Tj
+90 426.501 Td
+/F124_0 9.9626 Tf
+(pointless\)) 59.7756 Tj
+90 414.546 Td
+(BZ2_bzWriteClose) 95.641 Tj
+98.488 402.59 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 356.428 Td
+/F116_0 17.2154 Tf
+(3.4.6.) 43.0729 Tj
+-278 TJm
+(BZ2_bzWrite) 104.2565 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 329.455] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 344.997 Td
+/F124_0 9.9626 Tf
+(void) 23.9102 Tj
+-426 TJm
+(BZ2_bzWrite) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(int) 17.9327 Tj
+220.55 343.254 Td
+(*) 5.9776 Tj
+226.528 344.997 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+318.702 343.254 Td
+(*) 5.9776 Tj
+324.679 344.997 Td
+(b,) 11.9551 Tj
+-426 TJm
+(void) 23.9102 Tj
+369.033 343.254 Td
+(*) 5.9776 Tj
+375.01 344.997 Td
+(buf,) 23.9102 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(len) 17.9327 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 307.537 Td
+/F122_0 9.9626 Tf
+(Absorbs) 33.2053 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+107.696 307.537 Td
+/F124_0 9.9626 Tf
+(len) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+128.119 307.537 Td
+/F122_0 9.9626 Tf
+(bytes) 21.031 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+214.544 307.537 Td
+/F124_0 9.9626 Tf
+(buf) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+232.477 307.537 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(entually) 32.0995 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(written) 28.224 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(\002le.) 15.2229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 285.62 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 285.62 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 285.62 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 174.87] cm
+0 0 468 107.597 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 274.098 Td
+/F124_0 9.9626 Tf
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 262.143 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(buf) 17.9327 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(len) 17.9327 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+90 250.188 Td
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+98.488 238.232 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(opened) 35.8654 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(BZ2_bzReadOpen) 83.6858 Tj
+90 226.277 Td
+(BZ_IO_ERROR) 65.7532 Tj
+98.488 214.322 Td
+(if) 11.9551 Tj
+-426 TJm
+(there) 29.8878 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(an) 11.9551 Tj
+-426 TJm
+(error) 29.8878 Tj
+-426 TJm
+(writing) 41.8429 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(file.) 29.8878 Tj
+90 202.367 Td
+(BZ_OK) 29.8878 Tj
+98.488 190.412 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 144.249 Td
+/F116_0 17.2154 Tf
+(3.4.7.) 43.0729 Tj
+-278 TJm
+(BZ2_bzWriteClose) 151.134 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+/F122_0 9.9626 Tf
+(23) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 24 27
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 576.538] cm
+0 0 468 143.462 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(void) 23.9102 Tj
+-426 TJm
+(BZ2_bzWriteClose\() 101.6185 Tj
+-426 TJm
+(int) 17.9327 Tj
+246.194 709.888 Td
+(*) 5.9776 Tj
+252.172 711.631 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+340.102 709.888 Td
+(*) 5.9776 Tj
+350.323 711.631 Td
+(f,) 11.9551 Tj
+187.611 699.676 Td
+(int) 17.9327 Tj
+-426 TJm
+(abandon,) 47.8205 Tj
+187.611 687.721 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+257.609 685.978 Td
+(*) 5.9776 Tj
+267.83 687.721 Td
+(nbytes_in,) 59.7756 Tj
+187.611 675.766 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+257.609 674.022 Td
+(*) 5.9776 Tj
+267.83 675.766 Td
+(nbytes_out) 59.7756 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 651.856 Td
+(void) 23.9102 Tj
+-426 TJm
+(BZ2_bzWriteClose64\() 113.5736 Tj
+-426 TJm
+(int) 17.9327 Tj
+258.149 650.112 Td
+(*) 5.9776 Tj
+264.127 651.856 Td
+(bzerror,) 47.8205 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+352.057 650.112 Td
+(*) 5.9776 Tj
+362.278 651.856 Td
+(f,) 11.9551 Tj
+196.099 639.9 Td
+(int) 17.9327 Tj
+-426 TJm
+(abandon,) 47.8205 Tj
+196.099 627.945 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+266.097 626.202 Td
+(*) 5.9776 Tj
+276.318 627.945 Td
+(nbytes_in_lo32,) 89.6634 Tj
+196.099 615.99 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+266.097 614.247 Td
+(*) 5.9776 Tj
+276.318 615.99 Td
+(nbytes_in_hi32,) 89.6634 Tj
+196.099 604.035 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+266.097 602.291 Td
+(*) 5.9776 Tj
+276.318 604.035 Td
+(nbytes_out_lo32,) 95.641 Tj
+196.099 592.08 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+266.097 590.336 Td
+(*) 5.9776 Tj
+276.318 592.08 Td
+(nbytes_out_hi32) 89.6634 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 554.62 Td
+/F122_0 9.9626 Tf
+(Compresses) 48.1492 Tj
+-403 TJm
+(and) 14.386 Tj
+-402 TJm
+(\003ushes) 27.6761 Tj
+-403 TJm
+(to) 7.7509 Tj
+-403 TJm
+(the) 12.1743 Tj
+-402 TJm
+(compressed) 47.0334 Tj
+-403 TJm
+(\002le) 12.7322 Tj
+-402 TJm
+(all) 9.9626 Tj
+-403 TJm
+(data) 16.5977 Tj
+-403 TJm
+(so) 8.8568 Tj
+-402 TJm
+(f) 3.3175 Tj
+10 TJm
+(ar) 7.7409 Tj
+-403 TJm
+(supplied) 33.7633 Tj
+-403 TJm
+(by) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+384.152 554.62 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+449.906 554.62 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-768 TJm
+(The) 15.4918 Tj
+-403 TJm
+(logical) 27.1182 Tj
+-402 TJm
+(end-of-) 29.3199 Tj
+72 542.665 Td
+(stream) 26.5603 Tj
+-352 TJm
+(mark) 20.4731 Tj
+10 TJm
+(ers) 11.6164 Tj
+-352 TJm
+(are) 12.1643 Tj
+-353 TJm
+(also) 16.0497 Tj
+-352 TJm
+(written,) 30.7147 Tj
+-378 TJm
+(so) 8.8568 Tj
+-352 TJm
+(subsequent) 44.2738 Tj
+-352 TJm
+(calls) 18.2614 Tj
+-352 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+300.456 542.665 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+369.718 542.665 Td
+/F122_0 9.9626 Tf
+(are) 12.1643 Tj
+-352 TJm
+(ille) 12.7322 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(al.) 9.6836 Tj
+-1234 TJm
+(All) 12.7322 Tj
+-352 TJm
+(memory) 33.2053 Tj
+-352 TJm
+(associated) 40.9463 Tj
+-352 TJm
+(with) 17.7135 Tj
+72 530.71 Td
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+151.411 530.71 Td
+/F124_0 9.9626 Tf
+(b) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.88 530.71 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(released.) 35.1281 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+207.231 530.71 Td
+/F124_0 9.9626 Tf
+(fflush) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+245.587 530.71 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(called) 23.7907 Tj
+-250 TJm
+(on) 9.9626 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le,) 15.2229 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(not) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+422.771 530.71 Td
+/F124_0 9.9626 Tf
+(fclose) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+458.636 530.71 Td
+/F122_0 9.9626 Tf
+(') 3.3175 Tj
+50 TJm
+(d.) 7.472 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 508.792 Td
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.574 508.792 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteClose) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+180.155 508.792 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-295 TJm
+(called) 23.7907 Tj
+-295 TJm
+(to) 7.7509 Tj
+-295 TJm
+(clean) 21.0211 Tj
+-295 TJm
+(up) 9.9626 Tj
+-295 TJm
+(after) 18.2515 Tj
+-295 TJm
+(an) 9.4047 Tj
+-295 TJm
+(error) 19.3573 Tj
+40 TJm
+(,) 2.4907 Tj
+-306 TJm
+(the) 12.1743 Tj
+-295 TJm
+(only) 17.7135 Tj
+-295 TJm
+(action) 24.3486 Tj
+-295 TJm
+(is) 6.6451 Tj
+-295 TJm
+(to) 7.7509 Tj
+-295 TJm
+(release) 27.6562 Tj
+-295 TJm
+(the) 12.1743 Tj
+-295 TJm
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+-891 TJm
+(The) 15.4918 Tj
+-295 TJm
+(library) 26.5603 Tj
+72 496.837 Td
+(records) 29.3199 Tj
+-289 TJm
+(the) 12.1743 Tj
+-289 TJm
+(error) 19.3573 Tj
+-289 TJm
+(codes) 22.6848 Tj
+-289 TJm
+(issued) 24.9065 Tj
+-289 TJm
+(by) 9.9626 Tj
+-289 TJm
+(pre) 12.7222 Tj
+25 TJm
+(vious) 21.589 Tj
+-289 TJm
+(calls,) 20.7521 Tj
+-299 TJm
+(so) 8.8568 Tj
+-289 TJm
+(this) 14.396 Tj
+-289 TJm
+(situation) 34.3212 Tj
+-289 TJm
+(will) 15.5018 Tj
+-289 TJm
+(be) 9.4047 Tj
+-289 TJm
+(detected) 33.1954 Tj
+-289 TJm
+(automatically) 54.2364 Tj
+65 TJm
+(.) 2.4907 Tj
+-427 TJm
+(There) 23.2328 Tj
+-289 TJm
+(is) 6.6451 Tj
+-289 TJm
+(no) 9.9626 Tj
+-289 TJm
+(attempt) 29.8878 Tj
+72 484.882 Td
+(to) 7.7509 Tj
+-263 TJm
+(complete) 36.5229 Tj
+-262 TJm
+(the) 12.1743 Tj
+-263 TJm
+(compression) 50.3609 Tj
+-263 TJm
+(operation,) 40.1194 Tj
+-265 TJm
+(nor) 13.2801 Tj
+-263 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+258.308 484.882 Td
+/F124_0 9.9626 Tf
+(fflush) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+296.79 484.882 Td
+/F122_0 9.9626 Tf
+(the) 12.1743 Tj
+-263 TJm
+(compressed) 47.0334 Tj
+-262 TJm
+(\002le.) 15.2229 Tj
+-696 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-263 TJm
+(can) 13.8281 Tj
+-263 TJm
+(force) 20.4632 Tj
+-262 TJm
+(this) 14.396 Tj
+-263 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+-263 TJm
+(to) 7.7509 Tj
+-262 TJm
+(happen) 28.772 Tj
+72 472.926 Td
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(case) 17.1456 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(no) 9.9626 Tj
+-250 TJm
+(error) 19.3573 Tj
+40 TJm
+(,) 2.4907 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(passing) 29.8878 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(nonzero) 32.0895 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue) 16.5977 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+305.015 472.926 Td
+/F124_0 9.9626 Tf
+(abandon) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+346.858 472.926 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 451.009 Td
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+80.597 451.009 Td
+/F124_0 9.9626 Tf
+(nbytes_in) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+136.358 451.009 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-197 TJm
+(non-null,) 36.2539 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+183.287 449.265 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+189.265 451.009 Td
+(nbytes_in) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+245.025 451.009 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-197 TJm
+(be) 9.4047 Tj
+-197 TJm
+(set) 11.0684 Tj
+-197 TJm
+(to) 7.7509 Tj
+-197 TJm
+(be) 9.4047 Tj
+-197 TJm
+(the) 12.1743 Tj
+-197 TJm
+(total) 17.7135 Tj
+-197 TJm
+(v) 4.9813 Tj
+20 TJm
+(olume) 24.9065 Tj
+-197 TJm
+(of) 8.2988 Tj
+-197 TJm
+(uncompressed) 56.996 Tj
+-197 TJm
+(data) 16.5977 Tj
+-197 TJm
+(handled.) 34.0322 Tj
+-584 TJm
+(Similarly) 37.0908 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 439.053 Td
+/F124_0 9.9626 Tf
+(nbytes_out) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+134.716 439.053 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-295 TJm
+(be) 9.4047 Tj
+-295 TJm
+(set) 11.0684 Tj
+-295 TJm
+(to) 7.7509 Tj
+-295 TJm
+(the) 12.1743 Tj
+-295 TJm
+(total) 17.7135 Tj
+-295 TJm
+(v) 4.9813 Tj
+20 TJm
+(olume) 24.9065 Tj
+-295 TJm
+(of) 8.2988 Tj
+-296 TJm
+(compressed) 47.0334 Tj
+-295 TJm
+(data) 16.5977 Tj
+-295 TJm
+(written.) 30.7147 Tj
+-890 TJm
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-295 TJm
+(compatibility) 53.1405 Tj
+-295 TJm
+(with) 17.7135 Tj
+-295 TJm
+(older) 20.4731 Tj
+-295 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-296 TJm
+(of) 8.2988 Tj
+72 427.098 Td
+(the) 12.1743 Tj
+-283 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+118.294 427.098 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteClose) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.753 427.098 Td
+/F122_0 9.9626 Tf
+(only) 17.7135 Tj
+-283 TJm
+(yields) 23.8007 Tj
+-283 TJm
+(the) 12.1743 Tj
+-282 TJm
+(lo) 7.7509 Tj
+25 TJm
+(wer) 14.9339 Tj
+-283 TJm
+(32) 9.9626 Tj
+-283 TJm
+(bits) 14.396 Tj
+-283 TJm
+(of) 8.2988 Tj
+-283 TJm
+(these) 20.4731 Tj
+-282 TJm
+(counts.) 28.503 Tj
+-817 TJm
+(Use) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+423.499 427.098 Td
+/F124_0 9.9626 Tf
+(BZ2_bzWriteClose64) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+533.913 427.098 Td
+/F122_0 9.9626 Tf
+(if) 6.0871 Tj
+72 415.143 Td
+(you) 14.9439 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(full) 13.8381 Tj
+-250 TJm
+(64) 9.9626 Tj
+-250 TJm
+(bit) 10.5205 Tj
+-250 TJm
+(counts.) 28.503 Tj
+-620 TJm
+(These) 23.7907 Tj
+-250 TJm
+(tw) 9.9626 Tj
+10 TJm
+(o) 4.9813 Tj
+-250 TJm
+(functions) 37.0808 Tj
+-250 TJm
+(are) 12.1643 Tj
+-250 TJm
+(otherwise) 38.7346 Tj
+-250 TJm
+(absolutely) 40.9562 Tj
+-250 TJm
+(identical.) 36.8018 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 393.225 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(assignments) 48.7072 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+169.144 393.225 Td
+/F124_0 9.9626 Tf
+(bzerror) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.987 393.225 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 306.386] cm
+0 0 468 83.686 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 381.704 Td
+/F124_0 9.9626 Tf
+(BZ_SEQUENCE_ERROR) 101.6185 Tj
+98.488 369.749 Td
+(if) 11.9551 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(opened) 35.8654 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(BZ2_bzReadOpen) 83.6858 Tj
+90 357.793 Td
+(BZ_IO_ERROR) 65.7532 Tj
+98.488 345.838 Td
+(if) 11.9551 Tj
+-426 TJm
+(there) 29.8878 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(an) 11.9551 Tj
+-426 TJm
+(error) 29.8878 Tj
+-426 TJm
+(writing) 41.8429 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(file) 23.9102 Tj
+90 333.883 Td
+(BZ_OK) 29.8878 Tj
+98.488 321.928 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 275.765 Td
+/F116_0 17.2154 Tf
+(3.4.8.) 43.0729 Tj
+-278 TJm
+(Handling) 73.6475 Tj
+-278 TJm
+(embed) 55.4852 Tj
+10 TJm
+(ded) 30.609 Tj
+-278 TJm
+(compressed) 101.4159 Tj
+-278 TJm
+(data) 35.3949 Tj
+-278 TJm
+(streams) 66.0211 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 253.847 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-203 TJm
+(high-le) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-203 TJm
+(library) 26.5603 Tj
+-203 TJm
+(f) 3.3175 Tj
+10 TJm
+(acilitates) 35.417 Tj
+-203 TJm
+(use) 13.2801 Tj
+-203 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+226.404 253.847 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+258.316 253.847 Td
+/F122_0 9.9626 Tf
+(data) 16.5977 Tj
+-203 TJm
+(streams) 30.4357 Tj
+-203 TJm
+(which) 24.3486 Tj
+-203 TJm
+(form) 19.3673 Tj
+-203 TJm
+(some) 21.031 Tj
+-203 TJm
+(part) 15.4918 Tj
+-203 TJm
+(of) 8.2988 Tj
+-203 TJm
+(a) 4.4234 Tj
+-204 TJm
+(surrounding,) 50.6399 Tj
+-212 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ger) 12.7222 Tj
+-203 TJm
+(data) 16.5977 Tj
+-203 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 221.967 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-264 TJm
+(writing,) 31.2726 Tj
+-267 TJm
+(the) 12.1743 Tj
+-264 TJm
+(library) 26.5603 Tj
+-264 TJm
+(tak) 12.1743 Tj
+10 TJm
+(es) 8.2988 Tj
+-264 TJm
+(an) 9.4047 Tj
+-264 TJm
+(open) 19.3673 Tj
+-264 TJm
+(\002le) 12.7322 Tj
+-264 TJm
+(handle,) 29.0509 Tj
+-267 TJm
+(writes) 24.3486 Tj
+-264 TJm
+(compressed) 47.0334 Tj
+-264 TJm
+(data) 16.5977 Tj
+-264 TJm
+(to) 7.7509 Tj
+-264 TJm
+(it,) 8.0299 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+397.758 221.967 Td
+/F124_0 9.9626 Tf
+(fflush) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+433.624 221.967 Td
+/F122_0 9.9626 Tf
+(es) 8.2988 Tj
+-264 TJm
+(it) 5.5392 Tj
+-264 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-264 TJm
+(does) 18.2614 Tj
+-264 TJm
+(not) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+504.135 221.967 Td
+/F124_0 9.9626 Tf
+(fclose) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 210.012 Td
+/F122_0 9.9626 Tf
+(it.) 8.0299 Tj
+-675 TJm
+(The) 15.4918 Tj
+-259 TJm
+(calling) 27.1182 Tj
+-260 TJm
+(a) 4.4234 Tj
+1 TJm
+(pp) 9.9626 Tj
+-1 TJm
+(l) 2.7696 Tj
+1 TJm
+(ication) 27.1182 Tj
+-260 TJm
+(can) 13.8281 Tj
+-259 TJm
+(write) 20.4731 Tj
+-259 TJm
+(its) 9.4147 Tj
+-259 TJm
+(o) 4.9813 Tj
+25 TJm
+(wn) 12.1743 Tj
+-259 TJm
+(data) 16.5977 Tj
+-260 TJm
+(before) 25.4445 Tj
+-259 TJm
+(and) 14.386 Tj
+-259 TJm
+(after) 18.2515 Tj
+-259 TJm
+(the) 12.1743 Tj
+-259 TJm
+(compressed) 47.0334 Tj
+-260 TJm
+(dat) 12.1743 Tj
+1 TJm
+(a) 4.4234 Tj
+-260 TJm
+(stream,) 29.0509 Tj
+-261 TJm
+(using) 21.589 Tj
+-259 TJm
+(that) 14.9439 Tj
+-260 TJm
+(sam) 16.0497 Tj
+1 TJm
+(e) 4.4234 Tj
+-260 TJm
+(\002le) 12.7322 Tj
+81.963 198.056 Td
+(handle.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 176.139 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(Reading) 33.2053 Tj
+-258 TJm
+(is) 6.6451 Tj
+-259 TJm
+(more) 20.4731 Tj
+-258 TJm
+(comple) 29.3299 Tj
+15 TJm
+(x,) 7.472 Tj
+-261 TJm
+(and) 14.386 Tj
+-258 TJm
+(the) 12.1743 Tj
+-258 TJm
+(f) 3.3175 Tj
+10 TJm
+(acilities) 30.9936 Tj
+-259 TJm
+(are) 12.1643 Tj
+-258 TJm
+(not) 12.7322 Tj
+-258 TJm
+(as) 8.2988 Tj
+-259 TJm
+(general) 29.3199 Tj
+-258 TJm
+(as) 8.2988 Tj
+-259 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-258 TJm
+(could) 22.1369 Tj
+-258 TJm
+(be) 9.4047 Tj
+-259 TJm
+(since) 20.4731 Tj
+-258 TJm
+(generality) 39.8404 Tj
+-259 TJm
+(is) 6.6451 Tj
+-258 TJm
+(hard) 17.7035 Tj
+-258 TJm
+(to) 7.7509 Tj
+-259 TJm
+(reconcile) 36.5129 Tj
+81.963 164.183 Td
+(with) 17.7135 Tj
+-432 TJm
+(ef) 7.7409 Tj
+25 TJm
+(\002cienc) 26.5603 Tj
+15 TJm
+(y) 4.9813 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+161.767 164.183 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+225.847 164.183 Td
+/F122_0 9.9626 Tf
+(reads) 21.0211 Tj
+-432 TJm
+(from) 19.3673 Tj
+-432 TJm
+(the) 12.1743 Tj
+-432 TJm
+(compressed) 47.0334 Tj
+-432 TJm
+(\002le) 12.7322 Tj
+-432 TJm
+(in) 7.7509 Tj
+-432 TJm
+(blocks) 26.0123 Tj
+-432 TJm
+(of) 8.2988 Tj
+-432 TJm
+(size) 15.4918 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+434.467 164.183 Td
+/F124_0 9.9626 Tf
+(BZ_MAX_UNUSED) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+516.479 164.183 Td
+/F122_0 9.9626 Tf
+(bytes,) 23.5217 Tj
+81.963 152.228 Td
+(and) 14.386 Tj
+-436 TJm
+(in) 7.7509 Tj
+-435 TJm
+(doing) 22.6948 Tj
+-436 TJm
+(so) 8.8568 Tj
+-436 TJm
+(probably) 35.417 Tj
+-436 TJm
+(will) 15.5018 Tj
+-435 TJm
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ershoot) 29.3299 Tj
+-436 TJm
+(the) 12.1743 Tj
+-436 TJm
+(logical) 27.1182 Tj
+-435 TJm
+(end) 14.386 Tj
+-436 TJm
+(of) 8.2988 Tj
+-436 TJm
+(compressed) 47.0334 Tj
+-436 TJm
+(s) 3.8755 Tj
+1 TJm
+(tream.) 25.1755 Tj
+-1735 TJm
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-436 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-435 TJm
+(this) 14.396 Tj
+-436 TJm
+(data) 16.5977 Tj
+-436 TJm
+(once) 18.8094 Tj
+81.963 140.273 Td
+(decompression) 59.7656 Tj
+-290 TJm
+(has) 13.2801 Tj
+-289 TJm
+(ended,) 26.2813 Tj
+-300 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+207.321 140.273 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadGetUnused) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+323.782 140.273 Td
+/F122_0 9.9626 Tf
+(after) 18.2515 Tj
+-290 TJm
+(the) 12.1743 Tj
+-289 TJm
+(last) 13.8381 Tj
+-290 TJm
+(call) 14.386 Tj
+-290 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+405.164 140.273 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+467.826 140.273 Td
+/F122_0 9.9626 Tf
+(\(the) 15.4918 Tj
+-290 TJm
+(one) 14.386 Tj
+-290 TJm
+(returning) 36.5229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 128.318 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.671 128.318 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(before) 25.4445 Tj
+-250 TJm
+(calling) 27.1182 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+238.047 128.318 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadClose) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+327.71 128.318 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.852 Td
+(24) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 25 28
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(This) 17.7135 Tj
+-271 TJm
+(mechanism) 45.3796 Tj
+-272 TJm
+(mak) 17.1556 Tj
+10 TJm
+(es) 8.2988 Tj
+-271 TJm
+(it) 5.5392 Tj
+-271 TJm
+(easy) 17.7035 Tj
+-271 TJm
+(to) 7.7509 Tj
+-272 TJm
+(decompress) 47.0334 Tj
+-271 TJm
+(multiple) 33.2153 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+293.313 710.037 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+325.903 710.037 Td
+/F122_0 9.9626 Tf
+(streams) 30.4357 Tj
+-271 TJm
+(placed) 26.0024 Tj
+-272 TJm
+(end-to-end.) 45.6486 Tj
+-374 TJm
+(As) 11.0684 Tj
+-271 TJm
+(the) 12.1743 Tj
+-271 TJm
+(end) 14.386 Tj
+-271 TJm
+(of) 8.2988 Tj
+-272 TJm
+(one) 14.386 Tj
+-271 TJm
+(stream,) 29.0509 Tj
+72 698.082 Td
+(when) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+96.195 698.082 Td
+/F124_0 9.9626 Tf
+(BZ2_bzRead) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+158.586 698.082 Td
+/F122_0 9.9626 Tf
+(returns) 27.6661 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.868 698.082 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+266.577 698.082 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-263 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+288.685 698.082 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadGetUnused) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+404.875 698.082 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-263 TJm
+(coll) 14.9439 Tj
+1 TJm
+(ect) 11.6164 Tj
+-263 TJm
+(the) 12.1743 Tj
+-263 TJm
+(unused) 28.224 Tj
+-262 TJm
+(data) 16.5977 Tj
+-263 TJm
+(\(cop) 17.7035 Tj
+10 TJm
+(y) 4.9813 Tj
+-262 TJm
+(it) 5.5392 Tj
+72 686.127 Td
+(into) 15.5018 Tj
+-265 TJm
+(your) 18.2614 Tj
+-265 TJm
+(o) 4.9813 Tj
+25 TJm
+(wn) 12.1743 Tj
+-265 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-265 TJm
+(some) 21.031 Tj
+25 TJm
+(where\).) 30.1468 Tj
+-711 TJm
+(That) 18.2614 Tj
+-265 TJm
+(data) 16.5977 Tj
+-265 TJm
+(forms) 23.2427 Tj
+-265 TJm
+(the) 12.1743 Tj
+-265 TJm
+(start) 17.1556 Tj
+-265 TJm
+(of) 8.2988 Tj
+-265 TJm
+(the) 12.1743 Tj
+-265 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-265 TJm
+(compressed) 47.0334 Tj
+-265 TJm
+(stream.) 29.0509 Tj
+-711 TJm
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-265 TJm
+(start) 17.1556 Tj
+-265 TJm
+(uncompressing) 60.3235 Tj
+72 674.172 Td
+(that) 14.9439 Tj
+-246 TJm
+(ne) 9.4047 Tj
+15 TJm
+(xt) 7.7509 Tj
+-246 TJm
+(stream,) 29.0509 Tj
+-247 TJm
+(call) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+157.205 674.172 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadOpen) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+243.344 674.172 Td
+/F122_0 9.9626 Tf
+(ag) 9.4047 Tj
+5 TJm
+(ain,) 14.6649 Tj
+-247 TJm
+(feeding) 29.8778 Tj
+-246 TJm
+(in) 7.7509 Tj
+-246 TJm
+(the) 12.1743 Tj
+-247 TJm
+(unused) 28.224 Tj
+-246 TJm
+(data) 16.5977 Tj
+-246 TJm
+(via) 12.1743 Tj
+-246 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+405.967 674.172 Td
+/F124_0 9.9626 Tf
+(unused) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+444.286 674.172 Td
+/F122_0 9.9626 Tf
+(/) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+449.508 674.172 Td
+/F124_0 9.9626 Tf
+(nUnused) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+493.804 674.172 Td
+/F122_0 9.9626 Tf
+(parameters.) 46.1966 Tj
+72 662.217 Td
+(K) 7.193 Tj
+25 TJm
+(eep) 13.8281 Tj
+-263 TJm
+(doing) 22.6948 Tj
+-263 TJm
+(this) 14.396 Tj
+-264 TJm
+(until) 18.2714 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+158.622 662.217 Td
+/F124_0 9.9626 Tf
+(BZ_STREAM_END) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+238.952 662.217 Td
+/F122_0 9.9626 Tf
+(return) 23.7907 Tj
+-263 TJm
+(coincides) 37.6287 Tj
+-263 TJm
+(with) 17.7135 Tj
+-264 TJm
+(the) 12.1743 Tj
+-263 TJm
+(ph) 9.9626 Tj
+5 TJm
+(ysical) 23.2427 Tj
+-263 TJm
+(end) 14.386 Tj
+-263 TJm
+(of) 8.2988 Tj
+-263 TJm
+(\002le) 12.7322 Tj
+-263 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+423.124 662.217 Td
+/F124_0 9.9626 Tf
+(feof\(f\)) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+464.968 662.217 Td
+/F122_0 9.9626 Tf
+(\).) 5.8082 Tj
+-699 TJm
+(In) 8.2988 Tj
+-263 TJm
+(this) 14.396 Tj
+-263 TJm
+(situation) 34.3212 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 650.261 Td
+/F124_0 9.9626 Tf
+(BZ2_bzReadGetUnused) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+188.065 650.261 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(course) 26.0024 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(no) 9.9626 Tj
+-250 TJm
+(data.) 19.0883 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 628.344 Td
+(This) 17.7135 Tj
+-240 TJm
+(should) 26.5703 Tj
+-241 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-240 TJm
+(some) 21.031 Tj
+-241 TJm
+(feel) 14.9339 Tj
+-240 TJm
+(for) 11.6164 Tj
+-241 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-240 TJm
+(the) 12.1743 Tj
+-240 TJm
+(high-le) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-241 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace) 13.2702 Tj
+-240 TJm
+(can) 13.8281 Tj
+-241 TJm
+(be) 9.4047 Tj
+-240 TJm
+(used.) 20.7521 Tj
+-614 TJm
+(If) 6.6351 Tj
+-240 TJm
+(you) 14.9439 Tj
+-241 TJm
+(require) 28.2141 Tj
+-240 TJm
+(e) 4.4234 Tj
+15 TJm
+(xtra) 15.4918 Tj
+-241 TJm
+(\003e) 9.9626 Tj
+15 TJm
+(xibi) 15.5018 Tj
+1 TJm
+(lity) 13.2901 Tj
+65 TJm
+(,) 2.4907 Tj
+-243 TJm
+(you') 18.2614 Tj
+10 TJm
+(ll) 5.5392 Tj
+-240 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-241 TJm
+(to) 7.7509 Tj
+72 616.389 Td
+(bite) 14.9439 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ullet) 17.7135 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(get) 12.1743 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(grips) 19.9252 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace.) 15.7608 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 585.767 Td
+/F116_0 17.2154 Tf
+(3.4.9.) 43.0729 Tj
+-278 TJm
+(Standar) 64.0929 Tj
+20 TJm
+(d) 10.5186 Tj
+-278 TJm
+(\002le-reading/writing) 154.009 Tj
+-278 TJm
+(code) 40.1807 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 563.85 Td
+/F122_0 9.9626 Tf
+(Here') 22.6749 Tj
+55 TJm
+(s) 3.8755 Tj
+-250 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(you') 18.2614 Tj
+50 TJm
+(d) 4.9813 Tj
+-250 TJm
+(write) 20.4731 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le:) 15.5018 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 190.086] cm
+0 0 468 370.61 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 552.328 Td
+/F124_0 9.9626 Tf
+(FILE) 23.9102 Tj
+113.91 550.584 Td
+(*) 5.9776 Tj
+132.62 552.328 Td
+(f;) 11.9551 Tj
+90 540.373 Td
+(BZFILE) 35.8654 Tj
+125.866 538.629 Td
+(*) 5.9776 Tj
+136.087 540.373 Td
+(b;) 11.9551 Tj
+90 528.418 Td
+(int) 17.9327 Tj
+-2130 TJm
+(nBuf;) 29.8878 Tj
+90 516.462 Td
+(char) 23.9102 Tj
+-1704 TJm
+(buf[) 23.9102 Tj
+-426 TJm
+(/) 5.9776 Tj
+165.018 514.719 Td
+(*) 5.9776 Tj
+175.24 516.462 Td
+(whatever) 47.8205 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(you) 17.9327 Tj
+-426 TJm
+(like) 23.9102 Tj
+305.79 514.719 Td
+(*) 5.9776 Tj
+311.767 516.462 Td
+(/) 5.9776 Tj
+-426 TJm
+(];) 11.9551 Tj
+90 504.507 Td
+(int) 17.9327 Tj
+-2130 TJm
+(bzerror;) 47.8205 Tj
+90 492.552 Td
+(int) 17.9327 Tj
+-2130 TJm
+(nWritten;) 53.798 Tj
+90 468.642 Td
+(f) 5.9776 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(fopen) 29.8878 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+("myfile.bz2",) 77.7083 Tj
+-426 TJm
+("w") 17.9327 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 456.687 Td
+(if) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(!f) 11.9551 Tj
+-426 TJm
+(\)) 5.9776 Tj
+-426 TJm
+({) 5.9776 Tj
+94.244 444.731 Td
+(/) 5.9776 Tj
+100.222 442.988 Td
+(*) 5.9776 Tj
+110.443 444.731 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+184.684 442.988 Td
+(*) 5.9776 Tj
+190.662 444.731 Td
+(/) 5.9776 Tj
+90 432.776 Td
+(}) 5.9776 Tj
+90 420.821 Td
+(b) 5.9776 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ2_bzWriteOpen\() 95.641 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(f,) 11.9551 Tj
+-426 TJm
+(9) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 408.866 Td
+(if) 11.9551 Tj
+-426 TJm
+(\(bzerror) 47.8205 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(BZ_OK\)) 35.8654 Tj
+-426 TJm
+({) 5.9776 Tj
+94.244 396.911 Td
+(BZ2_bzWriteClose) 95.641 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+94.244 384.955 Td
+(/) 5.9776 Tj
+100.222 383.212 Td
+(*) 5.9776 Tj
+110.443 384.955 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+184.684 383.212 Td
+(*) 5.9776 Tj
+190.662 384.955 Td
+(/) 5.9776 Tj
+90 373 Td
+(}) 5.9776 Tj
+90 349.09 Td
+(while) 29.8878 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(/) 5.9776 Tj
+140.331 347.346 Td
+(*) 5.9776 Tj
+150.553 349.09 Td
+(condition) 53.798 Tj
+208.595 347.346 Td
+(*) 5.9776 Tj
+214.572 349.09 Td
+(/) 5.9776 Tj
+-426 TJm
+(\)) 5.9776 Tj
+-426 TJm
+({) 5.9776 Tj
+94.244 337.135 Td
+(/) 5.9776 Tj
+100.222 335.391 Td
+(*) 5.9776 Tj
+110.443 337.135 Td
+(get) 17.9327 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(write) 29.8878 Tj
+-426 TJm
+(into) 23.9102 Tj
+-426 TJm
+(buf,) 23.9102 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(set) 17.9327 Tj
+-426 TJm
+(nBuf) 23.9102 Tj
+-426 TJm
+(appropriately) 77.7083 Tj
+421.874 335.391 Td
+(*) 5.9776 Tj
+427.852 337.135 Td
+(/) 5.9776 Tj
+94.244 325.18 Td
+(nWritten) 47.8205 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ2_bzWrite) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b,) 11.9551 Tj
+-426 TJm
+(buf,) 23.9102 Tj
+-426 TJm
+(nBuf) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+94.244 313.224 Td
+(if) 11.9551 Tj
+-426 TJm
+(\(bzerror) 47.8205 Tj
+-426 TJm
+(==) 11.9551 Tj
+-426 TJm
+(BZ_IO_ERROR\)) 71.7307 Tj
+-426 TJm
+({) 5.9776 Tj
+102.732 301.269 Td
+(BZ2_bzWriteClose) 95.641 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+102.732 289.314 Td
+(/) 5.9776 Tj
+108.71 287.571 Td
+(*) 5.9776 Tj
+118.931 289.314 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+193.172 287.571 Td
+(*) 5.9776 Tj
+199.15 289.314 Td
+(/) 5.9776 Tj
+94.244 277.359 Td
+(}) 5.9776 Tj
+90 265.404 Td
+(}) 5.9776 Tj
+90 241.493 Td
+(BZ2_bzWriteClose\() 101.6185 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 229.538 Td
+(if) 11.9551 Tj
+-426 TJm
+(\(bzerror) 47.8205 Tj
+-426 TJm
+(==) 11.9551 Tj
+-426 TJm
+(BZ_IO_ERROR\)) 71.7307 Tj
+-426 TJm
+({) 5.9776 Tj
+94.244 217.583 Td
+(/) 5.9776 Tj
+100.222 215.84 Td
+(*) 5.9776 Tj
+110.443 217.583 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+184.684 215.84 Td
+(*) 5.9776 Tj
+190.662 217.583 Td
+(/) 5.9776 Tj
+90 205.628 Td
+(}) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 168.168 Td
+/F122_0 9.9626 Tf
+(And) 17.1556 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(read) 17.1456 Tj
+-250 TJm
+(from) 19.3673 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le:) 15.5018 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(25) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 26 29
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 349.39] cm
+0 0 468 370.61 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(FILE) 23.9102 Tj
+113.91 709.888 Td
+(*) 5.9776 Tj
+132.62 711.631 Td
+(f;) 11.9551 Tj
+90 699.676 Td
+(BZFILE) 35.8654 Tj
+125.866 697.933 Td
+(*) 5.9776 Tj
+136.087 699.676 Td
+(b;) 11.9551 Tj
+90 687.721 Td
+(int) 17.9327 Tj
+-2130 TJm
+(nBuf;) 29.8878 Tj
+90 675.766 Td
+(char) 23.9102 Tj
+-1704 TJm
+(buf[) 23.9102 Tj
+-426 TJm
+(/) 5.9776 Tj
+165.018 674.022 Td
+(*) 5.9776 Tj
+175.24 675.766 Td
+(whatever) 47.8205 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(you) 17.9327 Tj
+-426 TJm
+(like) 23.9102 Tj
+305.79 674.022 Td
+(*) 5.9776 Tj
+311.767 675.766 Td
+(/) 5.9776 Tj
+-426 TJm
+(];) 11.9551 Tj
+90 663.811 Td
+(int) 17.9327 Tj
+-2130 TJm
+(bzerror;) 47.8205 Tj
+90 651.856 Td
+(int) 17.9327 Tj
+-2130 TJm
+(nWritten;) 53.798 Tj
+90 627.945 Td
+(f) 5.9776 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(fopen) 29.8878 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+("myfile.bz2",) 77.7083 Tj
+-426 TJm
+("r") 17.9327 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 615.99 Td
+(if) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(!f) 11.9551 Tj
+-426 TJm
+(\)) 5.9776 Tj
+-426 TJm
+({) 5.9776 Tj
+98.488 604.035 Td
+(/) 5.9776 Tj
+104.466 602.291 Td
+(*) 5.9776 Tj
+114.687 604.035 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+188.928 602.291 Td
+(*) 5.9776 Tj
+194.906 604.035 Td
+(/) 5.9776 Tj
+90 592.08 Td
+(}) 5.9776 Tj
+90 580.125 Td
+(b) 5.9776 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ2_bzReadOpen) 83.6858 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(f,) 11.9551 Tj
+-426 TJm
+(0,) 11.9551 Tj
+-426 TJm
+(NULL,) 29.8878 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 568.169 Td
+(if) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(\)) 5.9776 Tj
+-426 TJm
+({) 5.9776 Tj
+98.488 556.214 Td
+(BZ2_bzReadClose) 89.6634 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+98.488 544.259 Td
+(/) 5.9776 Tj
+104.466 542.516 Td
+(*) 5.9776 Tj
+114.687 544.259 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+188.928 542.516 Td
+(*) 5.9776 Tj
+194.906 544.259 Td
+(/) 5.9776 Tj
+90 532.304 Td
+(}) 5.9776 Tj
+90 508.393 Td
+(bzerror) 41.8429 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ_OK;) 35.8654 Tj
+90 496.438 Td
+(while) 29.8878 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(==) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(&&) 11.9551 Tj
+-426 TJm
+(/) 5.9776 Tj
+252.948 494.695 Td
+(*) 5.9776 Tj
+263.17 496.438 Td
+(arbitrary) 53.798 Tj
+-426 TJm
+(other) 29.8878 Tj
+-426 TJm
+(conditions) 59.7756 Tj
+419.364 494.695 Td
+(*) 5.9776 Tj
+425.341 496.438 Td
+(/\)) 11.9551 Tj
+-426 TJm
+({) 5.9776 Tj
+98.488 484.483 Td
+(nBuf) 23.9102 Tj
+-426 TJm
+(=) 5.9776 Tj
+-426 TJm
+(BZ2_bzRead) 59.7756 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b,) 11.9551 Tj
+-426 TJm
+(buf,) 23.9102 Tj
+-426 TJm
+(/) 5.9776 Tj
+319.478 482.74 Td
+(*) 5.9776 Tj
+329.7 484.483 Td
+(size) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(buf) 17.9327 Tj
+396.23 482.74 Td
+(*) 5.9776 Tj
+402.208 484.483 Td
+(/) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+98.488 472.528 Td
+(if) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(==) 11.9551 Tj
+-426 TJm
+(BZ_OK) 29.8878 Tj
+-426 TJm
+(\)) 5.9776 Tj
+-426 TJm
+({) 5.9776 Tj
+106.976 460.573 Td
+(/) 5.9776 Tj
+112.953 458.829 Td
+(*) 5.9776 Tj
+123.175 460.573 Td
+(do) 11.9551 Tj
+-426 TJm
+(something) 53.798 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(buf[0) 29.8878 Tj
+-426 TJm
+(..) 11.9551 Tj
+-426 TJm
+(nBuf-1]) 41.8429 Tj
+321.989 458.829 Td
+(*) 5.9776 Tj
+327.966 460.573 Td
+(/) 5.9776 Tj
+98.488 448.618 Td
+(}) 5.9776 Tj
+90 436.662 Td
+(}) 5.9776 Tj
+90 424.707 Td
+(if) 11.9551 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(bzerror) 41.8429 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(BZ_STREAM_END) 77.7083 Tj
+-426 TJm
+(\)) 5.9776 Tj
+-426 TJm
+({) 5.9776 Tj
+102.732 412.752 Td
+(BZ2_bzReadClose) 89.6634 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+102.732 400.797 Td
+(/) 5.9776 Tj
+108.71 399.053 Td
+(*) 5.9776 Tj
+118.931 400.797 Td
+(handle) 35.8654 Tj
+-426 TJm
+(error) 29.8878 Tj
+193.172 399.053 Td
+(*) 5.9776 Tj
+199.15 400.797 Td
+(/) 5.9776 Tj
+90 388.842 Td
+(}) 5.9776 Tj
+-426 TJm
+(else) 23.9102 Tj
+-426 TJm
+({) 5.9776 Tj
+102.732 376.887 Td
+(BZ2_bzReadClose) 89.6634 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(&bzerror,) 53.798 Tj
+-426 TJm
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 364.931 Td
+(}) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 314.637 Td
+/F116_0 20.6585 Tf
+(3.5.) 34.4584 Tj
+-278 TJm
+(Utility) 57.3893 Tj
+-278 TJm
+(functions) 92.9633 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 284.016 Td
+/F116_0 17.2154 Tf
+(3.5.1.) 43.0729 Tj
+-278 TJm
+(BZ2_bzBuffT) 106.1502 Tj
+80 TJm
+(oBuffCompress) 129.1155 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 183.815] cm
+0 0 468 95.641 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 271.087 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzBuffToBuffCompress\() 149.439 Tj
+-426 TJm
+(char) 23.9102 Tj
+289.771 269.344 Td
+(*) 5.9776 Tj
+333.944 271.087 Td
+(dest,) 29.8878 Tj
+217.319 259.132 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+287.317 257.389 Td
+(*) 5.9776 Tj
+297.538 259.132 Td
+(destLen,) 47.8205 Tj
+217.319 247.177 Td
+(char) 23.9102 Tj
+241.23 245.434 Td
+(*) 5.9776 Tj
+285.403 247.177 Td
+(source,) 41.8429 Tj
+217.319 235.222 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-852 TJm
+(sourceLen,) 59.7756 Tj
+217.319 223.267 Td
+(int) 17.9327 Tj
+-4686 TJm
+(blockSize100k,) 83.6858 Tj
+217.319 211.312 Td
+(int) 17.9327 Tj
+-4686 TJm
+(verbosity,) 59.7756 Tj
+217.319 199.356 Td
+(int) 17.9327 Tj
+-4686 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 161.897 Td
+/F122_0 9.9626 Tf
+(Attempts) 36.5329 Tj
+-442 TJm
+(to) 7.7509 Tj
+-442 TJm
+(compress) 37.6287 Tj
+-443 TJm
+(the) 12.1743 Tj
+-442 TJm
+(data) 16.5977 Tj
+-442 TJm
+(in) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.87 161.897 Td
+/F124_0 9.9626 Tf
+(source[0) 47.8205 Tj
+-600 TJm
+(..) 11.9551 Tj
+-1200 TJm
+(sourceLen-1]) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+370.715 161.897 Td
+/F122_0 9.9626 Tf
+(into) 15.5018 Tj
+-442 TJm
+(the) 12.1743 Tj
+-443 TJm
+(dest) 16.0497 Tj
+1 TJm
+(ination) 27.6761 Tj
+-443 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+40 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+486.202 161.897 Td
+/F124_0 9.9626 Tf
+(dest[0) 35.8654 Tj
+-600 TJm
+(..) 11.9551 Tj
+72 148.198 Td
+(*) 5.9776 Tj
+77.978 149.942 Td
+(destLen-1]) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+137.753 149.942 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1393 TJm
+(If) 6.6351 Tj
+-379 TJm
+(the) 12.1743 Tj
+-379 TJm
+(destination) 43.7259 Tj
+-379 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-378 TJm
+(is) 6.6451 Tj
+-379 TJm
+(big) 12.7322 Tj
+-379 TJm
+(enough,) 31.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+318.487 148.198 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+324.464 149.942 Td
+(destLen) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+370.082 149.942 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-379 TJm
+(set) 11.0684 Tj
+-379 TJm
+(to) 7.7509 Tj
+-378 TJm
+(the) 12.1743 Tj
+-379 TJm
+(size) 15.4918 Tj
+-379 TJm
+(of) 8.2988 Tj
+-379 TJm
+(the) 12.1743 Tj
+-379 TJm
+(compressed) 47.0334 Tj
+-379 TJm
+(data,) 19.0883 Tj
+72 137.986 Td
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+89.527 137.986 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+122.556 137.986 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-315 TJm
+(returned.) 35.686 Tj
+-1012 TJm
+(If) 6.6351 Tj
+-315 TJm
+(the) 12.1743 Tj
+-316 TJm
+(compressed) 47.0334 Tj
+-315 TJm
+(data) 16.5977 Tj
+-315 TJm
+(w) 7.193 Tj
+10 TJm
+(on') 13.2801 Tj
+18 TJm
+(t) 2.7696 Tj
+-316 TJm
+(\002t,) 10.7995 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+313.323 136.243 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+319.3 137.986 Td
+(destLen) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+364.285 137.986 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-315 TJm
+(unchanged,) 45.6486 Tj
+-332 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+440.551 137.986 Td
+/F124_0 9.9626 Tf
+(BZ_OUTBUFF_FULL) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+533.355 137.986 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+72 126.031 Td
+(returned.) 35.686 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 104.113 Td
+(Compression) 52.5826 Tj
+-297 TJm
+(in) 7.7509 Tj
+-297 TJm
+(this) 14.396 Tj
+-297 TJm
+(manner) 29.8778 Tj
+-297 TJm
+(is) 6.6451 Tj
+-297 TJm
+(a) 4.4234 Tj
+-297 TJm
+(one-shot) 34.3112 Tj
+-297 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ent,) 14.6649 Tj
+-309 TJm
+(done) 19.3673 Tj
+-297 TJm
+(with) 17.7135 Tj
+-297 TJm
+(a) 4.4234 Tj
+-297 TJm
+(single) 23.8007 Tj
+-297 TJm
+(call) 14.386 Tj
+-297 TJm
+(to) 7.7509 Tj
+-297 TJm
+(this) 14.396 Tj
+-297 TJm
+(function.) 35.696 Tj
+-903 TJm
+(The) 15.4918 Tj
+-297 TJm
+(resulting) 34.8691 Tj
+-297 TJm
+(compressed) 47.0334 Tj
+72 92.158 Td
+(data) 16.5977 Tj
+-296 TJm
+(is) 6.6451 Tj
+-296 TJm
+(a) 4.4234 Tj
+-296 TJm
+(complete) 36.5229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+147.988 92.158 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+180.825 92.158 Td
+/F122_0 9.9626 Tf
+(format) 26.5603 Tj
+-296 TJm
+(data) 16.5977 Tj
+-296 TJm
+(stream.) 29.0509 Tj
+-897 TJm
+(There) 23.2328 Tj
+-296 TJm
+(is) 6.6451 Tj
+-296 TJm
+(no) 9.9626 Tj
+-296 TJm
+(mechanism) 45.3796 Tj
+-296 TJm
+(for) 11.6164 Tj
+-296 TJm
+(making) 29.8878 Tj
+-296 TJm
+(additional) 39.8504 Tj
+-296 TJm
+(calls) 18.2614 Tj
+-296 TJm
+(to) 7.7509 Tj
+-296 TJm
+(pro) 13.2801 Tj
+15 TJm
+(vide) 17.1556 Tj
+-296 TJm
+(e) 4.4234 Tj
+15 TJm
+(xtra) 15.4918 Tj
+72 80.203 Td
+(input) 20.4831 Tj
+-250 TJm
+(data.) 19.0883 Tj
+-620 TJm
+(If) 6.6351 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(kind) 17.7135 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(mechanism,) 47.8703 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(lo) 7.7509 Tj
+25 TJm
+(w-le) 17.7035 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(el) 7.193 Tj
+-250 TJm
+(interf) 21.579 Tj
+10 TJm
+(ace.) 15.7608 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(26) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 27 30
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-223 TJm
+(the) 12.1743 Tj
+-224 TJm
+(meaning) 34.3112 Tj
+-223 TJm
+(of) 8.2988 Tj
+-224 TJm
+(parameters) 43.7059 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+195.306 710.037 Td
+/F124_0 9.9626 Tf
+(blockSize100k) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+273.015 710.037 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+277.784 710.037 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+333.808 710.037 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+350.42 710.037 Td
+/F124_0 9.9626 Tf
+(workFactor) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+410.196 710.037 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-229 TJm
+(see) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+429.913 710.037 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 710.037 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 688.12 Td
+(T) 6.0871 Tj
+80 TJm
+(o) 4.9813 Tj
+-410 TJm
+(guarantee) 38.7246 Tj
+-410 TJm
+(that) 14.9439 Tj
+-410 TJm
+(the) 12.1743 Tj
+-410 TJm
+(compressed) 47.0334 Tj
+-410 TJm
+(data) 16.5977 Tj
+-410 TJm
+(will) 15.5018 Tj
+-410 TJm
+(\002t) 8.3088 Tj
+-410 TJm
+(in) 7.7509 Tj
+-410 TJm
+(its) 9.4147 Tj
+-410 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+40 TJm
+(,) 2.4907 Tj
+-450 TJm
+(allocate) 30.9837 Tj
+-410 TJm
+(an) 9.4047 Tj
+-410 TJm
+(output) 25.4644 Tj
+-410 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-411 TJm
+(of) 8.2988 Tj
+-410 TJm
+(size) 15.4918 Tj
+-410 TJm
+(1%) 13.2801 Tj
+-410 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ger) 12.7222 Tj
+-410 TJm
+(than) 17.1556 Tj
+-410 TJm
+(the) 12.1743 Tj
+72 676.164 Td
+(uncompressed) 56.996 Tj
+-250 TJm
+(data,) 19.0883 Tj
+-250 TJm
+(plus) 16.6077 Tj
+-250 TJm
+(six) 11.6264 Tj
+-250 TJm
+(hundred) 32.6474 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xtra) 15.4918 Tj
+-250 TJm
+(bytes.) 23.5217 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 654.247 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffDecompress) 155.4166 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+230.553 654.247 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-315 TJm
+(not) 12.7322 Tj
+-315 TJm
+(write) 20.4731 Tj
+-314 TJm
+(data) 16.5977 Tj
+-315 TJm
+(at) 7.193 Tj
+-315 TJm
+(or) 8.2988 Tj
+-315 TJm
+(be) 9.4047 Tj
+15 TJm
+(yond) 19.9252 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+362.484 654.247 Td
+/F124_0 9.9626 Tf
+(dest[) 29.8878 Tj
+392.372 652.503 Td
+(*) 5.9776 Tj
+398.349 654.247 Td
+(destLen]) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+446.17 654.247 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-331 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-315 TJm
+(in) 7.7509 Tj
+-315 TJm
+(case) 17.1456 Tj
+-314 TJm
+(of) 8.2988 Tj
+-315 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+72 642.291 Td
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er\003o) 18.2614 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 620.374 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 451.905] cm
+0 0 468 167.372 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 610.909 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+98.488 598.954 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(library) 41.8429 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(mis-compiled) 71.7307 Tj
+90 586.999 Td
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 575.044 Td
+(if) 11.9551 Tj
+-426 TJm
+(dest) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(destLen) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 563.089 Td
+(or) 11.9551 Tj
+-426 TJm
+(blockSize100k) 77.7083 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(1) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(blockSize100k) 77.7083 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(9) 5.9776 Tj
+98.488 551.133 Td
+(or) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(4) 5.9776 Tj
+98.488 539.178 Td
+(or) 11.9551 Tj
+-426 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(workFactor) 59.7756 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(250) 17.9327 Tj
+90 527.223 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 515.268 Td
+(if) 11.9551 Tj
+-426 TJm
+(insufficient) 71.7307 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(available) 53.798 Tj
+90 503.313 Td
+(BZ_OUTBUFF_FULL) 89.6634 Tj
+98.488 491.357 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(exceeds) 41.8429 Tj
+341.655 489.614 Td
+(*) 5.9776 Tj
+347.633 491.357 Td
+(destLen) 41.8429 Tj
+90 479.402 Td
+(BZ_OK) 29.8878 Tj
+98.488 467.447 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 421.284 Td
+/F116_0 17.2154 Tf
+(3.5.2.) 43.0729 Tj
+-278 TJm
+(BZ2_bzBuffT) 106.1502 Tj
+80 TJm
+(oBuffDecompress) 148.259 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 333.038] cm
+0 0 468 83.686 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 408.356 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzBuffToBuffDecompress\() 161.3941 Tj
+-426 TJm
+(char) 23.9102 Tj
+301.726 406.612 Td
+(*) 5.9776 Tj
+345.899 408.356 Td
+(dest,) 29.8878 Tj
+225.807 396.401 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+295.805 394.657 Td
+(*) 5.9776 Tj
+306.026 396.401 Td
+(destLen,) 47.8205 Tj
+225.807 384.446 Td
+(char) 23.9102 Tj
+249.717 382.702 Td
+(*) 5.9776 Tj
+293.891 384.446 Td
+(source,) 41.8429 Tj
+225.807 372.49 Td
+(unsigned) 47.8205 Tj
+-426 TJm
+(int) 17.9327 Tj
+-852 TJm
+(sourceLen,) 59.7756 Tj
+225.807 360.535 Td
+(int) 17.9327 Tj
+-4686 TJm
+(small,) 35.8654 Tj
+225.807 348.58 Td
+(int) 17.9327 Tj
+-4686 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 311.12 Td
+/F122_0 9.9626 Tf
+(Attempts) 36.5329 Tj
+-358 TJm
+(to) 7.7509 Tj
+-359 TJm
+(decompress) 47.0334 Tj
+-358 TJm
+(the) 12.1743 Tj
+-358 TJm
+(data) 16.5977 Tj
+-359 TJm
+(in) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.259 311.12 Td
+/F124_0 9.9626 Tf
+(source[0) 47.8205 Tj
+-600 TJm
+(..) 11.9551 Tj
+-1200 TJm
+(sourceLen-1]) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+374.268 311.12 Td
+/F122_0 9.9626 Tf
+(into) 15.5018 Tj
+-358 TJm
+(the) 12.1743 Tj
+-359 TJm
+(destination) 43.7259 Tj
+-358 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+40 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+486.202 311.12 Td
+/F124_0 9.9626 Tf
+(dest[0) 35.8654 Tj
+-600 TJm
+(..) 11.9551 Tj
+72 297.422 Td
+(*) 5.9776 Tj
+77.978 299.165 Td
+(destLen-1]) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+137.753 299.165 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1123 TJm
+(If) 6.6351 Tj
+-334 TJm
+(the) 12.1743 Tj
+-334 TJm
+(destination) 43.7259 Tj
+-334 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-334 TJm
+(is) 6.6451 Tj
+-334 TJm
+(big) 12.7322 Tj
+-334 TJm
+(enough,) 31.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+312.554 297.422 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+318.531 299.165 Td
+(destLen) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.701 299.165 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-334 TJm
+(set) 11.0684 Tj
+-334 TJm
+(to) 7.7509 Tj
+-334 TJm
+(the) 12.1743 Tj
+-334 TJm
+(size) 15.4918 Tj
+-333 TJm
+(of) 8.2988 Tj
+-334 TJm
+(the) 12.1743 Tj
+-334 TJm
+(uncompressed) 56.996 Tj
+-334 TJm
+(data,) 19.0883 Tj
+72 287.21 Td
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+89.527 287.21 Td
+/F124_0 9.9626 Tf
+(BZ_OK) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+122.556 287.21 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-315 TJm
+(returned.) 35.686 Tj
+-1012 TJm
+(If) 6.6351 Tj
+-315 TJm
+(the) 12.1743 Tj
+-316 TJm
+(compressed) 47.0334 Tj
+-315 TJm
+(data) 16.5977 Tj
+-315 TJm
+(w) 7.193 Tj
+10 TJm
+(on') 13.2801 Tj
+18 TJm
+(t) 2.7696 Tj
+-316 TJm
+(\002t,) 10.7995 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+313.323 285.467 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+319.3 287.21 Td
+(destLen) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+364.285 287.21 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-315 TJm
+(unchanged,) 45.6486 Tj
+-332 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+440.551 287.21 Td
+/F124_0 9.9626 Tf
+(BZ_OUTBUFF_FULL) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+533.355 287.21 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+72 275.255 Td
+(returned.) 35.686 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 253.337 Td
+/F124_0 9.9626 Tf
+(source) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+110.981 253.337 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-313 TJm
+(assumed) 34.3112 Tj
+-312 TJm
+(to) 7.7509 Tj
+-313 TJm
+(hold) 17.7135 Tj
+-313 TJm
+(a) 4.4234 Tj
+-313 TJm
+(complete) 36.5229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+237.04 253.337 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+270.044 253.337 Td
+/F122_0 9.9626 Tf
+(format) 26.5603 Tj
+-313 TJm
+(data) 16.5977 Tj
+-312 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+353.446 253.337 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffDecompress) 155.4166 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+511.978 253.337 Td
+/F122_0 9.9626 Tf
+(tries) 17.1556 Tj
+-313 TJm
+(to) 7.7509 Tj
+72 241.382 Td
+(decompress) 47.0334 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(entirety) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(stream) 26.5603 Tj
+-250 TJm
+(into) 15.5018 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(output) 25.4644 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 219.464 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(meaning) 34.3112 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(parameters) 43.7059 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+196.631 219.464 Td
+/F124_0 9.9626 Tf
+(small) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+229.01 219.464 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+245.887 219.464 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+299.685 219.464 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(see) 12.7222 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+319.879 219.464 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressInit) 119.5512 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+439.431 219.464 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 197.546 Td
+(Because) 33.1954 Tj
+-250 TJm
+(the) 12.1743 Tj
+-249 TJm
+(compression) 50.3609 Tj
+-250 TJm
+(ratio) 18.2614 Tj
+-249 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-249 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(data) 16.5977 Tj
+-249 TJm
+(cannot) 26.5603 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(kno) 14.9439 Tj
+25 TJm
+(wn) 12.1743 Tj
+-249 TJm
+(in) 7.7509 Tj
+-250 TJm
+(adv) 14.386 Tj
+25 TJm
+(ance,) 20.7421 Tj
+-249 TJm
+(there) 19.9152 Tj
+-250 TJm
+(is) 6.6451 Tj
+-249 TJm
+(no) 9.9626 Tj
+-250 TJm
+(easy) 17.7035 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-249 TJm
+(to) 7.7509 Tj
+-250 TJm
+(guarantee) 38.7246 Tj
+72 185.591 Td
+(that) 14.9439 Tj
+-286 TJm
+(the) 12.1743 Tj
+-287 TJm
+(output) 25.4644 Tj
+-286 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+-287 TJm
+(will) 15.5018 Tj
+-286 TJm
+(be) 9.4047 Tj
+-286 TJm
+(big) 12.7322 Tj
+-287 TJm
+(enough.) 31.8205 Tj
+-838 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-287 TJm
+(may) 17.1556 Tj
+-286 TJm
+(of) 8.2988 Tj
+-287 TJm
+(course) 26.0024 Tj
+-286 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-286 TJm
+(arrangements) 53.6685 Tj
+-287 TJm
+(in) 7.7509 Tj
+-286 TJm
+(your) 18.2614 Tj
+-287 TJm
+(code) 18.8094 Tj
+-286 TJm
+(to) 7.7509 Tj
+-286 TJm
+(record) 25.4445 Tj
+-287 TJm
+(the) 12.1743 Tj
+-286 TJm
+(size) 15.4918 Tj
+-287 TJm
+(of) 8.2988 Tj
+72 173.636 Td
+(the) 12.1743 Tj
+-250 TJm
+(uncompressed) 56.996 Tj
+-250 TJm
+(data,) 19.0883 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(mechanism) 45.3796 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(be) 9.4047 Tj
+15 TJm
+(yond) 19.9252 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(scope) 22.6848 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 151.718 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffDecompress) 155.4166 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+230.553 151.718 Td
+/F122_0 9.9626 Tf
+(will) 15.5018 Tj
+-315 TJm
+(not) 12.7322 Tj
+-315 TJm
+(write) 20.4731 Tj
+-314 TJm
+(data) 16.5977 Tj
+-315 TJm
+(at) 7.193 Tj
+-315 TJm
+(or) 8.2988 Tj
+-315 TJm
+(be) 9.4047 Tj
+15 TJm
+(yond) 19.9252 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+362.484 151.718 Td
+/F124_0 9.9626 Tf
+(dest[) 29.8878 Tj
+392.372 149.975 Td
+(*) 5.9776 Tj
+398.349 151.718 Td
+(destLen]) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+446.17 151.718 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-331 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(en) 9.4047 Tj
+-315 TJm
+(in) 7.7509 Tj
+-315 TJm
+(case) 17.1456 Tj
+-314 TJm
+(of) 8.2988 Tj
+-315 TJm
+(b) 4.9813 Tj
+20 TJm
+(uf) 8.2988 Tj
+25 TJm
+(fer) 11.0585 Tj
+72 139.763 Td
+(o) 4.9813 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(er\003o) 18.2614 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 117.845 Td
+(Possible) 33.2153 Tj
+-250 TJm
+(return) 23.7907 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues:) 23.2427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(27) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 28 31
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+420.96 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+498.449 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 75.786 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 492.852] cm
+0 0 468 227.148 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 711.631 Td
+/F124_0 9.9626 Tf
+(BZ_CONFIG_ERROR) 89.6634 Tj
+98.488 699.676 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(library) 41.8429 Tj
+-426 TJm
+(has) 17.9327 Tj
+-426 TJm
+(been) 23.9102 Tj
+-426 TJm
+(mis-compiled) 71.7307 Tj
+90 687.721 Td
+(BZ_PARAM_ERROR) 83.6858 Tj
+98.488 675.766 Td
+(if) 11.9551 Tj
+-426 TJm
+(dest) 23.9102 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(destLen) 41.8429 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(NULL) 23.9102 Tj
+98.488 663.811 Td
+(or) 11.9551 Tj
+-426 TJm
+(small) 29.8878 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(&&) 11.9551 Tj
+-426 TJm
+(small) 29.8878 Tj
+-426 TJm
+(!=) 11.9551 Tj
+-426 TJm
+(1) 5.9776 Tj
+98.488 651.856 Td
+(or) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(<) 5.9776 Tj
+-426 TJm
+(0) 5.9776 Tj
+-426 TJm
+(or) 11.9551 Tj
+-426 TJm
+(verbosity) 53.798 Tj
+-426 TJm
+(>) 5.9776 Tj
+-426 TJm
+(4) 5.9776 Tj
+90 639.9 Td
+(BZ_MEM_ERROR) 71.7307 Tj
+98.488 627.945 Td
+(if) 11.9551 Tj
+-426 TJm
+(insufficient) 71.7307 Tj
+-426 TJm
+(memory) 35.8654 Tj
+-426 TJm
+(is) 11.9551 Tj
+-426 TJm
+(available) 53.798 Tj
+90 615.99 Td
+(BZ_OUTBUFF_FULL) 89.6634 Tj
+98.488 604.035 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(size) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(exceeds) 41.8429 Tj
+341.655 602.291 Td
+(*) 5.9776 Tj
+347.633 604.035 Td
+(destLen) 41.8429 Tj
+90 592.08 Td
+(BZ_DATA_ERROR) 77.7083 Tj
+98.488 580.124 Td
+(if) 11.9551 Tj
+-426 TJm
+(a) 5.9776 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(integrity) 53.798 Tj
+-426 TJm
+(error) 29.8878 Tj
+-426 TJm
+(was) 17.9327 Tj
+-426 TJm
+(detected) 47.8205 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(data) 23.9102 Tj
+90 568.169 Td
+(BZ_DATA_ERROR_MAGIC) 113.5736 Tj
+98.488 556.214 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(doesn't) 41.8429 Tj
+-426 TJm
+(begin) 29.8878 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(right) 29.8878 Tj
+-426 TJm
+(magic) 29.8878 Tj
+-426 TJm
+(bytes) 29.8878 Tj
+90 544.259 Td
+(BZ_UNEXPECTED_EOF) 101.6185 Tj
+98.488 532.304 Td
+(if) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compressed) 59.7756 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(ends) 23.9102 Tj
+-426 TJm
+(unexpectedly) 71.7307 Tj
+90 520.349 Td
+(BZ_OK) 29.8878 Tj
+98.488 508.393 Td
+(otherwise) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 458.099 Td
+/F116_0 20.6585 Tf
+(3.6.) 34.4584 Tj
+-278 TJm
+(zlib) 34.4377 Tj
+-278 TJm
+(compatibility) 127.4216 Tj
+-278 TJm
+(functions) 92.9633 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 436.181 Td
+/F122_0 9.9626 Tf
+(Y) 7.193 Tj
+110 TJm
+(oshioka) 30.9936 Tj
+-604 TJm
+(Tsuneo) 29.3299 Tj
+-604 TJm
+(has) 13.2801 Tj
+-604 TJm
+(contrib) 28.224 Tj
+20 TJm
+(uted) 17.1556 Tj
+-604 TJm
+(some) 21.031 Tj
+-604 TJm
+(functions) 37.0808 Tj
+-604 TJm
+(to) 7.7509 Tj
+-604 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-604 TJm
+(better) 22.6848 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+356.347 436.181 Td
+/F124_0 9.9626 Tf
+(zlib) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+386.275 436.181 Td
+/F122_0 9.9626 Tf
+(compatibility) 53.1405 Tj
+65 TJm
+(.) 2.4907 Tj
+-1372 TJm
+(These) 23.7907 Tj
+-604 TJm
+(functions) 37.0808 Tj
+-604 TJm
+(are) 12.1643 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 424.226 Td
+/F124_0 9.9626 Tf
+(BZ2_bzopen) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+131.776 424.226 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+144.283 424.226 Td
+/F124_0 9.9626 Tf
+(BZ2_bzread) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+204.059 424.226 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+216.567 424.226 Td
+/F124_0 9.9626 Tf
+(BZ2_bzwrite) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+282.32 424.226 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.827 424.226 Td
+/F124_0 9.9626 Tf
+(BZ2_bzflush) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+360.581 424.226 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+373.088 424.226 Td
+/F124_0 9.9626 Tf
+(BZ2_bzclose) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+438.842 424.226 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+451.349 424.226 Td
+/F124_0 9.9626 Tf
+(BZ2_bzerror) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+525.614 424.226 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 412.271 Td
+/F124_0 9.9626 Tf
+(BZ2_bzlibVersion) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+167.641 412.271 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1420 TJm
+(These) 23.7907 Tj
+-383 TJm
+(functions) 37.0808 Tj
+-383 TJm
+(are) 12.1643 Tj
+-383 TJm
+(not) 12.7322 Tj
+-383 TJm
+(\(yet\)) 18.8094 Tj
+-384 TJm
+(of) 8.2988 Tj
+25 TJm
+(\002cially) 27.6761 Tj
+-383 TJm
+(part) 15.4918 Tj
+-383 TJm
+(of) 8.2988 Tj
+-383 TJm
+(the) 12.1743 Tj
+-384 TJm
+(library) 26.5603 Tj
+65 TJm
+(.) 2.4907 Tj
+-1419 TJm
+(If) 6.6351 Tj
+-383 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-384 TJm
+(break,) 24.6176 Tj
+-416 TJm
+(you) 14.9439 Tj
+-383 TJm
+(get) 12.1743 Tj
+-384 TJm
+(to) 7.7509 Tj
+72 400.316 Td
+(k) 4.9813 Tj
+10 TJm
+(eep) 13.8281 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(pieces.) 27.3872 Tj
+-620 TJm
+(Ne) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ertheless,) 37.3498 Tj
+-250 TJm
+(I) 3.3175 Tj
+-250 TJm
+(think) 20.4831 Tj
+-250 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-250 TJm
+(ok.) 12.4533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 349.342] cm
+0 0 468 47.821 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 388.794 Td
+/F124_0 9.9626 Tf
+(typedef) 41.8429 Tj
+-426 TJm
+(void) 23.9102 Tj
+-426 TJm
+(BZFILE;) 41.8429 Tj
+90 364.884 Td
+(const) 29.8878 Tj
+-426 TJm
+(char) 23.9102 Tj
+152.286 363.14 Td
+(*) 5.9776 Tj
+162.508 364.884 Td
+(BZ2_bzlibVersion) 95.641 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(void) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 327.424 Td
+/F122_0 9.9626 Tf
+(Returns) 30.9936 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(string) 22.6948 Tj
+-250 TJm
+(indicating) 39.8504 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion.) 26.8392 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 288.405] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 315.902 Td
+/F124_0 9.9626 Tf
+(BZFILE) 35.8654 Tj
+130.109 314.159 Td
+(*) 5.9776 Tj
+140.331 315.902 Td
+(BZ2_bzopen) 59.7756 Tj
+-852 TJm
+(\() 5.9776 Tj
+-426 TJm
+(const) 29.8878 Tj
+-426 TJm
+(char) 23.9102 Tj
+281.103 314.159 Td
+(*) 5.9776 Tj
+287.08 315.902 Td
+(path,) 29.8878 Tj
+-426 TJm
+(const) 29.8878 Tj
+-426 TJm
+(char) 23.9102 Tj
+383.498 314.159 Td
+(*) 5.9776 Tj
+389.476 315.902 Td
+(mode) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 303.947 Td
+(BZFILE) 35.8654 Tj
+130.109 302.204 Td
+(*) 5.9776 Tj
+140.331 303.947 Td
+(BZ2_bzdopen) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(int) 17.9327 Tj
+-3408 TJm
+(fd,) 17.9327 Tj
+-1704 TJm
+(const) 29.8878 Tj
+-426 TJm
+(char) 23.9102 Tj
+369.629 302.204 Td
+(*) 5.9776 Tj
+375.607 303.947 Td
+(mode) 23.9102 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 266.488 Td
+/F122_0 9.9626 Tf
+(Opens) 25.4544 Tj
+-243 TJm
+(a) 4.4234 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+106.713 266.488 Td
+/F124_0 9.9626 Tf
+(.bz2) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+133.041 266.488 Td
+/F122_0 9.9626 Tf
+(\002le) 12.7322 Tj
+-243 TJm
+(for) 11.6164 Tj
+-242 TJm
+(reading) 29.8778 Tj
+-243 TJm
+(or) 8.2988 Tj
+-243 TJm
+(writing,) 31.2726 Tj
+-244 TJm
+(using) 21.589 Tj
+-243 TJm
+(either) 22.6848 Tj
+-242 TJm
+(its) 9.4147 Tj
+-243 TJm
+(name) 21.579 Tj
+-243 TJm
+(or) 8.2988 Tj
+-242 TJm
+(a) 4.4234 Tj
+-243 TJm
+(pre-e) 20.4632 Tj
+15 TJm
+(xisting) 27.1282 Tj
+-243 TJm
+(\002le) 12.7322 Tj
+-242 TJm
+(descriptor) 39.8404 Tj
+55 TJm
+(.) 2.4907 Tj
+-615 TJm
+(Analogous) 43.1679 Tj
+-243 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+510.112 266.488 Td
+/F124_0 9.9626 Tf
+(fopen) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 254.532 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+88.877 254.532 Td
+/F124_0 9.9626 Tf
+(fdopen) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+124.742 254.532 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 216.137] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 243.633 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzread) 59.7756 Tj
+-852 TJm
+(\() 5.9776 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+226.528 241.89 Td
+(*) 5.9776 Tj
+236.749 243.633 Td
+(b,) 11.9551 Tj
+-426 TJm
+(void) 23.9102 Tj
+276.859 241.89 Td
+(*) 5.9776 Tj
+287.08 243.633 Td
+(buf,) 23.9102 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(len) 17.9327 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 231.678 Td
+(int) 17.9327 Tj
+-426 TJm
+(BZ2_bzwrite) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+228.261 229.935 Td
+(*) 5.9776 Tj
+238.483 231.678 Td
+(b,) 11.9551 Tj
+-426 TJm
+(void) 23.9102 Tj
+278.592 229.935 Td
+(*) 5.9776 Tj
+288.814 231.678 Td
+(buf,) 23.9102 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(len) 17.9327 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 194.219 Td
+/F122_0 9.9626 Tf
+(Reads/writes) 51.4668 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(from/to) 29.8878 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(pre) 12.7222 Tj
+25 TJm
+(viously) 29.3399 Tj
+-250 TJm
+(opened) 28.772 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+259.903 194.219 Td
+/F124_0 9.9626 Tf
+(BZFILE) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+295.769 194.219 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-500 TJm
+(Analogous) 43.1679 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+359.141 194.219 Td
+/F124_0 9.9626 Tf
+(fread) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+391.519 194.219 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+408.396 194.219 Td
+/F124_0 9.9626 Tf
+(fwrite) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+444.261 194.219 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 155.2] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 182.697 Td
+/F124_0 9.9626 Tf
+(int) 17.9327 Tj
+-852 TJm
+(BZ2_bzflush) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+232.505 180.954 Td
+(*) 5.9776 Tj
+242.727 182.697 Td
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+90 170.742 Td
+(void) 23.9102 Tj
+-426 TJm
+(BZ2_bzclose) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+234.239 168.998 Td
+(*) 5.9776 Tj
+244.46 170.742 Td
+(b) 5.9776 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 133.282 Td
+/F122_0 9.9626 Tf
+(Flushes/closes) 57.5639 Tj
+-250 TJm
+(a) 4.4234 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+138.968 133.282 Td
+/F124_0 9.9626 Tf
+(BZFILE) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+174.833 133.282 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+179.815 133.282 Td
+/F124_0 9.9626 Tf
+(BZ2_bzflush) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+248.059 133.282 Td
+/F122_0 9.9626 Tf
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(actually) 31.5416 Tj
+-250 TJm
+(do) 9.9626 Tj
+-250 TJm
+(an) 9.4047 Tj
+15 TJm
+(ything.) 27.9551 Tj
+-620 TJm
+(Analogous) 43.1679 Tj
+-250 TJm
+(to) 7.7509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+425.472 133.282 Td
+/F124_0 9.9626 Tf
+(fflush) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+463.828 133.282 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+480.705 133.282 Td
+/F124_0 9.9626 Tf
+(fclose) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+516.57 133.282 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 106.219] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 121.761 Td
+/F124_0 9.9626 Tf
+(const) 29.8878 Tj
+-426 TJm
+(char) 23.9102 Tj
+152.286 120.017 Td
+(*) 5.9776 Tj
+162.508 121.761 Td
+(BZ2_bzerror) 65.7532 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(BZFILE) 35.8654 Tj
+282.836 120.017 Td
+(*) 5.9776 Tj
+288.814 121.761 Td
+(b,) 11.9551 Tj
+-426 TJm
+(int) 17.9327 Tj
+327.19 120.017 Td
+(*) 5.9776 Tj
+333.167 121.761 Td
+(errnum) 35.8654 Tj
+-426 TJm
+(\)) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 84.301 Td
+/F122_0 9.9626 Tf
+(Returns) 30.9936 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(string) 22.6948 Tj
+-250 TJm
+(describing) 41.5042 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(more) 20.4731 Tj
+-250 TJm
+(recent) 24.3386 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(status) 22.6948 Tj
+-250 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+303.858 84.301 Td
+/F124_0 9.9626 Tf
+(b) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+309.835 84.301 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(also) 16.0497 Tj
+-250 TJm
+(sets) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+367.668 82.558 Td
+/F124_0 9.9626 Tf
+(*) 5.9776 Tj
+373.645 84.301 Td
+(errnum) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+412.002 84.301 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(its) 9.4147 Tj
+-250 TJm
+(numerical) 39.8404 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alue.) 19.0883 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+536.307 50.951 Td
+(28) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 29 32
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 704.93 Td
+/F116_0 20.6585 Tf
+(3.7.) 34.4584 Tj
+-278 TJm
+(Using) 57.3893 Tj
+-278 TJm
+(the) 30.9878 Tj
+-278 TJm
+(librar) 51.6669 Tj
+-10 TJm
+(y) 11.4861 Tj
+-278 TJm
+(in) 18.3654 Tj
+-278 TJm
+(a) 11.4861 Tj
+-278 TJm
+(stdio-free) 94.1201 Tj
+72 680.139 Td
+(en) 24.1085 Tj
+40 TJm
+(vir) 25.2653 Tj
+20 TJm
+(onment) 74.5978 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 649.583 Td
+/F116_0 17.2154 Tf
+(3.7.1.) 43.0729 Tj
+-278 TJm
+(Getting) 60.2539 Tj
+-278 TJm
+(rid) 22.0013 Tj
+-278 TJm
+(of) 16.2513 Tj
+-278 TJm
+(stdio) 41.1276 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 627.73 Td
+/F122_0 9.9626 Tf
+(In) 8.2988 Tj
+-319 TJm
+(a) 4.4234 Tj
+-319 TJm
+(deeply) 26.5603 Tj
+-319 TJm
+(embedded) 40.9463 Tj
+-319 TJm
+(application,) 46.7644 Tj
+-336 TJm
+(you) 14.9439 Tj
+-319 TJm
+(might) 23.2527 Tj
+-319 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-319 TJm
+(to) 7.7509 Tj
+-319 TJm
+(use) 13.2801 Tj
+-319 TJm
+(just) 14.396 Tj
+-319 TJm
+(the) 12.1743 Tj
+-319 TJm
+(memory-to-memory) 80.7967 Tj
+-319 TJm
+(functions.) 39.5714 Tj
+-1035 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-319 TJm
+(can) 13.8281 Tj
+-319 TJm
+(do) 9.9626 Tj
+-319 TJm
+(this) 14.396 Tj
+72 615.775 Td
+(con) 14.386 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(eniently) 32.0995 Tj
+-327 TJm
+(by) 9.9626 Tj
+-327 TJm
+(compiling) 40.4083 Tj
+-327 TJm
+(the) 12.1743 Tj
+-327 TJm
+(library) 26.5603 Tj
+-327 TJm
+(with) 17.7135 Tj
+-328 TJm
+(preproces) 38.7246 Tj
+1 TJm
+(sor) 12.1743 Tj
+-328 TJm
+(symbol) 29.3399 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+336.045 615.775 Td
+/F124_0 9.9626 Tf
+(BZ_NO_STDIO) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+405.057 615.775 Td
+/F122_0 9.9626 Tf
+(de\002ned.) 31.8205 Tj
+-1083 TJm
+(Doing) 24.9065 Tj
+-327 TJm
+(this) 14.396 Tj
+-327 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-327 TJm
+(you) 14.9439 Tj
+-327 TJm
+(a) 4.4234 Tj
+72 603.819 Td
+(library) 26.5603 Tj
+-250 TJm
+(containing) 42.0621 Tj
+-250 TJm
+(only) 17.7135 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-250 TJm
+(eight) 19.9252 Tj
+-250 TJm
+(functions:) 39.8504 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 581.966 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressInit) 107.5961 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+179.597 581.966 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+199.079 581.966 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompress) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+282.765 581.966 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+302.247 581.966 Td
+/F124_0 9.9626 Tf
+(BZ2_bzCompressEnd) 101.6185 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-1414 TJm
+(BZ2_bzDe) 47.8205 Tj
+-1 TJm
+(compressInit) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 581.966 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 570.011 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompress) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+167.641 570.011 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.144 570.011 Td
+/F124_0 9.9626 Tf
+(BZ2_bzDecompressEnd) 113.5736 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-190 TJm
+(BZ2_bzBuffToBuffCompress) 143.4614 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+431.073 570.011 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+435.577 570.011 Td
+/F124_0 9.9626 Tf
+(BZ2_bzBuffToBuffDecompress) 155.4166 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 548.158 Td
+/F122_0 9.9626 Tf
+(When) 23.7907 Tj
+-250 TJm
+(compiled) 37.0808 Tj
+-250 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-250 TJm
+(this,) 16.8866 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(functions) 37.0808 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(ignore) 25.4544 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+272.526 548.158 Td
+/F124_0 9.9626 Tf
+(verbosity) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+328.815 548.158 Td
+/F122_0 9.9626 Tf
+(settings.) 32.9364 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 517.601 Td
+/F116_0 17.2154 Tf
+(3.7.2.) 43.0729 Tj
+-278 TJm
+(Critical) 58.3602 Tj
+-278 TJm
+(err) 22.9653 Tj
+20 TJm
+(or) 17.2154 Tj
+-278 TJm
+(handling) 71.7366 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 495.748 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+124.529 495.748 Td
+/F122_0 9.9626 Tf
+(contains) 33.2053 Tj
+-473 TJm
+(a) 4.4234 Tj
+-472 TJm
+(number) 30.4357 Tj
+-473 TJm
+(of) 8.2988 Tj
+-472 TJm
+(internal) 30.4357 Tj
+-473 TJm
+(assertion) 35.417 Tj
+-472 TJm
+(checks) 27.1082 Tj
+-473 TJm
+(which) 24.3486 Tj
+-472 TJm
+(should,) 29.0609 Tj
+-529 TJm
+(needless) 33.7533 Tj
+-472 TJm
+(to) 7.7509 Tj
+-473 TJm
+(say) 13.2801 Tj
+65 TJm
+(,) 2.4907 Tj
+-528 TJm
+(ne) 9.4047 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-473 TJm
+(be) 9.4047 Tj
+-472 TJm
+(acti) 14.386 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ated.) 19.0883 Tj
+72 483.793 Td
+(Ne) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ertheless,) 37.3498 Tj
+-533 TJm
+(if) 6.0871 Tj
+-476 TJm
+(an) 9.4047 Tj
+-476 TJm
+(assertion) 35.417 Tj
+-476 TJm
+(should) 26.5703 Tj
+-476 TJm
+(f) 3.3175 Tj
+10 TJm
+(ail,) 12.4533 Tj
+-532 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+-476 TJm
+(depends) 32.6474 Tj
+-476 TJm
+(on) 9.9626 Tj
+-476 TJm
+(whether) 32.0895 Tj
+-476 TJm
+(or) 8.2988 Tj
+-477 TJm
+(not) 12.7322 Tj
+-476 TJm
+(the) 12.1743 Tj
+-476 TJm
+(library) 26.5603 Tj
+-476 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-476 TJm
+(compiled) 37.0808 Tj
+-476 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 471.838 Td
+/F124_0 9.9626 Tf
+(BZ_NO_STDIO) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+140.244 471.838 Td
+/F122_0 9.9626 Tf
+(set.) 13.5591 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 449.985 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(normal) 28.224 Tj
+-250 TJm
+(compile,) 34.5901 Tj
+-250 TJm
+(an) 9.4047 Tj
+-250 TJm
+(assertion) 35.417 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(ailure) 22.6848 Tj
+-250 TJm
+(yields) 23.8007 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(message:) 36.5229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 428.131 Td
+(bzip2/libbzip2:) 60.3335 Tj
+-310 TJm
+(internal) 30.4357 Tj
+-250 TJm
+(error) 19.3573 Tj
+-250 TJm
+(number) 30.4357 Tj
+-250 TJm
+(N.) 9.6836 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 406.278 Td
+(This) 17.7135 Tj
+-344 TJm
+(is) 6.6451 Tj
+-344 TJm
+(a) 4.4234 Tj
+-344 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-343 TJm
+(in) 7.7509 Tj
+-344 TJm
+(bzip2/libbzip2,) 60.0546 Tj
+-368 TJm
+(1.0.6) 19.9252 Tj
+-343 TJm
+(of) 8.2988 Tj
+-344 TJm
+(6) 4.9813 Tj
+-344 TJm
+(September) 42.61 Tj
+-344 TJm
+(2010.) 22.4159 Tj
+-592 TJm
+(Please) 25.4544 Tj
+-344 TJm
+(report) 23.7907 Tj
+-343 TJm
+(it) 5.5392 Tj
+-344 TJm
+(to) 7.7509 Tj
+-344 TJm
+(me) 12.1743 Tj
+-344 TJm
+(at:) 9.9626 Tj
+-498 TJm
+(jse) 11.0684 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(ard@bzip.or) 49.8429 Tj
+18 TJm
+(g.) 7.472 Tj
+-1183 TJm
+(If) 6.6351 Tj
+-344 TJm
+(this) 14.396 Tj
+72 394.323 Td
+(happened) 38.1767 Tj
+-297 TJm
+(when) 21.579 Tj
+-298 TJm
+(you) 14.9439 Tj
+-297 TJm
+(were) 19.3573 Tj
+-297 TJm
+(using) 21.589 Tj
+-297 TJm
+(some) 21.031 Tj
+-298 TJm
+(program) 33.7533 Tj
+-297 TJm
+(which) 24.3486 Tj
+-297 TJm
+(uses) 17.1556 Tj
+-297 TJm
+(libbzip2) 32.6574 Tj
+-298 TJm
+(as) 8.2988 Tj
+-297 TJm
+(a) 4.4234 Tj
+-297 TJm
+(component,) 46.7644 Tj
+-309 TJm
+(you) 14.9439 Tj
+-298 TJm
+(should) 26.5703 Tj
+-297 TJm
+(also) 16.0497 Tj
+-297 TJm
+(report) 23.7907 Tj
+-297 TJm
+(this) 14.396 Tj
+-298 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+72 382.368 Td
+(to) 7.7509 Tj
+-264 TJm
+(the) 12.1743 Tj
+-264 TJm
+(author\(s\)) 35.965 Tj
+-264 TJm
+(of) 8.2988 Tj
+-264 TJm
+(that) 14.9439 Tj
+-264 TJm
+(program.) 36.2439 Tj
+-703 TJm
+(Please) 25.4544 Tj
+-264 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-264 TJm
+(an) 9.4047 Tj
+-264 TJm
+(ef) 7.7409 Tj
+25 TJm
+(fort) 14.386 Tj
+-264 TJm
+(to) 7.7509 Tj
+-264 TJm
+(report) 23.7907 Tj
+-263 TJm
+(this) 14.396 Tj
+-264 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug;) 12.7322 Tj
+-271 TJm
+(timely) 25.4644 Tj
+-264 TJm
+(and) 14.386 Tj
+-264 TJm
+(accurate) 33.1854 Tj
+-264 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-264 TJm
+(reports) 27.6661 Tj
+-264 TJm
+(e) 4.4234 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(entually) 32.0995 Tj
+72 370.413 Td
+(lead) 16.5977 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(higher) 25.4544 Tj
+-250 TJm
+(quality) 27.6761 Tj
+-250 TJm
+(softw) 22.1369 Tj
+10 TJm
+(are.) 14.655 Tj
+-620 TJm
+(Thanks.) 31.8205 Tj
+-620 TJm
+(Julian) 23.8007 Tj
+-250 TJm
+(Se) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(ard,) 15.2129 Tj
+-250 TJm
+(6) 4.9813 Tj
+-250 TJm
+(September) 42.61 Tj
+-250 TJm
+(2010.) 22.4159 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 338.758 Td
+(where) 24.3386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+98.831 338.758 Td
+/F124_0 9.9626 Tf
+(N) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+107.301 338.758 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(error) 19.3573 Tj
+-251 TJm
+(code) 18.8094 Tj
+-250 TJm
+(number) 30.4357 Tj
+55 TJm
+(.) 2.4907 Tj
+-621 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+230.81 338.758 Td
+/F124_0 9.9626 Tf
+(N) 5.9776 Tj
+-600 TJm
+(==) 11.9551 Tj
+-600 TJm
+(1007) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+284.608 338.758 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(also) 16.0497 Tj
+-251 TJm
+(prints) 22.6948 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xtra) 15.4918 Tj
+-250 TJm
+(te) 7.193 Tj
+15 TJm
+(xt) 7.7509 Tj
+-250 TJm
+(advising) 33.7633 Tj
+-251 TJm
+(the) 12.1743 Tj
+-250 TJm
+(reader) 24.8866 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(unreliable) 39.8404 Tj
+72 326.803 Td
+(memory) 33.2053 Tj
+-425 TJm
+(is) 6.6451 Tj
+-424 TJm
+(often) 20.4731 Tj
+-425 TJm
+(associated) 40.9463 Tj
+-425 TJm
+(with) 17.7135 Tj
+-424 TJm
+(internal) 30.4357 Tj
+-425 TJm
+(error) 19.3573 Tj
+-424 TJm
+(1007.) 22.4159 Tj
+-834 TJm
+(\(This) 21.031 Tj
+-425 TJm
+(is) 6.6451 Tj
+-425 TJm
+(a) 4.4234 Tj
+-424 TJm
+(frequently-observ) 70.8241 Tj
+15 TJm
+(ed-phenomenon) 64.189 Tj
+-425 TJm
+(with) 17.7135 Tj
+-425 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+72 314.848 Td
+(1.0.0/1.0.1\).) 48.4282 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 292.995 Td
+/F124_0 9.9626 Tf
+(exit\(3\)) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+116.334 292.995 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(then) 17.1556 Tj
+-250 TJm
+(called.) 26.2813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 271.142 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-250 TJm
+(a) 4.4234 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+95.093 271.142 Td
+/F124_0 9.9626 Tf
+(stdio) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+124.981 271.142 Td
+/F122_0 9.9626 Tf
+(-free) 18.7994 Tj
+-250 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(assertion) 35.417 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(ailures) 26.5603 Tj
+-250 TJm
+(result) 22.1369 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(call) 14.386 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(function) 33.2053 Tj
+-250 TJm
+(declared) 33.7433 Tj
+-250 TJm
+(as:) 11.0684 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 244.078] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 259.62 Td
+/F124_0 9.9626 Tf
+(extern) 35.8654 Tj
+-426 TJm
+(void) 23.9102 Tj
+-426 TJm
+(bz_internal_error) 101.6185 Tj
+-426 TJm
+(\() 5.9776 Tj
+-426 TJm
+(int) 17.9327 Tj
+-426 TJm
+(errcode) 41.8429 Tj
+-426 TJm
+(\);) 11.9551 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 222.225 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-250 TJm
+(rele) 14.9339 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ant) 12.1743 Tj
+-250 TJm
+(code) 18.8094 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(passed) 26.5603 Tj
+-250 TJm
+(as) 8.2988 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(parameter) 39.8305 Tj
+55 TJm
+(.) 2.4907 Tj
+-620 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(supply) 26.5703 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(function.) 35.696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 200.372 Td
+(In) 8.2988 Tj
+-294 TJm
+(either) 22.6848 Tj
+-294 TJm
+(case,) 19.6363 Tj
+-306 TJm
+(once) 18.8094 Tj
+-294 TJm
+(an) 9.4047 Tj
+-294 TJm
+(assertion) 35.417 Tj
+-294 TJm
+(f) 3.3175 Tj
+10 TJm
+(ailure) 22.6848 Tj
+-294 TJm
+(has) 13.2801 Tj
+-295 TJm
+(occurred,) 37.3398 Tj
+-305 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+306.541 200.372 Td
+/F124_0 9.9626 Tf
+(bz_stream) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.271 200.372 Td
+/F122_0 9.9626 Tf
+(records) 29.3199 Tj
+-294 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+20 TJm
+(olv) 12.7322 Tj
+15 TJm
+(ed) 9.4047 Tj
+-294 TJm
+(can) 13.8281 Tj
+-295 TJm
+(be) 9.4047 Tj
+-294 TJm
+(re) 7.7409 Tj
+15 TJm
+(g) 4.9813 Tj
+5 TJm
+(arded) 22.1269 Tj
+-294 TJm
+(as) 8.2988 Tj
+-294 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+25 TJm
+(alid.) 17.4346 Tj
+72 188.417 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(attempt) 29.8878 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(resume) 28.772 Tj
+-250 TJm
+(normal) 28.224 Tj
+-250 TJm
+(operation) 37.6287 Tj
+-250 TJm
+(with) 17.7135 Tj
+-250 TJm
+(them.) 22.4159 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 166.564 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-299 TJm
+(may) 17.1556 Tj
+65 TJm
+(,) 2.4907 Tj
+-310 TJm
+(of) 8.2988 Tj
+-299 TJm
+(course,) 28.493 Tj
+-311 TJm
+(change) 28.2141 Tj
+-298 TJm
+(critical) 27.6661 Tj
+-299 TJm
+(error) 19.3573 Tj
+-298 TJm
+(handling) 34.8691 Tj
+-299 TJm
+(to) 7.7509 Tj
+-298 TJm
+(suit) 14.396 Tj
+-299 TJm
+(your) 18.2614 Tj
+-298 TJm
+(needs.) 25.1755 Tj
+-912 TJm
+(As) 11.0684 Tj
+-298 TJm
+(I) 3.3175 Tj
+-299 TJm
+(said) 16.0497 Tj
+-298 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+-311 TJm
+(critical) 27.6661 Tj
+-299 TJm
+(errors) 23.2328 Tj
+-298 TJm
+(indicate) 31.5416 Tj
+-299 TJm
+(b) 4.9813 Tj
+20 TJm
+(ugs) 13.8381 Tj
+72 154.609 Td
+(in) 7.7509 Tj
+-263 TJm
+(the) 12.1743 Tj
+-263 TJm
+(library) 26.5603 Tj
+-263 TJm
+(and) 14.386 Tj
+-263 TJm
+(should) 26.5703 Tj
+-263 TJm
+(not) 12.7322 Tj
+-263 TJm
+(occur) 22.1269 Tj
+55 TJm
+(.) 2.4907 Tj
+-697 TJm
+(All) 12.7322 Tj
+-263 TJm
+("normal") 36.3535 Tj
+-263 TJm
+(error) 19.3573 Tj
+-263 TJm
+(situations) 38.1966 Tj
+-263 TJm
+(are) 12.1643 Tj
+-263 TJm
+(indicated) 36.5229 Tj
+-263 TJm
+(via) 12.1743 Tj
+-263 TJm
+(error) 19.3573 Tj
+-263 TJm
+(return) 23.7907 Tj
+-263 TJm
+(codes) 22.6848 Tj
+-263 TJm
+(from) 19.3673 Tj
+-263 TJm
+(functions,) 39.5714 Tj
+72 142.653 Td
+(and) 14.386 Tj
+-250 TJm
+(can) 13.8281 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(reco) 17.1456 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ered) 17.1456 Tj
+-250 TJm
+(from.) 21.8579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 107.965 Td
+/F116_0 20.6585 Tf
+(3.8.) 34.4584 Tj
+-278 TJm
+(Making) 71.1685 Tj
+-278 TJm
+(a) 11.4861 Tj
+-278 TJm
+(Windo) 63.1117 Tj
+15 TJm
+(ws) 27.5584 Tj
+-278 TJm
+(DLL) 40.1601 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 86.112 Td
+/F122_0 9.9626 Tf
+(Ev) 11.0684 Tj
+15 TJm
+(erything) 33.2053 Tj
+-328 TJm
+(related) 27.1082 Tj
+-327 TJm
+(to) 7.7509 Tj
+-328 TJm
+(W) 9.4047 Tj
+40 TJm
+(indo) 17.7135 Tj
+25 TJm
+(ws) 11.0684 Tj
+-328 TJm
+(has) 13.2801 Tj
+-327 TJm
+(been) 18.8094 Tj
+-328 TJm
+(contrib) 28.224 Tj
+20 TJm
+(uted) 17.1556 Tj
+-328 TJm
+(by) 9.9626 Tj
+-327 TJm
+(Y) 7.193 Tj
+110 TJm
+(oshioka) 30.9936 Tj
+-328 TJm
+(Tsuneo) 29.3299 Tj
+-328 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+378.139 86.112 Td
+/F124_0 9.9626 Tf
+(tsuneo@rr.iij4u.or.jp) 125.5288 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+503.668 86.112 Td
+/F122_0 9.9626 Tf
+(\),) 5.8082 Tj
+-347 TJm
+(so) 8.8568 Tj
+-328 TJm
+(you) 14.9439 Tj
+72 74.157 Td
+(should) 26.5703 Tj
+-250 TJm
+(send) 18.2614 Tj
+-250 TJm
+(your) 18.2614 Tj
+-250 TJm
+(queries) 28.772 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(him) 15.5018 Tj
+-250 TJm
+(\(b) 8.2988 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(perhaps) 30.9837 Tj
+-250 TJm
+(Cc:) 13.8381 Tj
+-310 TJm
+(me,) 14.6649 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+287.958 74.157 Td
+/F124_0 9.9626 Tf
+(jseward@bzip.org) 95.641 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+383.6 74.157 Td
+/F122_0 9.9626 Tf
+(\).) 5.8082 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 51.071 Td
+(29) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 30 33
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+419.067 749.245 Td
+/F122_0 9.9626 Tf
+(Programming) 54.7943 Tj
+-250 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.556 749.245 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(My) 13.8381 Tj
+-367 TJm
+(v) 4.9813 Tj
+25 TJm
+(ague) 18.8094 Tj
+-367 TJm
+(understanding) 56.4481 Tj
+-367 TJm
+(of) 8.2988 Tj
+-367 TJm
+(what) 19.3673 Tj
+-368 TJm
+(to) 7.7509 Tj
+-367 TJm
+(do) 9.9626 Tj
+-367 TJm
+(is:) 9.4147 Tj
+-544 TJm
+(using) 21.589 Tj
+-367 TJm
+(V) 7.193 Tj
+60 TJm
+(isual) 18.8194 Tj
+-367 TJm
+(C++) 17.8829 Tj
+-367 TJm
+(5.0,) 14.9439 Tj
+-397 TJm
+(open) 19.3673 Tj
+-367 TJm
+(the) 12.1743 Tj
+-367 TJm
+(project) 27.6661 Tj
+-367 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+432.966 710.037 Td
+/F124_0 9.9626 Tf
+(libbz2.dsp) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+492.742 710.037 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-396 TJm
+(and) 14.386 Tj
+-368 TJm
+(b) 4.9813 Tj
+20 TJm
+(uild.) 17.9925 Tj
+72 698.082 Td
+(That') 21.579 Tj
+55 TJm
+(s) 3.8755 Tj
+-250 TJm
+(all.) 12.4533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 676.164 Td
+(If) 6.6351 Tj
+-284 TJm
+(you) 14.9439 Tj
+-284 TJm
+(can') 17.1456 Tj
+18 TJm
+(t) 2.7696 Tj
+-285 TJm
+(open) 19.3673 Tj
+-284 TJm
+(the) 12.1743 Tj
+-284 TJm
+(project) 27.6661 Tj
+-284 TJm
+(\002le) 12.7322 Tj
+-284 TJm
+(for) 11.6164 Tj
+-285 TJm
+(some) 21.031 Tj
+-284 TJm
+(reason,) 28.493 Tj
+-293 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-284 TJm
+(a) 4.4234 Tj
+-284 TJm
+(ne) 9.4047 Tj
+25 TJm
+(w) 7.193 Tj
+-284 TJm
+(one,) 16.8766 Tj
+-293 TJm
+(naming) 29.8878 Tj
+-284 TJm
+(these) 20.4731 Tj
+-284 TJm
+(\002les:) 19.3773 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+424.505 676.164 Td
+/F124_0 9.9626 Tf
+(blocksort.c) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+490.259 676.164 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+495.666 676.164 Td
+/F124_0 9.9626 Tf
+(bzlib.c) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+537.509 676.164 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 664.209 Td
+/F124_0 9.9626 Tf
+(compress.c) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+131.776 664.209 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+136.436 664.209 Td
+/F124_0 9.9626 Tf
+(crctable.c) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+196.211 664.209 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+200.871 664.209 Td
+/F124_0 9.9626 Tf
+(decompress.c) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+272.602 664.209 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+277.262 664.209 Td
+/F124_0 9.9626 Tf
+(huffman.c) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+331.06 664.209 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+335.72 664.209 Td
+/F124_0 9.9626 Tf
+(randtable.c) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+403.562 664.209 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+420.037 664.209 Td
+/F124_0 9.9626 Tf
+(libbz2.def) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+479.812 664.209 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-593 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-210 TJm
+(will) 15.5018 Tj
+-209 TJm
+(also) 16.0497 Tj
+72 652.254 Td
+(need) 18.8094 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(name) 21.579 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(header) 26.5503 Tj
+-250 TJm
+(\002les) 16.6077 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+190.415 652.254 Td
+/F124_0 9.9626 Tf
+(bzlib.h) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+234.749 652.254 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+251.625 652.254 Td
+/F124_0 9.9626 Tf
+(bzlib_private.h) 89.6634 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+341.289 652.254 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 630.336 Td
+(If) 6.6351 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(don') 18.2614 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(VC++,) 27.5665 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(may) 17.1556 Tj
+-250 TJm
+(need) 18.8094 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(de\002ne) 24.3486 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(proprocessor) 51.4568 Tj
+-250 TJm
+(symbol) 29.3399 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.634 630.336 Td
+/F124_0 9.9626 Tf
+(_WIN32) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+399.5 630.336 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 608.418 Td
+(Finally) 28.234 Tj
+65 TJm
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.568 608.418 Td
+/F124_0 9.9626 Tf
+(dlltest.c) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+160.856 608.418 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(sample) 28.224 Tj
+-250 TJm
+(program) 33.7533 Tj
+-250 TJm
+(using) 21.589 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(DLL.) 21.8579 Tj
+-500 TJm
+(It) 6.0871 Tj
+-250 TJm
+(has) 13.2801 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(project) 27.6661 Tj
+-250 TJm
+(\002le,) 15.2229 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+388.58 608.418 Td
+/F124_0 9.9626 Tf
+(dlltest.dsp) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+454.334 608.418 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 586.501 Td
+(If) 6.6351 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(just) 14.396 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e\002le) 17.1556 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(V) 7.193 Tj
+60 TJm
+(isual) 18.8194 Tj
+-250 TJm
+(C,) 9.1357 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(look) 17.7135 Tj
+-250 TJm
+(at) 7.193 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+292.212 586.501 Td
+/F124_0 9.9626 Tf
+(makefile.msc) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+363.943 586.501 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 564.583 Td
+(Be) 11.0684 Tj
+-291 TJm
+(a) 4.4234 Tj
+15 TJm
+(w) 7.193 Tj
+10 TJm
+(are) 12.1643 Tj
+-291 TJm
+(that) 14.9439 Tj
+-291 TJm
+(if) 6.0871 Tj
+-291 TJm
+(you) 14.9439 Tj
+-291 TJm
+(compile) 32.0995 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+192.07 564.583 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+224.857 564.583 Td
+/F122_0 9.9626 Tf
+(itself) 19.9252 Tj
+-291 TJm
+(on) 9.9626 Tj
+-291 TJm
+(W) 9.4047 Tj
+40 TJm
+(in32,) 20.2042 Tj
+-301 TJm
+(you) 14.9439 Tj
+-291 TJm
+(must) 19.3773 Tj
+-291 TJm
+(set) 11.0684 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+346.842 564.583 Td
+/F124_0 9.9626 Tf
+(BZ_UNIX) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+391.584 564.583 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-291 TJm
+(0) 4.9813 Tj
+-291 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+427.4 564.583 Td
+/F124_0 9.9626 Tf
+(BZ_LCCWIN32) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+496.052 564.583 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-291 TJm
+(1,) 7.472 Tj
+-301 TJm
+(in) 7.7509 Tj
+-291 TJm
+(the) 12.1743 Tj
+72 552.628 Td
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+87.223 552.628 Td
+/F124_0 9.9626 Tf
+(bzip2.c) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+129.066 552.628 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(before) 25.4445 Tj
+-250 TJm
+(compiling.) 42.899 Tj
+-310 TJm
+(Otherwise) 40.9463 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(resulting) 34.8691 Tj
+-250 TJm
+(binary) 25.4544 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(on') 13.2801 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-250 TJm
+(correctly) 35.4071 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 530.71 Td
+(I) 3.3175 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(en') 12.7222 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(tried) 18.2614 Tj
+-250 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(stuf) 14.9439 Tj
+25 TJm
+(f) 3.3175 Tj
+-250 TJm
+(myself,) 29.6088 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(looks) 21.589 Tj
+-250 TJm
+(plausible.) 38.4656 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(30) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 31 34
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 701.916 Td
+/F116_0 24.7902 Tf
+(4.) 20.675 Tj
+-278 TJm
+(Miscellanea) 139.1722 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 656.35 Td
+/F116_0 17.2154 Tf
+(T) 10.5186 Tj
+80 TJm
+(ab) 20.0904 Tj
+10 TJm
+(le) 14.3576 Tj
+-278 TJm
+(of) 16.2513 Tj
+-278 TJm
+(Contents) 74.5943 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 635.788 Td
+/F122_0 9.9626 Tf
+(4.1.) 14.9439 Tj
+-310 TJm
+(Limitations) 45.9475 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(format) 26.5603 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+269.154 635.788 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 635.788 Td
+/F122_0 9.9626 Tf
+(31) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 623.832 Td
+(4.2.) 14.9439 Tj
+-310 TJm
+(Portability) 42.0721 Tj
+-250 TJm
+(issues) 23.8007 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+172.03 623.832 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 623.832 Td
+/F122_0 9.9626 Tf
+(32) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 611.877 Td
+(4.3.) 14.9439 Tj
+-310 TJm
+(Reporting) 39.8504 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ugs) 13.8381 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+166.115 611.877 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 611.877 Td
+/F122_0 9.9626 Tf
+(32) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 599.922 Td
+(4.4.) 14.9439 Tj
+-310 TJm
+(Did) 14.9439 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(get) 12.1743 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(right) 18.8194 Tj
+-250 TJm
+(package?) 37.0609 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+229.109 599.922 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 599.922 Td
+/F122_0 9.9626 Tf
+(33) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 587.967 Td
+(4.5.) 14.9439 Tj
+-310 TJm
+(Further) 29.3299 Tj
+-250 TJm
+(Reading) 33.2053 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+170.361 587.967 Td
+/F230_0 9.9626 Tf
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-166 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+-167 TJm
+(:) 2.7676 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+506.127 587.967 Td
+/F122_0 9.9626 Tf
+(34) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 556.086 Td
+(These) 23.7907 Tj
+-250 TJm
+(are) 12.1643 Tj
+-250 TJm
+(just) 14.396 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(random) 30.4357 Tj
+-250 TJm
+(thoughts) 34.3212 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(mine.) 22.4159 Tj
+-620 TJm
+(Y) 7.193 Tj
+110 TJm
+(our) 13.2801 Tj
+-250 TJm
+(mileage) 31.5416 Tj
+-250 TJm
+(may) 17.1556 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(ary) 12.7222 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 521.334 Td
+/F116_0 20.6585 Tf
+(4.1.) 34.4584 Tj
+-278 TJm
+(Limitations) 110.1924 Tj
+-278 TJm
+(of) 19.5016 Tj
+-278 TJm
+(the) 30.9878 Tj
+-278 TJm
+(compressed) 121.6992 Tj
+-278 TJm
+(\002le) 29.8515 Tj
+-278 TJm
+(f) 6.8793 Tj
+20 TJm
+(ormat) 57.3893 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 499.416 Td
+/F124_0 9.9626 Tf
+(bzip2-1.0.X) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+137.753 499.416 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+143.405 499.416 Td
+/F124_0 9.9626 Tf
+(0.9.5) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+176.453 499.416 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+194 499.416 Td
+/F124_0 9.9626 Tf
+(0.9.0) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+227.048 499.416 Td
+/F122_0 9.9626 Tf
+(use) 13.2801 Tj
+-317 TJm
+(e) 4.4234 Tj
+15 TJm
+(xactly) 24.3486 Tj
+-318 TJm
+(the) 12.1743 Tj
+-317 TJm
+(same) 20.4731 Tj
+-317 TJm
+(\002le) 12.7322 Tj
+-317 TJm
+(format) 26.5603 Tj
+-317 TJm
+(as) 8.2988 Tj
+-318 TJm
+(the) 12.1743 Tj
+-317 TJm
+(original) 30.9936 Tj
+-317 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion,) 26.8392 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+455.801 499.416 Td
+/F124_0 9.9626 Tf
+(bzip2-0.1) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+509.599 499.416 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1024 TJm
+(This) 17.7135 Tj
+72 487.461 Td
+(decision) 33.2053 Tj
+-222 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-222 TJm
+(made) 21.579 Tj
+-222 TJm
+(in) 7.7509 Tj
+-221 TJm
+(the) 12.1743 Tj
+-222 TJm
+(interests) 33.2053 Tj
+-222 TJm
+(of) 8.2988 Tj
+-222 TJm
+(stability) 32.1095 Tj
+65 TJm
+(.) 2.4907 Tj
+-601 TJm
+(Creating) 34.3112 Tj
+-222 TJm
+(yet) 12.1743 Tj
+-222 TJm
+(another) 29.8778 Tj
+-222 TJm
+(incompatible) 52.0247 Tj
+-221 TJm
+(compressed) 47.0334 Tj
+-222 TJm
+(\002le) 12.7322 Tj
+-222 TJm
+(format) 26.5603 Tj
+-222 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-222 TJm
+(create) 23.7807 Tj
+72 475.505 Td
+(further) 27.1082 Tj
+-250 TJm
+(confusion) 39.2925 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(disruption) 40.4083 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(users.) 22.9638 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 453.588 Td
+(Ne) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ertheless,) 37.3498 Tj
+-234 TJm
+(this) 14.396 Tj
+-229 TJm
+(is) 6.6451 Tj
+-230 TJm
+(not) 12.7322 Tj
+-229 TJm
+(a) 4.4234 Tj
+-230 TJm
+(painless) 32.0995 Tj
+-229 TJm
+(decision.) 35.696 Tj
+-606 TJm
+(De) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(elopment) 37.0808 Tj
+-230 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-230 TJm
+(sinc) 16.0497 Tj
+1 TJm
+(e) 4.4234 Tj
+-230 TJm
+(the) 12.1743 Tj
+-230 TJm
+(release) 27.6562 Tj
+-229 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+407.317 453.588 Td
+/F124_0 9.9626 Tf
+(bzip2-0.1) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+463.402 453.588 Td
+/F122_0 9.9626 Tf
+(in) 7.7509 Tj
+-230 TJm
+(August) 28.782 Tj
+-229 TJm
+(1997) 19.9252 Tj
+-230 TJm
+(has) 13.2801 Tj
+72 441.632 Td
+(sho) 13.8381 Tj
+25 TJm
+(wn) 12.1743 Tj
+-226 TJm
+(comple) 29.3299 Tj
+15 TJm
+(xities) 21.589 Tj
+-226 TJm
+(in) 7.7509 Tj
+-225 TJm
+(the) 12.1743 Tj
+-226 TJm
+(\002le) 12.7322 Tj
+-226 TJm
+(format) 26.5603 Tj
+-226 TJm
+(which) 24.3486 Tj
+-226 TJm
+(slo) 11.6264 Tj
+25 TJm
+(w) 7.193 Tj
+-225 TJm
+(do) 9.9626 Tj
+25 TJm
+(wn) 12.1743 Tj
+-226 TJm
+(decompression) 59.7656 Tj
+-226 TJm
+(and,) 16.8766 Tj
+-231 TJm
+(in) 7.7509 Tj
+-226 TJm
+(retrospect,) 41.7732 Tj
+-230 TJm
+(are) 12.1643 Tj
+-226 TJm
+(unnecessary) 48.6872 Tj
+65 TJm
+(.) 2.4907 Tj
+-604 TJm
+(These) 23.7907 Tj
+-226 TJm
+(are:) 14.9339 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 409.752 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(The) 15.4918 Tj
+-287 TJm
+(run-length) 41.5042 Tj
+-287 TJm
+(encoder) 31.5316 Tj
+40 TJm
+(,) 2.4907 Tj
+-297 TJm
+(which) 24.3486 Tj
+-287 TJm
+(is) 6.6451 Tj
+-288 TJm
+(the) 12.1743 Tj
+-287 TJm
+(\002rst) 15.5018 Tj
+-287 TJm
+(of) 8.2988 Tj
+-287 TJm
+(the) 12.1743 Tj
+-288 TJm
+(compression) 50.3609 Tj
+-287 TJm
+(transformations,) 65.0259 Tj
+-296 TJm
+(is) 6.6451 Tj
+-288 TJm
+(entirely) 30.4357 Tj
+-287 TJm
+(irrele) 21.0211 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ant.) 14.6649 Tj
+-843 TJm
+(The) 15.4918 Tj
+-288 TJm
+(original) 30.9936 Tj
+81.963 397.797 Td
+(purpose) 31.5416 Tj
+-322 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-322 TJm
+(to) 7.7509 Tj
+-322 TJm
+(protect) 27.6661 Tj
+-321 TJm
+(the) 12.1743 Tj
+-322 TJm
+(sorting) 27.6761 Tj
+-322 TJm
+(algorithm) 38.7446 Tj
+-322 TJm
+(from) 19.3673 Tj
+-322 TJm
+(the) 12.1743 Tj
+-322 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-322 TJm
+(w) 7.193 Tj
+10 TJm
+(orst) 14.9439 Tj
+-321 TJm
+(case) 17.1456 Tj
+-322 TJm
+(input:) 23.2527 Tj
+-454 TJm
+(a) 4.4234 Tj
+-322 TJm
+(string) 22.6948 Tj
+-322 TJm
+(of) 8.2988 Tj
+-322 TJm
+(repeated) 33.7433 Tj
+-321 TJm
+(symbols.) 35.706 Tj
+-1052 TJm
+(But) 14.396 Tj
+81.963 385.842 Td
+(algorithm) 38.7446 Tj
+-229 TJm
+(steps) 19.9252 Tj
+-230 TJm
+(Q6a) 16.5977 Tj
+-229 TJm
+(and) 14.386 Tj
+-230 TJm
+(Q6b) 17.1556 Tj
+-229 TJm
+(in) 7.7509 Tj
+-230 TJm
+(t) 2.7696 Tj
+1 TJm
+(he) 9.4047 Tj
+-230 TJm
+(original) 30.9936 Tj
+-229 TJm
+(Burro) 23.2427 Tj
+25 TJm
+(ws-Wheeler) 48.1293 Tj
+-230 TJm
+(technical) 35.965 Tj
+-229 TJm
+(report) 23.7907 Tj
+-230 TJm
+(\(SRC-124\)) 43.7259 Tj
+-229 TJm
+(sho) 13.8381 Tj
+25 TJm
+(w) 7.193 Tj
+-229 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-230 TJm
+(repeats) 28.2141 Tj
+-229 TJm
+(can) 13.8281 Tj
+-230 TJm
+(be) 9.4047 Tj
+81.963 373.886 Td
+(handled) 31.5416 Tj
+-250 TJm
+(without) 30.4457 Tj
+-250 TJm
+(dif) 11.0684 Tj
+25 TJm
+(\002culty) 25.4644 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(block) 22.1369 Tj
+-250 TJm
+(sorting.) 30.1668 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 351.969 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(The) 15.4918 Tj
+-315 TJm
+(randomisation) 57.006 Tj
+-314 TJm
+(mechanism) 45.3796 Tj
+-315 TJm
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-314 TJm
+(really) 22.6848 Tj
+-315 TJm
+(need) 18.8094 Tj
+-315 TJm
+(to) 7.7509 Tj
+-314 TJm
+(be) 9.4047 Tj
+-315 TJm
+(there.) 22.4059 Tj
+-1007 TJm
+(Udi) 14.9439 Tj
+-315 TJm
+(Manber) 30.9837 Tj
+-315 TJm
+(and) 14.386 Tj
+-314 TJm
+(Gene) 21.0211 Tj
+-315 TJm
+(Myers) 25.4544 Tj
+-314 TJm
+(published) 38.7446 Tj
+-315 TJm
+(a) 4.4234 Tj
+-315 TJm
+(suf) 12.1743 Tj
+25 TJm
+(\002x) 10.5205 Tj
+81.963 340.013 Td
+(array) 20.4632 Tj
+-266 TJm
+(construction) 49.2551 Tj
+-266 TJm
+(algorithm) 38.7446 Tj
+-266 TJm
+(a) 4.4234 Tj
+-266 TJm
+(fe) 7.7409 Tj
+25 TJm
+(w) 7.193 Tj
+-266 TJm
+(years) 21.0211 Tj
+-266 TJm
+(back,) 21.3 Tj
+-269 TJm
+(which) 24.3486 Tj
+-266 TJm
+(can) 13.8281 Tj
+-266 TJm
+(be) 9.4047 Tj
+-266 TJm
+(emplo) 24.9065 Tj
+10 TJm
+(yed) 14.386 Tj
+-266 TJm
+(to) 7.7509 Tj
+-266 TJm
+(sort) 14.9439 Tj
+-266 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-266 TJm
+(block,) 24.6275 Tj
+-270 TJm
+(no) 9.9626 Tj
+-266 TJm
+(matter) 25.4544 Tj
+-266 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-266 TJm
+(repetiti) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+81.963 328.058 Td
+(in) 7.7509 Tj
+-257 TJm
+(O\(N) 17.7035 Tj
+-257 TJm
+(log) 12.7322 Tj
+-257 TJm
+(N\)) 10.5105 Tj
+-258 TJm
+(time.) 20.2042 Tj
+-663 TJm
+(Subsequent) 45.9375 Tj
+-257 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-257 TJm
+(by) 9.9626 Tj
+-257 TJm
+(K) 7.193 Tj
+15 TJm
+(unihik) 25.4644 Tj
+10 TJm
+(o) 4.9813 Tj
+-257 TJm
+(Sadakane) 38.1767 Tj
+-258 TJm
+(has) 13.2801 Tj
+-257 TJm
+(produced) 37.0708 Tj
+-257 TJm
+(a) 4.4234 Tj
+-257 TJm
+(deri) 15.4918 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ati) 9.9626 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-257 TJm
+(O\(N) 17.7035 Tj
+-257 TJm
+(\(log) 16.0497 Tj
+-258 TJm
+(N\)^2\)) 23.4818 Tj
+-257 TJm
+(algorithm) 38.7446 Tj
+81.963 316.103 Td
+(which) 24.3486 Tj
+-250 TJm
+(usually) 28.782 Tj
+-250 TJm
+(outperforms) 48.6972 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(Manber) 30.9837 Tj
+20 TJm
+(-Myers) 28.772 Tj
+-250 TJm
+(algorithm.) 41.2352 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 294.185 Td
+(I) 3.3175 Tj
+-274 TJm
+(could) 22.1369 Tj
+-274 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-274 TJm
+(changed) 33.1954 Tj
+-274 TJm
+(to) 7.7509 Tj
+-274 TJm
+(Sadakane') 41.4942 Tj
+55 TJm
+(s) 3.8755 Tj
+-274 TJm
+(algorithm,) 41.2352 Tj
+-280 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-274 TJm
+(I) 3.3175 Tj
+-274 TJm
+(\002nd) 15.5018 Tj
+-274 TJm
+(it) 5.5392 Tj
+-274 TJm
+(to) 7.7509 Tj
+-274 TJm
+(be) 9.4047 Tj
+-274 TJm
+(slo) 11.6264 Tj
+25 TJm
+(wer) 14.9339 Tj
+-274 TJm
+(than) 17.1556 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+391.407 294.185 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+421.295 294.185 Td
+/F122_0 9.9626 Tf
+(') 3.3175 Tj
+55 TJm
+(s) 3.8755 Tj
+-274 TJm
+(e) 4.4234 Tj
+15 TJm
+(xisting) 27.1282 Tj
+-274 TJm
+(algorithm) 38.7446 Tj
+-274 TJm
+(for) 11.6164 Tj
+-274 TJm
+(most) 19.3773 Tj
+81.963 282.23 Td
+(inputs,) 26.8492 Tj
+-399 TJm
+(and) 14.386 Tj
+-369 TJm
+(the) 12.1743 Tj
+-369 TJm
+(randomisation) 57.006 Tj
+-370 TJm
+(me) 12.1743 Tj
+1 TJm
+(chanism) 33.2053 Tj
+-370 TJm
+(protects) 31.5416 Tj
+-369 TJm
+(adequately) 43.158 Tj
+-369 TJm
+(ag) 9.4047 Tj
+5 TJm
+(ainst) 18.8194 Tj
+-369 TJm
+(bad) 14.386 Tj
+-369 TJm
+(cases.) 23.5117 Tj
+-1336 TJm
+(I) 3.3175 Tj
+-369 TJm
+(didn') 21.031 Tj
+18 TJm
+(t) 2.7696 Tj
+-369 TJm
+(think) 20.4831 Tj
+-369 TJm
+(it) 5.5392 Tj
+-369 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-369 TJm
+(a) 4.4234 Tj
+-370 TJm
+(good) 19.9252 Tj
+81.963 270.275 Td
+(tradeof) 28.2141 Tj
+25 TJm
+(f) 3.3175 Tj
+-282 TJm
+(to) 7.7509 Tj
+-283 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e.) 6.914 Tj
+-815 TJm
+(P) 5.5392 Tj
+15 TJm
+(artly) 18.2614 Tj
+-282 TJm
+(this) 14.396 Tj
+-282 TJm
+(is) 6.6451 Tj
+-283 TJm
+(due) 14.386 Tj
+-282 TJm
+(to) 7.7509 Tj
+-283 TJm
+(the) 12.1743 Tj
+-282 TJm
+(f) 3.3175 Tj
+10 TJm
+(act) 11.6164 Tj
+-283 TJm
+(that) 14.9439 Tj
+-282 TJm
+(I) 3.3175 Tj
+-283 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-282 TJm
+(not) 12.7322 Tj
+-282 TJm
+(\003ooded) 29.8878 Tj
+-283 TJm
+(with) 17.7135 Tj
+-282 TJm
+(email) 22.1369 Tj
+-283 TJm
+(complaints) 43.7259 Tj
+-282 TJm
+(about) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+479.557 270.275 Td
+/F124_0 9.9626 Tf
+(bzip2-0.1) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+533.355 270.275 Td
+/F122_0 9.9626 Tf
+(') 3.3175 Tj
+55 TJm
+(s) 3.8755 Tj
+81.963 258.32 Td
+(performance) 50.341 Tj
+-250 TJm
+(on) 9.9626 Tj
+-250 TJm
+(repetiti) 28.224 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(data,) 19.0883 Tj
+-250 TJm
+(so) 8.8568 Tj
+-250 TJm
+(perhaps) 30.9837 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(isn') 14.9439 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(problem) 33.2053 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(real) 14.9339 Tj
+-250 TJm
+(inputs.) 26.8492 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 236.402 Td
+(Probably) 35.9749 Tj
+-314 TJm
+(the) 12.1743 Tj
+-315 TJm
+(best) 16.0497 Tj
+-314 TJm
+(long-term) 39.2925 Tj
+-314 TJm
+(solution,) 34.6001 Tj
+-331 TJm
+(and) 14.386 Tj
+-314 TJm
+(the) 12.1743 Tj
+-314 TJm
+(one) 14.386 Tj
+-315 TJm
+(I) 3.3175 Tj
+-314 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-314 TJm
+(incorporated) 50.351 Tj
+-315 TJm
+(into) 15.5018 Tj
+-314 TJm
+(0.9.5) 19.9252 Tj
+-314 TJm
+(and) 14.386 Tj
+-315 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+-330 TJm
+(is) 6.6451 Tj
+-315 TJm
+(to) 7.7509 Tj
+-314 TJm
+(use) 13.2801 Tj
+-314 TJm
+(the) 12.1743 Tj
+-315 TJm
+(e) 4.4234 Tj
+15 TJm
+(xisting) 27.1282 Tj
+81.963 224.447 Td
+(sorting) 27.6761 Tj
+-206 TJm
+(algorithm) 38.7446 Tj
+-206 TJm
+(initially) 31.0036 Tj
+65 TJm
+(,) 2.4907 Tj
+-215 TJm
+(and) 14.386 Tj
+-207 TJm
+(f) 3.3175 Tj
+10 TJm
+(all) 9.9626 Tj
+-206 TJm
+(back) 18.8094 Tj
+-206 TJm
+(to) 7.7509 Tj
+-206 TJm
+(a) 4.4234 Tj
+-207 TJm
+(O\(N) 17.7035 Tj
+-206 TJm
+(\(log) 16.0497 Tj
+-206 TJm
+(N\)^2\)) 23.4818 Tj
+-206 TJm
+(algorithm) 38.7446 Tj
+-206 TJm
+(if) 6.0871 Tj
+-207 TJm
+(the) 12.1743 Tj
+-206 TJm
+(standard) 33.7533 Tj
+-206 TJm
+(algorithm) 38.7446 Tj
+-206 TJm
+(gets) 16.0497 Tj
+-206 TJm
+(into) 15.5018 Tj
+-207 TJm
+(dif) 11.0684 Tj
+25 TJm
+(\002culties.) 34.0422 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 202.529 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(The) 15.4918 Tj
+-321 TJm
+(compressed) 47.0334 Tj
+-322 TJm
+(\002le) 12.7322 Tj
+-321 TJm
+(format) 26.5603 Tj
+-321 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-322 TJm
+(ne) 9.4047 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-321 TJm
+(designed) 35.417 Tj
+-321 TJm
+(to) 7.7509 Tj
+-322 TJm
+(be) 9.4047 Tj
+-321 TJm
+(handled) 31.5416 Tj
+-321 TJm
+(by) 9.9626 Tj
+-322 TJm
+(a) 4.4234 Tj
+-321 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-339 TJm
+(and) 14.386 Tj
+-322 TJm
+(I) 3.3175 Tj
+-321 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-321 TJm
+(had) 14.386 Tj
+-322 TJm
+(to) 7.7509 Tj
+-321 TJm
+(jump) 20.4831 Tj
+-321 TJm
+(though) 27.6761 Tj
+-322 TJm
+(some) 21.031 Tj
+81.963 190.574 Td
+(hoops) 23.8007 Tj
+-299 TJm
+(t) 2.7696 Tj
+1 TJm
+(o) 4.9813 Tj
+-299 TJm
+(produce) 32.0895 Tj
+-299 TJm
+(an) 9.4047 Tj
+-298 TJm
+(ef) 7.7409 Tj
+25 TJm
+(\002cient) 24.9065 Tj
+-299 TJm
+(implementation) 62.5452 Tj
+-298 TJm
+(of) 8.2988 Tj
+-299 TJm
+(decompression.) 62.2563 Tj
+-911 TJm
+(It') 9.4047 Tj
+55 TJm
+(s) 3.8755 Tj
+-298 TJm
+(a) 4.4234 Tj
+-299 TJm
+(bit) 10.5205 Tj
+-298 TJm
+(hairy) 20.4731 Tj
+65 TJm
+(.) 2.4907 Tj
+-912 TJm
+(T) 6.0871 Tj
+35 TJm
+(ry) 8.2988 Tj
+-298 TJm
+(passing) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+468.269 190.574 Td
+/F124_0 9.9626 Tf
+(decompress.c) 71.7307 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 178.619 Td
+/F122_0 9.9626 Tf
+(through) 30.9936 Tj
+-289 TJm
+(the) 12.1743 Tj
+-289 TJm
+(C) 6.6451 Tj
+-289 TJm
+(preprocessor) 50.8989 Tj
+-289 TJm
+(and) 14.386 Tj
+-289 TJm
+(you') 18.2614 Tj
+10 TJm
+(ll) 5.5392 Tj
+-289 TJm
+(see) 12.7222 Tj
+-289 TJm
+(what) 19.3673 Tj
+-289 TJm
+(I) 3.3175 Tj
+-289 TJm
+(mean.) 24.0696 Tj
+-854 TJm
+(Much) 23.2427 Tj
+-289 TJm
+(of) 8.2988 Tj
+-289 TJm
+(this) 14.396 Tj
+-289 TJm
+(comple) 29.3299 Tj
+15 TJm
+(xity) 15.5018 Tj
+-289 TJm
+(could) 22.1369 Tj
+-289 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-289 TJm
+(been) 18.8094 Tj
+-289 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+20 TJm
+(oided) 22.1369 Tj
+-289 TJm
+(if) 6.0871 Tj
+-289 TJm
+(the) 12.1743 Tj
+81.963 166.663 Td
+(compressed) 47.0334 Tj
+-250 TJm
+(size) 15.4918 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(each) 18.2515 Tj
+-250 TJm
+(block) 22.1369 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(recorded) 34.8492 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(data) 16.5977 Tj
+-250 TJm
+(stream.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 144.746 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(An) 12.1743 Tj
+-250 TJm
+(Adler) 22.6848 Tj
+20 TJm
+(-32) 13.2801 Tj
+-250 TJm
+(checksum,) 42.3311 Tj
+-250 TJm
+(rather) 23.2328 Tj
+-250 TJm
+(than) 17.1556 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(CRC32) 29.8978 Tj
+-250 TJm
+(checksum,) 42.3311 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(aster) 18.8094 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(compute.) 36.8018 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 122.828 Td
+(It) 6.0871 Tj
+-349 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-349 TJm
+(be) 9.4047 Tj
+-349 TJm
+(f) 3.3175 Tj
+10 TJm
+(air) 10.5105 Tj
+-348 TJm
+(to) 7.7509 Tj
+-349 TJm
+(say) 13.2801 Tj
+-349 TJm
+(that) 14.9439 Tj
+-349 TJm
+(the) 12.1743 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+201.979 122.828 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+235.342 122.828 Td
+/F122_0 9.9626 Tf
+(format) 26.5603 Tj
+-349 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-349 TJm
+(frozen) 25.4445 Tj
+-348 TJm
+(before) 25.4445 Tj
+-349 TJm
+(I) 3.3175 Tj
+-349 TJm
+(properly) 33.7533 Tj
+-349 TJm
+(and) 14.386 Tj
+-349 TJm
+(fully) 18.8194 Tj
+-349 TJm
+(understood) 44.2738 Tj
+-348 TJm
+(the) 12.1743 Tj
+-349 TJm
+(performance) 50.341 Tj
+72 110.873 Td
+(consequences) 54.7744 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(doing) 22.6948 Tj
+-250 TJm
+(so.) 11.3474 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 88.955 Td
+(Impro) 24.3486 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(ements) 28.224 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(I) 3.3175 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(as) 8.2988 Tj
+-250 TJm
+(able) 16.5977 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(incorporate) 45.3697 Tj
+-250 TJm
+(into) 15.5018 Tj
+-250 TJm
+(0.9.0,) 22.4159 Tj
+-250 TJm
+(despite) 28.224 Tj
+-250 TJm
+(using) 21.589 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(same) 20.4731 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(format,) 29.0509 Tj
+-250 TJm
+(are:) 14.9339 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(31) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 32 35
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+498.728 749.245 Td
+/F122_0 9.9626 Tf
+(Miscellanea) 48.1393 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+74.491 710.037 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(Single) 25.4644 Tj
+-234 TJm
+(array) 20.4632 Tj
+-234 TJm
+(implementation) 62.5452 Tj
+-235 TJm
+(of) 8.2988 Tj
+-234 TJm
+(the) 12.1743 Tj
+-234 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(erse) 16.0398 Tj
+-234 TJm
+(BWT) 22.1369 Tj
+74 TJm
+(.) 2.4907 Tj
+-469 TJm
+(This) 17.7135 Tj
+-234 TJm
+(signi\002cantly) 49.2651 Tj
+-235 TJm
+(speeds) 26.5603 Tj
+-234 TJm
+(up) 9.9626 Tj
+-234 TJm
+(decompression,) 62.2563 Tj
+-237 TJm
+(presumably) 46.4855 Tj
+-235 TJm
+(because) 31.5316 Tj
+81.963 698.082 Td
+(it) 5.5392 Tj
+-250 TJm
+(reduces) 30.4258 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(number) 30.4357 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(cache) 22.6749 Tj
+-250 TJm
+(misses.) 29.0609 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 676.164 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(F) 5.5392 Tj
+15 TJm
+(aster) 18.8094 Tj
+-338 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(erse) 16.0398 Tj
+-338 TJm
+(MTF) 20.4831 Tj
+-338 TJm
+(transform) 38.7346 Tj
+-338 TJm
+(for) 11.6164 Tj
+-339 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-338 TJm
+(MTF) 20.4831 Tj
+-338 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues.) 22.9638 Tj
+-574 TJm
+(The) 15.4918 Tj
+-338 TJm
+(ne) 9.4047 Tj
+25 TJm
+(w) 7.193 Tj
+-339 TJm
+(implementation) 62.5452 Tj
+-338 TJm
+(is) 6.6451 Tj
+-338 TJm
+(based) 22.6848 Tj
+-338 TJm
+(on) 9.9626 Tj
+-338 TJm
+(the) 12.1743 Tj
+-338 TJm
+(notion) 25.4644 Tj
+-339 TJm
+(of) 8.2988 Tj
+-338 TJm
+(sliding) 27.1282 Tj
+81.963 664.209 Td
+(blocks) 26.0123 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(v) 4.9813 Tj
+25 TJm
+(alues.) 22.9638 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 642.291 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+82.461 642.291 Td
+/F124_0 9.9626 Tf
+(bzip2-0.9.0) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+151.137 642.291 Td
+/F122_0 9.9626 Tf
+(no) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-293 TJm
+(reads) 21.0211 Tj
+-294 TJm
+(and) 14.386 Tj
+-293 TJm
+(writes) 24.3486 Tj
+-293 TJm
+(\002les) 16.6077 Tj
+-294 TJm
+(with) 17.7135 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+279.657 642.291 Td
+/F124_0 9.9626 Tf
+(fread) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+312.467 642.291 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+329.776 642.291 Td
+/F124_0 9.9626 Tf
+(fwrite) 35.8654 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+365.642 642.291 Td
+/F122_0 9.9626 Tf
+(;) 2.7696 Tj
+-315 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-293 TJm
+(0.1) 12.4533 Tj
+-294 TJm
+(used) 18.2614 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+440.214 642.291 Td
+/F124_0 9.9626 Tf
+(putc) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+467.047 642.291 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+484.356 642.291 Td
+/F124_0 9.9626 Tf
+(getc) 23.9102 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+508.266 642.291 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-880 TJm
+(Duh!) 20.4731 Tj
+81.963 630.336 Td
+(W) 9.4047 Tj
+80 TJm
+(ell,) 12.4533 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(li) 5.5392 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(learn.) 22.4059 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 608.418 Td
+(Further) 29.3299 Tj
+-304 TJm
+(ahead,) 25.7234 Tj
+-318 TJm
+(it) 5.5392 Tj
+-305 TJm
+(w) 7.193 Tj
+10 TJm
+(ould) 17.7135 Tj
+-304 TJm
+(be) 9.4047 Tj
+-305 TJm
+(nice) 16.5977 Tj
+-304 TJm
+(to) 7.7509 Tj
+-305 TJm
+(be) 9.4047 Tj
+-304 TJm
+(able) 16.5977 Tj
+-304 TJm
+(to) 7.7509 Tj
+-305 TJm
+(do) 9.9626 Tj
+-304 TJm
+(random) 30.4357 Tj
+-305 TJm
+(access) 25.4445 Tj
+-304 TJm
+(into) 15.5018 Tj
+-305 TJm
+(\002les.) 19.0983 Tj
+-946 TJm
+(This) 17.7135 Tj
+-305 TJm
+(will) 15.5018 Tj
+-304 TJm
+(require) 28.2141 Tj
+-304 TJm
+(some) 21.031 Tj
+-305 TJm
+(careful) 27.6562 Tj
+-304 TJm
+(design) 26.0123 Tj
+-305 TJm
+(of) 8.2988 Tj
+72 596.463 Td
+(compressed) 47.0334 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(formats.) 32.9264 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 561.71 Td
+/F116_0 20.6585 Tf
+(4.2.) 34.4584 Tj
+-278 TJm
+(P) 13.7792 Tj
+40 TJm
+(or) 20.6585 Tj
+-20 TJm
+(tability) 66.5823 Tj
+-278 TJm
+(issues) 64.3099 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 539.792 Td
+/F122_0 9.9626 Tf
+(After) 21.0211 Tj
+-250 TJm
+(some) 21.031 Tj
+-250 TJm
+(consideration,) 56.1691 Tj
+-250 TJm
+(I) 3.3175 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(decided) 30.9837 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(use) 13.2801 Tj
+-250 TJm
+(GNU) 21.579 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+303.231 539.792 Td
+/F124_0 9.9626 Tf
+(autoconf) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+353.542 539.792 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-250 TJm
+(con\002gure) 37.6287 Tj
+-250 TJm
+(0.9.5) 19.9252 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(1.0.) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 517.875 Td
+/F124_0 9.9626 Tf
+(autoconf) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+119.821 517.875 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-502 TJm
+(admirable) 39.8404 Tj
+-452 TJm
+(and) 14.386 Tj
+-452 TJm
+(w) 7.193 Tj
+10 TJm
+(onderful) 33.7533 Tj
+-452 TJm
+(though) 27.6761 Tj
+-452 TJm
+(it) 5.5392 Tj
+-452 TJm
+(is,) 9.1357 Tj
+-502 TJm
+(mainly) 27.6761 Tj
+-452 TJm
+(assists) 25.4644 Tj
+-452 TJm
+(with) 17.7135 Tj
+-452 TJm
+(portability) 41.5142 Tj
+-452 TJm
+(problems) 37.0808 Tj
+-452 TJm
+(between) 33.1954 Tj
+-452 TJm
+(Unix-lik) 33.7633 Tj
+10 TJm
+(e) 4.4234 Tj
+72 505.92 Td
+(platforms.) 40.6773 Tj
+-1398 TJm
+(But) 14.396 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+144.784 505.92 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+178.455 505.92 Td
+/F122_0 9.9626 Tf
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-380 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-379 TJm
+(much) 22.1369 Tj
+-380 TJm
+(in) 7.7509 Tj
+-380 TJm
+(the) 12.1743 Tj
+-379 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-380 TJm
+(of) 8.2988 Tj
+-380 TJm
+(portability) 41.5142 Tj
+-379 TJm
+(problems) 37.0808 Tj
+-380 TJm
+(on) 9.9626 Tj
+-380 TJm
+(Unix;) 22.6948 Tj
+-444 TJm
+(most) 19.3773 Tj
+-380 TJm
+(of) 8.2988 Tj
+-380 TJm
+(the) 12.1743 Tj
+-379 TJm
+(dif) 11.0684 Tj
+25 TJm
+(\002culties) 31.5516 Tj
+72 493.964 Td
+(appear) 26.5503 Tj
+-297 TJm
+(when) 21.579 Tj
+-296 TJm
+(p) 4.9813 Tj
+-1 TJm
+(or) 8.2988 Tj
+1 TJm
+(ting) 15.5018 Tj
+-297 TJm
+(to) 7.7509 Tj
+-297 TJm
+(the) 12.1743 Tj
+-297 TJm
+(Mac,) 20.1942 Tj
+-308 TJm
+(or) 8.2988 Tj
+-297 TJm
+(to) 7.7509 Tj
+-297 TJm
+(Microsoft') 42.61 Tj
+55 TJm
+(s) 3.8755 Tj
+-296 TJm
+(operating) 37.6287 Tj
+-297 TJm
+(systems.) 34.0422 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+361.339 493.964 Td
+/F124_0 9.9626 Tf
+(autoconf) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+412.116 493.964 Td
+/F122_0 9.9626 Tf
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-297 TJm
+(help) 17.1556 Tj
+-297 TJm
+(in) 7.7509 Tj
+-296 TJm
+(those) 21.031 Tj
+-297 TJm
+(cases,) 23.5117 Tj
+-308 TJm
+(and) 14.386 Tj
+72 482.009 Td
+(brings) 24.9065 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(whole) 24.3486 Tj
+-250 TJm
+(load) 17.1556 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(ne) 9.4047 Tj
+25 TJm
+(w) 7.193 Tj
+-250 TJm
+(comple) 29.3299 Tj
+15 TJm
+(xity) 15.5018 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 460.091 Td
+(Most) 20.4831 Tj
+-392 TJm
+(people) 26.5603 Tj
+-392 TJm
+(should) 26.5703 Tj
+-393 TJm
+(be) 9.4047 Tj
+-392 TJm
+(able) 16.5977 Tj
+-392 TJm
+(to) 7.7509 Tj
+-392 TJm
+(compile) 32.0995 Tj
+-393 TJm
+(the) 12.1743 Tj
+-392 TJm
+(library) 26.5603 Tj
+-392 TJm
+(and) 14.386 Tj
+-392 TJm
+(program) 33.7533 Tj
+-393 TJm
+(under) 22.6848 Tj
+-392 TJm
+(Unix) 19.9252 Tj
+-392 TJm
+(straight) 29.8878 Tj
+-392 TJm
+(out-of-the-box,) 60.5925 Tj
+-428 TJm
+(so) 8.8568 Tj
+-392 TJm
+(to) 7.7509 Tj
+-393 TJm
+(speak,) 25.1755 Tj
+72 448.136 Td
+(especially) 39.8404 Tj
+-250 TJm
+(if) 6.0871 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(GNU) 21.579 Tj
+-250 TJm
+(C) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable.) 29.0509 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 426.218 Td
+(There) 23.2328 Tj
+-259 TJm
+(are) 12.1643 Tj
+-258 TJm
+(a) 4.4234 Tj
+-259 TJm
+(couple) 26.5603 Tj
+-258 TJm
+(of) 8.2988 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+159.561 426.218 Td
+/F124_0 9.9626 Tf
+(__inline__) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+221.913 426.218 Td
+/F122_0 9.9626 Tf
+(directi) 25.4544 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-259 TJm
+(in) 7.7509 Tj
+-258 TJm
+(the) 12.1743 Tj
+-259 TJm
+(code.) 21.3 Tj
+-671 TJm
+(GNU) 21.579 Tj
+-259 TJm
+(C) 6.6451 Tj
+-258 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+352.587 426.218 Td
+/F124_0 9.9626 Tf
+(gcc) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+370.52 426.218 Td
+/F122_0 9.9626 Tf
+(\)) 3.3175 Tj
+-259 TJm
+(should) 26.5703 Tj
+-258 TJm
+(be) 9.4047 Tj
+-259 TJm
+(able) 16.5977 Tj
+-258 TJm
+(to) 7.7509 Tj
+-259 TJm
+(handle) 26.5603 Tj
+-258 TJm
+(them.) 22.4159 Tj
+-672 TJm
+(If) 6.6351 Tj
+-259 TJm
+(you') 18.2614 Tj
+50 TJm
+(re) 7.7409 Tj
+72 414.263 Td
+(not) 12.7322 Tj
+-279 TJm
+(using) 21.589 Tj
+-279 TJm
+(GNU) 21.579 Tj
+-279 TJm
+(C,) 9.1357 Tj
+-279 TJm
+(your) 18.2614 Tj
+-279 TJm
+(C) 6.6451 Tj
+-279 TJm
+(compiler) 35.417 Tj
+-279 TJm
+(shouldn') 34.8691 Tj
+18 TJm
+(t) 2.7696 Tj
+-279 TJm
+(see) 12.7222 Tj
+-279 TJm
+(them) 19.9252 Tj
+-279 TJm
+(at) 7.193 Tj
+-279 TJm
+(all.) 12.4533 Tj
+-794 TJm
+(If) 6.6351 Tj
+-279 TJm
+(your) 18.2614 Tj
+-279 TJm
+(compiler) 35.417 Tj
+-279 TJm
+(does,) 20.7521 Tj
+-286 TJm
+(for) 11.6164 Tj
+-279 TJm
+(some) 21.031 Tj
+-279 TJm
+(reason,) 28.493 Tj
+-287 TJm
+(see) 12.7222 Tj
+-279 TJm
+(them) 19.9252 Tj
+-279 TJm
+(and) 14.386 Tj
+72 402.308 Td
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-283 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-283 TJm
+(them,) 22.4159 Tj
+-291 TJm
+(just) 14.396 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+164.167 402.308 Td
+/F124_0 9.9626 Tf
+(#define) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-283 TJm
+(__inline__) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+271.425 402.308 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-283 TJm
+(be) 9.4047 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+294.22 402.308 Td
+/F124_0 9.9626 Tf
+(/) 5.9776 Tj
+300.197 400.565 Td
+(*) 5.9776 Tj
+-600 TJm
+(*) 5.9776 Tj
+318.13 402.308 Td
+(/) 5.9776 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+324.108 402.308 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-818 TJm
+(One) 16.5977 Tj
+-283 TJm
+(easy) 17.7035 Tj
+-283 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-283 TJm
+(to) 7.7509 Tj
+-283 TJm
+(do) 9.9626 Tj
+-283 TJm
+(this) 14.396 Tj
+-283 TJm
+(is) 6.6451 Tj
+-283 TJm
+(to) 7.7509 Tj
+-283 TJm
+(compile) 32.0995 Tj
+-283 TJm
+(with) 17.7135 Tj
+-283 TJm
+(the) 12.1743 Tj
+-283 TJm
+(\003ag) 14.9439 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 390.353 Td
+/F124_0 9.9626 Tf
+(-D__inline__=) 77.7083 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+149.709 390.353 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-250 TJm
+(which) 24.3486 Tj
+-250 TJm
+(should) 26.5703 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(understood) 44.2738 Tj
+-250 TJm
+(by) 9.9626 Tj
+-250 TJm
+(most) 19.3773 Tj
+-250 TJm
+(Unix) 19.9252 Tj
+-250 TJm
+(compilers.) 41.7831 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 368.435 Td
+(If) 6.6351 Tj
+-321 TJm
+(you) 14.9439 Tj
+-321 TJm
+(still) 14.9539 Tj
+-322 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-321 TJm
+(dif) 11.0684 Tj
+25 TJm
+(\002culties,) 34.0422 Tj
+-339 TJm
+(try) 11.0684 Tj
+-321 TJm
+(compiling) 40.4083 Tj
+-321 TJm
+(with) 17.7135 Tj
+-322 TJm
+(t) 2.7696 Tj
+1 TJm
+(he) 9.4047 Tj
+-322 TJm
+(macro) 24.8965 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+310.295 368.435 Td
+/F124_0 9.9626 Tf
+(BZ_STRICT_ANSI) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+397.181 368.435 Td
+/F122_0 9.9626 Tf
+(de\002ned.) 31.8205 Tj
+-524 TJm
+(This) 17.7135 Tj
+-321 TJm
+(should) 26.5703 Tj
+-321 TJm
+(enable) 26.0024 Tj
+-321 TJm
+(you) 14.9439 Tj
+-322 TJm
+(to) 7.7509 Tj
+72 356.48 Td
+(b) 4.9813 Tj
+20 TJm
+(uild) 15.5018 Tj
+-321 TJm
+(the) 12.1743 Tj
+-321 TJm
+(library) 26.5603 Tj
+-322 TJm
+(in) 7.7509 Tj
+-321 TJm
+(a) 4.4234 Tj
+-321 TJm
+(strictly) 27.6761 Tj
+-321 TJm
+(ANSI) 23.2427 Tj
+-321 TJm
+(compliant) 39.8504 Tj
+-322 TJm
+(en) 9.4047 Tj
+40 TJm
+(vironment.) 43.4469 Tj
+-1047 TJm
+(Building) 34.8791 Tj
+-321 TJm
+(the) 12.1743 Tj
+-321 TJm
+(program) 33.7533 Tj
+-322 TJm
+(itself) 19.9252 Tj
+-321 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e) 4.4234 Tj
+-321 TJm
+(this) 14.396 Tj
+-321 TJm
+(is) 6.6451 Tj
+-321 TJm
+(dangerous) 40.9463 Tj
+-322 TJm
+(and) 14.386 Tj
+72 344.525 Td
+(not) 12.7322 Tj
+-260 TJm
+(supported,) 41.7831 Tj
+-263 TJm
+(since) 20.4731 Tj
+-260 TJm
+(you) 14.9439 Tj
+-260 TJm
+(remo) 20.4731 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+204.498 344.525 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+234.386 344.525 Td
+/F122_0 9.9626 Tf
+(') 3.3175 Tj
+55 TJm
+(s) 3.8755 Tj
+-260 TJm
+(checks) 27.1082 Tj
+-260 TJm
+(ag) 9.4047 Tj
+5 TJm
+(ainst) 18.8194 Tj
+-260 TJm
+(compressing) 50.3609 Tj
+-261 TJm
+(directories,) 44.5428 Tj
+-262 TJm
+(symbolic) 36.5329 Tj
+-261 TJm
+(li) 5.5392 Tj
+1 TJm
+(nks,) 16.3287 Tj
+-263 TJm
+(de) 9.4047 Tj
+25 TJm
+(vices,) 22.9638 Tj
+-263 TJm
+(and) 14.386 Tj
+-260 TJm
+(other) 20.4731 Tj
+72 332.57 Td
+(not-really-a-\002le) 62.5253 Tj
+-250 TJm
+(entities.) 31.2726 Tj
+-620 TJm
+(This) 17.7135 Tj
+-250 TJm
+(could) 22.1369 Tj
+-250 TJm
+(cause) 22.1269 Tj
+-250 TJm
+(\002lesystem) 40.4083 Tj
+-250 TJm
+(corruption!) 44.8217 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 310.652 Td
+(One) 16.5977 Tj
+-392 TJm
+(other) 20.4731 Tj
+-391 TJm
+(thing:) 23.2527 Tj
+-594 TJm
+(if) 6.0871 Tj
+-391 TJm
+(you) 14.9439 Tj
+-392 TJm
+(create) 23.7807 Tj
+-391 TJm
+(a) 4.4234 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+210.879 310.652 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+244.669 310.652 Td
+/F122_0 9.9626 Tf
+(binary) 25.4544 Tj
+-392 TJm
+(for) 11.6164 Tj
+-391 TJm
+(public) 24.9065 Tj
+-392 TJm
+(distrib) 25.4644 Tj
+20 TJm
+(ution,) 22.9738 Tj
+-427 TJm
+(please) 24.8965 Tj
+-392 TJm
+(consider) 33.7533 Tj
+-391 TJm
+(linking) 28.234 Tj
+-392 TJm
+(it) 5.5392 Tj
+-391 TJm
+(statically) 35.9749 Tj
+-392 TJm
+(\() 3.3175 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+522.067 310.652 Td
+/F124_0 9.9626 Tf
+(gcc) 17.9327 Tj
+72 298.697 Td
+(-static) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+113.843 298.697 Td
+/F122_0 9.9626 Tf
+(\).) 5.8082 Tj
+-620 TJm
+(This) 17.7135 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+20 TJm
+(oids) 16.6077 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(sorts) 18.8194 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(library-v) 34.8591 Tj
+15 TJm
+(ersion) 24.3486 Tj
+-250 TJm
+(issues) 23.8007 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(others) 24.3486 Tj
+-250 TJm
+(may) 17.1556 Tj
+-250 TJm
+(encounter) 39.2825 Tj
+-250 TJm
+(later) 17.7035 Tj
+-250 TJm
+(on.) 12.4533 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 276.779 Td
+(If) 6.6351 Tj
+-296 TJm
+(you) 14.9439 Tj
+-296 TJm
+(b) 4.9813 Tj
+20 TJm
+(uild) 15.5018 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+122.708 276.779 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+155.545 276.779 Td
+/F122_0 9.9626 Tf
+(on) 9.9626 Tj
+-296 TJm
+(W) 9.4047 Tj
+40 TJm
+(in32,) 20.2042 Tj
+-307 TJm
+(you) 14.9439 Tj
+-296 TJm
+(must) 19.3773 Tj
+-296 TJm
+(set) 11.0684 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+254.965 276.779 Td
+/F124_0 9.9626 Tf
+(BZ_UNIX) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+299.756 276.779 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-296 TJm
+(0) 4.9813 Tj
+-296 TJm
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+335.72 276.779 Td
+/F124_0 9.9626 Tf
+(BZ_LCCWIN32) 65.7532 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+404.422 276.779 Td
+/F122_0 9.9626 Tf
+(to) 7.7509 Tj
+-296 TJm
+(1,) 7.472 Tj
+-307 TJm
+(in) 7.7509 Tj
+-296 TJm
+(the) 12.1743 Tj
+-296 TJm
+(\002le) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+467.159 276.779 Td
+/F124_0 9.9626 Tf
+(bzip2.c) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+509.002 276.779 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-307 TJm
+(before) 25.4445 Tj
+72 264.824 Td
+(compiling.) 42.899 Tj
+-310 TJm
+(Otherwise) 40.9463 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(resulting) 34.8691 Tj
+-250 TJm
+(binary) 25.4544 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(on') 13.2801 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ork) 13.2801 Tj
+-250 TJm
+(correctly) 35.4071 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 230.071 Td
+/F116_0 20.6585 Tf
+(4.3.) 34.4584 Tj
+-278 TJm
+(Repor) 59.6824 Tj
+-20 TJm
+(ting) 37.867 Tj
+-278 TJm
+(b) 12.6223 Tj
+20 TJm
+(ugs) 36.7308 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 208.153 Td
+/F122_0 9.9626 Tf
+(I) 3.3175 Tj
+-228 TJm
+(tried) 18.2614 Tj
+-228 TJm
+(pretty) 23.2427 Tj
+-228 TJm
+(hard) 17.7035 Tj
+-228 TJm
+(to) 7.7509 Tj
+-228 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-228 TJm
+(sure) 16.5977 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+196.25 208.153 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+228.409 208.153 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-228 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-228 TJm
+(free,) 17.9725 Tj
+-232 TJm
+(both) 17.7135 Tj
+-228 TJm
+(by) 9.9626 Tj
+-228 TJm
+(design) 26.0123 Tj
+-228 TJm
+(and) 14.386 Tj
+-228 TJm
+(by) 9.9626 Tj
+-228 TJm
+(testing.) 29.0609 Tj
+-605 TJm
+(Hopefully) 40.3983 Tj
+-228 TJm
+(you') 18.2614 Tj
+10 TJm
+(ll) 5.5392 Tj
+-228 TJm
+(ne) 9.4047 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+-228 TJm
+(need) 18.8094 Tj
+-228 TJm
+(to) 7.7509 Tj
+-228 TJm
+(read) 17.1456 Tj
+72 196.198 Td
+(this) 14.396 Tj
+-250 TJm
+(section) 28.224 Tj
+-250 TJm
+(for) 11.6164 Tj
+-250 TJm
+(real.) 17.4246 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 174.28 Td
+(Ne) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ertheless,) 37.3498 Tj
+-313 TJm
+(if) 6.0871 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+137.751 174.28 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+170.634 174.28 Td
+/F122_0 9.9626 Tf
+(dies) 16.0497 Tj
+-301 TJm
+(with) 17.7135 Tj
+-300 TJm
+(a) 4.4234 Tj
+-301 TJm
+(se) 8.2988 Tj
+15 TJm
+(gmentation) 44.8317 Tj
+-300 TJm
+(f) 3.3175 Tj
+10 TJm
+(ault,) 17.4346 Tj
+-314 TJm
+(a) 4.4234 Tj
+-300 TJm
+(b) 4.9813 Tj
+20 TJm
+(us) 8.8568 Tj
+-301 TJm
+(error) 19.3573 Tj
+-300 TJm
+(or) 8.2988 Tj
+-301 TJm
+(an) 9.4047 Tj
+-301 TJm
+(internal) 30.4357 Tj
+-300 TJm
+(assertion) 35.417 Tj
+-301 TJm
+(f) 3.3175 Tj
+10 TJm
+(ailure,) 25.1755 Tj
+-313 TJm
+(it) 5.5392 Tj
+-301 TJm
+(wil) 12.7322 Tj
+1 TJm
+(l) 2.7696 Tj
+-301 TJm
+(ask) 13.2801 Tj
+-301 TJm
+(you) 14.9439 Tj
+-300 TJm
+(to) 7.7509 Tj
+72 162.325 Td
+(email) 22.1369 Tj
+-242 TJm
+(me) 12.1743 Tj
+-243 TJm
+(a) 4.4234 Tj
+-242 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-243 TJm
+(report.) 26.2813 Tj
+-615 TJm
+(Experience) 44.8118 Tj
+-242 TJm
+(from) 19.3673 Tj
+-243 TJm
+(years) 21.0211 Tj
+-242 TJm
+(of) 8.2988 Tj
+-242 TJm
+(feedback) 35.955 Tj
+-243 TJm
+(of) 8.2988 Tj
+-242 TJm
+(bzip2) 22.1369 Tj
+-243 TJm
+(users) 20.4731 Tj
+-242 TJm
+(indicates) 35.417 Tj
+-243 TJm
+(that) 14.9439 Tj
+-242 TJm
+(almost) 26.5703 Tj
+-242 TJm
+(all) 9.9626 Tj
+-243 TJm
+(these) 20.4731 Tj
+-242 TJm
+(problems) 37.0808 Tj
+-243 TJm
+(can) 13.8281 Tj
+72 150.37 Td
+(be) 9.4047 Tj
+-250 TJm
+(traced) 24.3386 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(either) 22.6848 Tj
+-250 TJm
+(compiler) 35.417 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ugs) 13.8381 Tj
+-250 TJm
+(or) 8.2988 Tj
+-250 TJm
+(hardw) 24.8965 Tj
+10 TJm
+(are) 12.1643 Tj
+-250 TJm
+(problems.) 39.5714 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(32) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 33 36
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+498.728 749.245 Td
+/F122_0 9.9626 Tf
+(Miscellanea) 48.1393 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+74.491 710.037 Td
+/F122_0 9.9626 Tf
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(Recompile) 43.1679 Tj
+-322 TJm
+(the) 12.1743 Tj
+-322 TJm
+(program) 33.7533 Tj
+-322 TJm
+(with) 17.7135 Tj
+-322 TJm
+(no) 9.9626 Tj
+-322 TJm
+(optimisat) 37.0908 Tj
+1 TJm
+(ion,) 15.2229 Tj
+-340 TJm
+(and) 14.386 Tj
+-322 TJm
+(see) 12.7222 Tj
+-322 TJm
+(if) 6.0871 Tj
+-322 TJm
+(it) 5.5392 Tj
+-322 TJm
+(w) 7.193 Tj
+10 TJm
+(orks.) 19.6462 Tj
+-1052 TJm
+(And/or) 28.224 Tj
+-322 TJm
+(try) 11.0684 Tj
+-322 TJm
+(a) 4.4234 Tj
+-321 TJm
+(dif) 11.0684 Tj
+25 TJm
+(ferent) 23.2328 Tj
+-322 TJm
+(compiler) 35.417 Tj
+55 TJm
+(.) 2.4907 Tj
+-1052 TJm
+(I) 3.3175 Tj
+-322 TJm
+(heard) 22.1269 Tj
+-322 TJm
+(all) 9.9626 Tj
+81.963 698.082 Td
+(sorts) 18.8194 Tj
+-309 TJm
+(of) 8.2988 Tj
+-310 TJm
+(stories) 26.0123 Tj
+-310 TJm
+(about) 22.1369 Tj
+-309 TJm
+(v) 4.9813 Tj
+25 TJm
+(arious) 24.3486 Tj
+-310 TJm
+(\003a) 9.9626 Tj
+20 TJm
+(v) 4.9813 Tj
+20 TJm
+(ours) 17.1556 Tj
+-309 TJm
+(of) 8.2988 Tj
+-310 TJm
+(GNU) 21.579 Tj
+-309 TJm
+(C) 6.6451 Tj
+-310 TJm
+(\(and) 17.7035 Tj
+-309 TJm
+(other) 20.4731 Tj
+-310 TJm
+(compilers\)) 42.61 Tj
+-309 TJm
+(generating) 42.0521 Tj
+-310 TJm
+(bad) 14.386 Tj
+-310 TJm
+(code) 18.8094 Tj
+-309 TJm
+(for) 11.6164 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+471.527 698.082 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+501.415 698.082 Td
+/F122_0 9.9626 Tf
+(,) 2.4907 Tj
+-324 TJm
+(and) 14.386 Tj
+-310 TJm
+(I') 6.6351 Tj
+50 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+81.963 686.127 Td
+(run) 13.2801 Tj
+-250 TJm
+(across) 24.8965 Tj
+-250 TJm
+(tw) 9.9626 Tj
+10 TJm
+(o) 4.9813 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xamples) 33.2053 Tj
+-250 TJm
+(myself.) 29.6088 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 664.209 Td
+(2.7.X) 22.1369 Tj
+-299 TJm
+(v) 4.9813 Tj
+15 TJm
+(ersions) 28.224 Tj
+-300 TJm
+(of) 8.2988 Tj
+-299 TJm
+(GNU) 21.579 Tj
+-299 TJm
+(C) 6.6451 Tj
+-300 TJm
+(are) 12.1643 Tj
+-299 TJm
+(kno) 14.9439 Tj
+25 TJm
+(wn) 12.1743 Tj
+-300 TJm
+(to) 7.7509 Tj
+-299 TJm
+(generate) 33.7433 Tj
+-299 TJm
+(bad) 14.386 Tj
+-300 TJm
+(code) 18.8094 Tj
+-299 TJm
+(from) 19.3673 Tj
+-299 TJm
+(time) 17.7135 Tj
+-300 TJm
+(to) 7.7509 Tj
+-299 TJm
+(time,) 20.2042 Tj
+-312 TJm
+(at) 7.193 Tj
+-299 TJm
+(high) 17.7135 Tj
+-300 TJm
+(optimisation) 49.823 Tj
+-299 TJm
+(le) 7.193 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(els.) 13.5591 Tj
+-916 TJm
+(If) 6.6351 Tj
+-300 TJm
+(you) 14.9439 Tj
+81.963 652.254 Td
+(get) 12.1743 Tj
+-328 TJm
+(problems,) 39.5714 Tj
+-348 TJm
+(try) 11.0684 Tj
+-328 TJm
+(using) 21.589 Tj
+-329 TJm
+(the) 12.1743 Tj
+-328 TJm
+(\003ags) 18.8194 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+217.176 652.254 Td
+/F124_0 9.9626 Tf
+(-O2) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-328 TJm
+(-fomit-frame-pointer) 119.5512 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-329 TJm
+(-fno-strength-reduce) 119.5512 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+480.753 652.254 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-1090 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-328 TJm
+(should) 26.5703 Tj
+81.963 640.299 Td
+(speci\002cally) 45.3796 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+129.832 640.299 Td
+/F621_0 9.9626 Tf
+(not) 12.7322 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+145.055 640.299 Td
+/F122_0 9.9626 Tf
+(use) 13.2801 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+160.826 640.299 Td
+/F124_0 9.9626 Tf
+(-funroll-loops) 83.6858 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+244.512 640.299 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 618.381 Td
+(Y) 7.193 Tj
+110 TJm
+(ou) 9.9626 Tj
+-240 TJm
+(may) 17.1556 Tj
+-240 TJm
+(notice) 24.3486 Tj
+-241 TJm
+(that) 14.9439 Tj
+-240 TJm
+(the) 12.1743 Tj
+-240 TJm
+(Mak) 18.2614 Tj
+10 TJm
+(e\002le) 17.1556 Tj
+-240 TJm
+(runs) 17.1556 Tj
+-240 TJm
+(six) 11.6264 Tj
+-241 TJm
+(tests) 17.7135 Tj
+-240 TJm
+(as) 8.2988 Tj
+-240 TJm
+(part) 15.4918 Tj
+-240 TJm
+(of) 8.2988 Tj
+-240 TJm
+(the) 12.1743 Tj
+-241 TJm
+(b) 4.9813 Tj
+20 TJm
+(uild) 15.5018 Tj
+-240 TJm
+(process.) 32.3685 Tj
+-613 TJm
+(If) 6.6351 Tj
+-240 TJm
+(the) 12.1743 Tj
+-241 TJm
+(program) 33.7533 Tj
+-240 TJm
+(passes) 25.4544 Tj
+-240 TJm
+(all) 9.9626 Tj
+-240 TJm
+(of) 8.2988 Tj
+-240 TJm
+(these,) 22.9638 Tj
+-242 TJm
+(it') 8.8568 Tj
+55 TJm
+(s) 3.8755 Tj
+-241 TJm
+(a) 4.4234 Tj
+81.963 606.426 Td
+(pretty) 23.2427 Tj
+-250 TJm
+(good) 19.9252 Tj
+-250 TJm
+(\(b) 8.2988 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(not) 12.7322 Tj
+-250 TJm
+(100%\)) 26.5603 Tj
+-250 TJm
+(indication) 39.8504 Tj
+-250 TJm
+(that) 14.9439 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(compiler) 35.417 Tj
+-250 TJm
+(has) 13.2801 Tj
+-250 TJm
+(done) 19.3673 Tj
+-250 TJm
+(its) 9.4147 Tj
+-250 TJm
+(job) 12.7322 Tj
+-250 TJm
+(correctly) 35.4071 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 584.508 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.723 584.508 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+124.239 584.508 Td
+/F122_0 9.9626 Tf
+(crashes) 29.3199 Tj
+-264 TJm
+(randomly) 38.1866 Tj
+65 TJm
+(,) 2.4907 Tj
+-267 TJm
+(and) 14.386 Tj
+-264 TJm
+(the) 12.1743 Tj
+-263 TJm
+(crashes) 29.3199 Tj
+-264 TJm
+(are) 12.1643 Tj
+-264 TJm
+(not) 12.7322 Tj
+-263 TJm
+(repeatable,) 43.427 Tj
+-268 TJm
+(you) 14.9439 Tj
+-263 TJm
+(may) 17.1556 Tj
+-264 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-264 TJm
+(a) 4.4234 Tj
+-264 TJm
+(\003ak) 14.9439 Tj
+15 TJm
+(y) 4.9813 Tj
+-263 TJm
+(memory) 33.2053 Tj
+-264 TJm
+(subsystem.) 44.0048 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+510.112 584.508 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 572.553 Td
+/F122_0 9.9626 Tf
+(really) 22.6848 Tj
+-274 TJm
+(hammers) 36.5229 Tj
+-274 TJm
+(your) 18.2614 Tj
+-274 TJm
+(memory) 33.2053 Tj
+-274 TJm
+(hierarch) 32.6375 Tj
+5 TJm
+(y) 4.9813 Tj
+65 TJm
+(,) 2.4907 Tj
+-280 TJm
+(and) 14.386 Tj
+-274 TJm
+(if) 6.0871 Tj
+-274 TJm
+(it') 8.8568 Tj
+55 TJm
+(s) 3.8755 Tj
+-274 TJm
+(a) 4.4234 Tj
+-274 TJm
+(bit) 10.5205 Tj
+-274 TJm
+(mar) 15.4918 Tj
+18 TJm
+(ginal,) 22.4159 Tj
+-280 TJm
+(you) 14.9439 Tj
+-274 TJm
+(may) 17.1556 Tj
+-274 TJm
+(get) 12.1743 Tj
+-274 TJm
+(these) 20.4731 Tj
+-274 TJm
+(problems.) 39.5714 Tj
+-764 TJm
+(Ditto) 20.4831 Tj
+-274 TJm
+(if) 6.0871 Tj
+-274 TJm
+(your) 18.2614 Tj
+-274 TJm
+(disk) 16.6077 Tj
+81.963 560.598 Td
+(or) 8.2988 Tj
+-250 TJm
+(I/O) 13.2801 Tj
+-250 TJm
+(subsystem) 41.5142 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(slo) 11.6264 Tj
+25 TJm
+(wly) 14.9439 Tj
+-250 TJm
+(f) 3.3175 Tj
+10 TJm
+(ailing.) 25.1855 Tj
+-620 TJm
+(Y) 7.193 Tj
+111 TJm
+(up,) 12.4533 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(really) 22.6848 Tj
+-250 TJm
+(does) 18.2614 Tj
+-250 TJm
+(happen.) 31.2626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+81.963 538.68 Td
+(T) 6.0871 Tj
+35 TJm
+(ry) 8.2988 Tj
+-250 TJm
+(using) 21.589 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(dif) 11.0684 Tj
+25 TJm
+(ferent) 23.2328 Tj
+-250 TJm
+(machine) 33.7533 Tj
+-250 TJm
+(of) 8.2988 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(same) 20.4731 Tj
+-250 TJm
+(type,) 19.6462 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(see) 12.7222 Tj
+-250 TJm
+(if) 6.0871 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(can) 13.8281 Tj
+-250 TJm
+(repeat) 24.3386 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(problem.) 35.696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+74.491 516.762 Td
+(\225) 3.4869 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+-450 TJm
+(This) 17.7135 Tj
+-252 TJm
+(isn') 14.9439 Tj
+18 TJm
+(t) 2.7696 Tj
+-251 TJm
+(really) 22.6848 Tj
+-252 TJm
+(a) 4.4234 Tj
+-252 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug,) 12.4533 Tj
+-252 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-251 TJm
+(...) 7.472 Tj
+-315 TJm
+(If) 6.6351 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+209.383 516.762 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+241.778 516.762 Td
+/F122_0 9.9626 Tf
+(tells) 16.6077 Tj
+-252 TJm
+(you) 14.9439 Tj
+-251 TJm
+(your) 18.2614 Tj
+-252 TJm
+(\002le) 12.7322 Tj
+-252 TJm
+(is) 6.6451 Tj
+-251 TJm
+(corrupted) 38.1767 Tj
+-252 TJm
+(on) 9.9626 Tj
+-252 TJm
+(decompression,) 62.2563 Tj
+-252 TJm
+(and) 14.386 Tj
+-251 TJm
+(you) 14.9439 Tj
+-252 TJm
+(obtained) 34.3112 Tj
+-252 TJm
+(the) 12.1743 Tj
+-251 TJm
+(\002le) 12.7322 Tj
+81.963 504.807 Td
+(via) 12.1743 Tj
+-281 TJm
+(FTP) 17.1656 Tj
+111 TJm
+(,) 2.4907 Tj
+-282 TJm
+(there) 19.9152 Tj
+-282 TJm
+(is) 6.6451 Tj
+-281 TJm
+(a) 4.4234 Tj
+-282 TJm
+(possibility) 41.5241 Tj
+-281 TJm
+(that) 14.9439 Tj
+-282 TJm
+(you) 14.9439 Tj
+-281 TJm
+(for) 11.6164 Tj
+18 TJm
+(got) 12.7322 Tj
+-282 TJm
+(to) 7.7509 Tj
+-281 TJm
+(tell) 12.7322 Tj
+-282 TJm
+(FTP) 17.1656 Tj
+-281 TJm
+(to) 7.7509 Tj
+-282 TJm
+(do) 9.9626 Tj
+-281 TJm
+(a) 4.4234 Tj
+-282 TJm
+(binary) 25.4544 Tj
+-281 TJm
+(mode) 22.1369 Tj
+-282 TJm
+(transfer) 30.4258 Tj
+55 TJm
+(.) 2.4907 Tj
+-809 TJm
+(That) 18.2614 Tj
+-282 TJm
+(absolutely) 40.9562 Tj
+-281 TJm
+(will) 15.5018 Tj
+-282 TJm
+(cause) 22.1269 Tj
+81.963 492.852 Td
+(the) 12.1743 Tj
+-250 TJm
+(\002le) 12.7322 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(be) 9.4047 Tj
+-250 TJm
+(non-decompressible.) 82.7294 Tj
+-620 TJm
+(Y) 7.193 Tj
+110 TJm
+(ou') 13.2801 Tj
+10 TJm
+(ll) 5.5392 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(transfer) 30.4258 Tj
+-250 TJm
+(it) 5.5392 Tj
+-250 TJm
+(ag) 9.4047 Tj
+5 TJm
+(ain.) 14.6649 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 470.934 Td
+(If) 6.6351 Tj
+-235 TJm
+(you') 18.2614 Tj
+50 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-236 TJm
+(inc) 12.1743 Tj
+1 TJm
+(o) 4.9813 Tj
+-1 TJm
+(r) 3.3175 Tj
+1 TJm
+(po) 9.9626 Tj
+-1 TJm
+(r) 3.3175 Tj
+1 TJm
+(ated) 16.5977 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+163.036 470.934 Td
+/F124_0 9.9626 Tf
+(libbzip2) 47.8205 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+213.2 470.934 Td
+/F122_0 9.9626 Tf
+(into) 15.5018 Tj
+-235 TJm
+(your) 18.2614 Tj
+-236 TJm
+(o) 4.9813 Tj
+25 TJm
+(wn) 12.1743 Tj
+-235 TJm
+(program) 33.7533 Tj
+-235 TJm
+(and) 14.386 Tj
+-235 TJm
+(are) 12.1643 Tj
+-236 TJm
+(gett) 14.9439 Tj
+1 TJm
+(ing) 12.7322 Tj
+-236 TJm
+(problems,) 39.5714 Tj
+-238 TJm
+(please,) 27.3872 Tj
+-238 TJm
+(please,) 27.3872 Tj
+-238 TJm
+(please,) 27.3872 Tj
+-238 TJm
+(check) 23.2328 Tj
+-236 TJm
+(that) 14.9439 Tj
+72 458.979 Td
+(the) 12.1743 Tj
+-242 TJm
+(parameters) 43.7059 Tj
+-243 TJm
+(you) 14.9439 Tj
+-242 TJm
+(are) 12.1643 Tj
+-242 TJm
+(passing) 29.8878 Tj
+-243 TJm
+(in) 7.7509 Tj
+-242 TJm
+(calls) 18.2614 Tj
+-242 TJm
+(to) 7.7509 Tj
+-243 TJm
+(the) 12.1743 Tj
+-242 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-244 TJm
+(are) 12.1643 Tj
+-242 TJm
+(correct,) 30.1468 Tj
+-244 TJm
+(and) 14.386 Tj
+-243 TJm
+(in) 7.7509 Tj
+-242 TJm
+(accordance) 44.8018 Tj
+-242 TJm
+(with) 17.7135 Tj
+-243 TJm
+(what) 19.3673 Tj
+-242 TJm
+(the) 12.1743 Tj
+-242 TJm
+(documentation) 59.2177 Tj
+-243 TJm
+(says) 17.1556 Tj
+72 447.024 Td
+(is) 6.6451 Tj
+-250 TJm
+(allo) 14.9439 Tj
+25 TJm
+(w) 7.193 Tj
+10 TJm
+(able.) 19.0883 Tj
+-310 TJm
+(I) 3.3175 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(tried) 18.2614 Tj
+-250 TJm
+(to) 7.7509 Tj
+-250 TJm
+(mak) 17.1556 Tj
+10 TJm
+(e) 4.4234 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(library) 26.5603 Tj
+-250 TJm
+(rob) 13.2801 Tj
+20 TJm
+(ust) 11.6264 Tj
+-250 TJm
+(ag) 9.4047 Tj
+5 TJm
+(ainst) 18.8194 Tj
+-250 TJm
+(such) 18.2614 Tj
+-250 TJm
+(problems,) 39.5714 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-250 TJm
+(I'm) 14.386 Tj
+-250 TJm
+(sure) 16.5977 Tj
+-250 TJm
+(I) 3.3175 Tj
+-250 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(en') 12.7222 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(succeeded.) 43.427 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 425.106 Td
+(Finally) 28.234 Tj
+65 TJm
+(,) 2.4907 Tj
+-324 TJm
+(if) 6.0871 Tj
+-310 TJm
+(the) 12.1743 Tj
+-309 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-309 TJm
+(comments) 40.9562 Tj
+-310 TJm
+(don') 18.2614 Tj
+18 TJm
+(t) 2.7696 Tj
+-309 TJm
+(help,) 19.6462 Tj
+-324 TJm
+(you') 18.2614 Tj
+10 TJm
+(ll) 5.5392 Tj
+-310 TJm
+(ha) 9.4047 Tj
+20 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-309 TJm
+(to) 7.7509 Tj
+-309 TJm
+(send) 18.2614 Tj
+-310 TJm
+(me) 12.1743 Tj
+-309 TJm
+(a) 4.4234 Tj
+-309 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-310 TJm
+(report.) 26.2813 Tj
+-976 TJm
+(No) 12.1743 Tj
+25 TJm
+(w) 7.193 Tj
+65 TJm
+(,) 2.4907 Tj
+-324 TJm
+(it') 8.8568 Tj
+55 TJm
+(s) 3.8755 Tj
+-310 TJm
+(just) 14.396 Tj
+-309 TJm
+(amazing) 33.7533 Tj
+-309 TJm
+(ho) 9.9626 Tj
+25 TJm
+(w) 7.193 Tj
+-310 TJm
+(man) 17.1556 Tj
+15 TJm
+(y) 4.9813 Tj
+72 413.151 Td
+(people) 26.5603 Tj
+-250 TJm
+(will) 15.5018 Tj
+-250 TJm
+(send) 18.2614 Tj
+-250 TJm
+(me) 12.1743 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(b) 4.9813 Tj
+20 TJm
+(ug) 9.9626 Tj
+-250 TJm
+(report) 23.7907 Tj
+-250 TJm
+(saying) 26.0123 Tj
+-250 TJm
+(something) 41.5142 Tj
+-250 TJm
+(lik) 10.5205 Tj
+10 TJm
+(e:) 7.193 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 386.087] cm
+0 0 468 23.91 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 401.629 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+-426 TJm
+(crashed) 41.8429 Tj
+-426 TJm
+(with) 23.9102 Tj
+-426 TJm
+(segmentation) 71.7307 Tj
+-426 TJm
+(fault) 29.8878 Tj
+-426 TJm
+(on) 11.9551 Tj
+-426 TJm
+(my) 11.9551 Tj
+-426 TJm
+(machine) 41.8429 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 364.169 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+-241 TJm
+(absolutely) 40.9562 Tj
+-241 TJm
+(nothing) 30.4457 Tj
+-241 TJm
+(el) 7.193 Tj
+1 TJm
+(se.) 10.7895 Tj
+-614 TJm
+(Needless) 35.965 Tj
+-241 TJm
+(to) 7.7509 Tj
+-241 TJm
+(say) 13.2801 Tj
+65 TJm
+(,) 2.4907 Tj
+-243 TJm
+(a) 4.4234 Tj
+-241 TJm
+(such) 18.2614 Tj
+-240 TJm
+(a) 4.4234 Tj
+-241 TJm
+(report) 23.7907 Tj
+-241 TJm
+(is) 6.6451 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+324.681 364.169 Td
+/F621_0 9.9626 Tf
+(totally) 25.4644 Tj
+55 TJm
+(,) 2.4907 Tj
+-243 TJm
+(utterly) 26.0123 Tj
+55 TJm
+(,) 2.4907 Tj
+-242 TJm
+(completely) 43.158 Tj
+-241 TJm
+(and) 14.9439 Tj
+-241 TJm
+(compr) 25.4544 Tj
+37 TJm
+(ehensively) 41.4942 Tj
+-241 TJm
+(100%) 23.2427 Tj
+72 352.214 Td
+(useless;) 31.5416 Tj
+-257 TJm
+(a) 4.9813 Tj
+-255 TJm
+(waste) 22.6948 Tj
+-255 TJm
+(of) 7.7509 Tj
+-255 TJm
+(your) 18.2614 Tj
+-255 TJm
+(time) 17.1556 Tj
+10 TJm
+(,) 2.4907 Tj
+-256 TJm
+(my) 11.6164 Tj
+-255 TJm
+(time) 17.1556 Tj
+10 TJm
+(,) 2.4907 Tj
+-256 TJm
+(and) 14.9439 Tj
+-255 TJm
+(net) 12.1743 Tj
+-255 TJm
+(bandwidth) 42.0721 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+302.574 352.214 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-650 TJm
+(W) 9.4047 Tj
+40 TJm
+(ith) 10.5205 Tj
+-254 TJm
+(no) 9.9626 Tj
+-255 TJm
+(details) 26.0123 Tj
+-255 TJm
+(at) 7.193 Tj
+-255 TJm
+(all,) 12.4533 Tj
+-256 TJm
+(there') 23.2328 Tj
+55 TJm
+(s) 3.8755 Tj
+-255 TJm
+(no) 9.9626 Tj
+-255 TJm
+(w) 7.193 Tj
+10 TJm
+(ay) 9.4047 Tj
+-255 TJm
+(I) 3.3175 Tj
+-255 TJm
+(can) 13.8281 Tj
+-255 TJm
+(possibly) 33.2153 Tj
+-255 TJm
+(be) 9.4047 Tj
+15 TJm
+(gin) 12.7322 Tj
+72 340.259 Td
+(to) 7.7509 Tj
+-250 TJm
+(\002gure) 23.2427 Tj
+-250 TJm
+(out) 12.7322 Tj
+-250 TJm
+(what) 19.3673 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(problem) 33.2053 Tj
+-250 TJm
+(is.) 9.1357 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 318.341 Td
+(The) 15.4918 Tj
+-309 TJm
+(rules) 19.3673 Tj
+-309 TJm
+(of) 8.2988 Tj
+-309 TJm
+(the) 12.1743 Tj
+-310 TJm
+(g) 4.9813 Tj
+5 TJm
+(ame) 16.5977 Tj
+-309 TJm
+(are:) 14.9339 Tj
+-428 TJm
+(f) 3.3175 Tj
+10 TJm
+(acts,) 17.9825 Tj
+-324 TJm
+(f) 3.3175 Tj
+10 TJm
+(acts,) 17.9825 Tj
+-324 TJm
+(f) 3.3175 Tj
+10 TJm
+(acts.) 17.9825 Tj
+-975 TJm
+(Don') 20.4731 Tj
+18 TJm
+(t) 2.7696 Tj
+-309 TJm
+(omit) 18.2714 Tj
+-309 TJm
+(them) 19.9252 Tj
+-309 TJm
+(because) 31.5316 Tj
+-309 TJm
+("oh,) 16.518 Tj
+-324 TJm
+(the) 12.1743 Tj
+15 TJm
+(y) 4.9813 Tj
+-309 TJm
+(w) 7.193 Tj
+10 TJm
+(on') 13.2801 Tj
+18 TJm
+(t) 2.7696 Tj
+-309 TJm
+(be) 9.4047 Tj
+-310 TJm
+(rele) 14.9339 Tj
+25 TJm
+(v) 4.9813 Tj
+25 TJm
+(ant".) 18.7297 Tj
+-974 TJm
+(At) 9.9626 Tj
+-310 TJm
+(the) 12.1743 Tj
+-309 TJm
+(bare) 17.1456 Tj
+72 306.386 Td
+(minimum:) 41.5241 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.949 0.949 0.9765] sc
+/DeviceRGB {} CS
+[0.949 0.949 0.9765] SC
+q
+[1 0 0 1 72 245.514] cm
+0 0 468 59.776 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 296.922 Td
+/F124_0 9.9626 Tf
+(Machine) 41.8429 Tj
+-426 TJm
+(type.) 29.8878 Tj
+-852 TJm
+(Operating) 53.798 Tj
+-426 TJm
+(system) 35.8654 Tj
+-426 TJm
+(version.) 47.8205 Tj
+90 284.967 Td
+(Exact) 29.8878 Tj
+-426 TJm
+(version) 41.8429 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(bzip2) 29.8878 Tj
+-426 TJm
+(\(do) 17.9327 Tj
+-426 TJm
+(bzip2) 29.8878 Tj
+-426 TJm
+(-V\).) 23.9102 Tj
+90 273.011 Td
+(Exact) 29.8878 Tj
+-426 TJm
+(version) 41.8429 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compiler) 47.8205 Tj
+-426 TJm
+(used.) 29.8878 Tj
+90 261.056 Td
+(Flags) 29.8878 Tj
+-426 TJm
+(passed) 35.8654 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(compiler.) 53.798 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 223.597 Td
+/F122_0 9.9626 Tf
+(Ho) 12.1743 Tj
+25 TJm
+(we) 11.6164 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(er) 7.7409 Tj
+40 TJm
+(,) 2.4907 Tj
+-254 TJm
+(the) 12.1743 Tj
+-252 TJm
+(most) 19.3773 Tj
+-253 TJm
+(important) 38.7446 Tj
+-253 TJm
+(single) 23.8007 Tj
+-253 TJm
+(thing) 20.4831 Tj
+-253 TJm
+(t) 2.7696 Tj
+1 TJm
+(hat) 12.1743 Tj
+-253 TJm
+(will) 15.5018 Tj
+-253 TJm
+(help) 17.1556 Tj
+-253 TJm
+(me) 12.1743 Tj
+-253 TJm
+(is) 6.6451 Tj
+-252 TJm
+(the) 12.1743 Tj
+-253 TJm
+(\002le) 12.7322 Tj
+-253 TJm
+(that) 14.9439 Tj
+-253 TJm
+(you) 14.9439 Tj
+-253 TJm
+(were) 19.3573 Tj
+-253 TJm
+(trying) 23.8007 Tj
+-252 TJm
+(to) 7.7509 Tj
+-253 TJm
+(compress) 37.6287 Tj
+-253 TJm
+(or) 8.2988 Tj
+-253 TJm
+(decompress) 47.0334 Tj
+72 211.641 Td
+(at) 7.193 Tj
+-304 TJm
+(the) 12.1743 Tj
+-305 TJm
+(time) 17.7135 Tj
+-304 TJm
+(the) 12.1743 Tj
+-304 TJm
+(problem) 33.2053 Tj
+-305 TJm
+(happened.) 40.6673 Tj
+-946 TJm
+(W) 9.4047 Tj
+40 TJm
+(ithout) 23.2527 Tj
+-304 TJm
+(that,) 17.4346 Tj
+-318 TJm
+(my) 12.7322 Tj
+-305 TJm
+(ability) 25.4644 Tj
+-304 TJm
+(to) 7.7509 Tj
+-304 TJm
+(do) 9.9626 Tj
+-305 TJm
+(an) 9.4047 Tj
+15 TJm
+(ything) 25.4644 Tj
+-304 TJm
+(more) 20.4731 Tj
+-304 TJm
+(than) 17.1556 Tj
+-305 TJm
+(speculate) 37.0708 Tj
+-304 TJm
+(about) 22.1369 Tj
+-304 TJm
+(the) 12.1743 Tj
+-305 TJm
+(cause,) 24.6176 Tj
+-318 TJm
+(is) 6.6451 Tj
+72 199.686 Td
+(limited.) 30.7247 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 164.933 Td
+/F116_0 20.6585 Tf
+(4.4.) 34.4584 Tj
+-278 TJm
+(Did) 33.2808 Tj
+-278 TJm
+(y) 11.4861 Tj
+25 TJm
+(ou) 25.2447 Tj
+-278 TJm
+(g) 12.6223 Tj
+-10 TJm
+(et) 18.3654 Tj
+-278 TJm
+(the) 30.9878 Tj
+-278 TJm
+(right) 45.9032 Tj
+-278 TJm
+(pac) 35.5946 Tj
+20 TJm
+(ka) 22.9723 Tj
+10 TJm
+(g) 12.6223 Tj
+-10 TJm
+(e?) 24.1085 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 143.016 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.603 143.016 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-272 TJm
+(a) 4.4234 Tj
+-273 TJm
+(resource) 33.7433 Tj
+-272 TJm
+(hog.) 17.4346 Tj
+-378 TJm
+(It) 6.0871 Tj
+-272 TJm
+(soaks) 22.1369 Tj
+-273 TJm
+(up) 9.9626 Tj
+-272 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-273 TJm
+(amounts) 33.7633 Tj
+-272 TJm
+(of) 8.2988 Tj
+-273 TJm
+(CPU) 19.3773 Tj
+-272 TJm
+(c) 4.4234 Tj
+15 TJm
+(ycles) 20.4731 Tj
+-273 TJm
+(and) 14.386 Tj
+-272 TJm
+(memory) 33.2053 Tj
+65 TJm
+(.) 2.4907 Tj
+-755 TJm
+(Also,) 21.31 Tj
+-278 TJm
+(it) 5.5392 Tj
+-273 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-272 TJm
+(v) 4.9813 Tj
+15 TJm
+(ery) 12.7222 Tj
+-273 TJm
+(lar) 10.5105 Tj
+18 TJm
+(ge) 9.4047 Tj
+-272 TJm
+(latencies.) 37.3498 Tj
+72 131.06 Td
+(In) 8.2988 Tj
+-251 TJm
+(the) 12.1743 Tj
+-251 TJm
+(w) 7.193 Tj
+10 TJm
+(orst) 14.9439 Tj
+-251 TJm
+(case,) 19.6363 Tj
+-251 TJm
+(you) 14.9439 Tj
+-251 TJm
+(can) 13.8281 Tj
+-251 TJm
+(feed) 17.1456 Tj
+-251 TJm
+(man) 17.1556 Tj
+15 TJm
+(y) 4.9813 Tj
+-251 TJm
+(me) 12.1743 Tj
+15 TJm
+(g) 4.9813 Tj
+4 TJm
+(abyt) 17.1556 Tj
+1 TJm
+(es) 8.2988 Tj
+-252 TJm
+(of) 8.2988 Tj
+-251 TJm
+(uncompressed) 56.996 Tj
+-251 TJm
+(data) 16.5977 Tj
+-251 TJm
+(into) 15.5018 Tj
+-251 TJm
+(the) 12.1743 Tj
+-251 TJm
+(library) 26.5603 Tj
+-251 TJm
+(before) 25.4445 Tj
+-251 TJm
+(getting) 27.6761 Tj
+-251 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-251 TJm
+(compressed) 47.0334 Tj
+72 119.105 Td
+(output,) 27.9551 Tj
+-250 TJm
+(so) 8.8568 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(probably) 35.417 Tj
+-250 TJm
+(rules) 19.3673 Tj
+-250 TJm
+(out) 12.7322 Tj
+-250 TJm
+(applications) 48.1492 Tj
+-250 TJm
+(requiring) 36.5229 Tj
+-250 TJm
+(interacti) 32.6474 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(e) 4.4234 Tj
+-250 TJm
+(beha) 18.8094 Tj
+20 TJm
+(viour) 21.031 Tj
+55 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 97.187 Td
+(These) 23.7907 Tj
+-304 TJm
+(aren') 20.4632 Tj
+18 TJm
+(t) 2.7696 Tj
+-304 TJm
+(f) 3.3175 Tj
+10 TJm
+(aults) 18.8194 Tj
+-304 TJm
+(of) 8.2988 Tj
+-304 TJm
+(my) 12.7322 Tj
+-304 TJm
+(implementation,) 65.0359 Tj
+-317 TJm
+(I) 3.3175 Tj
+-304 TJm
+(hope,) 21.8579 Tj
+-318 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-304 TJm
+(more) 20.4731 Tj
+-304 TJm
+(an) 9.4047 Tj
+-304 TJm
+(intrinsic) 32.6574 Tj
+-304 TJm
+(property) 33.7533 Tj
+-304 TJm
+(of) 8.2988 Tj
+-304 TJm
+(the) 12.1743 Tj
+-304 TJm
+(Burro) 23.2427 Tj
+25 TJm
+(ws-Wheeler) 48.1293 Tj
+-304 TJm
+(transform) 38.7346 Tj
+72 85.232 Td
+(\(unfortunately\).) 62.8042 Tj
+-620 TJm
+(Maybe) 27.6661 Tj
+-250 TJm
+(this) 14.396 Tj
+-250 TJm
+(isn') 14.9439 Tj
+18 TJm
+(t) 2.7696 Tj
+-250 TJm
+(what) 19.3673 Tj
+-250 TJm
+(you) 14.9439 Tj
+-250 TJm
+(w) 7.193 Tj
+10 TJm
+(ant.) 14.6649 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+(33) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 34 37
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+498.728 749.245 Td
+/F122_0 9.9626 Tf
+(Miscellanea) 48.1393 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(If) 6.6351 Tj
+-275 TJm
+(you) 14.9439 Tj
+-274 TJm
+(w) 7.193 Tj
+10 TJm
+(ant) 12.1743 Tj
+-275 TJm
+(a) 4.4234 Tj
+-274 TJm
+(compressor) 45.9276 Tj
+-275 TJm
+(and/or) 25.4544 Tj
+-275 TJm
+(library) 26.5603 Tj
+-274 TJm
+(which) 24.3486 Tj
+-275 TJm
+(is) 6.6451 Tj
+-274 TJm
+(f) 3.3175 Tj
+10 TJm
+(aster) 18.8094 Tj
+40 TJm
+(,) 2.4907 Tj
+-281 TJm
+(uses) 17.1556 Tj
+-275 TJm
+(less) 14.9439 Tj
+-274 TJm
+(memory) 33.2053 Tj
+-275 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-275 TJm
+(gets) 16.0497 Tj
+-274 TJm
+(pretty) 23.2427 Tj
+-275 TJm
+(good) 19.9252 Tj
+-274 TJm
+(compression,) 52.8516 Tj
+-281 TJm
+(and) 14.386 Tj
+-275 TJm
+(has) 13.2801 Tj
+72 698.082 Td
+(minimal) 33.2153 Tj
+-288 TJm
+(latenc) 23.7907 Tj
+15 TJm
+(y) 4.9813 Tj
+65 TJm
+(,) 2.4907 Tj
+-297 TJm
+(consider) 33.7533 Tj
+-288 TJm
+(Jean-loup) 38.7346 Tj
+-288 TJm
+(Gailly') 28.224 Tj
+55 TJm
+(s) 3.8755 Tj
+-288 TJm
+(and) 14.386 Tj
+-288 TJm
+(Mark) 21.579 Tj
+-288 TJm
+(Adl) 14.9439 Tj
+1 TJm
+(er') 11.0585 Tj
+55 TJm
+(s) 3.8755 Tj
+-288 TJm
+(w) 7.193 Tj
+10 TJm
+(ork,) 15.7708 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+353.879 698.082 Td
+/F124_0 9.9626 Tf
+(zlib-1.2.1) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+416.523 698.082 Td
+/F122_0 9.9626 Tf
+(and) 14.386 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+433.777 698.082 Td
+/F124_0 9.9626 Tf
+(gzip-1.2.4) 59.7756 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+493.553 698.082 Td
+/F122_0 9.9626 Tf
+(.) 2.4907 Tj
+-847 TJm
+(Look) 21.031 Tj
+-288 TJm
+(for) 11.6164 Tj
+72 686.127 Td
+(them) 19.9252 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(http://www) 45.3896 Tj
+65 TJm
+(.zlib) 17.4346 Tj
+40 TJm
+(.or) 10.7895 Tj
+18 TJm
+(g) 4.9813 Tj
+-250 TJm
+(and) 14.386 Tj
+-250 TJm
+(http://www) 45.3896 Tj
+65 TJm
+(.gzip.or) 30.4357 Tj
+18 TJm
+(g) 4.9813 Tj
+-250 TJm
+(respecti) 30.9837 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(ely) 12.1743 Tj
+65 TJm
+(.) 2.4907 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 664.209 Td
+(F) 5.5392 Tj
+15 TJm
+(or) 8.2988 Tj
+-582 TJm
+(something) 41.5142 Tj
+-583 TJm
+(f) 3.3175 Tj
+10 TJm
+(aster) 18.8094 Tj
+-582 TJm
+(and) 14.386 Tj
+-582 TJm
+(lighter) 26.0123 Tj
+-583 TJm
+(still,) 17.4445 Tj
+-665 TJm
+(you) 14.9439 Tj
+-582 TJm
+(might) 23.2527 Tj
+-583 TJm
+(try) 11.0684 Tj
+-582 TJm
+(Markus) 30.4357 Tj
+-582 TJm
+(F) 5.5392 Tj
+-582 TJm
+(X) 7.193 Tj
+-582 TJm
+(J) 3.8755 Tj
+-582 TJm
+(Oberhumer') 48.6872 Tj
+55 TJm
+(s) 3.8755 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+437.433 664.209 Td
+/F124_0 9.9626 Tf
+(LZO) 17.9327 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+461.164 664.209 Td
+/F122_0 9.9626 Tf
+(real-time) 35.965 Tj
+-582 TJm
+(compres-) 37.0708 Tj
+72 652.254 Td
+(sion/decompression) 79.1429 Tj
+-250 TJm
+(library) 26.5603 Tj
+65 TJm
+(,) 2.4907 Tj
+-250 TJm
+(at) 7.193 Tj
+-250 TJm
+(http://www) 45.3896 Tj
+65 TJm
+(.oberhumer) 45.6486 Tj
+55 TJm
+(.com/opensource.) 70.2762 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 617.501 Td
+/F116_0 20.6585 Tf
+(4.5.) 34.4584 Tj
+-278 TJm
+(Fur) 33.2808 Tj
+-20 TJm
+(ther) 39.0239 Tj
+-278 TJm
+(Reading) 81.4978 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 595.583 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+104.923 595.583 Td
+/F122_0 9.9626 Tf
+(is) 6.6451 Tj
+-305 TJm
+(not) 12.7322 Tj
+-304 TJm
+(research) 33.1854 Tj
+-305 TJm
+(w) 7.193 Tj
+10 TJm
+(ork,) 15.7708 Tj
+-318 TJm
+(in) 7.7509 Tj
+-305 TJm
+(the) 12.1743 Tj
+-304 TJm
+(sense) 21.579 Tj
+-305 TJm
+(that) 14.9439 Tj
+-304 TJm
+(it) 5.5392 Tj
+-305 TJm
+(doesn') 26.5603 Tj
+18 TJm
+(t) 2.7696 Tj
+-304 TJm
+(present) 28.772 Tj
+-305 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-305 TJm
+(ne) 9.4047 Tj
+25 TJm
+(w) 7.193 Tj
+-304 TJm
+(ideas.) 22.9638 Tj
+-474 TJm
+(Rather) 26.5603 Tj
+40 TJm
+(,) 2.4907 Tj
+-318 TJm
+(it') 8.8568 Tj
+55 TJm
+(s) 3.8755 Tj
+-305 TJm
+(an) 9.4047 Tj
+-304 TJm
+(engineering) 47.0334 Tj
+-305 TJm
+(e) 4.4234 Tj
+15 TJm
+(x) 4.9813 Tj
+15 TJm
+(ercise) 23.2328 Tj
+72 583.628 Td
+(based) 22.6848 Tj
+-250 TJm
+(on) 9.9626 Tj
+-250 TJm
+(e) 4.4234 Tj
+15 TJm
+(xisting) 27.1282 Tj
+-250 TJm
+(ideas.) 22.9638 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 561.71 Td
+(F) 5.5392 Tj
+15 TJm
+(our) 13.2801 Tj
+-250 TJm
+(documents) 43.1679 Tj
+-250 TJm
+(describe) 33.1954 Tj
+-250 TJm
+(essentially) 42.0621 Tj
+-250 TJm
+(all) 9.9626 Tj
+-250 TJm
+(the) 12.1743 Tj
+-250 TJm
+(ideas) 20.4731 Tj
+-250 TJm
+(behind) 27.1182 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+298.747 561.71 Td
+/F124_0 9.9626 Tf
+(bzip2) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+328.635 561.71 Td
+/F122_0 9.9626 Tf
+(:) 2.7696 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.9294 0.9686 0.9568] sc
+/DeviceRGB {} CS
+[0.9294 0.9686 0.9568] SC
+q
+[1 0 0 1 72 259.678] cm
+0 0 468 298.879 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 550.189 Td
+/F124_0 9.9626 Tf
+(Michael) 41.8429 Tj
+-426 TJm
+(Burrows) 41.8429 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(D.) 11.9551 Tj
+-426 TJm
+(J.) 11.9551 Tj
+-426 TJm
+(Wheeler:) 47.8205 Tj
+98.488 538.234 Td
+("A) 11.9551 Tj
+-426 TJm
+(block-sorting) 77.7083 Tj
+-426 TJm
+(lossless) 47.8205 Tj
+-426 TJm
+(data) 23.9102 Tj
+-426 TJm
+(compression) 65.7532 Tj
+-426 TJm
+(algorithm") 59.7756 Tj
+102.732 526.278 Td
+(10th) 23.9102 Tj
+-426 TJm
+(May) 17.9327 Tj
+-426 TJm
+(1994.) 29.8878 Tj
+102.732 514.323 Td
+(Digital) 41.8429 Tj
+-426 TJm
+(SRC) 17.9327 Tj
+-426 TJm
+(Research) 47.8205 Tj
+-426 TJm
+(Report) 35.8654 Tj
+-426 TJm
+(124.) 23.9102 Tj
+102.732 502.368 Td
+(ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.g\
+z) 382.5638 Tj
+102.732 490.413 Td
+(If) 11.9551 Tj
+-426 TJm
+(you) 17.9327 Tj
+-426 TJm
+(have) 23.9102 Tj
+-426 TJm
+(trouble) 41.8429 Tj
+-426 TJm
+(finding) 41.8429 Tj
+-426 TJm
+(it,) 17.9327 Tj
+-426 TJm
+(try) 17.9327 Tj
+-426 TJm
+(searching) 53.798 Tj
+-426 TJm
+(at) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+102.732 478.458 Td
+(New) 17.9327 Tj
+-426 TJm
+(Zealand) 41.8429 Tj
+-426 TJm
+(Digital) 41.8429 Tj
+-426 TJm
+(Library,) 47.8205 Tj
+-426 TJm
+(http://www.nzdl.org.) 119.5512 Tj
+90 454.547 Td
+(Daniel) 35.8654 Tj
+-426 TJm
+(S.) 11.9551 Tj
+-426 TJm
+(Hirschberg) 59.7756 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(Debra) 29.8878 Tj
+-426 TJm
+(A.) 11.9551 Tj
+-426 TJm
+(LeLewer) 41.8429 Tj
+98.488 442.592 Td
+("Efficient) 59.7756 Tj
+-426 TJm
+(Decoding) 47.8205 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(Prefix) 35.8654 Tj
+-426 TJm
+(Codes") 35.8654 Tj
+102.732 430.637 Td
+(Communications) 83.6858 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(ACM,) 23.9102 Tj
+-426 TJm
+(April) 29.8878 Tj
+-426 TJm
+(1990,) 29.8878 Tj
+-426 TJm
+(Vol) 17.9327 Tj
+-426 TJm
+(33,) 17.9327 Tj
+-426 TJm
+(Number) 35.8654 Tj
+-426 TJm
+(4.) 11.9551 Tj
+102.732 418.682 Td
+(You) 17.9327 Tj
+-426 TJm
+(might) 29.8878 Tj
+-426 TJm
+(be) 11.9551 Tj
+-426 TJm
+(able) 23.9102 Tj
+-426 TJm
+(to) 11.9551 Tj
+-426 TJm
+(get) 17.9327 Tj
+-426 TJm
+(an) 11.9551 Tj
+-426 TJm
+(electronic) 59.7756 Tj
+-426 TJm
+(copy) 23.9102 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(this) 23.9102 Tj
+102.732 406.727 Td
+(from) 23.9102 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(ACM) 17.9327 Tj
+-426 TJm
+(Digital) 41.8429 Tj
+-426 TJm
+(Library.) 47.8205 Tj
+90 382.816 Td
+(David) 29.8878 Tj
+-426 TJm
+(J.) 11.9551 Tj
+-426 TJm
+(Wheeler) 41.8429 Tj
+102.732 370.861 Td
+(Program) 41.8429 Tj
+-426 TJm
+(bred3.c) 41.8429 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(accompanying) 71.7307 Tj
+-426 TJm
+(document) 47.8205 Tj
+-426 TJm
+(bred3.ps.) 53.798 Tj
+102.732 358.906 Td
+(This) 23.9102 Tj
+-426 TJm
+(contains) 47.8205 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(idea) 23.9102 Tj
+-426 TJm
+(behind) 35.8654 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(multi-table) 65.7532 Tj
+-426 TJm
+(Huffman) 41.8429 Tj
+-426 TJm
+(coding) 35.8654 Tj
+-426 TJm
+(scheme.) 41.8429 Tj
+102.732 346.951 Td
+(ftp://ftp.cl.cam.ac.uk/users/djw3/) 203.237 Tj
+90 323.04 Td
+(Jon) 17.9327 Tj
+-426 TJm
+(L.) 11.9551 Tj
+-426 TJm
+(Bentley) 41.8429 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(Robert) 35.8654 Tj
+-426 TJm
+(Sedgewick) 53.798 Tj
+98.488 311.085 Td
+("Fast) 29.8878 Tj
+-426 TJm
+(Algorithms) 59.7756 Tj
+-426 TJm
+(for) 17.9327 Tj
+-426 TJm
+(Sorting) 41.8429 Tj
+-426 TJm
+(and) 17.9327 Tj
+-426 TJm
+(Searching) 53.798 Tj
+-426 TJm
+(Strings") 47.8205 Tj
+102.732 299.13 Td
+(Available) 53.798 Tj
+-426 TJm
+(from) 23.9102 Tj
+-426 TJm
+(Sedgewick's) 65.7532 Tj
+-426 TJm
+(web) 17.9327 Tj
+-426 TJm
+(page,) 29.8878 Tj
+102.732 287.175 Td
+(www.cs.princeton.edu/~rs) 143.4614 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 237.76 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-239 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-238 TJm
+(paper) 22.1269 Tj
+-239 TJm
+(gi) 7.7509 Tj
+25 TJm
+(v) 4.9813 Tj
+15 TJm
+(es) 8.2988 Tj
+-239 TJm
+(v) 4.9813 Tj
+25 TJm
+(aluable) 28.772 Tj
+-238 TJm
+(additional) 39.8504 Tj
+-239 TJm
+(insights) 31.0036 Tj
+-238 TJm
+(into) 15.5018 Tj
+-239 TJm
+(the) 12.1743 Tj
+-239 TJm
+(algorithm,) 41.2352 Tj
+-241 TJm
+(b) 4.9813 Tj
+20 TJm
+(ut) 7.7509 Tj
+-238 TJm
+(is) 6.6451 Tj
+-239 TJm
+(not) 12.7322 Tj
+-239 TJm
+(immedia) 34.8691 Tj
+1 TJm
+(tely) 14.9439 Tj
+-239 TJm
+(the) 12.1743 Tj
+-239 TJm
+(basis) 19.9252 Tj
+-238 TJm
+(of) 8.2988 Tj
+-239 TJm
+(an) 9.4047 Tj
+15 TJm
+(y) 4.9813 Tj
+-239 TJm
+(code) 18.8094 Tj
+72 225.805 Td
+(used) 18.2614 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(bzip2.) 24.6275 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.9294 0.9686 0.9568] sc
+/DeviceRGB {} CS
+[0.9294 0.9686 0.9568] SC
+q
+[1 0 0 1 72 150.921] cm
+0 0 468 71.731 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 214.283 Td
+/F124_0 9.9626 Tf
+(Peter) 29.8878 Tj
+-426 TJm
+(Fenwick:) 47.8205 Tj
+102.732 202.328 Td
+(Block) 29.8878 Tj
+-426 TJm
+(Sorting) 41.8429 Tj
+-426 TJm
+(Text) 23.9102 Tj
+-426 TJm
+(Compression) 65.7532 Tj
+102.732 190.373 Td
+(Proceedings) 65.7532 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(19th) 23.9102 Tj
+-426 TJm
+(Australasian) 71.7307 Tj
+-426 TJm
+(Computer) 47.8205 Tj
+-426 TJm
+(Science) 41.8429 Tj
+-426 TJm
+(Conference,) 65.7532 Tj
+111.22 178.418 Td
+(Melbourne,) 59.7756 Tj
+-426 TJm
+(Australia.) 59.7756 Tj
+-852 TJm
+(Jan) 17.9327 Tj
+-426 TJm
+(31) 11.9551 Tj
+-426 TJm
+(-) 5.9776 Tj
+-426 TJm
+(Feb) 17.9327 Tj
+-426 TJm
+(2,) 11.9551 Tj
+-426 TJm
+(1996.) 29.8878 Tj
+102.732 166.463 Td
+(ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps) 322.7882 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 129.003 Td
+/F122_0 9.9626 Tf
+(K) 7.193 Tj
+15 TJm
+(unihik) 25.4644 Tj
+10 TJm
+(o) 4.9813 Tj
+-250 TJm
+(Sadakane') 41.4942 Tj
+55 TJm
+(s) 3.8755 Tj
+-250 TJm
+(sorting) 27.6761 Tj
+-250 TJm
+(algorithm,) 41.2352 Tj
+-250 TJm
+(mentioned) 42.0621 Tj
+-250 TJm
+(abo) 14.386 Tj
+15 TJm
+(v) 4.9813 Tj
+15 TJm
+(e,) 6.914 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable) 26.5603 Tj
+-250 TJm
+(from:) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.9294 0.9686 0.9568] sc
+/DeviceRGB {} CS
+[0.9294 0.9686 0.9568] SC
+q
+[1 0 0 1 72 89.985] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 117.482 Td
+/F124_0 9.9626 Tf
+(http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz) 346.6985 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+/F122_0 9.9626 Tf
+(34) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Page: 35 38
+%%BeginPageSetup
+%%PageOrientation: Portrait
+pdfStartPage
+0 0 612 792 re W
+%%EndPageSetup
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+498.728 749.245 Td
+/F122_0 9.9626 Tf
+(Miscellanea) 48.1393 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+q
+[1 0 0 1 73.893 741.803] cm
+[] 0 d
+0 J
+0.498 w
+0 0 m
+475.465 0 l
+S
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+72 710.037 Td
+/F122_0 9.9626 Tf
+(The) 15.4918 Tj
+-250 TJm
+(Manber) 30.9837 Tj
+20 TJm
+(-Myers) 28.772 Tj
+-250 TJm
+(suf) 12.1743 Tj
+25 TJm
+(\002x) 10.5205 Tj
+-250 TJm
+(array) 20.4632 Tj
+-250 TJm
+(construction) 49.2551 Tj
+-250 TJm
+(algorithm) 38.7446 Tj
+-250 TJm
+(is) 6.6451 Tj
+-250 TJm
+(described) 38.1767 Tj
+-250 TJm
+(in) 7.7509 Tj
+-250 TJm
+(a) 4.4234 Tj
+-250 TJm
+(paper) 22.1269 Tj
+-250 TJm
+(a) 4.4234 Tj
+20 TJm
+(v) 4.9813 Tj
+25 TJm
+(ailable) 26.5603 Tj
+-250 TJm
+(from:) 22.1369 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.9294 0.9686 0.9568] sc
+/DeviceRGB {} CS
+[0.9294 0.9686 0.9568] SC
+q
+[1 0 0 1 72 671.019] cm
+0 0 468 35.866 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 698.516 Td
+/F124_0 9.9626 Tf
+(http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps) 322.7882 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+72 649.101 Td
+/F122_0 9.9626 Tf
+(Finally) 28.234 Tj
+65 TJm
+(,) 2.4907 Tj
+-227 TJm
+(the) 12.1743 Tj
+-221 TJm
+(follo) 18.8194 Tj
+25 TJm
+(wing) 19.9252 Tj
+-222 TJm
+(papers) 26.0024 Tj
+-221 TJm
+(document) 39.2925 Tj
+-221 TJm
+(some) 21.031 Tj
+-222 TJm
+(in) 7.7509 Tj
+40 TJm
+(v) 4.9813 Tj
+15 TJm
+(estig) 18.8194 Tj
+5 TJm
+(ations) 23.8007 Tj
+-221 TJm
+(I) 3.3175 Tj
+-221 TJm
+(made) 21.579 Tj
+-222 TJm
+(into) 15.5018 Tj
+-221 TJm
+(the) 12.1743 Tj
+-221 TJm
+(performance) 50.341 Tj
+-222 TJm
+(of) 8.2988 Tj
+-221 TJm
+(sorting) 27.6761 Tj
+-221 TJm
+(and) 14.386 Tj
+-222 TJm
+(decompression) 59.7656 Tj
+72 637.146 Td
+(algorithms:) 45.3896 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0.9294 0.9686 0.9568] sc
+/DeviceRGB {} CS
+[0.9294 0.9686 0.9568] SC
+q
+[1 0 0 1 72 502.486] cm
+0 0 468 131.507 re
+f
+Q
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+[1 0 0 1 0 0] Tm
+0 0 Td
+90 625.624 Td
+/F124_0 9.9626 Tf
+(Julian) 35.8654 Tj
+-426 TJm
+(Seward) 35.8654 Tj
+102.732 613.669 Td
+(On) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(Performance) 65.7532 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(BWT) 17.9327 Tj
+-426 TJm
+(Sorting) 41.8429 Tj
+-426 TJm
+(Algorithms) 59.7756 Tj
+102.732 601.714 Td
+(Proceedings) 65.7532 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(IEEE) 23.9102 Tj
+-426 TJm
+(Data) 23.9102 Tj
+-426 TJm
+(Compression) 65.7532 Tj
+-426 TJm
+(Conference) 59.7756 Tj
+-426 TJm
+(2000) 23.9102 Tj
+111.22 589.759 Td
+(Snowbird,) 53.798 Tj
+-426 TJm
+(Utah.) 29.8878 Tj
+-852 TJm
+(28-30) 29.8878 Tj
+-426 TJm
+(March) 29.8878 Tj
+-426 TJm
+(2000.) 29.8878 Tj
+90 565.848 Td
+(Julian) 35.8654 Tj
+-426 TJm
+(Seward) 35.8654 Tj
+102.732 553.893 Td
+(Space-time) 59.7756 Tj
+-426 TJm
+(Tradeoffs) 53.798 Tj
+-426 TJm
+(in) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(Inverse) 41.8429 Tj
+-426 TJm
+(B-W) 17.9327 Tj
+-426 TJm
+(Transform) 53.798 Tj
+102.732 541.938 Td
+(Proceedings) 65.7532 Tj
+-426 TJm
+(of) 11.9551 Tj
+-426 TJm
+(the) 17.9327 Tj
+-426 TJm
+(IEEE) 23.9102 Tj
+-426 TJm
+(Data) 23.9102 Tj
+-426 TJm
+(Compression) 65.7532 Tj
+-426 TJm
+(Conference) 59.7756 Tj
+-426 TJm
+(2001) 23.9102 Tj
+111.22 529.983 Td
+(Snowbird,) 53.798 Tj
+-426 TJm
+(Utah.) 29.8878 Tj
+-852 TJm
+(27-29) 29.8878 Tj
+-426 TJm
+(March) 29.8878 Tj
+-426 TJm
+(2001.) 29.8878 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+534.414 50.951 Td
+/F122_0 9.9626 Tf
+(35) 9.9626 Tj
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Trailer
+end
+%%DocumentSuppliedResources:
+%%+ font PYRIYB+NimbusSanL-Bold
+%%+ font XDVKOU+NimbusRomNo9L-Regu
+%%+ font QYKIKI+NimbusMonL-Regu
+%%+ font BITXNG+CMMI10
+%%+ font ZWXELK+NimbusMonL-Bold
+%%+ font FRBTTO+CMSY10
+%%+ font AMYDOG+NimbusRomNo9L-ReguItal
+%%EOF
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/manual.xml
@@ -0,0 +1,2964 @@
+<?xml version="1.0"?> <!-- -*- sgml -*- -->
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"[
+
+<!-- various strings, dates etc. common to all docs -->
+<!ENTITY % common-ents SYSTEM "entities.xml"> %common-ents;
+]>
+
+<book lang="en" id="userman" xreflabel="bzip2 Manual">
+
+ <bookinfo>
+  <title>bzip2 and libbzip2, version 1.0.6</title>
+  <subtitle>A program and library for data compression</subtitle>
+  <copyright>
+   <year>&bz-lifespan;</year>
+   <holder>Julian Seward</holder>
+  </copyright>
+  <releaseinfo>Version &bz-version; of &bz-date;</releaseinfo>
+
+  <authorgroup>
+   <author>
+    <firstname>Julian</firstname>
+    <surname>Seward</surname>
+    <affiliation>
+     <orgname>&bz-url;</orgname>
+    </affiliation>
+   </author>
+  </authorgroup>
+
+  <legalnotice>
+
+  <para>This program, <computeroutput>bzip2</computeroutput>, the
+  associated library <computeroutput>libbzip2</computeroutput>, and
+  all documentation, are copyright &copy; &bz-lifespan; Julian Seward.
+  All rights reserved.</para>
+
+  <para>Redistribution and use in source and binary forms, with
+  or without modification, are permitted provided that the
+  following conditions are met:</para>
+
+  <itemizedlist mark='bullet'>
+
+   <listitem><para>Redistributions of source code must retain the
+   above copyright notice, this list of conditions and the
+   following disclaimer.</para></listitem>
+
+   <listitem><para>The origin of this software must not be
+   misrepresented; you must not claim that you wrote the original
+   software.  If you use this software in a product, an
+   acknowledgment in the product documentation would be
+   appreciated but is not required.</para></listitem>
+
+   <listitem><para>Altered source versions must be plainly marked
+   as such, and must not be misrepresented as being the original
+   software.</para></listitem>
+
+   <listitem><para>The name of the author may not be used to
+   endorse or promote products derived from this software without
+   specific prior written permission.</para></listitem>
+
+  </itemizedlist>
+
+  <para>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.</para>
+
+ <para>PATENTS: To the best of my knowledge,
+ <computeroutput>bzip2</computeroutput> and
+ <computeroutput>libbzip2</computeroutput> do not use any patented
+ algorithms.  However, I do not have the resources to carry
+ out a patent search.  Therefore I cannot give any guarantee of
+ the above statement.
+ </para>
+
+</legalnotice>
+
+</bookinfo>
+
+
+
+<chapter id="intro" xreflabel="Introduction">
+<title>Introduction</title>
+
+<para><computeroutput>bzip2</computeroutput> compresses files
+using the Burrows-Wheeler block-sorting text compression
+algorithm, and Huffman coding.  Compression is generally
+considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of
+the PPM family of statistical compressors.</para>
+
+<para><computeroutput>bzip2</computeroutput> is built on top of
+<computeroutput>libbzip2</computeroutput>, a flexible library for
+handling compressed data in the
+<computeroutput>bzip2</computeroutput> format.  This manual
+describes both how to use the program and how to work with the
+library interface.  Most of the manual is devoted to this
+library, not the program, which is good news if your interest is
+only in the program.</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para><xref linkend="using"/> describes how to use
+ <computeroutput>bzip2</computeroutput>; this is the only part
+ you need to read if you just want to know how to operate the
+ program.</para></listitem>
+
+ <listitem><para><xref linkend="libprog"/> describes the
+ programming interfaces in detail, and</para></listitem>
+
+ <listitem><para><xref linkend="misc"/> records some
+ miscellaneous notes which I thought ought to be recorded
+ somewhere.</para></listitem>
+
+</itemizedlist>
+
+</chapter>
+
+
+<chapter id="using" xreflabel="How to use bzip2">
+<title>How to use bzip2</title>
+
+<para>This chapter contains a copy of the
+<computeroutput>bzip2</computeroutput> man page, and nothing
+else.</para>
+
+<sect1 id="name" xreflabel="NAME">
+<title>NAME</title>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para><computeroutput>bzip2</computeroutput>,
+  <computeroutput>bunzip2</computeroutput> - a block-sorting file
+  compressor, v1.0.6</para></listitem>
+
+ <listitem><para><computeroutput>bzcat</computeroutput> -
+   decompresses files to stdout</para></listitem>
+
+ <listitem><para><computeroutput>bzip2recover</computeroutput> -
+   recovers data from damaged bzip2 files</para></listitem>
+
+</itemizedlist>
+
+</sect1>
+
+
+<sect1 id="synopsis" xreflabel="SYNOPSIS">
+<title>SYNOPSIS</title>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para><computeroutput>bzip2</computeroutput> [
+  -cdfkqstvzVL123456789 ] [ filenames ...  ]</para></listitem>
+
+ <listitem><para><computeroutput>bunzip2</computeroutput> [
+  -fkvsVL ] [ filenames ...  ]</para></listitem>
+
+ <listitem><para><computeroutput>bzcat</computeroutput> [ -s ] [
+  filenames ...  ]</para></listitem>
+
+ <listitem><para><computeroutput>bzip2recover</computeroutput>
+  filename</para></listitem>
+
+</itemizedlist>
+
+</sect1>
+
+
+<sect1 id="description" xreflabel="DESCRIPTION">
+<title>DESCRIPTION</title>
+
+<para><computeroutput>bzip2</computeroutput> compresses files
+using the Burrows-Wheeler block sorting text compression
+algorithm, and Huffman coding.  Compression is generally
+considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of
+the PPM family of statistical compressors.</para>
+
+<para>The command-line options are deliberately very similar to
+those of GNU <computeroutput>gzip</computeroutput>, but they are
+not identical.</para>
+
+<para><computeroutput>bzip2</computeroutput> expects a list of
+file names to accompany the command-line flags.  Each file is
+replaced by a compressed version of itself, with the name
+<computeroutput>original_name.bz2</computeroutput>.  Each
+compressed file has the same modification date, permissions, and,
+when possible, ownership as the corresponding original, so that
+these properties can be correctly restored at decompression time.
+File name handling is naive in the sense that there is no
+mechanism for preserving original file names, permissions,
+ownerships or dates in filesystems which lack these concepts, or
+have serious file name length restrictions, such as
+MS-DOS.</para>
+
+<para><computeroutput>bzip2</computeroutput> and
+<computeroutput>bunzip2</computeroutput> will by default not
+overwrite existing files.  If you want this to happen, specify
+the <computeroutput>-f</computeroutput> flag.</para>
+
+<para>If no file names are specified,
+<computeroutput>bzip2</computeroutput> compresses from standard
+input to standard output.  In this case,
+<computeroutput>bzip2</computeroutput> will decline to write
+compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.</para>
+
+<para><computeroutput>bunzip2</computeroutput> (or
+<computeroutput>bzip2 -d</computeroutput>) decompresses all
+specified files.  Files which were not created by
+<computeroutput>bzip2</computeroutput> will be detected and
+ignored, and a warning issued.
+<computeroutput>bzip2</computeroutput> attempts to guess the
+filename for the decompressed file from that of the compressed
+file as follows:</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para><computeroutput>filename.bz2 </computeroutput>
+  becomes
+  <computeroutput>filename</computeroutput></para></listitem>
+
+ <listitem><para><computeroutput>filename.bz </computeroutput>
+  becomes
+  <computeroutput>filename</computeroutput></para></listitem>
+
+ <listitem><para><computeroutput>filename.tbz2</computeroutput>
+  becomes
+  <computeroutput>filename.tar</computeroutput></para></listitem>
+
+ <listitem><para><computeroutput>filename.tbz </computeroutput>
+  becomes
+  <computeroutput>filename.tar</computeroutput></para></listitem>
+
+ <listitem><para><computeroutput>anyothername </computeroutput>
+  becomes
+  <computeroutput>anyothername.out</computeroutput></para></listitem>
+
+</itemizedlist>
+
+<para>If the file does not end in one of the recognised endings,
+<computeroutput>.bz2</computeroutput>,
+<computeroutput>.bz</computeroutput>,
+<computeroutput>.tbz2</computeroutput> or
+<computeroutput>.tbz</computeroutput>,
+<computeroutput>bzip2</computeroutput> complains that it cannot
+guess the name of the original file, and uses the original name
+with <computeroutput>.out</computeroutput> appended.</para>
+
+<para>As with compression, supplying no filenames causes
+decompression from standard input to standard output.</para>
+
+<para><computeroutput>bunzip2</computeroutput> will correctly
+decompress a file which is the concatenation of two or more
+compressed files.  The result is the concatenation of the
+corresponding uncompressed files.  Integrity testing
+(<computeroutput>-t</computeroutput>) of concatenated compressed
+files is also supported.</para>
+
+<para>You can also compress or decompress files to the standard
+output by giving the <computeroutput>-c</computeroutput> flag.
+Multiple files may be compressed and decompressed like this.  The
+resulting outputs are fed sequentially to stdout.  Compression of
+multiple files in this manner generates a stream containing
+multiple compressed file representations.  Such a stream can be
+decompressed correctly only by
+<computeroutput>bzip2</computeroutput> version 0.9.0 or later.
+Earlier versions of <computeroutput>bzip2</computeroutput> will
+stop after decompressing the first file in the stream.</para>
+
+<para><computeroutput>bzcat</computeroutput> (or
+<computeroutput>bzip2 -dc</computeroutput>) decompresses all
+specified files to the standard output.</para>
+
+<para><computeroutput>bzip2</computeroutput> will read arguments
+from the environment variables
+<computeroutput>BZIP2</computeroutput> and
+<computeroutput>BZIP</computeroutput>, in that order, and will
+process them before any arguments read from the command line.
+This gives a convenient way to supply default arguments.</para>
+
+<para>Compression is always performed, even if the compressed
+file is slightly larger than the original.  Files of less than
+about one hundred bytes tend to get larger, since the compression
+mechanism has a constant overhead in the region of 50 bytes.
+Random data (including the output of most file compressors) is
+coded at about 8.05 bits per byte, giving an expansion of around
+0.5%.</para>
+
+<para>As a self-check for your protection,
+<computeroutput>bzip2</computeroutput> uses 32-bit CRCs to make
+sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data,
+and against undetected bugs in
+<computeroutput>bzip2</computeroutput> (hopefully very unlikely).
+The chances of data corruption going undetected is microscopic,
+about one chance in four billion for each file processed.  Be
+aware, though, that the check occurs upon decompression, so it
+can only tell you that something is wrong.  It can't help you
+recover the original uncompressed data.  You can use
+<computeroutput>bzip2recover</computeroutput> to try to recover
+data from damaged files.</para>
+
+<para>Return values: 0 for a normal exit, 1 for environmental
+problems (file not found, invalid flags, I/O errors, etc.), 2
+to indicate a corrupt compressed file, 3 for an internal
+consistency error (eg, bug) which caused
+<computeroutput>bzip2</computeroutput> to panic.</para>
+
+</sect1>
+
+
+<sect1 id="options" xreflabel="OPTIONS">
+<title>OPTIONS</title>
+
+<variablelist>
+
+ <varlistentry>
+ <term><computeroutput>-c --stdout</computeroutput></term>
+ <listitem><para>Compress or decompress to standard
+  output.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-d --decompress</computeroutput></term>
+ <listitem><para>Force decompression.
+  <computeroutput>bzip2</computeroutput>,
+  <computeroutput>bunzip2</computeroutput> and
+  <computeroutput>bzcat</computeroutput> are really the same
+  program, and the decision about what actions to take is done on
+  the basis of which name is used.  This flag overrides that
+  mechanism, and forces bzip2 to decompress.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-z --compress</computeroutput></term>
+ <listitem><para>The complement to
+  <computeroutput>-d</computeroutput>: forces compression,
+  regardless of the invokation name.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-t --test</computeroutput></term>
+ <listitem><para>Check integrity of the specified file(s), but
+  don't decompress them.  This really performs a trial
+  decompression and throws away the result.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-f --force</computeroutput></term>
+ <listitem><para>Force overwrite of output files.  Normally,
+  <computeroutput>bzip2</computeroutput> will not overwrite
+  existing output files.  Also forces
+  <computeroutput>bzip2</computeroutput> to break hard links to
+  files, which it otherwise wouldn't do.</para>
+  <para><computeroutput>bzip2</computeroutput> normally declines
+  to decompress files which don't have the correct magic header
+  bytes. If forced (<computeroutput>-f</computeroutput>),
+  however, it will pass such files through unmodified. This is
+  how GNU <computeroutput>gzip</computeroutput> behaves.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-k --keep</computeroutput></term>
+ <listitem><para>Keep (don't delete) input files during
+  compression or decompression.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-s --small</computeroutput></term>
+ <listitem><para>Reduce memory usage, for compression,
+  decompression and testing.  Files are decompressed and tested
+  using a modified algorithm which only requires 2.5 bytes per
+  block byte.  This means any file can be decompressed in 2300k
+  of memory, albeit at about half the normal speed.</para>
+  <para>During compression, <computeroutput>-s</computeroutput>
+  selects a block size of 200k, which limits memory use to around
+  the same figure, at the expense of your compression ratio.  In
+  short, if your machine is low on memory (8 megabytes or less),
+  use <computeroutput>-s</computeroutput> for everything.  See
+  <xref linkend="memory-management"/> below.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-q --quiet</computeroutput></term>
+ <listitem><para>Suppress non-essential warning messages.
+  Messages pertaining to I/O errors and other critical events
+  will not be suppressed.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-v --verbose</computeroutput></term>
+ <listitem><para>Verbose mode -- show the compression ratio for
+  each file processed.  Further
+  <computeroutput>-v</computeroutput>'s increase the verbosity
+  level, spewing out lots of information which is primarily of
+  interest for diagnostic purposes.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-L --license -V --version</computeroutput></term>
+ <listitem><para>Display the software version, license terms and
+  conditions.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>-1</computeroutput> (or
+ <computeroutput>--fast</computeroutput>) to
+ <computeroutput>-9</computeroutput> (or
+ <computeroutput>-best</computeroutput>)</term>
+ <listitem><para>Set the block size to 100 k, 200 k ...  900 k
+  when compressing.  Has no effect when decompressing.  See <xref
+  linkend="memory-management" /> below.  The
+  <computeroutput>--fast</computeroutput> and
+  <computeroutput>--best</computeroutput> aliases are primarily
+  for GNU <computeroutput>gzip</computeroutput> compatibility.
+  In particular, <computeroutput>--fast</computeroutput> doesn't
+  make things significantly faster.  And
+  <computeroutput>--best</computeroutput> merely selects the
+  default behaviour.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>--</computeroutput></term>
+ <listitem><para>Treats all subsequent arguments as file names,
+  even if they start with a dash.  This is so you can handle
+  files with names beginning with a dash, for example:
+  <computeroutput>bzip2 --
+  -myfilename</computeroutput>.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><computeroutput>--repetitive-fast</computeroutput></term>
+ <term><computeroutput>--repetitive-best</computeroutput></term>
+ <listitem><para>These flags are redundant in versions 0.9.5 and
+  above.  They provided some coarse control over the behaviour of
+  the sorting algorithm in earlier versions, which was sometimes
+  useful.  0.9.5 and above have an improved algorithm which
+  renders these flags irrelevant.</para></listitem>
+ </varlistentry>
+
+</variablelist>
+
+</sect1>
+
+
+<sect1 id="memory-management" xreflabel="MEMORY MANAGEMENT">
+<title>MEMORY MANAGEMENT</title>
+
+<para><computeroutput>bzip2</computeroutput> compresses large
+files in blocks.  The block size affects both the compression
+ratio achieved, and the amount of memory needed for compression
+and decompression.  The flags <computeroutput>-1</computeroutput>
+through <computeroutput>-9</computeroutput> specify the block
+size to be 100,000 bytes through 900,000 bytes (the default)
+respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+<computeroutput>bunzip2</computeroutput> then allocates itself
+just enough memory to decompress the file.  Since block sizes are
+stored in compressed files, it follows that the flags
+<computeroutput>-1</computeroutput> to
+<computeroutput>-9</computeroutput> are irrelevant to and so
+ignored during decompression.</para>
+
+<para>Compression and decompression requirements, in bytes, can be
+estimated as:</para>
+<programlisting>
+Compression:   400k + ( 8 x block size )
+
+Decompression: 100k + ( 4 x block size ), or
+               100k + ( 2.5 x block size )
+</programlisting>
+
+<para>Larger block sizes give rapidly diminishing marginal
+returns.  Most of the compression comes from the first two or
+three hundred k of block size, a fact worth bearing in mind when
+using <computeroutput>bzip2</computeroutput> on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block
+size.</para>
+
+<para>For files compressed with the default 900k block size,
+<computeroutput>bunzip2</computeroutput> will require about 3700
+kbytes to decompress.  To support decompression of any file on a
+4 megabyte machine, <computeroutput>bunzip2</computeroutput> has
+an option to decompress using approximately half this amount of
+memory, about 2300 kbytes.  Decompression speed is also halved,
+so you should use this option only where necessary.  The relevant
+flag is <computeroutput>-s</computeroutput>.</para>
+
+<para>In general, try and use the largest block size memory
+constraints allow, since that maximises the compression achieved.
+Compression and decompression speed are virtually unaffected by
+block size.</para>
+
+<para>Another significant point applies to files which fit in a
+single block -- that means most files you'd encounter using a
+large block size.  The amount of real memory touched is
+proportional to the size of the file, since the file is smaller
+than a block.  For example, compressing a file 20,000 bytes long
+with the flag <computeroutput>-9</computeroutput> will cause the
+compressor to allocate around 7600k of memory, but only touch
+400k + 20000 * 8 = 560 kbytes of it.  Similarly, the decompressor
+will allocate 3700k but only touch 100k + 20000 * 4 = 180
+kbytes.</para>
+
+<para>Here is a table which summarises the maximum memory usage
+for different block sizes.  Also recorded is the total compressed
+size for 14 files of the Calgary Text Compression Corpus
+totalling 3,141,622 bytes.  This column gives some feel for how
+compression varies with block size.  These figures tend to
+understate the advantage of larger block sizes for larger files,
+since the Corpus is dominated by smaller files.</para>
+
+<programlisting>
+        Compress   Decompress   Decompress   Corpus
+Flag     usage      usage       -s usage     Size
+
+ -1      1200k       500k         350k      914704
+ -2      2000k       900k         600k      877703
+ -3      2800k      1300k         850k      860338
+ -4      3600k      1700k        1100k      846899
+ -5      4400k      2100k        1350k      845160
+ -6      5200k      2500k        1600k      838626
+ -7      6100k      2900k        1850k      834096
+ -8      6800k      3300k        2100k      828642
+ -9      7600k      3700k        2350k      828642
+</programlisting>
+
+</sect1>
+
+
+<sect1 id="recovering" xreflabel="RECOVERING DATA FROM DAMAGED FILES">
+<title>RECOVERING DATA FROM DAMAGED FILES</title>
+
+<para><computeroutput>bzip2</computeroutput> compresses files in
+blocks, usually 900kbytes long.  Each block is handled
+independently.  If a media or transmission error causes a
+multi-block <computeroutput>.bz2</computeroutput> file to become
+damaged, it may be possible to recover data from the undamaged
+blocks in the file.</para>
+
+<para>The compressed representation of each block is delimited by
+a 48-bit pattern, which makes it possible to find the block
+boundaries with reasonable certainty.  Each block also carries
+its own 32-bit CRC, so damaged blocks can be distinguished from
+undamaged ones.</para>
+
+<para><computeroutput>bzip2recover</computeroutput> is a simple
+program whose purpose is to search for blocks in
+<computeroutput>.bz2</computeroutput> files, and write each block
+out into its own <computeroutput>.bz2</computeroutput> file.  You
+can then use <computeroutput>bzip2 -t</computeroutput> to test
+the integrity of the resulting files, and decompress those which
+are undamaged.</para>
+
+<para><computeroutput>bzip2recover</computeroutput> takes a
+single argument, the name of the damaged file, and writes a
+number of files <computeroutput>rec0001file.bz2</computeroutput>,
+<computeroutput>rec0002file.bz2</computeroutput>, etc, containing
+the extracted blocks.  The output filenames are designed so that
+the use of wildcards in subsequent processing -- for example,
+<computeroutput>bzip2 -dc rec*file.bz2 &#62;
+recovered_data</computeroutput> -- lists the files in the correct
+order.</para>
+
+<para><computeroutput>bzip2recover</computeroutput> should be of
+most use dealing with large <computeroutput>.bz2</computeroutput>
+files, as these will contain many blocks.  It is clearly futile
+to use it on damaged single-block files, since a damaged block
+cannot be recovered.  If you wish to minimise any potential data
+loss through media or transmission errors, you might consider
+compressing with a smaller block size.</para>
+
+</sect1>
+
+
+<sect1 id="performance" xreflabel="PERFORMANCE NOTES">
+<title>PERFORMANCE NOTES</title>
+
+<para>The sorting phase of compression gathers together similar
+strings in the file.  Because of this, files containing very long
+runs of repeated symbols, like "aabaabaabaab ..."  (repeated
+several hundred times) may compress more slowly than normal.
+Versions 0.9.5 and above fare much better than previous versions
+in this respect.  The ratio between worst-case and average-case
+compression time is in the region of 10:1.  For previous
+versions, this figure was more like 100:1.  You can use the
+<computeroutput>-vvvv</computeroutput> option to monitor progress
+in great detail, if you want.</para>
+
+<para>Decompression speed is unaffected by these
+phenomena.</para>
+
+<para><computeroutput>bzip2</computeroutput> usually allocates
+several megabytes of memory to operate in, and then charges all
+over it in a fairly random fashion.  This means that performance,
+both for compressing and decompressing, is largely determined by
+the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss
+rate have been observed to give disproportionately large
+performance improvements.  I imagine
+<computeroutput>bzip2</computeroutput> will perform best on
+machines with very large caches.</para>
+
+</sect1>
+
+
+
+<sect1 id="caveats" xreflabel="CAVEATS">
+<title>CAVEATS</title>
+
+<para>I/O error messages are not as helpful as they could be.
+<computeroutput>bzip2</computeroutput> tries hard to detect I/O
+errors and exit cleanly, but the details of what the problem is
+sometimes seem rather misleading.</para>
+
+<para>This manual page pertains to version &bz-version; of
+<computeroutput>bzip2</computeroutput>.  Compressed data created by
+this version is entirely forwards and backwards compatible with the
+previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0,
+1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and
+above can correctly decompress multiple concatenated compressed files.
+0.1pl2 cannot do this; it will stop after decompressing just the first
+file in the stream.</para>
+
+<para><computeroutput>bzip2recover</computeroutput> versions
+prior to 1.0.2 used 32-bit integers to represent bit positions in
+compressed files, so it could not handle compressed files more
+than 512 megabytes long.  Versions 1.0.2 and above use 64-bit ints
+on some platforms which support them (GNU supported targets, and
+Windows). To establish whether or not
+<computeroutput>bzip2recover</computeroutput> was built with such
+a limitation, run it without arguments. In any event you can
+build yourself an unlimited version if you can recompile it with
+<computeroutput>MaybeUInt64</computeroutput> set to be an
+unsigned 64-bit integer.</para>
+
+</sect1>
+
+
+
+<sect1 id="author" xreflabel="AUTHOR">
+<title>AUTHOR</title>
+
+<para>Julian Seward,
+<computeroutput>&bz-email;</computeroutput></para>
+
+<para>The ideas embodied in
+<computeroutput>bzip2</computeroutput> are due to (at least) the
+following people: Michael Burrows and David Wheeler (for the
+block sorting transformation), David Wheeler (again, for the
+Huffman coder), Peter Fenwick (for the structured coding model in
+the original <computeroutput>bzip</computeroutput>, and many
+refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+<computeroutput>bzip</computeroutput>).  I am much indebted for
+their help, support and advice.  See the manual in the source
+distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms,
+so as to speed up compression.  Bela Lubkin encouraged me to
+improve the worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+Many people sent
+patches, helped with portability problems, lent machines, gave
+advice and were generally helpful.</para>
+
+</sect1>
+
+</chapter>
+
+
+
+<chapter id="libprog" xreflabel="Programming with libbzip2">
+<title>
+Programming with <computeroutput>libbzip2</computeroutput>
+</title>
+
+<para>This chapter describes the programming interface to
+<computeroutput>libbzip2</computeroutput>.</para>
+
+<para>For general background information, particularly about
+memory use and performance aspects, you'd be well advised to read
+<xref linkend="using"/> as well.</para>
+
+
+<sect1 id="top-level" xreflabel="Top-level structure">
+<title>Top-level structure</title>
+
+<para><computeroutput>libbzip2</computeroutput> is a flexible
+library for compressing and decompressing data in the
+<computeroutput>bzip2</computeroutput> data format.  Although
+packaged as a single entity, it helps to regard the library as
+three separate parts: the low level interface, and the high level
+interface, and some utility functions.</para>
+
+<para>The structure of
+<computeroutput>libbzip2</computeroutput>'s interfaces is similar
+to that of Jean-loup Gailly's and Mark Adler's excellent
+<computeroutput>zlib</computeroutput> library.</para>
+
+<para>All externally visible symbols have names beginning
+<computeroutput>BZ2_</computeroutput>.  This is new in version
+1.0.  The intention is to minimise pollution of the namespaces of
+library clients.</para>
+
+<para>To use any part of the library, you need to
+<computeroutput>#include &lt;bzlib.h&gt;</computeroutput>
+into your sources.</para>
+
+
+
+<sect2 id="ll-summary" xreflabel="Low-level summary">
+<title>Low-level summary</title>
+
+<para>This interface provides services for compressing and
+decompressing data in memory.  There's no provision for dealing
+with files, streams or any other I/O mechanisms, just straight
+memory-to-memory work.  In fact, this part of the library can be
+compiled without inclusion of
+<computeroutput>stdio.h</computeroutput>, which may be helpful
+for embedded applications.</para>
+
+<para>The low-level part of the library has no global variables
+and is therefore thread-safe.</para>
+
+<para>Six routines make up the low level interface:
+<computeroutput>BZ2_bzCompressInit</computeroutput>,
+<computeroutput>BZ2_bzCompress</computeroutput>, and
+<computeroutput>BZ2_bzCompressEnd</computeroutput> for
+compression, and a corresponding trio
+<computeroutput>BZ2_bzDecompressInit</computeroutput>,
+<computeroutput>BZ2_bzDecompress</computeroutput> and
+<computeroutput>BZ2_bzDecompressEnd</computeroutput> for
+decompression.  The <computeroutput>*Init</computeroutput>
+functions allocate memory for compression/decompression and do
+other initialisations, whilst the
+<computeroutput>*End</computeroutput> functions close down
+operations and release memory.</para>
+
+<para>The real work is done by
+<computeroutput>BZ2_bzCompress</computeroutput> and
+<computeroutput>BZ2_bzDecompress</computeroutput>.  These
+compress and decompress data from a user-supplied input buffer to
+a user-supplied output buffer.  These buffers can be any size;
+arbitrary quantities of data are handled by making repeated calls
+to these functions.  This is a flexible mechanism allowing a
+consumer-pull style of activity, or producer-push, or a mixture
+of both.</para>
+
+</sect2>
+
+
+<sect2 id="hl-summary" xreflabel="High-level summary">
+<title>High-level summary</title>
+
+<para>This interface provides some handy wrappers around the
+low-level interface to facilitate reading and writing
+<computeroutput>bzip2</computeroutput> format files
+(<computeroutput>.bz2</computeroutput> files).  The routines
+provide hooks to facilitate reading files in which the
+<computeroutput>bzip2</computeroutput> data stream is embedded
+within some larger-scale file structure, or where there are
+multiple <computeroutput>bzip2</computeroutput> data streams
+concatenated end-to-end.</para>
+
+<para>For reading files,
+<computeroutput>BZ2_bzReadOpen</computeroutput>,
+<computeroutput>BZ2_bzRead</computeroutput>,
+<computeroutput>BZ2_bzReadClose</computeroutput> and 
+<computeroutput>BZ2_bzReadGetUnused</computeroutput> are
+supplied.  For writing files,
+<computeroutput>BZ2_bzWriteOpen</computeroutput>,
+<computeroutput>BZ2_bzWrite</computeroutput> and
+<computeroutput>BZ2_bzWriteFinish</computeroutput> are
+available.</para>
+
+<para>As with the low-level library, no global variables are used
+so the library is per se thread-safe.  However, if I/O errors
+occur whilst reading or writing the underlying compressed files,
+you may have to consult <computeroutput>errno</computeroutput> to
+determine the cause of the error.  In that case, you'd need a C
+library which correctly supports
+<computeroutput>errno</computeroutput> in a multithreaded
+environment.</para>
+
+<para>To make the library a little simpler and more portable,
+<computeroutput>BZ2_bzReadOpen</computeroutput> and
+<computeroutput>BZ2_bzWriteOpen</computeroutput> require you to
+pass them file handles (<computeroutput>FILE*</computeroutput>s)
+which have previously been opened for reading or writing
+respectively.  That avoids portability problems associated with
+file operations and file attributes, whilst not being much of an
+imposition on the programmer.</para>
+
+</sect2>
+
+
+<sect2 id="util-fns-summary" xreflabel="Utility functions summary">
+<title>Utility functions summary</title>
+
+<para>For very simple needs,
+<computeroutput>BZ2_bzBuffToBuffCompress</computeroutput> and
+<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> are
+provided.  These compress data in memory from one buffer to
+another buffer in a single function call.  You should assess
+whether these functions fulfill your memory-to-memory
+compression/decompression requirements before investing effort in
+understanding the more general but more complex low-level
+interface.</para>
+
+<para>Yoshioka Tsuneo
+(<computeroutput>tsuneo@rr.iij4u.or.jp</computeroutput>) has
+contributed some functions to give better
+<computeroutput>zlib</computeroutput> compatibility.  These
+functions are <computeroutput>BZ2_bzopen</computeroutput>,
+<computeroutput>BZ2_bzread</computeroutput>,
+<computeroutput>BZ2_bzwrite</computeroutput>,
+<computeroutput>BZ2_bzflush</computeroutput>,
+<computeroutput>BZ2_bzclose</computeroutput>,
+<computeroutput>BZ2_bzerror</computeroutput> and
+<computeroutput>BZ2_bzlibVersion</computeroutput>.  You may find
+these functions more convenient for simple file reading and
+writing, than those in the high-level interface.  These functions
+are not (yet) officially part of the library, and are minimally
+documented here.  If they break, you get to keep all the pieces.
+I hope to document them properly when time permits.</para>
+
+<para>Yoshioka also contributed modifications to allow the
+library to be built as a Windows DLL.</para>
+
+</sect2>
+
+</sect1>
+
+
+<sect1 id="err-handling" xreflabel="Error handling">
+<title>Error handling</title>
+
+<para>The library is designed to recover cleanly in all
+situations, including the worst-case situation of decompressing
+random data.  I'm not 100% sure that it can always do this, so
+you might want to add a signal handler to catch segmentation
+violations during decompression if you are feeling especially
+paranoid.  I would be interested in hearing more about the
+robustness of the library to corrupted compressed data.</para>
+
+<para>Version 1.0.3 more robust in this respect than any
+previous version.  Investigations with Valgrind (a tool for detecting
+problems with memory management) indicate
+that, at least for the few files I tested, all single-bit errors
+in the decompressed data are caught properly, with no
+segmentation faults, no uses of uninitialised data, no out of
+range reads or writes, and no infinite looping in the decompressor.
+So it's certainly pretty robust, although
+I wouldn't claim it to be totally bombproof.</para>
+
+<para>The file <computeroutput>bzlib.h</computeroutput> contains
+all definitions needed to use the library.  In particular, you
+should definitely not include
+<computeroutput>bzlib_private.h</computeroutput>.</para>
+
+<para>In <computeroutput>bzlib.h</computeroutput>, the various
+return values are defined.  The following list is not intended as
+an exhaustive description of the circumstances in which a given
+value may be returned -- those descriptions are given later.
+Rather, it is intended to convey the rough meaning of each return
+value.  The first five actions are normal and not intended to
+denote an error situation.</para>
+
+<variablelist>
+
+ <varlistentry>
+  <term><computeroutput>BZ_OK</computeroutput></term>
+  <listitem><para>The requested action was completed
+   successfully.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_RUN_OK, BZ_FLUSH_OK,
+    BZ_FINISH_OK</computeroutput></term>
+  <listitem><para>In 
+   <computeroutput>BZ2_bzCompress</computeroutput>, the requested
+   flush/finish/nothing-special action was completed
+   successfully.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_STREAM_END</computeroutput></term>
+  <listitem><para>Compression of data was completed, or the
+   logical stream end was detected during
+   decompression.</para></listitem>
+ </varlistentry>
+
+</variablelist>
+
+<para>The following return values indicate an error of some
+kind.</para>
+
+<variablelist>
+
+ <varlistentry>
+  <term><computeroutput>BZ_CONFIG_ERROR</computeroutput></term>
+  <listitem><para>Indicates that the library has been improperly
+   compiled on your platform -- a major configuration error.
+   Specifically, it means that
+   <computeroutput>sizeof(char)</computeroutput>,
+   <computeroutput>sizeof(short)</computeroutput> and
+   <computeroutput>sizeof(int)</computeroutput> are not 1, 2 and
+   4 respectively, as they should be.  Note that the library
+   should still work properly on 64-bit platforms which follow
+   the LP64 programming model -- that is, where
+   <computeroutput>sizeof(long)</computeroutput> and
+   <computeroutput>sizeof(void*)</computeroutput> are 8.  Under
+   LP64, <computeroutput>sizeof(int)</computeroutput> is still 4,
+   so <computeroutput>libbzip2</computeroutput>, which doesn't
+   use the <computeroutput>long</computeroutput> type, is
+   OK.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_SEQUENCE_ERROR</computeroutput></term>
+  <listitem><para>When using the library, it is important to call
+   the functions in the correct sequence and with data structures
+   (buffers etc) in the correct states.
+   <computeroutput>libbzip2</computeroutput> checks as much as it
+   can to ensure this is happening, and returns
+   <computeroutput>BZ_SEQUENCE_ERROR</computeroutput> if not.
+   Code which complies precisely with the function semantics, as
+   detailed below, should never receive this value; such an event
+   denotes buggy code which you should
+   investigate.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_PARAM_ERROR</computeroutput></term>
+  <listitem><para>Returned when a parameter to a function call is
+   out of range or otherwise manifestly incorrect.  As with
+   <computeroutput>BZ_SEQUENCE_ERROR</computeroutput>, this
+   denotes a bug in the client code.  The distinction between
+   <computeroutput>BZ_PARAM_ERROR</computeroutput> and
+   <computeroutput>BZ_SEQUENCE_ERROR</computeroutput> is a bit
+   hazy, but still worth making.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_MEM_ERROR</computeroutput></term>
+  <listitem><para>Returned when a request to allocate memory
+   failed.  Note that the quantity of memory needed to decompress
+   a stream cannot be determined until the stream's header has
+   been read.  So
+   <computeroutput>BZ2_bzDecompress</computeroutput> and
+   <computeroutput>BZ2_bzRead</computeroutput> may return
+   <computeroutput>BZ_MEM_ERROR</computeroutput> even though some
+   of the compressed data has been read.  The same is not true
+   for compression; once
+   <computeroutput>BZ2_bzCompressInit</computeroutput> or
+   <computeroutput>BZ2_bzWriteOpen</computeroutput> have
+   successfully completed,
+   <computeroutput>BZ_MEM_ERROR</computeroutput> cannot
+   occur.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_DATA_ERROR</computeroutput></term>
+  <listitem><para>Returned when a data integrity error is
+   detected during decompression.  Most importantly, this means
+   when stored and computed CRCs for the data do not match.  This
+   value is also returned upon detection of any other anomaly in
+   the compressed data.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_DATA_ERROR_MAGIC</computeroutput></term>
+  <listitem><para>As a special case of
+   <computeroutput>BZ_DATA_ERROR</computeroutput>, it is
+   sometimes useful to know when the compressed stream does not
+   start with the correct magic bytes (<computeroutput>'B' 'Z'
+   'h'</computeroutput>).</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_IO_ERROR</computeroutput></term>
+  <listitem><para>Returned by
+   <computeroutput>BZ2_bzRead</computeroutput> and
+   <computeroutput>BZ2_bzWrite</computeroutput> when there is an
+   error reading or writing in the compressed file, and by
+   <computeroutput>BZ2_bzReadOpen</computeroutput> and
+   <computeroutput>BZ2_bzWriteOpen</computeroutput> for attempts
+   to use a file for which the error indicator (viz,
+   <computeroutput>ferror(f)</computeroutput>) is set.  On
+   receipt of <computeroutput>BZ_IO_ERROR</computeroutput>, the
+   caller should consult <computeroutput>errno</computeroutput>
+   and/or <computeroutput>perror</computeroutput> to acquire
+   operating-system specific information about the
+   problem.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_UNEXPECTED_EOF</computeroutput></term>
+  <listitem><para>Returned by
+   <computeroutput>BZ2_bzRead</computeroutput> when the
+   compressed file finishes before the logical end of stream is
+   detected.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+  <term><computeroutput>BZ_OUTBUFF_FULL</computeroutput></term>
+  <listitem><para>Returned by
+   <computeroutput>BZ2_bzBuffToBuffCompress</computeroutput> and
+   <computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> to
+   indicate that the output data will not fit into the output
+   buffer provided.</para></listitem>
+ </varlistentry>
+
+</variablelist>
+
+</sect1>
+
+
+
+<sect1 id="low-level" xreflabel=">Low-level interface">
+<title>Low-level interface</title>
+
+
+<sect2 id="bzcompress-init" xreflabel="BZ2_bzCompressInit">
+<title>BZ2_bzCompressInit</title>
+
+<programlisting>
+typedef struct {
+  char *next_in;
+  unsigned int avail_in;
+  unsigned int total_in_lo32;
+  unsigned int total_in_hi32;
+
+  char *next_out;
+  unsigned int avail_out;
+  unsigned int total_out_lo32;
+  unsigned int total_out_hi32;
+
+  void *state;
+
+  void *(*bzalloc)(void *,int,int);
+  void (*bzfree)(void *,void *);
+  void *opaque;
+} bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm, 
+                         int blockSize100k, 
+                         int verbosity,
+                         int workFactor );
+</programlisting>
+
+<para>Prepares for compression.  The
+<computeroutput>bz_stream</computeroutput> structure holds all
+data pertaining to the compression activity.  A
+<computeroutput>bz_stream</computeroutput> structure should be
+allocated and initialised prior to the call.  The fields of
+<computeroutput>bz_stream</computeroutput> comprise the entirety
+of the user-visible data.  <computeroutput>state</computeroutput>
+is a pointer to the private data structures required for
+compression.</para>
+
+<para>Custom memory allocators are supported, via fields
+<computeroutput>bzalloc</computeroutput>,
+<computeroutput>bzfree</computeroutput>, and
+<computeroutput>opaque</computeroutput>.  The value
+<computeroutput>opaque</computeroutput> is passed to as the first
+argument to all calls to <computeroutput>bzalloc</computeroutput>
+and <computeroutput>bzfree</computeroutput>, but is otherwise
+ignored by the library.  The call <computeroutput>bzalloc (
+opaque, n, m )</computeroutput> is expected to return a pointer
+<computeroutput>p</computeroutput> to <computeroutput>n *
+m</computeroutput> bytes of memory, and <computeroutput>bzfree (
+opaque, p )</computeroutput> should free that memory.</para>
+
+<para>If you don't want to use a custom memory allocator, set
+<computeroutput>bzalloc</computeroutput>,
+<computeroutput>bzfree</computeroutput> and
+<computeroutput>opaque</computeroutput> to
+<computeroutput>NULL</computeroutput>, and the library will then
+use the standard <computeroutput>malloc</computeroutput> /
+<computeroutput>free</computeroutput> routines.</para>
+
+<para>Before calling
+<computeroutput>BZ2_bzCompressInit</computeroutput>, fields
+<computeroutput>bzalloc</computeroutput>,
+<computeroutput>bzfree</computeroutput> and
+<computeroutput>opaque</computeroutput> should be filled
+appropriately, as just described.  Upon return, the internal
+state will have been allocated and initialised, and
+<computeroutput>total_in_lo32</computeroutput>,
+<computeroutput>total_in_hi32</computeroutput>,
+<computeroutput>total_out_lo32</computeroutput> and
+<computeroutput>total_out_hi32</computeroutput> will have been
+set to zero.  These four fields are used by the library to inform
+the caller of the total amount of data passed into and out of the
+library, respectively.  You should not try to change them.  As of
+version 1.0, 64-bit counts are maintained, even on 32-bit
+platforms, using the <computeroutput>_hi32</computeroutput>
+fields to store the upper 32 bits of the count.  So, for example,
+the total amount of data in is <computeroutput>(total_in_hi32
+&#60;&#60; 32) + total_in_lo32</computeroutput>.</para>
+
+<para>Parameter <computeroutput>blockSize100k</computeroutput>
+specifies the block size to be used for compression.  It should
+be a value between 1 and 9 inclusive, and the actual block size
+used is 100000 x this figure.  9 gives the best compression but
+takes most memory.</para>
+
+<para>Parameter <computeroutput>verbosity</computeroutput> should
+be set to a number between 0 and 4 inclusive.  0 is silent, and
+greater numbers give increasingly verbose monitoring/debugging
+output.  If the library has been compiled with
+<computeroutput>-DBZ_NO_STDIO</computeroutput>, no such output
+will appear for any verbosity setting.</para>
+
+<para>Parameter <computeroutput>workFactor</computeroutput>
+controls how the compression phase behaves when presented with
+worst case, highly repetitive, input data.  If compression runs
+into difficulties caused by repetitive data, the library switches
+from the standard sorting algorithm to a fallback algorithm.  The
+fallback is slower than the standard algorithm by perhaps a
+factor of three, but always behaves reasonably, no matter how bad
+the input.</para>
+
+<para>Lower values of <computeroutput>workFactor</computeroutput>
+reduce the amount of effort the standard algorithm will expend
+before resorting to the fallback.  You should set this parameter
+carefully; too low, and many inputs will be handled by the
+fallback algorithm and so compress rather slowly, too high, and
+your average-to-worst case compression times can become very
+large.  The default value of 30 gives reasonable behaviour over a
+wide range of circumstances.</para>
+
+<para>Allowable values range from 0 to 250 inclusive.  0 is a
+special case, equivalent to using the default value of 30.</para>
+
+<para>Note that the compressed output generated is the same
+regardless of whether or not the fallback algorithm is
+used.</para>
+
+<para>Be aware also that this parameter may disappear entirely in
+future versions of the library.  In principle it should be
+possible to devise a good way to automatically choose which
+algorithm to use.  Such a mechanism would render the parameter
+obsolete.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if strm is NULL 
+  or blockSize < 1 or blockSize > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR 
+  if not enough memory is available
+BZ_OK 
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+BZ2_bzCompress
+  if BZ_OK is returned
+  no specific action needed in case of error
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzCompress" xreflabel="BZ2_bzCompress">
+<title>BZ2_bzCompress</title>
+
+<programlisting>
+int BZ2_bzCompress ( bz_stream *strm, int action );
+</programlisting>
+
+<para>Provides more input and/or output buffer space for the
+library.  The caller maintains input and output buffers, and
+calls <computeroutput>BZ2_bzCompress</computeroutput> to transfer
+data between them.</para>
+
+<para>Before each call to
+<computeroutput>BZ2_bzCompress</computeroutput>,
+<computeroutput>next_in</computeroutput> should point at the data
+to be compressed, and <computeroutput>avail_in</computeroutput>
+should indicate how many bytes the library may read.
+<computeroutput>BZ2_bzCompress</computeroutput> updates
+<computeroutput>next_in</computeroutput>,
+<computeroutput>avail_in</computeroutput> and
+<computeroutput>total_in</computeroutput> to reflect the number
+of bytes it has read.</para>
+
+<para>Similarly, <computeroutput>next_out</computeroutput> should
+point to a buffer in which the compressed data is to be placed,
+with <computeroutput>avail_out</computeroutput> indicating how
+much output space is available.
+<computeroutput>BZ2_bzCompress</computeroutput> updates
+<computeroutput>next_out</computeroutput>,
+<computeroutput>avail_out</computeroutput> and
+<computeroutput>total_out</computeroutput> to reflect the number
+of bytes output.</para>
+
+<para>You may provide and remove as little or as much data as you
+like on each call of
+<computeroutput>BZ2_bzCompress</computeroutput>.  In the limit,
+it is acceptable to supply and remove data one byte at a time,
+although this would be terribly inefficient.  You should always
+ensure that at least one byte of output space is available at
+each call.</para>
+
+<para>A second purpose of
+<computeroutput>BZ2_bzCompress</computeroutput> is to request a
+change of mode of the compressed stream.</para>
+
+<para>Conceptually, a compressed stream can be in one of four
+states: IDLE, RUNNING, FLUSHING and FINISHING.  Before
+initialisation
+(<computeroutput>BZ2_bzCompressInit</computeroutput>) and after
+termination (<computeroutput>BZ2_bzCompressEnd</computeroutput>),
+a stream is regarded as IDLE.</para>
+
+<para>Upon initialisation
+(<computeroutput>BZ2_bzCompressInit</computeroutput>), the stream
+is placed in the RUNNING state.  Subsequent calls to
+<computeroutput>BZ2_bzCompress</computeroutput> should pass
+<computeroutput>BZ_RUN</computeroutput> as the requested action;
+other actions are illegal and will result in
+<computeroutput>BZ_SEQUENCE_ERROR</computeroutput>.</para>
+
+<para>At some point, the calling program will have provided all
+the input data it wants to.  It will then want to finish up -- in
+effect, asking the library to process any data it might have
+buffered internally.  In this state,
+<computeroutput>BZ2_bzCompress</computeroutput> will no longer
+attempt to read data from
+<computeroutput>next_in</computeroutput>, but it will want to
+write data to <computeroutput>next_out</computeroutput>.  Because
+the output buffer supplied by the user can be arbitrarily small,
+the finishing-up operation cannot necessarily be done with a
+single call of
+<computeroutput>BZ2_bzCompress</computeroutput>.</para>
+
+<para>Instead, the calling program passes
+<computeroutput>BZ_FINISH</computeroutput> as an action to
+<computeroutput>BZ2_bzCompress</computeroutput>.  This changes
+the stream's state to FINISHING.  Any remaining input (ie,
+<computeroutput>next_in[0 .. avail_in-1]</computeroutput>) is
+compressed and transferred to the output buffer.  To do this,
+<computeroutput>BZ2_bzCompress</computeroutput> must be called
+repeatedly until all the output has been consumed.  At that
+point, <computeroutput>BZ2_bzCompress</computeroutput> returns
+<computeroutput>BZ_STREAM_END</computeroutput>, and the stream's
+state is set back to IDLE.
+<computeroutput>BZ2_bzCompressEnd</computeroutput> should then be
+called.</para>
+
+<para>Just to make sure the calling program does not cheat, the
+library makes a note of <computeroutput>avail_in</computeroutput>
+at the time of the first call to
+<computeroutput>BZ2_bzCompress</computeroutput> which has
+<computeroutput>BZ_FINISH</computeroutput> as an action (ie, at
+the time the program has announced its intention to not supply
+any more input).  By comparing this value with that of
+<computeroutput>avail_in</computeroutput> over subsequent calls
+to <computeroutput>BZ2_bzCompress</computeroutput>, the library
+can detect any attempts to slip in more data to compress.  Any
+calls for which this is detected will return
+<computeroutput>BZ_SEQUENCE_ERROR</computeroutput>.  This
+indicates a programming mistake which should be corrected.</para>
+
+<para>Instead of asking to finish, the calling program may ask
+<computeroutput>BZ2_bzCompress</computeroutput> to take all the
+remaining input, compress it and terminate the current
+(Burrows-Wheeler) compression block.  This could be useful for
+error control purposes.  The mechanism is analogous to that for
+finishing: call <computeroutput>BZ2_bzCompress</computeroutput>
+with an action of <computeroutput>BZ_FLUSH</computeroutput>,
+remove output data, and persist with the
+<computeroutput>BZ_FLUSH</computeroutput> action until the value
+<computeroutput>BZ_RUN</computeroutput> is returned.  As with
+finishing, <computeroutput>BZ2_bzCompress</computeroutput>
+detects any attempt to provide more input data once the flush has
+begun.</para>
+
+<para>Once the flush is complete, the stream returns to the
+normal RUNNING state.</para>
+
+<para>This all sounds pretty complex, but isn't really.  Here's a
+table which shows which actions are allowable in each state, what
+action will be taken, what the next state is, and what the
+non-error return values are.  Note that you can't explicitly ask
+what state the stream is in, but nor do you need to -- it can be
+inferred from the values returned by
+<computeroutput>BZ2_bzCompress</computeroutput>.</para>
+
+<programlisting>
+IDLE/any
+  Illegal.  IDLE state only exists after BZ2_bzCompressEnd or
+  before BZ2_bzCompressInit.
+  Return value = BZ_SEQUENCE_ERROR
+
+RUNNING/BZ_RUN
+  Compress from next_in to next_out as much as possible.
+  Next state = RUNNING
+  Return value = BZ_RUN_OK
+
+RUNNING/BZ_FLUSH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FLUSHING
+  Return value = BZ_FLUSH_OK
+
+RUNNING/BZ_FINISH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FINISHING
+  Return value = BZ_FINISH_OK
+
+FLUSHING/BZ_FLUSH
+  Compress from next_in to next_out as much as possible, 
+  but do not accept any more input.
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = RUNNING; Return value = BZ_RUN_OK
+  else
+    Next state = FLUSHING; Return value = BZ_FLUSH_OK
+
+FLUSHING/other     
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+
+FINISHING/BZ_FINISH
+  Compress from next_in to next_out as much as possible,
+  but to not accept any more input.  
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = IDLE; Return value = BZ_STREAM_END
+  else
+    Next state = FINISHING; Return value = BZ_FINISH_OK
+
+FINISHING/other
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+</programlisting>
+
+
+<para>That still looks complicated?  Well, fair enough.  The
+usual sequence of calls for compressing a load of data is:</para>
+
+<orderedlist>
+
+ <listitem><para>Get started with
+  <computeroutput>BZ2_bzCompressInit</computeroutput>.</para></listitem>
+
+ <listitem><para>Shovel data in and shlurp out its compressed form
+  using zero or more calls of
+  <computeroutput>BZ2_bzCompress</computeroutput> with action =
+  <computeroutput>BZ_RUN</computeroutput>.</para></listitem>
+
+ <listitem><para>Finish up. Repeatedly call
+  <computeroutput>BZ2_bzCompress</computeroutput> with action =
+  <computeroutput>BZ_FINISH</computeroutput>, copying out the
+  compressed output, until
+  <computeroutput>BZ_STREAM_END</computeroutput> is
+  returned.</para></listitem> <listitem><para>Close up and go home.  Call
+  <computeroutput>BZ2_bzCompressEnd</computeroutput>.</para></listitem>
+
+</orderedlist>
+
+<para>If the data you want to compress fits into your input
+buffer all at once, you can skip the calls of
+<computeroutput>BZ2_bzCompress ( ..., BZ_RUN )</computeroutput>
+and just do the <computeroutput>BZ2_bzCompress ( ..., BZ_FINISH
+)</computeroutput> calls.</para>
+
+<para>All required memory is allocated by
+<computeroutput>BZ2_bzCompressInit</computeroutput>.  The
+compression library can accept any data at all (obviously).  So
+you shouldn't get any error return values from the
+<computeroutput>BZ2_bzCompress</computeroutput> calls.  If you
+do, they will be
+<computeroutput>BZ_SEQUENCE_ERROR</computeroutput>, and indicate
+a bug in your programming.</para>
+
+<para>Trivial other possible return values:</para>
+
+<programlisting>
+BZ_PARAM_ERROR
+  if strm is NULL, or strm->s is NULL
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzCompress-end" xreflabel="BZ2_bzCompressEnd">
+<title>BZ2_bzCompressEnd</title>
+
+<programlisting>
+int BZ2_bzCompressEnd ( bz_stream *strm );
+</programlisting>
+
+<para>Releases all memory associated with a compression
+stream.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_PARAM_ERROR  if strm is NULL or strm->s is NULL
+BZ_OK           otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzDecompress-init" xreflabel="BZ2_bzDecompressInit">
+<title>BZ2_bzDecompressInit</title>
+
+<programlisting>
+int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
+</programlisting>
+
+<para>Prepares for decompression.  As with
+<computeroutput>BZ2_bzCompressInit</computeroutput>, a
+<computeroutput>bz_stream</computeroutput> record should be
+allocated and initialised before the call.  Fields
+<computeroutput>bzalloc</computeroutput>,
+<computeroutput>bzfree</computeroutput> and
+<computeroutput>opaque</computeroutput> should be set if a custom
+memory allocator is required, or made
+<computeroutput>NULL</computeroutput> for the normal
+<computeroutput>malloc</computeroutput> /
+<computeroutput>free</computeroutput> routines.  Upon return, the
+internal state will have been initialised, and
+<computeroutput>total_in</computeroutput> and
+<computeroutput>total_out</computeroutput> will be zero.</para>
+
+<para>For the meaning of parameter
+<computeroutput>verbosity</computeroutput>, see
+<computeroutput>BZ2_bzCompressInit</computeroutput>.</para>
+
+<para>If <computeroutput>small</computeroutput> is nonzero, the
+library will use an alternative decompression algorithm which
+uses less memory but at the cost of decompressing more slowly
+(roughly speaking, half the speed, but the maximum memory
+requirement drops to around 2300k).  See <xref linkend="using"/>
+for more information on memory management.</para>
+
+<para>Note that the amount of memory needed to decompress a
+stream cannot be determined until the stream's header has been
+read, so even if
+<computeroutput>BZ2_bzDecompressInit</computeroutput> succeeds, a
+subsequent <computeroutput>BZ2_bzDecompress</computeroutput>
+could fail with
+<computeroutput>BZ_MEM_ERROR</computeroutput>.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if ( small != 0 && small != 1 )
+  or (verbosity <; 0 || verbosity > 4)
+BZ_MEM_ERROR
+  if insufficient memory is available
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+BZ2_bzDecompress
+  if BZ_OK was returned
+  no specific action required in case of error
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzDecompress" xreflabel="BZ2_bzDecompress">
+<title>BZ2_bzDecompress</title>
+
+<programlisting>
+int BZ2_bzDecompress ( bz_stream *strm );
+</programlisting>
+
+<para>Provides more input and/out output buffer space for the
+library.  The caller maintains input and output buffers, and uses
+<computeroutput>BZ2_bzDecompress</computeroutput> to transfer
+data between them.</para>
+
+<para>Before each call to
+<computeroutput>BZ2_bzDecompress</computeroutput>,
+<computeroutput>next_in</computeroutput> should point at the
+compressed data, and <computeroutput>avail_in</computeroutput>
+should indicate how many bytes the library may read.
+<computeroutput>BZ2_bzDecompress</computeroutput> updates
+<computeroutput>next_in</computeroutput>,
+<computeroutput>avail_in</computeroutput> and
+<computeroutput>total_in</computeroutput> to reflect the number
+of bytes it has read.</para>
+
+<para>Similarly, <computeroutput>next_out</computeroutput> should
+point to a buffer in which the uncompressed output is to be
+placed, with <computeroutput>avail_out</computeroutput>
+indicating how much output space is available.
+<computeroutput>BZ2_bzCompress</computeroutput> updates
+<computeroutput>next_out</computeroutput>,
+<computeroutput>avail_out</computeroutput> and
+<computeroutput>total_out</computeroutput> to reflect the number
+of bytes output.</para>
+
+<para>You may provide and remove as little or as much data as you
+like on each call of
+<computeroutput>BZ2_bzDecompress</computeroutput>.  In the limit,
+it is acceptable to supply and remove data one byte at a time,
+although this would be terribly inefficient.  You should always
+ensure that at least one byte of output space is available at
+each call.</para>
+
+<para>Use of <computeroutput>BZ2_bzDecompress</computeroutput> is
+simpler than
+<computeroutput>BZ2_bzCompress</computeroutput>.</para>
+
+<para>You should provide input and remove output as described
+above, and repeatedly call
+<computeroutput>BZ2_bzDecompress</computeroutput> until
+<computeroutput>BZ_STREAM_END</computeroutput> is returned.
+Appearance of <computeroutput>BZ_STREAM_END</computeroutput>
+denotes that <computeroutput>BZ2_bzDecompress</computeroutput>
+has detected the logical end of the compressed stream.
+<computeroutput>BZ2_bzDecompress</computeroutput> will not
+produce <computeroutput>BZ_STREAM_END</computeroutput> until all
+output data has been placed into the output buffer, so once
+<computeroutput>BZ_STREAM_END</computeroutput> appears, you are
+guaranteed to have available all the decompressed output, and
+<computeroutput>BZ2_bzDecompressEnd</computeroutput> can safely
+be called.</para>
+
+<para>If case of an error return value, you should call
+<computeroutput>BZ2_bzDecompressEnd</computeroutput> to clean up
+and release memory.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+  or strm->avail_out < 1
+BZ_DATA_ERROR
+  if a data integrity error is detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the compressed stream doesn't begin with the right magic bytes
+BZ_MEM_ERROR
+  if there wasn't enough memory available
+BZ_STREAM_END
+  if the logical end of the data stream was detected and all
+  output in has been consumed, eg s-->avail_out > 0
+BZ_OK
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+BZ2_bzDecompress
+  if BZ_OK was returned
+BZ2_bzDecompressEnd
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzDecompress-end" xreflabel="BZ2_bzDecompressEnd">
+<title>BZ2_bzDecompressEnd</title>
+
+<programlisting>
+int BZ2_bzDecompressEnd ( bz_stream *strm );
+</programlisting>
+
+<para>Releases all memory associated with a decompression
+stream.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+BZ_OK
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+  None.
+</programlisting>
+
+</sect2>
+
+</sect1>
+
+
+<sect1 id="hl-interface" xreflabel="High-level interface">
+<title>High-level interface</title>
+
+<para>This interface provides functions for reading and writing
+<computeroutput>bzip2</computeroutput> format files.  First, some
+general points.</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para>All of the functions take an
+  <computeroutput>int*</computeroutput> first argument,
+  <computeroutput>bzerror</computeroutput>.  After each call,
+  <computeroutput>bzerror</computeroutput> should be consulted
+  first to determine the outcome of the call.  If
+  <computeroutput>bzerror</computeroutput> is
+  <computeroutput>BZ_OK</computeroutput>, the call completed
+  successfully, and only then should the return value of the
+  function (if any) be consulted.  If
+  <computeroutput>bzerror</computeroutput> is
+  <computeroutput>BZ_IO_ERROR</computeroutput>, there was an
+  error reading/writing the underlying compressed file, and you
+  should then consult <computeroutput>errno</computeroutput> /
+  <computeroutput>perror</computeroutput> to determine the cause
+  of the difficulty.  <computeroutput>bzerror</computeroutput>
+  may also be set to various other values; precise details are
+  given on a per-function basis below.</para></listitem>
+
+ <listitem><para>If <computeroutput>bzerror</computeroutput> indicates
+  an error (ie, anything except
+  <computeroutput>BZ_OK</computeroutput> and
+  <computeroutput>BZ_STREAM_END</computeroutput>), you should
+  immediately call
+  <computeroutput>BZ2_bzReadClose</computeroutput> (or
+  <computeroutput>BZ2_bzWriteClose</computeroutput>, depending on
+  whether you are attempting to read or to write) to free up all
+  resources associated with the stream.  Once an error has been
+  indicated, behaviour of all calls except
+  <computeroutput>BZ2_bzReadClose</computeroutput>
+  (<computeroutput>BZ2_bzWriteClose</computeroutput>) is
+  undefined.  The implication is that (1)
+  <computeroutput>bzerror</computeroutput> should be checked
+  after each call, and (2) if
+  <computeroutput>bzerror</computeroutput> indicates an error,
+  <computeroutput>BZ2_bzReadClose</computeroutput>
+  (<computeroutput>BZ2_bzWriteClose</computeroutput>) should then
+  be called to clean up.</para></listitem>
+
+ <listitem><para>The <computeroutput>FILE*</computeroutput> arguments
+  passed to <computeroutput>BZ2_bzReadOpen</computeroutput> /
+  <computeroutput>BZ2_bzWriteOpen</computeroutput> should be set
+  to binary mode.  Most Unix systems will do this by default, but
+  other platforms, including Windows and Mac, will not.  If you
+  omit this, you may encounter problems when moving code to new
+  platforms.</para></listitem>
+
+ <listitem><para>Memory allocation requests are handled by
+  <computeroutput>malloc</computeroutput> /
+  <computeroutput>free</computeroutput>.  At present there is no
+  facility for user-defined memory allocators in the file I/O
+  functions (could easily be added, though).</para></listitem>
+
+</itemizedlist>
+
+
+
+<sect2 id="bzreadopen" xreflabel="BZ2_bzReadOpen">
+<title>BZ2_bzReadOpen</title>
+
+<programlisting>
+typedef void BZFILE;
+
+BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, 
+                        int verbosity, int small,
+                        void *unused, int nUnused );
+</programlisting>
+
+<para>Prepare to read compressed data from file handle
+<computeroutput>f</computeroutput>.
+<computeroutput>f</computeroutput> should refer to a file which
+has been opened for reading, and for which the error indicator
+(<computeroutput>ferror(f)</computeroutput>)is not set.  If
+<computeroutput>small</computeroutput> is 1, the library will try
+to decompress using less memory, at the expense of speed.</para>
+
+<para>For reasons explained below,
+<computeroutput>BZ2_bzRead</computeroutput> will decompress the
+<computeroutput>nUnused</computeroutput> bytes starting at
+<computeroutput>unused</computeroutput>, before starting to read
+from the file <computeroutput>f</computeroutput>.  At most
+<computeroutput>BZ_MAX_UNUSED</computeroutput> bytes may be
+supplied like this.  If this facility is not required, you should
+pass <computeroutput>NULL</computeroutput> and
+<computeroutput>0</computeroutput> for
+<computeroutput>unused</computeroutput> and
+n<computeroutput>Unused</computeroutput> respectively.</para>
+
+<para>For the meaning of parameters
+<computeroutput>small</computeroutput> and
+<computeroutput>verbosity</computeroutput>, see
+<computeroutput>BZ2_bzDecompressInit</computeroutput>.</para>
+
+<para>The amount of memory needed to decompress a file cannot be
+determined until the file's header has been read.  So it is
+possible that <computeroutput>BZ2_bzReadOpen</computeroutput>
+returns <computeroutput>BZ_OK</computeroutput> but a subsequent
+call of <computeroutput>BZ2_bzRead</computeroutput> will return
+<computeroutput>BZ_MEM_ERROR</computeroutput>.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or small is neither 0 nor 1
+  or ( unused == NULL && nUnused != 0 )
+  or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) )
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise.
+</programlisting>
+
+<para>Possible return values:</para>
+
+<programlisting>
+Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+BZ2_bzRead
+  if bzerror is BZ_OK
+BZ2_bzClose
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzread" xreflabel="BZ2_bzRead">
+<title>BZ2_bzRead</title>
+
+<programlisting>
+int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
+</programlisting>
+
+<para>Reads up to <computeroutput>len</computeroutput>
+(uncompressed) bytes from the compressed file
+<computeroutput>b</computeroutput> into the buffer
+<computeroutput>buf</computeroutput>.  If the read was
+successful, <computeroutput>bzerror</computeroutput> is set to
+<computeroutput>BZ_OK</computeroutput> and the number of bytes
+read is returned.  If the logical end-of-stream was detected,
+<computeroutput>bzerror</computeroutput> will be set to
+<computeroutput>BZ_STREAM_END</computeroutput>, and the number of
+bytes read is returned.  All other
+<computeroutput>bzerror</computeroutput> values denote an
+error.</para>
+
+<para><computeroutput>BZ2_bzRead</computeroutput> will supply
+<computeroutput>len</computeroutput> bytes, unless the logical
+stream end is detected or an error occurs.  Because of this, it
+is possible to detect the stream end by observing when the number
+of bytes returned is less than the number requested.
+Nevertheless, this is regarded as inadvisable; you should instead
+check <computeroutput>bzerror</computeroutput> after every call
+and watch out for
+<computeroutput>BZ_STREAM_END</computeroutput>.</para>
+
+<para>Internally, <computeroutput>BZ2_bzRead</computeroutput>
+copies data from the compressed file in chunks of size
+<computeroutput>BZ_MAX_UNUSED</computeroutput> bytes before
+decompressing it.  If the file contains more bytes than strictly
+needed to reach the logical end-of-stream,
+<computeroutput>BZ2_bzRead</computeroutput> will almost certainly
+read some of the trailing data before signalling
+<computeroutput>BZ_SEQUENCE_END</computeroutput>.  To collect the
+read but unused data once
+<computeroutput>BZ_SEQUENCE_END</computeroutput> has appeared,
+call <computeroutput>BZ2_bzReadGetUnused</computeroutput>
+immediately before
+<computeroutput>BZ2_bzReadClose</computeroutput>.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzWriteOpen
+BZ_IO_ERROR
+  if there is an error reading from the compressed file
+BZ_UNEXPECTED_EOF
+  if the compressed file ended before 
+  the logical end-of-stream was detected
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the stream does not begin with the requisite header bytes 
+  (ie, is not a bzip2 data file).  This is really 
+  a special case of BZ_DATA_ERROR.
+BZ_MEM_ERROR
+  if insufficient memory was available
+BZ_STREAM_END
+  if the logical end of stream was detected.
+BZ_OK
+  otherwise.
+</programlisting>
+
+<para>Possible return values:</para>
+
+<programlisting>
+number of bytes read
+  if bzerror is BZ_OK or BZ_STREAM_END
+undefined
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
+  if bzerror is BZ_OK
+collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
+  if bzerror is BZ_SEQUENCE_END
+BZ2_bzReadClose
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzreadgetunused" xreflabel="BZ2_bzReadGetUnused">
+<title>BZ2_bzReadGetUnused</title>
+
+<programlisting>
+void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, 
+                          void** unused, int* nUnused );
+</programlisting>
+
+<para>Returns data which was read from the compressed file but
+was not needed to get to the logical end-of-stream.
+<computeroutput>*unused</computeroutput> is set to the address of
+the data, and <computeroutput>*nUnused</computeroutput> to the
+number of bytes.  <computeroutput>*nUnused</computeroutput> will
+be set to a value between <computeroutput>0</computeroutput> and
+<computeroutput>BZ_MAX_UNUSED</computeroutput> inclusive.</para>
+
+<para>This function may only be called once
+<computeroutput>BZ2_bzRead</computeroutput> has signalled
+<computeroutput>BZ_STREAM_END</computeroutput> but before
+<computeroutput>BZ2_bzReadClose</computeroutput>.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_PARAM_ERROR
+  if b is NULL
+  or unused is NULL or nUnused is NULL
+BZ_SEQUENCE_ERROR
+  if BZ_STREAM_END has not been signalled
+  or if b was opened with BZ2_bzWriteOpen
+BZ_OK
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+BZ2_bzReadClose
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzreadclose" xreflabel="BZ2_bzReadClose">
+<title>BZ2_bzReadClose</title>
+
+<programlisting>
+void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
+</programlisting>
+
+<para>Releases all memory pertaining to the compressed file
+<computeroutput>b</computeroutput>.
+<computeroutput>BZ2_bzReadClose</computeroutput> does not call
+<computeroutput>fclose</computeroutput> on the underlying file
+handle, so you should do that yourself if appropriate.
+<computeroutput>BZ2_bzReadClose</computeroutput> should be called
+to clean up after all error situations.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzOpenWrite
+BZ_OK
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+none
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzwriteopen" xreflabel="BZ2_bzWriteOpen">
+<title>BZ2_bzWriteOpen</title>
+
+<programlisting>
+BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, 
+                         int blockSize100k, int verbosity,
+                         int workFactor );
+</programlisting>
+
+<para>Prepare to write compressed data to file handle
+<computeroutput>f</computeroutput>.
+<computeroutput>f</computeroutput> should refer to a file which
+has been opened for writing, and for which the error indicator
+(<computeroutput>ferror(f)</computeroutput>)is not set.</para>
+
+<para>For the meaning of parameters
+<computeroutput>blockSize100k</computeroutput>,
+<computeroutput>verbosity</computeroutput> and
+<computeroutput>workFactor</computeroutput>, see
+<computeroutput>BZ2_bzCompressInit</computeroutput>.</para>
+
+<para>All required memory is allocated at this stage, so if the
+call completes successfully,
+<computeroutput>BZ_MEM_ERROR</computeroutput> cannot be signalled
+by a subsequent call to
+<computeroutput>BZ2_bzWrite</computeroutput>.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise
+</programlisting>
+
+<para>Possible return values:</para>
+
+<programlisting>
+Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+</programlisting>
+
+<para>Allowable next actions:</para>
+
+<programlisting>
+BZ2_bzWrite
+  if bzerror is BZ_OK
+  (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
+BZ2_bzWriteClose
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzwrite" xreflabel="BZ2_bzWrite">
+<title>BZ2_bzWrite</title>
+
+<programlisting>
+void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
+</programlisting>
+
+<para>Absorbs <computeroutput>len</computeroutput> bytes from the
+buffer <computeroutput>buf</computeroutput>, eventually to be
+compressed and written to the file.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file.
+BZ_OK
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzwriteclose" xreflabel="BZ2_bzWriteClose">
+<title>BZ2_bzWriteClose</title>
+
+<programlisting>
+void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
+                       int abandon,
+                       unsigned int* nbytes_in,
+                       unsigned int* nbytes_out );
+
+void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
+                         int abandon,
+                         unsigned int* nbytes_in_lo32,
+                         unsigned int* nbytes_in_hi32,
+                         unsigned int* nbytes_out_lo32,
+                         unsigned int* nbytes_out_hi32 );
+</programlisting>
+
+<para>Compresses and flushes to the compressed file all data so
+far supplied by <computeroutput>BZ2_bzWrite</computeroutput>.
+The logical end-of-stream markers are also written, so subsequent
+calls to <computeroutput>BZ2_bzWrite</computeroutput> are
+illegal.  All memory associated with the compressed file
+<computeroutput>b</computeroutput> is released.
+<computeroutput>fflush</computeroutput> is called on the
+compressed file, but it is not
+<computeroutput>fclose</computeroutput>'d.</para>
+
+<para>If <computeroutput>BZ2_bzWriteClose</computeroutput> is
+called to clean up after an error, the only action is to release
+the memory.  The library records the error codes issued by
+previous calls, so this situation will be detected automatically.
+There is no attempt to complete the compression operation, nor to
+<computeroutput>fflush</computeroutput> the compressed file.  You
+can force this behaviour to happen even in the case of no error,
+by passing a nonzero value to
+<computeroutput>abandon</computeroutput>.</para>
+
+<para>If <computeroutput>nbytes_in</computeroutput> is non-null,
+<computeroutput>*nbytes_in</computeroutput> will be set to be the
+total volume of uncompressed data handled.  Similarly,
+<computeroutput>nbytes_out</computeroutput> will be set to the
+total volume of compressed data written.  For compatibility with
+older versions of the library,
+<computeroutput>BZ2_bzWriteClose</computeroutput> only yields the
+lower 32 bits of these counts.  Use
+<computeroutput>BZ2_bzWriteClose64</computeroutput> if you want
+the full 64 bit counts.  These two functions are otherwise
+absolutely identical.</para>
+
+<para>Possible assignments to
+<computeroutput>bzerror</computeroutput>:</para>
+
+<programlisting>
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file
+BZ_OK
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="embed" xreflabel="Handling embedded compressed data streams">
+<title>Handling embedded compressed data streams</title>
+
+<para>The high-level library facilitates use of
+<computeroutput>bzip2</computeroutput> data streams which form
+some part of a surrounding, larger data stream.</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para>For writing, the library takes an open file handle,
+  writes compressed data to it,
+  <computeroutput>fflush</computeroutput>es it but does not
+  <computeroutput>fclose</computeroutput> it.  The calling
+  application can write its own data before and after the
+  compressed data stream, using that same file handle.</para></listitem>
+
+ <listitem><para>Reading is more complex, and the facilities are not as
+  general as they could be since generality is hard to reconcile
+  with efficiency.  <computeroutput>BZ2_bzRead</computeroutput>
+  reads from the compressed file in blocks of size
+  <computeroutput>BZ_MAX_UNUSED</computeroutput> bytes, and in
+  doing so probably will overshoot the logical end of compressed
+  stream.  To recover this data once decompression has ended,
+  call <computeroutput>BZ2_bzReadGetUnused</computeroutput> after
+  the last call of <computeroutput>BZ2_bzRead</computeroutput>
+  (the one returning
+  <computeroutput>BZ_STREAM_END</computeroutput>) but before
+  calling
+  <computeroutput>BZ2_bzReadClose</computeroutput>.</para></listitem>
+
+</itemizedlist>
+
+<para>This mechanism makes it easy to decompress multiple
+<computeroutput>bzip2</computeroutput> streams placed end-to-end.
+As the end of one stream, when
+<computeroutput>BZ2_bzRead</computeroutput> returns
+<computeroutput>BZ_STREAM_END</computeroutput>, call
+<computeroutput>BZ2_bzReadGetUnused</computeroutput> to collect
+the unused data (copy it into your own buffer somewhere).  That
+data forms the start of the next compressed stream.  To start
+uncompressing that next stream, call
+<computeroutput>BZ2_bzReadOpen</computeroutput> again, feeding in
+the unused data via the <computeroutput>unused</computeroutput> /
+<computeroutput>nUnused</computeroutput> parameters.  Keep doing
+this until <computeroutput>BZ_STREAM_END</computeroutput> return
+coincides with the physical end of file
+(<computeroutput>feof(f)</computeroutput>).  In this situation
+<computeroutput>BZ2_bzReadGetUnused</computeroutput> will of
+course return no data.</para>
+
+<para>This should give some feel for how the high-level interface
+can be used.  If you require extra flexibility, you'll have to
+bite the bullet and get to grips with the low-level
+interface.</para>
+
+</sect2>
+
+
+<sect2 id="std-rdwr" xreflabel="Standard file-reading/writing code">
+<title>Standard file-reading/writing code</title>
+
+<para>Here's how you'd write data to a compressed file:</para>
+
+<programlisting>
+FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if ( !f ) {
+ /* handle error */
+}
+b = BZ2_bzWriteOpen( &bzerror, f, 9 );
+if (bzerror != BZ_OK) {
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+}
+
+while ( /* condition */ ) {
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) { 
+   BZ2_bzWriteClose ( &bzerror, b );
+   /* handle error */
+ }
+}
+
+BZ2_bzWriteClose( &bzerror, b );
+if (bzerror == BZ_IO_ERROR) {
+ /* handle error */
+}
+</programlisting>
+
+<para>And to read from a compressed file:</para>
+
+<programlisting>
+FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if ( !f ) {
+  /* handle error */
+}
+b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 );
+if ( bzerror != BZ_OK ) {
+  BZ2_bzReadClose ( &bzerror, b );
+  /* handle error */
+}
+
+bzerror = BZ_OK;
+while ( bzerror == BZ_OK && /* arbitrary other conditions */) {
+  nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ );
+  if ( bzerror == BZ_OK ) {
+    /* do something with buf[0 .. nBuf-1] */
+  }
+}
+if ( bzerror != BZ_STREAM_END ) {
+   BZ2_bzReadClose ( &bzerror, b );
+   /* handle error */
+} else {
+   BZ2_bzReadClose ( &bzerror, b );
+}
+</programlisting>
+
+</sect2>
+
+</sect1>
+
+
+<sect1 id="util-fns" xreflabel="Utility functions">
+<title>Utility functions</title>
+
+
+<sect2 id="bzbufftobuffcompress" xreflabel="BZ2_bzBuffToBuffCompress">
+<title>BZ2_bzBuffToBuffCompress</title>
+
+<programlisting>
+int BZ2_bzBuffToBuffCompress( char*         dest,
+                              unsigned int* destLen,
+                              char*         source,
+                              unsigned int  sourceLen,
+                              int           blockSize100k,
+                              int           verbosity,
+                              int           workFactor );
+</programlisting>
+
+<para>Attempts to compress the data in <computeroutput>source[0
+.. sourceLen-1]</computeroutput> into the destination buffer,
+<computeroutput>dest[0 .. *destLen-1]</computeroutput>.  If the
+destination buffer is big enough,
+<computeroutput>*destLen</computeroutput> is set to the size of
+the compressed data, and <computeroutput>BZ_OK</computeroutput>
+is returned.  If the compressed data won't fit,
+<computeroutput>*destLen</computeroutput> is unchanged, and
+<computeroutput>BZ_OUTBUFF_FULL</computeroutput> is
+returned.</para>
+
+<para>Compression in this manner is a one-shot event, done with a
+single call to this function.  The resulting compressed data is a
+complete <computeroutput>bzip2</computeroutput> format data
+stream.  There is no mechanism for making additional calls to
+provide extra input data.  If you want that kind of mechanism,
+use the low-level interface.</para>
+
+<para>For the meaning of parameters
+<computeroutput>blockSize100k</computeroutput>,
+<computeroutput>verbosity</computeroutput> and
+<computeroutput>workFactor</computeroutput>, see
+<computeroutput>BZ2_bzCompressInit</computeroutput>.</para>
+
+<para>To guarantee that the compressed data will fit in its
+buffer, allocate an output buffer of size 1% larger than the
+uncompressed data, plus six hundred extra bytes.</para>
+
+<para><computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput>
+will not write data at or beyond
+<computeroutput>dest[*destLen]</computeroutput>, even in case of
+buffer overflow.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_OK
+  otherwise
+</programlisting>
+
+</sect2>
+
+
+<sect2 id="bzbufftobuffdecompress" xreflabel="BZ2_bzBuffToBuffDecompress">
+<title>BZ2_bzBuffToBuffDecompress</title>
+
+<programlisting>
+int BZ2_bzBuffToBuffDecompress( char*         dest,
+                                unsigned int* destLen,
+                                char*         source,
+                                unsigned int  sourceLen,
+                                int           small,
+                                int           verbosity );
+</programlisting>
+
+<para>Attempts to decompress the data in <computeroutput>source[0
+.. sourceLen-1]</computeroutput> into the destination buffer,
+<computeroutput>dest[0 .. *destLen-1]</computeroutput>.  If the
+destination buffer is big enough,
+<computeroutput>*destLen</computeroutput> is set to the size of
+the uncompressed data, and <computeroutput>BZ_OK</computeroutput>
+is returned.  If the compressed data won't fit,
+<computeroutput>*destLen</computeroutput> is unchanged, and
+<computeroutput>BZ_OUTBUFF_FULL</computeroutput> is
+returned.</para>
+
+<para><computeroutput>source</computeroutput> is assumed to hold
+a complete <computeroutput>bzip2</computeroutput> format data
+stream.
+<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> tries
+to decompress the entirety of the stream into the output
+buffer.</para>
+
+<para>For the meaning of parameters
+<computeroutput>small</computeroutput> and
+<computeroutput>verbosity</computeroutput>, see
+<computeroutput>BZ2_bzDecompressInit</computeroutput>.</para>
+
+<para>Because the compression ratio of the compressed data cannot
+be known in advance, there is no easy way to guarantee that the
+output buffer will be big enough.  You may of course make
+arrangements in your code to record the size of the uncompressed
+data, but such a mechanism is beyond the scope of this
+library.</para>
+
+<para><computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput>
+will not write data at or beyond
+<computeroutput>dest[*destLen]</computeroutput>, even in case of
+buffer overflow.</para>
+
+<para>Possible return values:</para>
+
+<programlisting>
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or small != 0 && small != 1
+  or verbosity < 0 or verbosity > 4
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed data
+BZ_DATA_ERROR_MAGIC
+  if the compressed data doesn't begin with the right magic bytes
+BZ_UNEXPECTED_EOF
+  if the compressed data ends unexpectedly
+BZ_OK
+  otherwise
+</programlisting>
+
+</sect2>
+
+</sect1>
+
+
+<sect1 id="zlib-compat" xreflabel="zlib compatibility functions">
+<title>zlib compatibility functions</title>
+
+<para>Yoshioka Tsuneo has contributed some functions to give
+better <computeroutput>zlib</computeroutput> compatibility.
+These functions are <computeroutput>BZ2_bzopen</computeroutput>,
+<computeroutput>BZ2_bzread</computeroutput>,
+<computeroutput>BZ2_bzwrite</computeroutput>,
+<computeroutput>BZ2_bzflush</computeroutput>,
+<computeroutput>BZ2_bzclose</computeroutput>,
+<computeroutput>BZ2_bzerror</computeroutput> and
+<computeroutput>BZ2_bzlibVersion</computeroutput>.  These
+functions are not (yet) officially part of the library.  If they
+break, you get to keep all the pieces.  Nevertheless, I think
+they work ok.</para>
+
+<programlisting>
+typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );
+</programlisting>
+
+<para>Returns a string indicating the library version.</para>
+
+<programlisting>
+BZFILE * BZ2_bzopen  ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int        fd,    const char *mode );
+</programlisting>
+
+<para>Opens a <computeroutput>.bz2</computeroutput> file for
+reading or writing, using either its name or a pre-existing file
+descriptor.  Analogous to <computeroutput>fopen</computeroutput>
+and <computeroutput>fdopen</computeroutput>.</para>
+
+<programlisting>
+int BZ2_bzread  ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
+</programlisting>
+
+<para>Reads/writes data from/to a previously opened
+<computeroutput>BZFILE</computeroutput>.  Analogous to
+<computeroutput>fread</computeroutput> and
+<computeroutput>fwrite</computeroutput>.</para>
+
+<programlisting>
+int  BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );
+</programlisting>
+
+<para>Flushes/closes a <computeroutput>BZFILE</computeroutput>.
+<computeroutput>BZ2_bzflush</computeroutput> doesn't actually do
+anything.  Analogous to <computeroutput>fflush</computeroutput>
+and <computeroutput>fclose</computeroutput>.</para>
+
+<programlisting>
+const char * BZ2_bzerror ( BZFILE *b, int *errnum )
+</programlisting>
+
+<para>Returns a string describing the more recent error status of
+<computeroutput>b</computeroutput>, and also sets
+<computeroutput>*errnum</computeroutput> to its numerical
+value.</para>
+
+</sect1>
+
+
+<sect1 id="stdio-free" 
+       xreflabel="Using the library in a stdio-free environment">
+<title>Using the library in a stdio-free environment</title>
+
+
+<sect2 id="stdio-bye" xreflabel="Getting rid of stdio">
+<title>Getting rid of stdio</title>
+
+<para>In a deeply embedded application, you might want to use
+just the memory-to-memory functions.  You can do this
+conveniently by compiling the library with preprocessor symbol
+<computeroutput>BZ_NO_STDIO</computeroutput> defined.  Doing this
+gives you a library containing only the following eight
+functions:</para>
+
+<para><computeroutput>BZ2_bzCompressInit</computeroutput>,
+<computeroutput>BZ2_bzCompress</computeroutput>,
+<computeroutput>BZ2_bzCompressEnd</computeroutput>
+<computeroutput>BZ2_bzDecompressInit</computeroutput>,
+<computeroutput>BZ2_bzDecompress</computeroutput>,
+<computeroutput>BZ2_bzDecompressEnd</computeroutput>
+<computeroutput>BZ2_bzBuffToBuffCompress</computeroutput>,
+<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput></para>
+
+<para>When compiled like this, all functions will ignore
+<computeroutput>verbosity</computeroutput> settings.</para>
+
+</sect2>
+
+
+<sect2 id="critical-error" xreflabel="Critical error handling">
+<title>Critical error handling</title>
+
+<para><computeroutput>libbzip2</computeroutput> contains a number
+of internal assertion checks which should, needless to say, never
+be activated.  Nevertheless, if an assertion should fail,
+behaviour depends on whether or not the library was compiled with
+<computeroutput>BZ_NO_STDIO</computeroutput> set.</para>
+
+<para>For a normal compile, an assertion failure yields the
+message:</para>
+
+<blockquote>
+<para>bzip2/libbzip2: internal error number N.</para>
+<para>This is a bug in bzip2/libbzip2, &bz-version; of &bz-date;.
+Please report it to me at: &bz-email;.  If this happened
+when you were using some program which uses libbzip2 as a
+component, you should also report this bug to the author(s)
+of that program.  Please make an effort to report this bug;
+timely and accurate bug reports eventually lead to higher
+quality software.  Thanks.  Julian Seward, &bz-date;.
+</para></blockquote>
+
+<para>where <computeroutput>N</computeroutput> is some error code
+number.  If <computeroutput>N == 1007</computeroutput>, it also
+prints some extra text advising the reader that unreliable memory
+is often associated with internal error 1007. (This is a
+frequently-observed-phenomenon with versions 1.0.0/1.0.1).</para>
+
+<para><computeroutput>exit(3)</computeroutput> is then
+called.</para>
+
+<para>For a <computeroutput>stdio</computeroutput>-free library,
+assertion failures result in a call to a function declared
+as:</para>
+
+<programlisting>
+extern void bz_internal_error ( int errcode );
+</programlisting>
+
+<para>The relevant code is passed as a parameter.  You should
+supply such a function.</para>
+
+<para>In either case, once an assertion failure has occurred, any
+<computeroutput>bz_stream</computeroutput> records involved can
+be regarded as invalid.  You should not attempt to resume normal
+operation with them.</para>
+
+<para>You may, of course, change critical error handling to suit
+your needs.  As I said above, critical errors indicate bugs in
+the library and should not occur.  All "normal" error situations
+are indicated via error return codes from functions, and can be
+recovered from.</para>
+
+</sect2>
+
+</sect1>
+
+
+<sect1 id="win-dll" xreflabel="Making a Windows DLL">
+<title>Making a Windows DLL</title>
+
+<para>Everything related to Windows has been contributed by
+Yoshioka Tsuneo
+(<computeroutput>tsuneo@rr.iij4u.or.jp</computeroutput>), so
+you should send your queries to him (but perhaps Cc: me,
+<computeroutput>&bz-email;</computeroutput>).</para>
+
+<para>My vague understanding of what to do is: using Visual C++
+5.0, open the project file
+<computeroutput>libbz2.dsp</computeroutput>, and build.  That's
+all.</para>
+
+<para>If you can't open the project file for some reason, make a
+new one, naming these files:
+<computeroutput>blocksort.c</computeroutput>,
+<computeroutput>bzlib.c</computeroutput>,
+<computeroutput>compress.c</computeroutput>,
+<computeroutput>crctable.c</computeroutput>,
+<computeroutput>decompress.c</computeroutput>,
+<computeroutput>huffman.c</computeroutput>,
+<computeroutput>randtable.c</computeroutput> and
+<computeroutput>libbz2.def</computeroutput>.  You will also need
+to name the header files <computeroutput>bzlib.h</computeroutput>
+and <computeroutput>bzlib_private.h</computeroutput>.</para>
+
+<para>If you don't use VC++, you may need to define the
+proprocessor symbol
+<computeroutput>_WIN32</computeroutput>.</para>
+
+<para>Finally, <computeroutput>dlltest.c</computeroutput> is a
+sample program using the DLL.  It has a project file,
+<computeroutput>dlltest.dsp</computeroutput>.</para>
+
+<para>If you just want a makefile for Visual C, have a look at
+<computeroutput>makefile.msc</computeroutput>.</para>
+
+<para>Be aware that if you compile
+<computeroutput>bzip2</computeroutput> itself on Win32, you must
+set <computeroutput>BZ_UNIX</computeroutput> to 0 and
+<computeroutput>BZ_LCCWIN32</computeroutput> to 1, in the file
+<computeroutput>bzip2.c</computeroutput>, before compiling.
+Otherwise the resulting binary won't work correctly.</para>
+
+<para>I haven't tried any of this stuff myself, but it all looks
+plausible.</para>
+
+</sect1>
+
+</chapter>
+
+
+
+<chapter id="misc" xreflabel="Miscellanea">
+<title>Miscellanea</title>
+
+<para>These are just some random thoughts of mine.  Your mileage
+may vary.</para>
+
+
+<sect1 id="limits" xreflabel="Limitations of the compressed file format">
+<title>Limitations of the compressed file format</title>
+
+<para><computeroutput>bzip2-1.0.X</computeroutput>,
+<computeroutput>0.9.5</computeroutput> and
+<computeroutput>0.9.0</computeroutput> use exactly the same file
+format as the original version,
+<computeroutput>bzip2-0.1</computeroutput>.  This decision was
+made in the interests of stability.  Creating yet another
+incompatible compressed file format would create further
+confusion and disruption for users.</para>
+
+<para>Nevertheless, this is not a painless decision.  Development
+work since the release of
+<computeroutput>bzip2-0.1</computeroutput> in August 1997 has
+shown complexities in the file format which slow down
+decompression and, in retrospect, are unnecessary.  These
+are:</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para>The run-length encoder, which is the first of the
+   compression transformations, is entirely irrelevant.  The
+   original purpose was to protect the sorting algorithm from the
+   very worst case input: a string of repeated symbols.  But
+   algorithm steps Q6a and Q6b in the original Burrows-Wheeler
+   technical report (SRC-124) show how repeats can be handled
+   without difficulty in block sorting.</para></listitem>
+
+ <listitem><para>The randomisation mechanism doesn't really need to be
+   there.  Udi Manber and Gene Myers published a suffix array
+   construction algorithm a few years back, which can be employed
+   to sort any block, no matter how repetitive, in O(N log N)
+   time.  Subsequent work by Kunihiko Sadakane has produced a
+   derivative O(N (log N)^2) algorithm which usually outperforms
+   the Manber-Myers algorithm.</para>
+
+   <para>I could have changed to Sadakane's algorithm, but I find
+   it to be slower than <computeroutput>bzip2</computeroutput>'s
+   existing algorithm for most inputs, and the randomisation
+   mechanism protects adequately against bad cases.  I didn't
+   think it was a good tradeoff to make.  Partly this is due to
+   the fact that I was not flooded with email complaints about
+   <computeroutput>bzip2-0.1</computeroutput>'s performance on
+   repetitive data, so perhaps it isn't a problem for real
+   inputs.</para>
+
+   <para>Probably the best long-term solution, and the one I have
+   incorporated into 0.9.5 and above, is to use the existing
+   sorting algorithm initially, and fall back to a O(N (log N)^2)
+   algorithm if the standard algorithm gets into
+   difficulties.</para></listitem>
+
+  <listitem><para>The compressed file format was never designed to be
+   handled by a library, and I have had to jump though some hoops
+   to produce an efficient implementation of decompression.  It's
+   a bit hairy.  Try passing
+   <computeroutput>decompress.c</computeroutput> through the C
+   preprocessor and you'll see what I mean.  Much of this
+   complexity could have been avoided if the compressed size of
+   each block of data was recorded in the data stream.</para></listitem>
+
+ <listitem><para>An Adler-32 checksum, rather than a CRC32 checksum,
+   would be faster to compute.</para></listitem>
+
+</itemizedlist>
+
+<para>It would be fair to say that the
+<computeroutput>bzip2</computeroutput> format was frozen before I
+properly and fully understood the performance consequences of
+doing so.</para>
+
+<para>Improvements which I was able to incorporate into 0.9.0,
+despite using the same file format, are:</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para>Single array implementation of the inverse BWT.  This
+  significantly speeds up decompression, presumably because it
+  reduces the number of cache misses.</para></listitem>
+
+ <listitem><para>Faster inverse MTF transform for large MTF values.
+  The new implementation is based on the notion of sliding blocks
+  of values.</para></listitem>
+
+ <listitem><para><computeroutput>bzip2-0.9.0</computeroutput> now reads
+  and writes files with <computeroutput>fread</computeroutput>
+  and <computeroutput>fwrite</computeroutput>; version 0.1 used
+  <computeroutput>putc</computeroutput> and
+  <computeroutput>getc</computeroutput>.  Duh!  Well, you live
+  and learn.</para></listitem>
+
+</itemizedlist>
+
+<para>Further ahead, it would be nice to be able to do random
+access into files.  This will require some careful design of
+compressed file formats.</para>
+
+</sect1>
+
+
+<sect1 id="port-issues" xreflabel="Portability issues">
+<title>Portability issues</title>
+
+<para>After some consideration, I have decided not to use GNU
+<computeroutput>autoconf</computeroutput> to configure 0.9.5 or
+1.0.</para>
+
+<para><computeroutput>autoconf</computeroutput>, admirable and
+wonderful though it is, mainly assists with portability problems
+between Unix-like platforms.  But
+<computeroutput>bzip2</computeroutput> doesn't have much in the
+way of portability problems on Unix; most of the difficulties
+appear when porting to the Mac, or to Microsoft's operating
+systems.  <computeroutput>autoconf</computeroutput> doesn't help
+in those cases, and brings in a whole load of new
+complexity.</para>
+
+<para>Most people should be able to compile the library and
+program under Unix straight out-of-the-box, so to speak,
+especially if you have a version of GNU C available.</para>
+
+<para>There are a couple of
+<computeroutput>__inline__</computeroutput> directives in the
+code.  GNU C (<computeroutput>gcc</computeroutput>) should be
+able to handle them.  If you're not using GNU C, your C compiler
+shouldn't see them at all.  If your compiler does, for some
+reason, see them and doesn't like them, just
+<computeroutput>#define</computeroutput>
+<computeroutput>__inline__</computeroutput> to be
+<computeroutput>/* */</computeroutput>.  One easy way to do this
+is to compile with the flag
+<computeroutput>-D__inline__=</computeroutput>, which should be
+understood by most Unix compilers.</para>
+
+<para>If you still have difficulties, try compiling with the
+macro <computeroutput>BZ_STRICT_ANSI</computeroutput> defined.
+This should enable you to build the library in a strictly ANSI
+compliant environment.  Building the program itself like this is
+dangerous and not supported, since you remove
+<computeroutput>bzip2</computeroutput>'s checks against
+compressing directories, symbolic links, devices, and other
+not-really-a-file entities.  This could cause filesystem
+corruption!</para>
+
+<para>One other thing: if you create a
+<computeroutput>bzip2</computeroutput> binary for public distribution,
+please consider linking it statically (<computeroutput>gcc
+-static</computeroutput>).  This avoids all sorts of library-version
+issues that others may encounter later on.</para>
+
+<para>If you build <computeroutput>bzip2</computeroutput> on
+Win32, you must set <computeroutput>BZ_UNIX</computeroutput> to 0
+and <computeroutput>BZ_LCCWIN32</computeroutput> to 1, in the
+file <computeroutput>bzip2.c</computeroutput>, before compiling.
+Otherwise the resulting binary won't work correctly.</para>
+
+</sect1>
+
+
+<sect1 id="bugs" xreflabel="Reporting bugs">
+<title>Reporting bugs</title>
+
+<para>I tried pretty hard to make sure
+<computeroutput>bzip2</computeroutput> is bug free, both by
+design and by testing.  Hopefully you'll never need to read this
+section for real.</para>
+
+<para>Nevertheless, if <computeroutput>bzip2</computeroutput> dies
+with a segmentation fault, a bus error or an internal assertion
+failure, it will ask you to email me a bug report.  Experience from
+years of feedback of bzip2 users indicates that almost all these
+problems can be traced to either compiler bugs or hardware
+problems.</para>
+
+<itemizedlist mark='bullet'>
+
+ <listitem><para>Recompile the program with no optimisation, and
+  see if it works.  And/or try a different compiler.  I heard all
+  sorts of stories about various flavours of GNU C (and other
+  compilers) generating bad code for
+  <computeroutput>bzip2</computeroutput>, and I've run across two
+  such examples myself.</para>
+
+  <para>2.7.X versions of GNU C are known to generate bad code
+  from time to time, at high optimisation levels.  If you get
+  problems, try using the flags
+  <computeroutput>-O2</computeroutput>
+  <computeroutput>-fomit-frame-pointer</computeroutput>
+  <computeroutput>-fno-strength-reduce</computeroutput>.  You
+  should specifically <emphasis>not</emphasis> use
+  <computeroutput>-funroll-loops</computeroutput>.</para>
+
+  <para>You may notice that the Makefile runs six tests as part
+  of the build process.  If the program passes all of these, it's
+  a pretty good (but not 100%) indication that the compiler has
+  done its job correctly.</para></listitem>
+
+ <listitem><para>If <computeroutput>bzip2</computeroutput>
+  crashes randomly, and the crashes are not repeatable, you may
+  have a flaky memory subsystem.
+  <computeroutput>bzip2</computeroutput> really hammers your
+  memory hierarchy, and if it's a bit marginal, you may get these
+  problems.  Ditto if your disk or I/O subsystem is slowly
+  failing.  Yup, this really does happen.</para>
+
+  <para>Try using a different machine of the same type, and see
+  if you can repeat the problem.</para></listitem>
+
+  <listitem><para>This isn't really a bug, but ... If
+  <computeroutput>bzip2</computeroutput> tells you your file is
+  corrupted on decompression, and you obtained the file via FTP,
+  there is a possibility that you forgot to tell FTP to do a
+  binary mode transfer.  That absolutely will cause the file to
+  be non-decompressible.  You'll have to transfer it
+  again.</para></listitem>
+
+</itemizedlist>
+
+<para>If you've incorporated
+<computeroutput>libbzip2</computeroutput> into your own program
+and are getting problems, please, please, please, check that the
+parameters you are passing in calls to the library, are correct,
+and in accordance with what the documentation says is allowable.
+I have tried to make the library robust against such problems,
+but I'm sure I haven't succeeded.</para>
+
+<para>Finally, if the above comments don't help, you'll have to
+send me a bug report.  Now, it's just amazing how many people
+will send me a bug report saying something like:</para>
+
+<programlisting>
+bzip2 crashed with segmentation fault on my machine
+</programlisting>
+
+<para>and absolutely nothing else.  Needless to say, a such a
+report is <emphasis>totally, utterly, completely and
+comprehensively 100% useless; a waste of your time, my time, and
+net bandwidth</emphasis>.  With no details at all, there's no way
+I can possibly begin to figure out what the problem is.</para>
+
+<para>The rules of the game are: facts, facts, facts.  Don't omit
+them because "oh, they won't be relevant".  At the bare
+minimum:</para>
+
+<programlisting>
+Machine type.  Operating system version.  
+Exact version of bzip2 (do bzip2 -V).  
+Exact version of the compiler used.  
+Flags passed to the compiler.
+</programlisting>
+
+<para>However, the most important single thing that will help me
+is the file that you were trying to compress or decompress at the
+time the problem happened.  Without that, my ability to do
+anything more than speculate about the cause, is limited.</para>
+
+</sect1>
+
+
+<sect1 id="package" xreflabel="Did you get the right package?">
+<title>Did you get the right package?</title>
+
+<para><computeroutput>bzip2</computeroutput> is a resource hog.
+It soaks up large amounts of CPU cycles and memory.  Also, it
+gives very large latencies.  In the worst case, you can feed many
+megabytes of uncompressed data into the library before getting
+any compressed output, so this probably rules out applications
+requiring interactive behaviour.</para>
+
+<para>These aren't faults of my implementation, I hope, but more
+an intrinsic property of the Burrows-Wheeler transform
+(unfortunately).  Maybe this isn't what you want.</para>
+
+<para>If you want a compressor and/or library which is faster,
+uses less memory but gets pretty good compression, and has
+minimal latency, consider Jean-loup Gailly's and Mark Adler's
+work, <computeroutput>zlib-1.2.1</computeroutput> and
+<computeroutput>gzip-1.2.4</computeroutput>.  Look for them at 
+<ulink url="http://www.zlib.org">http://www.zlib.org</ulink> and 
+<ulink url="http://www.gzip.org">http://www.gzip.org</ulink>
+respectively.</para>
+
+<para>For something faster and lighter still, you might try Markus F
+X J Oberhumer's <computeroutput>LZO</computeroutput> real-time
+compression/decompression library, at 
+<ulink url="http://www.oberhumer.com/opensource">http://www.oberhumer.com/opensource</ulink>.</para>
+
+</sect1>
+
+
+
+<sect1 id="reading" xreflabel="Further Reading">
+<title>Further Reading</title>
+
+<para><computeroutput>bzip2</computeroutput> is not research
+work, in the sense that it doesn't present any new ideas.
+Rather, it's an engineering exercise based on existing
+ideas.</para>
+
+<para>Four documents describe essentially all the ideas behind
+<computeroutput>bzip2</computeroutput>:</para>
+
+<literallayout>Michael Burrows and D. J. Wheeler:
+  "A block-sorting lossless data compression algorithm"
+   10th May 1994. 
+   Digital SRC Research Report 124.
+   ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz
+   If you have trouble finding it, try searching at the
+   New Zealand Digital Library, http://www.nzdl.org.
+
+Daniel S. Hirschberg and Debra A. LeLewer
+  "Efficient Decoding of Prefix Codes"
+   Communications of the ACM, April 1990, Vol 33, Number 4.
+   You might be able to get an electronic copy of this
+   from the ACM Digital Library.
+
+David J. Wheeler
+   Program bred3.c and accompanying document bred3.ps.
+   This contains the idea behind the multi-table Huffman coding scheme.
+   ftp://ftp.cl.cam.ac.uk/users/djw3/
+
+Jon L. Bentley and Robert Sedgewick
+  "Fast Algorithms for Sorting and Searching Strings"
+   Available from Sedgewick's web page,
+   www.cs.princeton.edu/~rs
+</literallayout>
+
+<para>The following paper gives valuable additional insights into
+the algorithm, but is not immediately the basis of any code used
+in bzip2.</para>
+
+<literallayout>Peter Fenwick:
+   Block Sorting Text Compression
+   Proceedings of the 19th Australasian Computer Science Conference,
+     Melbourne, Australia.  Jan 31 - Feb 2, 1996.
+   ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps</literallayout>
+
+<para>Kunihiko Sadakane's sorting algorithm, mentioned above, is
+available from:</para>
+
+<literallayout>http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz
+</literallayout>
+
+<para>The Manber-Myers suffix array construction algorithm is
+described in a paper available from:</para>
+
+<literallayout>http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps
+</literallayout>
+
+<para>Finally, the following papers document some
+investigations I made into the performance of sorting
+and decompression algorithms:</para>
+
+<literallayout>Julian Seward
+   On the Performance of BWT Sorting Algorithms
+   Proceedings of the IEEE Data Compression Conference 2000
+     Snowbird, Utah.  28-30 March 2000.
+
+Julian Seward
+   Space-time Tradeoffs in the Inverse B-W Transform
+   Proceedings of the IEEE Data Compression Conference 2001
+     Snowbird, Utah.  27-29 March 2001.
+</literallayout>
+
+</sect1>
+
+</chapter>
+
+</book>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/mk251.c
@@ -0,0 +1,31 @@
+
+/* Spew out a long sequence of the byte 251.  When fed to bzip2
+   versions 1.0.0 or 1.0.1, causes it to die with internal error
+   1007 in blocksort.c.  This assertion misses an extremely rare
+   case, which is fixed in this version (1.0.2) and above.
+*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include <stdio.h>
+
+int main ()
+{
+   int i;
+   for (i = 0; i < 48500000 ; i++)
+     putchar(251);
+   return 0;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/randtable.c
@@ -0,0 +1,84 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for randomising repetitive blocks               ---*/
+/*---                                           randtable.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------*/
+Int32 BZ2_rNums[512] = { 
+   619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 
+   985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 
+   733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 
+   419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 
+   878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 
+   862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 
+   150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 
+   170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 
+   73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 
+   909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 
+   641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 
+   161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 
+   382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 
+   98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 
+   227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 
+   469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 
+   184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 
+   715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 
+   951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 
+   652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 
+   645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 
+   609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 
+   653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 
+   411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 
+   170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 
+   857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 
+   669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 
+   944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 
+   344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 
+   897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 
+   433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 
+   686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 
+   946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 
+   978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 
+   680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 
+   707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 
+   297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 
+   134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 
+   343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 
+   140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 
+   170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 
+   369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 
+   804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 
+   896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 
+   661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 
+   768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 
+   61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 
+   372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 
+   780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 
+   920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 
+   645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 
+   936, 638
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                       randtable.c ---*/
+/*-------------------------------------------------------------*/
new file mode 100644
index 0000000000000000000000000000000000000000..18dea60043b692c86b095c06123809f10430fd03
GIT binary patch
literal 32348
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
T9V3)BU;ZxSig2MJnd56pDt(C>
new file mode 100644
index 0000000000000000000000000000000000000000..a56e52b77f90faf637e2c1e87ee60eaffa4c5056
GIT binary patch
literal 98696
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
VMdp|`O!Yt8wtVoLzL)r){|0Jp1y}$8
new file mode 100644
index 0000000000000000000000000000000000000000..d5a6160ba20903121617cb8bf4fbdb71ba1ca1e7
GIT binary patch
literal 73732
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
WNhw7tt~6mk@pmLsg$W0O<~~60QOKkK
new file mode 100644
index 0000000000000000000000000000000000000000..34af95839a02afd57bbd653d02e4ce5f0bfe2546
GIT binary patch
literal 212340
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
AZ2$lO
new file mode 100644
index 0000000000000000000000000000000000000000..d90cff9208fe3f15eebd888e978f639248752126
GIT binary patch
literal 235
zc$@+202Kd1T4*ydL0KkKS-Q<L$pAXG-+%xRKxHrh03ZYaKkwe)FaX-yLsJ5oC+eA|
zqfba}O$LIGO+z37qd+2%QRy_%iJ)lHN||ronbA~15oJ?6?R@Ur={T0(CqvG%t+n@0
zxIMvmp05bCVSBscm0kq>GUXb&m7Q)GuvY4W7DBi0bybO}v|xtYG6|~5=Sd|%uMPkN
zKoB6Yo`4Dni@uED{RR!AUXhJ4Aj_`^@cN^s$CJ95fR!nP>-4u_Z0JO2Gf1zI+FWf9
lNldh8X=%unLa<Wv8~_v%7Fbs9gq~l;+>uTcBrdZ|@<43xY-0cb
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/sample3.ref
@@ -0,0 +1,30007 @@
+This file is exceedingly boring.  If you find yourself
+reading it, please (1) take it from me that you can safely
+guess what the rest of the file says, and (2) seek professional
+help.
+
+ps.  there are no further sarcastic remarks in this file.
+
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/spewG.c
@@ -0,0 +1,54 @@
+
+/* spew out a thoroughly gigantic file designed so that bzip2
+   can compress it reasonably rapidly.  This is to help test
+   support for large files (> 2GB) in a reasonable amount of time.
+   I suggest you use the undocumented --exponential option to
+   bzip2 when compressing the resulting file; this saves a bit of
+   time.  Note: *don't* bother with --exponential when compressing 
+   Real Files; it'll just waste a lot of CPU time :-)
+   (but is otherwise harmless).
+*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+	 ------------------------------------------------------------------ */
+
+
+#define _FILE_OFFSET_BITS 64
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* The number of megabytes of junk to spew out (roughly) */
+#define MEGABYTES 5000
+
+#define N_BUF 1000000
+char buf[N_BUF];
+
+int main ( int argc, char** argv )
+{
+   int ii, kk, p;
+   srandom(1);
+   setbuffer ( stdout, buf, N_BUF );
+   for (kk = 0; kk < MEGABYTES * 515; kk+=3) {
+      p = 25+random()%50;
+      for (ii = 0; ii < p; ii++)
+         printf ( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" );
+      for (ii = 0; ii < p-1; ii++)
+         printf ( "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" );
+      for (ii = 0; ii < p+1; ii++)
+         printf ( "ccccccccccccccccccccccccccccccccccccc" );
+   }
+   fflush(stdout);
+   return 0;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/unzcrash.c
@@ -0,0 +1,141 @@
+
+/* A test program written to test robustness to decompression of
+   corrupted data.  Usage is 
+       unzcrash filename
+   and the program will read the specified file, compress it (in memory),
+   and then repeatedly decompress it, each time with a different bit of
+   the compressed data inverted, so as to test all possible one-bit errors.
+   This should not cause any invalid memory accesses.  If it does, 
+   I want to know about it!
+
+   PS.  As you can see from the above description, the process is
+   incredibly slow.  A file of size eg 5KB will cause it to run for
+   many hours.
+*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.6 of 6 September 2010
+   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include <stdio.h>
+#include <assert.h>
+#include "bzlib.h"
+
+#define M_BLOCK 1000000
+
+typedef unsigned char uchar;
+
+#define M_BLOCK_OUT (M_BLOCK + 1000000)
+uchar inbuf[M_BLOCK];
+uchar outbuf[M_BLOCK_OUT];
+uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)];
+
+int nIn, nOut, nZ;
+
+static char *bzerrorstrings[] = {
+       "OK"
+      ,"SEQUENCE_ERROR"
+      ,"PARAM_ERROR"
+      ,"MEM_ERROR"
+      ,"DATA_ERROR"
+      ,"DATA_ERROR_MAGIC"
+      ,"IO_ERROR"
+      ,"UNEXPECTED_EOF"
+      ,"OUTBUFF_FULL"
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+};
+
+void flip_bit ( int bit )
+{
+   int byteno = bit / 8;
+   int bitno  = bit % 8;
+   uchar mask = 1 << bitno;
+   //fprintf ( stderr, "(byte %d  bit %d  mask %d)",
+   //          byteno, bitno, (int)mask );
+   zbuf[byteno] ^= mask;
+}
+
+int main ( int argc, char** argv )
+{
+   FILE* f;
+   int   r;
+   int   bit;
+   int   i;
+
+   if (argc != 2) {
+      fprintf ( stderr, "usage: unzcrash filename\n" );
+      return 1;
+   }
+
+   f = fopen ( argv[1], "r" );
+   if (!f) {
+      fprintf ( stderr, "unzcrash: can't open %s\n", argv[1] );
+      return 1;
+   }
+
+   nIn = fread ( inbuf, 1, M_BLOCK, f );
+   fprintf ( stderr, "%d bytes read\n", nIn );
+
+   nZ = M_BLOCK;
+   r = BZ2_bzBuffToBuffCompress (
+         zbuf, &nZ, inbuf, nIn, 9, 0, 30 );
+
+   assert (r == BZ_OK);
+   fprintf ( stderr, "%d after compression\n", nZ );
+
+   for (bit = 0; bit < nZ*8; bit++) {
+      fprintf ( stderr, "bit %d  ", bit );
+      flip_bit ( bit );
+      nOut = M_BLOCK_OUT;
+      r = BZ2_bzBuffToBuffDecompress (
+            outbuf, &nOut, zbuf, nZ, 0, 0 );
+      fprintf ( stderr, " %d  %s ", r, bzerrorstrings[-r] );
+
+      if (r != BZ_OK) {
+         fprintf ( stderr, "\n" );
+      } else {
+         if (nOut != nIn) {
+           fprintf(stderr, "nIn/nOut mismatch %d %d\n", nIn, nOut );
+           return 1;
+         } else {
+           for (i = 0; i < nOut; i++)
+             if (inbuf[i] != outbuf[i]) { 
+                fprintf(stderr, "mismatch at %d\n", i ); 
+                return 1; 
+           }
+           if (i == nOut) fprintf(stderr, "really ok!\n" );
+         }
+      }
+
+      flip_bit ( bit );
+   }
+
+#if 0
+   assert (nOut == nIn);
+   for (i = 0; i < nOut; i++) {
+     if (inbuf[i] != outbuf[i]) {
+        fprintf ( stderr, "difference at %d !\n", i );
+        return 1;
+     }
+   }
+#endif
+
+   fprintf ( stderr, "all ok\n" );
+   return 0;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/words0
@@ -0,0 +1,9 @@
+
+If compilation produces errors, or a large number of warnings,
+please read README.COMPILATION.PROBLEMS -- you might be able to
+adjust the flags in this Makefile to improve matters.
+
+Also in README.COMPILATION.PROBLEMS are some hints that may help
+if your build produces an executable which is unable to correctly
+handle so-called 'large files' -- files of size 2GB or more.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/words1
@@ -0,0 +1,4 @@
+
+Doing 6 tests (3 compress, 3 uncompress) ...
+If there's a problem, things might stop at this point.
+ 
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/words2
@@ -0,0 +1,5 @@
+
+Checking test results.  If any of the four "cmp"s which follow
+report any differences, something is wrong.  If you can't easily
+figure out what, please let me know (jseward@bzip.org).
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/words3
@@ -0,0 +1,30 @@
+
+If you got this far and the 'cmp's didn't complain, it looks
+like you're in business.  
+
+To install in /usr/local/bin, /usr/local/lib, /usr/local/man and 
+/usr/local/include, type
+
+   make install
+
+To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type 
+
+   make install PREFIX=/xxx/yyy
+
+If you are (justifiably) paranoid and want to see what 'make install'
+is going to do, you can first do
+
+   make -n install                      or
+   make -n install PREFIX=/xxx/yyy      respectively.
+
+The -n instructs make to show the commands it would execute, but
+not actually execute them.
+
+Instructions for use are in the preformatted manual page, in the file
+bzip2.txt.  For more detailed documentation, read the full manual.  
+It is available in Postscript form (manual.ps), PDF form (manual.pdf),
+and HTML form (manual.html).
+
+You can also do "bzip2 --help" to see some helpful information. 
+"bzip2 -L" displays the software license.
+
new file mode 100755
--- /dev/null
+++ b/third_party/rust/bzip2-sys/bzip2-1.0.6/xmlproc.sh
@@ -0,0 +1,114 @@
+#!/bin/bash
+# see the README file for usage etc.
+#
+# ------------------------------------------------------------------
+#  This file is part of bzip2/libbzip2, a program and library for
+#  lossless, block-sorting data compression.
+#
+#  bzip2/libbzip2 version 1.0.6 of 6 September 2010
+#  Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
+#
+#  Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+#  README file.
+#
+#  This program is released under the terms of the license contained
+#  in the file LICENSE.
+# ----------------------------------------------------------------
+
+
+usage() {
+  echo '';
+  echo 'Usage: xmlproc.sh -[option] <filename.xml>';
+  echo 'Specify a target from:';
+  echo '-v      verify xml file conforms to dtd';
+  echo '-html   output in html format (single file)';
+  echo '-ps     output in postscript format';
+  echo '-pdf    output in pdf format';
+  exit;
+}
+
+if test $# -ne 2; then
+  usage
+fi
+# assign the variable for the output type
+action=$1; shift
+# assign the output filename
+xmlfile=$1; shift
+# and check user input it correct
+if !(test -f $xmlfile); then
+  echo "No such file: $xmlfile";
+  exit;
+fi
+# some other stuff we will use
+OUT=output
+xsl_fo=bz-fo.xsl
+xsl_html=bz-html.xsl
+
+basename=$xmlfile
+basename=${basename//'.xml'/''}
+
+fofile="${basename}.fo"
+htmlfile="${basename}.html"
+pdffile="${basename}.pdf"
+psfile="${basename}.ps"
+xmlfmtfile="${basename}.fmt"
+
+# first process the xmlfile with CDATA tags
+./format.pl $xmlfile $xmlfmtfile
+# so the shell knows where the catalogs live
+export XML_CATALOG_FILES=/etc/xml/catalog
+
+# post-processing tidy up
+cleanup() {
+  echo "Cleaning up: $@" 
+  while [ $# != 0 ]
+  do
+    arg=$1; shift;
+    echo "  deleting $arg";
+    rm $arg
+  done
+}
+
+case $action in
+  -v)
+   flags='--noout --xinclude --noblanks --postvalid'
+   dtd='--dtdvalid http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd'
+   xmllint $flags $dtd $xmlfmtfile 2> $OUT 
+   egrep 'error' $OUT 
+   rm $OUT
+  ;;
+
+  -html)
+   echo "Creating $htmlfile ..."
+   xsltproc --nonet --xinclude  -o $htmlfile $xsl_html $xmlfmtfile
+   cleanup $xmlfmtfile
+  ;;
+
+  -pdf)
+   echo "Creating $pdffile ..."
+   xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile
+   pdfxmltex $fofile >$OUT </dev/null
+   pdfxmltex $fofile >$OUT </dev/null
+   pdfxmltex $fofile >$OUT </dev/null
+   cleanup $OUT $xmlfmtfile *.aux *.fo *.log *.out
+  ;;
+
+  -ps)
+   echo "Creating $psfile ..."
+   xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile
+   pdfxmltex $fofile >$OUT </dev/null
+   pdfxmltex $fofile >$OUT </dev/null
+   pdfxmltex $fofile >$OUT </dev/null
+   pdftops $pdffile $psfile
+   cleanup $OUT $xmlfmtfile $pdffile *.aux *.fo *.log *.out
+#  passivetex is broken, so we can't go this route yet.
+#   xmltex $fofile >$OUT </dev/null
+#   xmltex $fofile >$OUT </dev/null
+#   xmltex $fofile >$OUT </dev/null
+#   dvips -R -q -o bzip-manual.ps *.dvi
+  ;;
+
+  *)
+  usage
+  ;;
+esac
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2-sys/lib.rs
@@ -0,0 +1,75 @@
+#![doc(html_root_url = "https://docs.rs/bzip2-sys/0.1")]
+
+extern crate libc;
+
+use libc::{c_int, c_uint, c_void, c_char};
+
+pub const BZ_RUN: c_int = 0;
+pub const BZ_FLUSH: c_int = 1;
+pub const BZ_FINISH: c_int = 2;
+
+pub const BZ_OK: c_int = 0;
+pub const BZ_RUN_OK: c_int = 1;
+pub const BZ_FLUSH_OK: c_int = 2;
+pub const BZ_FINISH_OK: c_int = 3;
+pub const BZ_STREAM_END: c_int = 4;
+pub const BZ_SEQUENCE_ERROR: c_int = -1;
+pub const BZ_PARAM_ERROR: c_int = -2;
+pub const BZ_MEM_ERROR: c_int = -3;
+pub const BZ_DATA_ERROR: c_int = -4;
+pub const BZ_DATA_ERROR_MAGIC: c_int = -5;
+pub const BZ_IO_ERROR: c_int = -6;
+pub const BZ_UNEXPECTED_EOF: c_int = -7;
+pub const BZ_OUTBUFF_FULL: c_int = -8;
+pub const BZ_CONFIG_ERROR: c_int = -9;
+
+#[repr(C)]
+pub struct bz_stream {
+    pub next_in: *mut c_char,
+    pub avail_in: c_uint,
+    pub total_in_lo32: c_uint,
+    pub total_in_hi32: c_uint,
+
+    pub next_out: *mut c_char,
+    pub avail_out: c_uint,
+    pub total_out_lo32: c_uint,
+    pub total_out_hi32: c_uint,
+
+    pub state: *mut c_void,
+
+    pub bzalloc: Option<extern fn(*mut c_void, c_int, c_int) -> *mut c_void>,
+    pub bzfree: Option<extern fn(*mut c_void, *mut c_void)>,
+    pub opaque: *mut c_void,
+}
+
+macro_rules! abi_compat {
+    ($(pub fn $name:ident($($arg:ident: $t:ty),*) -> $ret:ty,)*) => {
+        #[cfg(windows)]
+        extern "system" {
+            $(pub fn $name($($arg: $t),*) -> $ret;)*
+        }
+        #[cfg(unix)]
+        extern {
+            $(pub fn $name($($arg: $t),*) -> $ret;)*
+        }
+    }
+}
+
+abi_compat! {
+    pub fn BZ2_bzCompressInit(stream: *mut bz_stream,
+                              blockSize100k: c_int,
+                              verbosity: c_int,
+                              workFactor: c_int) -> c_int,
+    pub fn BZ2_bzCompress(stream: *mut bz_stream, action: c_int) -> c_int,
+    pub fn BZ2_bzCompressEnd(stream: *mut bz_stream) -> c_int,
+    pub fn BZ2_bzDecompressInit(stream: *mut bz_stream,
+                                verbosity: c_int,
+                                small: c_int) -> c_int,
+    pub fn BZ2_bzDecompress(stream: *mut bz_stream) -> c_int,
+    pub fn BZ2_bzDecompressEnd(stream: *mut bz_stream) -> c_int,
+}
+
+#[no_mangle]
+pub fn bz_internal_error(errcode: c_int) {
+    panic!("bz internal error: {}", errcode);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"364c4f937827f2198a09375da4e600e9125226aa48a8d638ae6e60ac81a4138d","Cargo.toml":"03be4e0cd554c624cc0440aa16c76de36cf70504031ec72774579aa4a4f66820","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"6fc30c321b044d0df0881d88f6692d5a033ebc2c85a9854013b268e0d41bf736","appveyor.yml":"a39fd7664bf538147bfb494b9f9c96d6f898d9896a5d5e1806019f399cc44bff","src/bufread.rs":"2d4dc93a26131cd483ecdfa862f559c187ea3afc6252bf7ab120b69f5aa58a96","src/lib.rs":"e37f771f5036116b3fd5911f9195b769c481f002b81a6c6c7588e07227bc7c0d","src/mem.rs":"e01c78d4ccc8fa62e62b807d18d68b359826f341e18b22347be8ae37b787ca18","src/read.rs":"c7cd2002c4b5210f67febb01e70dd5333f155a2786d2dc7e0bb8c2b6603e7ba2","src/write.rs":"b1bdedf64fe1a011468d882f45b6ee83d1e52a4d9b2c4898284f8aa09cf1b1d7","tests/tokio.rs":"b148e0909a10636ead355bf8cd1a5b9cdd9b1ad5f0ab4fbf5c20c49c03cd0975"},"package":"c3eafc42c44e0d827de6b1c131175098fe7fb53b8ce8a47e65cb3ea94688be24"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/.travis.yml
@@ -0,0 +1,24 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+before_script:
+  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
+script:
+  - export CARGO_TARGET_DIR=`pwd`/target
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo test --verbose --features tokio
+  - rustdoc --test README.md -L target/debug -L target/debug/deps
+  - cargo doc --no-deps
+  - cargo doc --no-deps --manifest-path=bzip2-sys/Cargo.toml
+after_success:
+  - travis-cargo --only nightly doc-upload
+notifications:
+  email:
+    on_success: never
+env:
+  global:
+    secure: "PXNga5meeArqD5RcInRiqDIHCsVqYlBtx6NSAQfCcKgo8z3qE5A2ig3txIS0rWNWbv+j2nlmOes6mljLx3Bx9O99hXIM5d2/UKHrzCWm8vJYmK6cw51r58MmZh4TMNo+p5aBN2aclluv5W1pueC1ndQ3QPGcVE4JgboUQNPIveU="
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/Cargo.toml
@@ -0,0 +1,32 @@
+[package]
+
+name = "bzip2"
+version = "0.3.2"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+license = "MIT/Apache-2.0"
+readme = "README.md"
+keywords = ["bzip", "encoding"]
+repository = "https://github.com/alexcrichton/bzip2-rs"
+homepage = "https://github.com/alexcrichton/bzip2-rs"
+documentation = "http://alexcrichton.com/bzip2-rs"
+description = """
+Bindings to libbzip2 for bzip2 compression and decompression exposed as
+Reader/Writer streams.
+"""
+categories = ["compression", "api-bindings"]
+
+[workspace]
+
+[dependencies]
+libc = "0.2"
+bzip2-sys = { version = "0.1", path = "bzip2-sys" }
+tokio-io = { version = "0.1", optional = true }
+futures = { version = "0.1", optional = true }
+
+[dev-dependencies]
+rand = "0.3"
+quickcheck = "0.2"
+tokio-core = "0.1"
+
+[features]
+tokio = ["tokio-io", "futures"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/README.md
@@ -0,0 +1,22 @@
+# bzip2
+
+[![Build Status](https://travis-ci.org/alexcrichton/bzip2-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/bzip2-rs)
+[![Build status](https://ci.appveyor.com/api/projects/status/joowqvvwfhxgdw5x?svg=true)](https://ci.appveyor.com/project/alexcrichton/bzip2-rs)
+
+[Documentation](https://docs.rs/bzip2)
+
+A streaming compression/decompression library for rust with bindings to libbz2.
+
+```toml
+# Cargo.toml
+[dependencies]
+bzip2 = "0.2"
+```
+
+# License
+
+`bzip2-rs` is primarily distributed under the terms of both the MIT license and
+the Apache License (Version 2.0), with portions covered by various BSD-like
+licenses.
+
+See LICENSE-APACHE, and LICENSE-MIT for details.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/appveyor.yml
@@ -0,0 +1,18 @@
+environment:
+  matrix:
+  - TARGET: x86_64-pc-windows-msvc
+  - TARGET: i686-pc-windows-msvc
+  - TARGET: i686-pc-windows-gnu
+install:
+  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
+  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
+  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
+  - SET PATH=%PATH%;C:\MinGW\bin
+  - rustc -V
+  - cargo -V
+
+build: false
+
+test_script:
+  - cargo test --verbose --target %TARGET%
+  - cargo test --verbose --target %TARGET% --features tokio
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/src/bufread.rs
@@ -0,0 +1,238 @@
+//! I/O streams for wrapping `BufRead` types as encoders/decoders
+
+use std::io::prelude::*;
+use std::io;
+
+#[cfg(feature = "tokio")]
+use futures::Poll;
+#[cfg(feature = "tokio")]
+use tokio_io::{AsyncRead, AsyncWrite};
+
+use {Compress, Decompress, Compression, Action, Status};
+
+/// A bz2 encoder, or compressor.
+///
+/// This structure implements a `BufRead` interface and will read uncompressed
+/// data from an underlying stream and emit a stream of compressed data.
+pub struct BzEncoder<R> {
+    obj: R,
+    data: Compress,
+    done: bool,
+}
+
+/// A bz2 decoder, or decompressor.
+///
+/// This structure implements a `BufRead` interface and takes a stream of
+/// compressed data as input, providing the decompressed data when read from.
+pub struct BzDecoder<R> {
+    obj: R,
+    data: Decompress,
+    done: bool,
+}
+
+impl<R: BufRead> BzEncoder<R> {
+    /// Creates a new encoder which will read uncompressed data from the given
+    /// stream and emit the compressed stream.
+    pub fn new(r: R, level: Compression) -> BzEncoder<R> {
+        BzEncoder {
+            obj: r,
+            data: Compress::new(level, 30),
+            done: false,
+        }
+    }
+}
+
+impl<R> BzEncoder<R> {
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        &self.obj
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.obj
+    }
+
+    /// Consumes this encoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.obj
+    }
+
+    /// Returns the number of bytes produced by the compressor
+    /// (e.g. the number of bytes read from this stream)
+    ///
+    /// Note that, due to buffering, this only bears any relation to
+    /// total_in() when the compressor chooses to flush its data
+    /// (unfortunately, this won't happen in general
+    /// at the end of the stream, because the compressor doesn't know
+    /// if there's more data to come).  At that point,
+    /// `total_out() / total_in()` would be the compression ratio.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+
+    /// Returns the number of bytes consumed by the compressor
+    /// (e.g. the number of bytes read from the underlying stream)
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+}
+
+impl<R: BufRead> Read for BzEncoder<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        if self.done {
+            return Ok(0)
+        }
+        loop {
+            let (read, consumed, eof, ret);
+            {
+                let input = try!(self.obj.fill_buf());
+                eof = input.is_empty();
+                let before_out = self.data.total_out();
+                let before_in = self.data.total_in();
+                let action = if eof {Action::Finish} else {Action::Run};
+                ret = self.data.compress(input, buf, action);
+                read = (self.data.total_out() - before_out) as usize;
+                consumed = (self.data.total_in() - before_in) as usize;
+            }
+            self.obj.consume(consumed);
+
+            // we should never get the sequence error that's possible to be
+            // returned from compression
+            let ret = ret.unwrap();
+
+            // If we haven't ready any data and we haven't hit EOF yet, then we
+            // need to keep asking for more data because if we return that 0
+            // bytes of data have been read then it will be interpreted as EOF.
+            if read == 0 && !eof && buf.len() > 0 {
+                continue
+            }
+            if ret == Status::StreamEnd {
+                self.done = true;
+            }
+            return Ok(read)
+        }
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + BufRead> AsyncRead for BzEncoder<R> {
+}
+
+impl<W: Write> Write for BzEncoder<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite> AsyncWrite for BzEncoder<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: BufRead> BzDecoder<R> {
+    /// Creates a new decoder which will decompress data read from the given
+    /// stream.
+    pub fn new(r: R) -> BzDecoder<R> {
+        BzDecoder {
+            obj: r,
+            data: Decompress::new(false),
+            done: false,
+        }
+    }
+}
+
+impl<R> BzDecoder<R> {
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        &self.obj
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.obj
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.obj
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed.
+    ///
+    /// Note that this will likely be smaller than what the decompressor
+    /// actually read from the underlying stream due to buffering.
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has produced.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+}
+
+impl<R: BufRead> Read for BzDecoder<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        if self.done {
+            return Ok(0)
+        }
+        loop {
+            let (read, consumed, eof, ret);
+            {
+                let input = try!(self.obj.fill_buf());
+                eof = input.is_empty();
+                let before_out = self.data.total_out();
+                let before_in = self.data.total_in();
+                ret = self.data.decompress(input, buf);
+                read = (self.data.total_out() - before_out) as usize;
+                consumed = (self.data.total_in() - before_in) as usize;
+            }
+            self.obj.consume(consumed);
+
+            let ret = try!(ret.map_err(|e| {
+                io::Error::new(io::ErrorKind::InvalidInput, e)
+            }));
+            if ret == Status::StreamEnd {
+                self.done = true;
+                return Ok(read)
+            }
+            if read > 0 || eof || buf.len() == 0 {
+                return Ok(read)
+            }
+        }
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + BufRead> AsyncRead for BzDecoder<R> {
+}
+
+impl<W: Write> Write for BzDecoder<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite> AsyncWrite for BzDecoder<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/src/lib.rs
@@ -0,0 +1,84 @@
+//! Bzip compression for Rust
+//!
+//! This library contains bindings to libbz2 to support bzip compression and
+//! decompression for Rust. The streams offered in this library are primarily
+//! found in the `reader` and `writer` modules. Both compressors and
+//! decompressors are available in each module depending on what operation you
+//! need.
+//!
+//! Access to the raw decompression/compression stream is also provided through
+//! the `raw` module which has a much closer interface to libbz2.
+//!
+//! # Example
+//!
+//! ```
+//! use std::io::prelude::*;
+//! use bzip2::Compression;
+//! use bzip2::read::{BzEncoder, BzDecoder};
+//!
+//! // Round trip some bytes from a byte source, into a compressor, into a
+//! // decompressor, and finally into a vector.
+//! let data = "Hello, World!".as_bytes();
+//! let compressor = BzEncoder::new(data, Compression::Best);
+//! let mut decompressor = BzDecoder::new(compressor);
+//!
+//! let mut contents = String::new();
+//! decompressor.read_to_string(&mut contents).unwrap();
+//! assert_eq!(contents, "Hello, World!");
+//! ```
+//!
+//! # Async I/O
+//!
+//! This crate optionally can support async I/O streams with the Tokio stack via
+//! the `tokio` feature of this crate:
+//!
+//! ```toml
+//! bzip2 = { version = "0.3", features = ["tokio"] }
+//! ```
+//!
+//! All methods are internally capable of working with streams that may return
+//! `ErrorKind::WouldBlock` when they're not ready to perform the particular
+//! operation.
+//!
+//! Note that care needs to be taken when using these objects, however. The
+//! Tokio runtime, in particular, requires that data is fully flushed before
+//! dropping streams. For compatibility with blocking streams all streams are
+//! flushed/written when they are dropped, and this is not always a suitable
+//! time to perform I/O. If I/O streams are flushed before drop, however, then
+//! these operations will be a noop.
+
+#![deny(missing_docs, warnings)]
+#![doc(html_root_url = "https://docs.rs/bzip2/0.3")]
+
+extern crate bzip2_sys as ffi;
+extern crate libc;
+#[cfg(test)]
+extern crate rand;
+#[cfg(test)]
+extern crate quickcheck;
+#[cfg(feature = "tokio")]
+#[macro_use]
+extern crate tokio_io;
+#[cfg(feature = "tokio")]
+extern crate futures;
+
+pub use mem::{Compress, Decompress, Action, Status, Error};
+
+mod mem;
+
+pub mod bufread;
+pub mod read;
+pub mod write;
+
+/// When compressing data, the compression level can be specified by a value in
+/// this enum.
+#[derive(Copy, Clone, Debug)]
+pub enum Compression {
+    /// Optimize for the best speed of encoding.
+    Fastest = 1,
+    /// Optimize for the size of data being encoded.
+    Best = 9,
+    /// Choose the default compression, a balance between speed and size.
+    Default = 6,
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/src/mem.rs
@@ -0,0 +1,305 @@
+//! Raw low-level manipulations of bz streams.
+
+use std::error;
+use std::fmt;
+use std::marker;
+use std::mem;
+use std::slice;
+
+use libc::{c_int, c_uint};
+
+use {ffi, Compression};
+
+/// Representation of an in-memory compression stream.
+///
+/// An instance of `Compress` can be used to compress a stream of bz2 data.
+pub struct Compress {
+    inner: Stream<DirCompress>,
+}
+
+/// Representation of an in-memory decompression stream.
+///
+/// An instance of `Decompress` can be used to inflate a straem of bz2-encoded
+/// data.
+pub struct Decompress {
+    inner: Stream<DirDecompress>,
+}
+
+struct Stream<D: Direction> {
+    // libbz2 requires a stable address for this stream.
+    raw: Box<ffi::bz_stream>,
+    _marker: marker::PhantomData<D>,
+}
+
+unsafe impl<D: Direction> Send for Stream<D> {}
+unsafe impl<D: Direction> Sync for Stream<D> {}
+
+trait Direction {
+    unsafe fn destroy(stream: *mut ffi::bz_stream) -> c_int;
+}
+
+enum DirCompress {}
+enum DirDecompress {}
+
+/// Possible actions to take on compression.
+#[derive(PartialEq, Eq, Copy, Debug, Clone)]
+pub enum Action {
+    /// Normal compression.
+    Run = ffi::BZ_RUN as isize,
+    /// Request that the current compression block is terminate.
+    Flush = ffi::BZ_FLUSH as isize,
+    /// Request that the compression stream be finalized.
+    Finish = ffi::BZ_FINISH as isize,
+}
+
+/// Result of compression or decompression
+#[derive(PartialEq, Eq, Copy, Debug, Clone)]
+pub enum Status {
+    /// Decompression went fine, nothing much to report.
+    Ok,
+
+    /// The Flush action on a compression went ok.
+    FlushOk,
+
+    /// THe Run action on compression went ok.
+    RunOk,
+
+    /// The Finish action on compression went ok.
+    FinishOk,
+
+    /// The stream's end has been met, meaning that no more data can be input.
+    StreamEnd,
+
+    /// There was insufficient memory in the input or output buffer to complete
+    /// the request, but otherwise everything went normally.
+    MemNeeded,
+}
+
+/// Fatal errors encountered when compressing/decompressing bytes.
+///
+/// These errors indicate that progress could not be made in any form due to
+/// input or output parameters.
+#[derive(PartialEq, Eq, Copy, Debug, Clone)]
+pub enum Error {
+    /// The sequence of operations called on a decompression/compression stream
+    /// were invalid. See methods for details.
+    Sequence,
+
+    /// The data being decompressed was invalid, or it was not a valid bz2
+    /// stream.
+    Data,
+
+    /// The magic bz2 header wasn't present when decompressing.
+    DataMagic,
+
+    /// The parameters to this function were invalid.
+    Param,
+}
+
+impl Compress {
+    /// Creates a new stream prepared for compression.
+    ///
+    /// The `work_factor` parameter controls how the compression phase behaves
+    /// when presented with worst case, highly repetitive, input data. If
+    /// compression runs into difficulties caused by repetitive data, the
+    /// library switches from the standard sorting algorithm to a fallback
+    /// algorithm. The fallback is slower than the standard algorithm by perhaps
+    /// a factor of three, but always behaves reasonably, no matter how bad the
+    /// input.
+    ///
+    /// Lower values of `work_factor` reduce the amount of effort the standard
+    /// algorithm will expend before resorting to the fallback. You should set
+    /// this parameter carefully; too low, and many inputs will be handled by
+    /// the fallback algorithm and so compress rather slowly, too high, and your
+    /// average-to-worst case compression times can become very large. The
+    /// default value of 30 gives reasonable behaviour over a wide range of
+    /// circumstances.
+    ///
+    /// Allowable values range from 0 to 250 inclusive. 0 is a special case,
+    /// equivalent to using the default value of 30.
+    pub fn new(lvl: Compression, work_factor: u32) -> Compress {
+        unsafe {
+            let mut raw = Box::new(mem::zeroed());
+            assert_eq!(ffi::BZ2_bzCompressInit(&mut *raw, lvl as c_int, 0,
+                                               work_factor as c_int), 0);
+            Compress {
+                inner: Stream { raw: raw, _marker: marker::PhantomData },
+            }
+        }
+    }
+
+    /// Compress a block of input into a block of output.
+    ///
+    /// If anything other than BZ_OK is seen, `Err` is returned. The action
+    /// given must be one of Run, Flush or Finish.
+    pub fn compress(&mut self, input: &[u8], output: &mut [u8],
+                    action: Action) -> Result<Status, Error> {
+        // apparently 0-length compression requests which don't actually make
+        // any progress are returned as BZ_PARAM_ERROR, which we don't want, to
+        // just translate to a success here.
+        if input.len() == 0 && action == Action::Run {
+            return Ok(Status::RunOk)
+        }
+        self.inner.raw.next_in = input.as_ptr() as *mut _;
+        self.inner.raw.avail_in = input.len() as c_uint;
+        self.inner.raw.next_out = output.as_mut_ptr() as *mut _;
+        self.inner.raw.avail_out = output.len() as c_uint;
+        unsafe {
+            match ffi::BZ2_bzCompress(&mut *self.inner.raw, action as c_int) {
+                ffi::BZ_RUN_OK => Ok(Status::RunOk),
+                ffi::BZ_FLUSH_OK => Ok(Status::FlushOk),
+                ffi::BZ_FINISH_OK => Ok(Status::FinishOk),
+                ffi::BZ_STREAM_END => Ok(Status::StreamEnd),
+                ffi::BZ_SEQUENCE_ERROR => Err(Error::Sequence),
+                c => panic!("unknown return status: {}", c),
+            }
+        }
+    }
+
+    /// Compress a block of input into an output vector.
+    ///
+    /// This function will not grow `output`, but it will fill the space after
+    /// its current length up to its capacity. The length of the vector will be
+    /// adjusted appropriately.
+    pub fn compress_vec(&mut self,
+                        input: &[u8],
+                        output: &mut Vec<u8>,
+                        action: Action) -> Result<Status, Error> {
+        let cap = output.capacity();
+        let len = output.len();
+
+        unsafe {
+            let before = self.total_out();
+            let ret = {
+                let ptr = output.as_mut_ptr().offset(len as isize);
+                let out = slice::from_raw_parts_mut(ptr, cap - len);
+                self.compress(input, out, action)
+            };
+            output.set_len((self.total_out() - before) as usize + len);
+            return ret
+        }
+    }
+
+    /// Total number of bytes processed as input
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in()
+    }
+
+    /// Total number of bytes processed as output
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out()
+    }
+}
+
+impl Decompress {
+    /// Creates a new stream prepared for decompression.
+    ///
+    /// If `small` is true, then the library will use an alternative
+    /// decompression algorithm which uses less memory but at the cost of
+    /// decompressing more slowly (roughly speaking, half the speed, but the
+    /// maximum memory requirement drops to around 2300k). See
+    pub fn new(small: bool) -> Decompress {
+        unsafe {
+            let mut raw = Box::new(mem::zeroed());
+            assert_eq!(ffi::BZ2_bzDecompressInit(&mut *raw, 0, small as c_int), 0);
+            Decompress {
+                inner: Stream { raw: raw, _marker: marker::PhantomData },
+            }
+        }
+    }
+
+    /// Decompress a block of input into a block of output.
+    pub fn decompress(&mut self, input: &[u8], output: &mut [u8])
+                      -> Result<Status, Error> {
+        self.inner.raw.next_in = input.as_ptr() as *mut _;
+        self.inner.raw.avail_in = input.len() as c_uint;
+        self.inner.raw.next_out = output.as_mut_ptr() as *mut _;
+        self.inner.raw.avail_out = output.len() as c_uint;
+        unsafe {
+            match ffi::BZ2_bzDecompress(&mut *self.inner.raw) {
+                ffi::BZ_OK => Ok(Status::Ok),
+                ffi::BZ_MEM_ERROR => Ok(Status::MemNeeded),
+                ffi::BZ_STREAM_END => Ok(Status::StreamEnd),
+                ffi::BZ_PARAM_ERROR => Err(Error::Param),
+                ffi::BZ_DATA_ERROR => Err(Error::Data),
+                ffi::BZ_DATA_ERROR_MAGIC => Err(Error::DataMagic),
+                ffi::BZ_SEQUENCE_ERROR => Err(Error::Sequence),
+                c => panic!("wut: {}", c),
+            }
+        }
+    }
+
+    /// Decompress a block of input into an output vector.
+    ///
+    /// This function will not grow `output`, but it will fill the space after
+    /// its current length up to its capacity. The length of the vector will be
+    /// adjusted appropriately.
+    pub fn decompress_vec(&mut self, input: &[u8], output: &mut Vec<u8>)
+                          -> Result<Status, Error> {
+        let cap = output.capacity();
+        let len = output.len();
+
+        unsafe {
+            let before = self.total_out();
+            let ret = {
+                let ptr = output.as_mut_ptr().offset(len as isize);
+                let out = slice::from_raw_parts_mut(ptr, cap - len);
+                self.decompress(input, out)
+            };
+            output.set_len((self.total_out() - before) as usize + len);
+            return ret
+        }
+    }
+
+    /// Total number of bytes processed as input
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in()
+    }
+
+    /// Total number of bytes processed as output
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out()
+    }
+}
+
+impl<D: Direction> Stream<D> {
+    fn total_in(&self) -> u64 {
+        (self.raw.total_in_lo32 as u64) |
+        ((self.raw.total_in_hi32 as u64) << 32)
+    }
+
+    fn total_out(&self) -> u64 {
+        (self.raw.total_out_lo32 as u64) |
+        ((self.raw.total_out_hi32 as u64) << 32)
+    }
+}
+
+impl error::Error for Error {
+    fn description(&self) -> &str { "bz2 data error" }
+}
+
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        error::Error::description(self).fmt(f)
+    }
+}
+
+impl Direction for DirCompress {
+    unsafe fn destroy(stream: *mut ffi::bz_stream) -> c_int {
+        ffi::BZ2_bzCompressEnd(stream)
+    }
+}
+impl Direction for DirDecompress {
+    unsafe fn destroy(stream: *mut ffi::bz_stream) -> c_int {
+        ffi::BZ2_bzDecompressEnd(stream)
+    }
+}
+
+impl<D: Direction> Drop for Stream<D> {
+    fn drop(&mut self) {
+        unsafe {
+            let _ = D::destroy(&mut *self.raw);
+        }
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/src/read.rs
@@ -0,0 +1,278 @@
+//! Reader-based compression/decompression streams
+
+use std::io::prelude::*;
+use std::io::{self, BufReader};
+
+#[cfg(feature = "tokio")]
+use futures::Poll;
+#[cfg(feature = "tokio")]
+use tokio_io::{AsyncRead, AsyncWrite};
+
+use bufread;
+use Compression;
+
+/// A compression stream which wraps an uncompressed stream of data. Compressed
+/// data will be read from the stream.
+pub struct BzEncoder<R> {
+    inner: bufread::BzEncoder<BufReader<R>>,
+}
+
+/// A decompression stream which wraps a compressed stream of data. Decompressed
+/// data will be read from the stream.
+pub struct BzDecoder<R> {
+    inner: bufread::BzDecoder<BufReader<R>>,
+}
+
+impl<R: Read> BzEncoder<R> {
+    /// Create a new compression stream which will compress at the given level
+    /// to read compress output to the give output stream.
+    pub fn new(r: R, level: Compression) -> BzEncoder<R> {
+        BzEncoder {
+            inner: bufread::BzEncoder::new(BufReader::new(r), level),
+        }
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Unwrap the underlying writer, finishing the compression stream.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    /// Returns the number of bytes produced by the compressor
+    /// (e.g. the number of bytes read from this stream)
+    ///
+    /// Note that, due to buffering, this only bears any relation to
+    /// total_in() when the compressor chooses to flush its data
+    /// (unfortunately, this won't happen in general
+    /// at the end of the stream, because the compressor doesn't know
+    /// if there's more data to come).  At that point,
+    /// `total_out() / total_in()` would be the compression ratio.
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out()
+    }
+
+    /// Returns the number of bytes consumed by the compressor
+    /// (e.g. the number of bytes read from the underlying stream)
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in()
+    }
+}
+
+impl<R: Read> Read for BzEncoder<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead> AsyncRead for BzEncoder<R> {
+}
+
+impl<W: Write + Read> Write for BzEncoder<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + Read> AsyncWrite for BzEncoder<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: Read> BzDecoder<R> {
+    /// Create a new decompression stream, which will read compressed
+    /// data from the given input stream and decompress it.
+    pub fn new(r: R) -> BzDecoder<R> {
+        BzDecoder {
+            inner: bufread::BzDecoder::new(BufReader::new(r)),
+        }
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Unwrap the underlying writer, finishing the compression stream.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    /// Returns the number of bytes produced by the decompressor
+    /// (e.g. the number of bytes read from this stream)
+    ///
+    /// Note that, due to buffering, this only bears any relation to
+    /// total_in() when the decompressor reaches a sync point
+    /// (e.g. where the original compressed stream was flushed).
+    /// At that point, `total_in() / total_out()` is the compression ratio.
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out()
+    }
+
+    /// Returns the number of bytes consumed by the decompressor
+    /// (e.g. the number of bytes read from the underlying stream)
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in()
+    }
+}
+
+impl<R: Read> Read for BzDecoder<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(into)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + Read> AsyncRead for BzDecoder<R> {
+}
+
+impl<W: Write + Read> Write for BzDecoder<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + Read> AsyncWrite for BzDecoder<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::prelude::*;
+    use read::{BzEncoder, BzDecoder};
+    use Compression;
+    use rand::{thread_rng, Rng};
+
+    #[test]
+    fn smoke() {
+        let m: &[u8] = &[1, 2, 3, 4, 5, 6, 7, 8];
+        let mut c = BzEncoder::new(m, Compression::Default);
+        let mut data = vec![];
+        c.read_to_end(&mut data).unwrap();
+        let mut d = BzDecoder::new(&data[..]);
+        let mut data2 = Vec::new();
+        d.read_to_end(&mut data2).unwrap();
+        assert_eq!(data2, m);
+    }
+
+    #[test]
+    fn smoke2() {
+        let m: &[u8] = &[1, 2, 3, 4, 5, 6, 7, 8];
+        let c = BzEncoder::new(m, Compression::Default);
+        let mut d = BzDecoder::new(c);
+        let mut data = vec![];
+        d.read_to_end(&mut data).unwrap();
+        assert_eq!(data, [1, 2, 3, 4, 5, 6, 7, 8]);
+    }
+
+    #[test]
+    fn smoke3() {
+        let m = vec![3u8; 128 * 1024 + 1];
+        let c = BzEncoder::new(&m[..], Compression::Default);
+        let mut d = BzDecoder::new(c);
+        let mut data = vec![];
+        d.read_to_end(&mut data).unwrap();
+        assert!(data == &m[..]);
+    }
+
+    #[test]
+    fn self_terminating() {
+        let m = vec![3u8; 128 * 1024 + 1];
+        let mut c = BzEncoder::new(&m[..], Compression::Default);
+
+        let mut result = Vec::new();
+        c.read_to_end(&mut result).unwrap();
+
+        let v = thread_rng().gen_iter::<u8>().take(1024).collect::<Vec<_>>();
+        for _ in 0..200 {
+            result.extend(v.iter().map(|x| *x));
+        }
+
+        let mut d = BzDecoder::new(&result[..]);
+        let mut data = Vec::with_capacity(m.len());
+        unsafe { data.set_len(m.len()); }
+        assert!(d.read(&mut data).unwrap() == m.len());
+        assert!(data == &m[..]);
+    }
+
+    #[test]
+    fn zero_length_read_at_eof() {
+        let m = Vec::new();
+        let mut c = BzEncoder::new(&m[..], Compression::Default);
+
+        let mut result = Vec::new();
+        c.read_to_end(&mut result).unwrap();
+
+        let mut d = BzDecoder::new(&result[..]);
+        let mut data = Vec::new();
+        assert!(d.read(&mut data).unwrap() == 0);
+    }
+
+    #[test]
+    fn zero_length_read_with_data() {
+        let m = vec![3u8; 128 * 1024 + 1];
+        let mut c = BzEncoder::new(&m[..], Compression::Default);
+
+        let mut result = Vec::new();
+        c.read_to_end(&mut result).unwrap();
+
+        let mut d = BzDecoder::new(&result[..]);
+        let mut data = Vec::new();
+        assert!(d.read(&mut data).unwrap() == 0);
+    }
+
+    #[test]
+    fn empty() {
+        let r = BzEncoder::new(&[][..], Compression::Default);
+        let mut r = BzDecoder::new(r);
+        let mut v2 = Vec::new();
+        r.read_to_end(&mut v2).unwrap();
+        assert!(v2.len() == 0);
+    }
+
+    #[test]
+    fn qc() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let r = BzEncoder::new(&v[..], Compression::Default);
+            let mut r = BzDecoder::new(r);
+            let mut v2 = Vec::new();
+            r.read_to_end(&mut v2).unwrap();
+            v == v2
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/src/write.rs
@@ -0,0 +1,348 @@
+//! Writer-based compression/decompression streams
+
+use std::io::prelude::*;
+use std::io;
+
+#[cfg(feature = "tokio")]
+use futures::Poll;
+#[cfg(feature = "tokio")]
+use tokio_io::{AsyncRead, AsyncWrite};
+
+use {Action, Status, Compression, Compress, Decompress};
+
+/// A compression stream which will have uncompressed data written to it and
+/// will write compressed data to an output stream.
+pub struct BzEncoder<W: Write> {
+    data: Compress,
+    obj: Option<W>,
+    buf: Vec<u8>,
+    done: bool,
+}
+
+/// A compression stream which will have compressed data written to it and
+/// will write uncompressed data to an output stream.
+pub struct BzDecoder<W: Write> {
+    data: Decompress,
+    obj: Option<W>,
+    buf: Vec<u8>,
+    done: bool,
+}
+
+impl<W: Write> BzEncoder<W> {
+    /// Create a new compression stream which will compress at the given level
+    /// to write compress output to the give output stream.
+    pub fn new(obj: W, level: Compression) -> BzEncoder<W> {
+        BzEncoder {
+            data: Compress::new(level, 30),
+            obj: Some(obj),
+            buf: Vec::with_capacity(32 * 1024),
+            done: false,
+        }
+    }
+
+    fn dump(&mut self) -> io::Result<()> {
+        while self.buf.len() > 0 {
+            let n = try!(self.obj.as_mut().unwrap().write(&self.buf));
+            self.buf.drain(..n);
+        }
+        Ok(())
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.obj.as_ref().unwrap()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutating the output/input state of the stream may corrupt this
+    /// object, so care must be taken when using this method.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.obj.as_mut().unwrap()
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        while !self.done {
+            try!(self.dump());
+            let res = self.data.compress_vec(&[], &mut self.buf, Action::Finish);
+            if res == Ok(Status::StreamEnd) {
+                self.done = true;
+                break
+            }
+        }
+        self.dump()
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream and then return the contained
+    /// writer if the flush succeeded.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(mut self) -> io::Result<W> {
+        try!(self.try_finish());
+        Ok(self.obj.take().unwrap())
+    }
+
+    /// Returns the number of bytes produced by the compressor
+    ///
+    /// Note that, due to buffering, this only bears any relation to
+    /// `total_in()` after a call to `flush()`.  At that point,
+    /// `total_out() / total_in()` is the compression ratio.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+
+    /// Returns the number of bytes consumed by the compressor
+    /// (e.g. the number of bytes written to this stream.)
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+}
+
+impl<W: Write> Write for BzEncoder<W> {
+    fn write(&mut self, data: &[u8]) -> io::Result<usize> {
+        loop {
+            try!(self.dump());
+
+            let total_in = self.total_in();
+            self.data.compress_vec(data, &mut self.buf, Action::Run)
+                .unwrap();
+            let written = (self.total_in() - total_in) as usize;
+
+            if written > 0 || data.len() == 0 {
+                return Ok(written)
+            }
+        }
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        loop {
+            try!(self.dump());
+            let before = self.total_out();
+            self.data.compress_vec(&[], &mut self.buf, Action::Flush)
+                .unwrap();
+
+            if before == self.total_out() {
+                break
+            }
+        }
+        self.obj.as_mut().unwrap().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for BzEncoder<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.try_finish());
+        self.get_mut().shutdown()
+    }
+}
+
+impl<W: Read + Write> Read for BzEncoder<W> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncRead + AsyncWrite> AsyncRead for BzEncoder<W> {
+}
+
+impl<W: Write> Drop for BzEncoder<W> {
+    fn drop(&mut self) {
+        if self.obj.is_some() {
+            let _ = self.try_finish();
+        }
+    }
+}
+
+impl<W: Write> BzDecoder<W> {
+    /// Create a new decoding stream which will decompress all data written
+    /// to it into `obj`.
+    pub fn new(obj: W) -> BzDecoder<W> {
+        BzDecoder {
+            data: Decompress::new(false),
+            obj: Some(obj),
+            buf: Vec::with_capacity(32 * 1024),
+            done: false,
+        }
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.obj.as_ref().unwrap()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutating the output/input state of the stream may corrupt this
+    /// object, so care must be taken when using this method.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.obj.as_mut().unwrap()
+    }
+
+    fn dump(&mut self) -> io::Result<()> {
+        while self.buf.len() > 0 {
+            let n = try!(self.obj.as_mut().unwrap().write(&self.buf));
+            self.buf.drain(..n);
+        }
+        Ok(())
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        while !self.done {
+            try!(self.write(&[]));
+        }
+        self.dump()
+    }
+
+    /// Unwrap the underlying writer, finishing the compression stream.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(&mut self) -> io::Result<W> {
+        try!(self.try_finish());
+        Ok(self.obj.take().unwrap())
+    }
+
+    /// Returns the number of bytes produced by the decompressor
+    ///
+    /// Note that, due to buffering, this only bears any relation to
+    /// `total_in()` after a call to `flush()`.  At that point,
+    /// `total_in() / total_out()` is the compression ratio.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+
+    /// Returns the number of bytes consumed by the decompressor
+    /// (e.g. the number of bytes written to this stream.)
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+}
+
+impl<W: Write> Write for BzDecoder<W> {
+    fn write(&mut self, data: &[u8]) -> io::Result<usize> {
+        if self.done {
+            return Ok(0)
+        }
+        loop {
+            try!(self.dump());
+
+            let before = self.total_in();
+            let res = self.data.decompress_vec(data, &mut self.buf);
+            let written = (self.total_in() - before) as usize;
+
+            let res = try!(res.map_err(|e| {
+                io::Error::new(io::ErrorKind::InvalidInput, e)
+            }));
+
+            if res == Status::StreamEnd {
+                self.done = true;
+            }
+            if written > 0 || data.len() == 0 || self.done {
+                return Ok(written)
+            }
+        }
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        try!(self.dump());
+        self.obj.as_mut().unwrap().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for BzDecoder<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.try_finish());
+        self.get_mut().shutdown()
+    }
+}
+
+impl<W: Read + Write> Read for BzDecoder<W> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncRead + AsyncWrite> AsyncRead for BzDecoder<W> {
+}
+
+impl<W: Write> Drop for BzDecoder<W> {
+    fn drop(&mut self) {
+        if self.obj.is_some() {
+            let _ = self.try_finish();
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::prelude::*;
+    use std::iter::repeat;
+    use super::{BzEncoder, BzDecoder};
+
+    #[test]
+    fn smoke() {
+        let d = BzDecoder::new(Vec::new());
+        let mut c = BzEncoder::new(d, ::Compression::Default);
+        c.write_all(b"12834").unwrap();
+        let s = repeat("12345").take(100000).collect::<String>();
+        c.write_all(s.as_bytes()).unwrap();
+        let data = c.finish().unwrap().finish().unwrap();
+        assert_eq!(&data[0..5], b"12834");
+        assert_eq!(data.len(), 500005);
+        assert!(format!("12834{}", s).as_bytes() == &*data);
+    }
+
+    #[test]
+    fn write_empty() {
+        let d = BzDecoder::new(Vec::new());
+        let mut c = BzEncoder::new(d, ::Compression::Default);
+        c.write(b"").unwrap();
+        let data = c.finish().unwrap().finish().unwrap();
+        assert_eq!(&data[..], b"");
+    }
+
+    #[test]
+    fn qc() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let w = BzDecoder::new(Vec::new());
+            let mut w = BzEncoder::new(w, ::Compression::Default);
+            w.write_all(&v).unwrap();
+            v == w.finish().unwrap().finish().unwrap()
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bzip2/tests/tokio.rs
@@ -0,0 +1,125 @@
+#![cfg(feature = "tokio")]
+
+extern crate tokio_core;
+extern crate bzip2;
+extern crate tokio_io;
+extern crate futures;
+extern crate rand;
+
+use std::thread;
+use std::net::{Shutdown, TcpListener};
+use std::io::{Read, Write};
+
+use bzip2::Compression;
+use bzip2::read;
+use bzip2::write;
+use futures::Future;
+use rand::{Rng, thread_rng};
+use tokio_core::net::TcpStream;
+use tokio_core::reactor::Core;
+use tokio_io::AsyncRead;
+use tokio_io::io::{copy, shutdown};
+
+#[test]
+fn tcp_stream_echo_pattern() {
+    const N: u8 = 16;
+    const M: usize = 16 * 1024;
+
+    let mut core = Core::new().unwrap();
+    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
+    let addr = listener.local_addr().unwrap();
+    let t = thread::spawn(move || {
+        let a = listener.accept().unwrap().0;
+        let b = a.try_clone().unwrap();
+
+        let t = thread::spawn(move || {
+            let mut b = read::BzDecoder::new(b);
+            let mut buf = [0; M];
+            for i in 0..N {
+                b.read_exact(&mut buf).unwrap();
+                for byte in buf.iter() {
+                    assert_eq!(*byte, i);
+                }
+            }
+
+            assert_eq!(b.read(&mut buf).unwrap(), 0);
+        });
+
+        let mut a = write::BzEncoder::new(a, Compression::Default);
+        for i in 0..N {
+            let buf = [i; M];
+            a.write_all(&buf).unwrap();
+        }
+        a.finish().unwrap()
+         .shutdown(Shutdown::Write).unwrap();
+
+        t.join().unwrap();
+    });
+
+    let handle = core.handle();
+    let stream = TcpStream::connect(&addr, &handle);
+    let copy = stream.and_then(|s| {
+        let (a, b) = s.split();
+        let a = read::BzDecoder::new(a);
+        let b = write::BzEncoder::new(b, Compression::Default);
+        copy(a, b)
+    }).then(|result| {
+        let (amt, _a, b) = result.unwrap();
+        assert_eq!(amt, (N as u64) * (M as u64));
+        shutdown(b).map(|_| ())
+    });
+
+    core.run(copy).unwrap();
+    t.join().unwrap();
+}
+
+#[test]
+fn echo_random() {
+    let v = thread_rng().gen_iter::<u8>().take(1024 * 1024).collect::<Vec<_>>();
+    let mut core = Core::new().unwrap();
+    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
+    let addr = listener.local_addr().unwrap();
+    let v2 = v.clone();
+    let t = thread::spawn(move || {
+        let a = listener.accept().unwrap().0;
+        let b = a.try_clone().unwrap();
+
+        let mut v3 = v2.clone();
+        let t = thread::spawn(move || {
+            let mut b = read::BzDecoder::new(b);
+            let mut buf = [0; 1024];
+            while v3.len() > 0 {
+                let n = b.read(&mut buf).unwrap();
+                for (actual, expected) in buf[..n].iter().zip(&v3) {
+                    assert_eq!(*actual, *expected);
+                }
+                v3.drain(..n);
+            }
+
+            assert_eq!(b.read(&mut buf).unwrap(), 0);
+        });
+
+        let mut a = write::BzEncoder::new(a, Compression::Default);
+        a.write_all(&v2).unwrap();
+        a.finish().unwrap()
+         .shutdown(Shutdown::Write).unwrap();
+
+        t.join().unwrap();
+    });
+
+    let handle = core.handle();
+    let stream = TcpStream::connect(&addr, &handle);
+    let copy = stream.and_then(|s| {
+        let (a, b) = s.split();
+        let a = read::BzDecoder::new(a);
+        let b = write::BzEncoder::new(b, Compression::Default);
+        copy(a, b)
+    }).then(|result| {
+        let (amt, _a, b) = result.unwrap();
+        assert_eq!(amt, v.len() as u64);
+        shutdown(b).map(|_| ())
+    });
+
+    core.run(copy).unwrap();
+    t.join().unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"e4721fe8d991d6b9f58da6fba573906a759b58b49ba58cb15b0ca279b3bc53cb","AUTHORS.txt":"4ba13d189cb419382ef9837e74de67c2dba98ff1b378816de2a3f59922da598a","CHANGELOG.md":"5dcce1ee25d1e37a0fa3ce162568061787a13870297d5f95bffa44156efe8701","Cargo.toml":"d7703847fb88c9edcd69a7ce84a4098d21a6dfa2159454067cf9bd56577073ac","LICENSE.txt":"37064a3e3254d5a0c7963d476125e25762e86adadc71959549767486e37c8038","Makefile":"6901ba54f43a90422482457a9237edbee41490b394c09fe5a7d40129db7be5b0","README.md":"d674954a5135c85e2af5e6efa3480b64f16f79dcfface35b01dd837c3b942af6","src/date.rs":"54ccfd7964c1d0ef601c8818bd59c88bf2fb61b51ea78336f190f5e793a47b8d","src/datetime.rs":"400cf1666cfc7224b2e38fbab31236a07f9d75418c9c7b3962d9871e4bda51af","src/div.rs":"bf03964177e2960b0c4726f4856f12b597a59b051241e2a0121501b78825dce8","src/format/mod.rs":"ff50334f39ce537e4745424c8e1a7632a8ec5179fd9047fa0d6cf622d6ce182a","src/format/parse.rs":"0b3ac142ac27b7a32618684b18453e2fd43c7d7d7ddc9b3adbf395c5934e0f1c","src/format/parsed.rs":"6ce9196fa34f29e64a1bc14e76a35b76f4ad5bf72711df8eba2b196aad5ec811","src/format/scan.rs":"ea5ebe5ab966c70f18605edce9a55098ee5f661da1a02b0710559d76067bab79","src/format/strftime.rs":"35ee925171f8c02e876a9b4f515d6ba7eadf3fc8cc914759bee382d5821270e7","src/lib.rs":"1e88f2bdc97130bd6ec3f87bfec4d671167cd66e9daa953b7ce11ceb5ea62928","src/naive/date.rs":"ad4e6b0a4ad939afd79981015d4b2004a33f66abd3c0a3d18a0765d6b87900a1","src/naive/datetime.rs":"317ab30a8648aef7440da5a813a55a7346c24ff13953436bcae7f6888ed0a0c6","src/naive/time.rs":"dab2c7a6cbd8943a1a775c6c8a9a042fed0dacca623c741871d3969a592d733f","src/offset/fixed.rs":"9f103b5abb3927a19bfeb533db5a695451a5e474ed645c7cf1ac52649bc5fe8a","src/offset/local.rs":"c29fdd66a0dd39f32ded7834479dd8755022a791fb13be1ae5027999a86e4a9e","src/offset/mod.rs":"3e732d056a29585d3eecd74ccdbb38c050d08def9d10f0000a7328761e6c77e6","src/offset/utc.rs":"072b460f6b726877344207e68edc00507e08d8a9168f9f571b6631a0c73ea7be"},"package":"9213f7cd7c27e95c2b57c49f0e69b1ea65b27138da84a170133fd21b07659c00"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/.travis.yml
@@ -0,0 +1,18 @@
+language: rust
+os:
+  - linux
+  - osx
+env:
+  global:
+    - LD_LIBRARY_PATH: /usr/local/lib
+    - secure: i8Ijk6g4/26e3e7+r2OeGAPSP8G8O9P50JibW1omJ0j0ixXhyhPoY2bch3CGhnOu44dI5O31IIbjJJ+iEMp29xQBvkv9YpxAI+hIzOP+XAH6GCYxUDiBVcDoWrXTj+wU6/veuvjLCunu4eRHlskrgJbZXhUVODYzJuLgsN8Ou0w=
+script:
+  - cargo build -v
+  - cargo build -v --features rustc-serialize
+  - cargo build -v --features serde
+  - cargo test -v
+  - cargo test -v --features rustc-serialize
+  - cargo test -v --features serde
+  - cargo doc
+after_script:
+  - cd target && curl http://www.rust-ci.org/artifacts/put?t=$RUSTCI_TOKEN | sh
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/AUTHORS.txt
@@ -0,0 +1,26 @@
+Chrono is mainly written by Kang Seonghoon <public+rust@mearie.org>,
+and also the following people (in ascending order):
+
+Alexander Bulaev <alexbool@yandex-team.ru>
+Ben Eills <ben@beneills.com>
+Colin Ray <r.colinray@gmail.com>
+Corey Farwell <coreyf@rwell.org>
+Dan <dan@ebip.co.uk>
+Danilo Bargen <mail@dbrgn.ch>
+David Hewson <dev@daveid.co.uk>
+David Ross <daboross@daboross.net>
+David Willie <david.willie.1@gmail.com>
+Eunchong Yu <kroisse@gmail.com>
+Huon Wilson <dbau.pp+github@gmail.com>
+Jisoo Park <xxxyel@gmail.com>
+Joe Wilm <joe@jwilm.com>
+John Heitmann <jheitmann@gmail.com>
+John Nagle <nagle@sitetruth.com>
+Ken Tossell <ken@tossell.net>
+Martin Risell Lilja <martin.risell.lilja@gmail.com>
+Ryan Lewis <ryansname@gmail.com>
+Sergey V. Galtsev <sergey.v.galtsev@github.com>
+Steve Klabnik <steve@steveklabnik.com>
+Tom Gallacher <tomgallacher23@gmail.com>
+klutzy <klutzytheklutzy@gmail.com>
+kud1ing <github@kudling.de>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/CHANGELOG.md
@@ -0,0 +1,302 @@
+ChangeLog for Chrono
+====================
+
+This documents all notable changes to [Chrono](https://github.com/lifthrasiir/rust-chrono).
+
+Chrono obeys the principle of [Semantic Versioning](http://semver.org/).
+
+There were/are numerous minor versions before 1.0 due to the language changes.
+Versions with only mechnical changes will be omitted from the following list.
+
+## 0.2.25 (2016-08-04)
+
+(0.2.24 was accidentally uploaded without a proper check for warnings in the default state,
+and replaced by 0.2.25 very shortly. Duh.)
+
+### Added
+
+- Serde 0.8 is now supported. 0.7 also remains supported. (#86)
+
+### Fixed
+
+- The deserialization implementation for rustc-serialize now properly verifies the input.
+  All serialization codes are also now thoroughly tested. (#42)
+
+## 0.2.23 (2016-08-03)
+
+### Added
+
+- The documentation was greatly improved for several types,
+  and tons of cross-references have been added. (#77, #78, #80, #82)
+
+- `DateTime::timestamp_subsec_{millis,micros,nanos}` methods have been added. (#81)
+
+### Fixed
+
+- When the system time records a leap second,
+  the nanosecond component was mistakenly reset to zero. (#84)
+
+- `Local` offset misbehaves in Windows for August and later,
+  due to the long-standing libtime bug (dates back to mid-2015).
+  Workaround has been implemented. (#85)
+
+## 0.2.22 (2016-04-22)
+
+### Fixed
+
+- `%.6f` and `%.9f` used to print only three digits when the nanosecond part is zero. (#71)
+- The documentation for `%+` has been updated to reflect the current status. (#71)
+
+## 0.2.21 (2016-03-29)
+
+### Fixed
+
+- `Fixed::LongWeekdayName` was unable to recognize `"sunday"` (whoops). (#66)
+
+## 0.2.20 (2016-03-06)
+
+### Changed
+
+- `serde` dependency has been updated to 0.7. (#63, #64)
+
+## 0.2.19 (2016-02-05)
+
+### Added
+
+- The documentation for `Date` is made clear about its ambiguity and guarantees.
+
+### Fixed
+
+- `DateTime::date` had been wrong when the local date and the UTC date is in disagreement. (#61)
+
+## 0.2.18 (2016-01-23)
+
+### Fixed
+
+- Chrono no longer pulls a superfluous `rand` dependency. (#57)
+
+## 0.2.17 (2015-11-22)
+
+### Added
+
+- Naive date and time types and `DateTime` now have a `serde` support.
+  They serialize as an ISO 8601 / RFC 3339 string just like `Debug`. (#51)
+
+## 0.2.16 (2015-09-06)
+
+### Added
+
+- Added `%.3f`, `%.6f` and `%.9f` specifier for formatting fractional seconds
+  up to 3, 6 or 9 decimal digits. This is a natural extension to the existing `%f`.
+  Note that this is (not yet) generic, no other value of precision is supported. (#45)
+
+### Changed
+
+- Forbade unsized types from implementing `Datelike` and `Timelike`.
+  This does not make a big harm as any type implementing them should be already sized
+  to be practical, but this change still can break highly generic codes. (#46)
+
+### Fixed
+
+- Fixed a broken link in the `README.md`. (#41)
+
+## 0.2.15 (2015-07-05)
+
+### Added
+
+- Padding modifiers `%_?`, `%-?` and `%0?` are implemented.
+  They are glibc extensions which seem to be reasonably widespread (e.g. Ruby).
+
+- Added `%:z` specifier and corresponding formatting items
+  which is essentially same to `%z` but with a colon.
+
+- Added a new specifier `%.f` which precision adapts from the input.
+  This was added as a response to the UX problems in the original nanosecond specifier `%f`.
+
+### Fixed
+
+- `Numeric::Timestamp` specifier (`%s`) was ignoring the time zone offset when provided.
+
+- Improved the documentation and associated tests for `strftime`.
+
+## 0.2.14 (2015-05-15)
+
+### Fixed
+
+- `NaiveDateTime +/- Duration` or `NaiveTime +/- Duration` could have gone wrong
+  when the `Duration` to be added is negative and has a fractional second part.
+  This was caused by an underflow in the conversion from `Duration` to the parts;
+  the lack of tests for this case allowed a bug. (#37)
+
+## 0.2.13 (2015-04-29)
+
+### Added
+
+- The optional dependency on `rustc_serialize` and
+  relevant `Rustc{En,De}codable` implementations for supported types has been added.
+  This is enabled by the `rustc-serialize` Cargo feature. (#34)
+
+### Changed
+
+- `chrono::Duration` reexport is changed to that of crates.io `time` crate.
+  This enables Rust 1.0 beta compatibility.
+
+## 0.2.4 (2015-03-03)
+
+### Fixed
+
+- Clarified the meaning of `Date<Tz>` and fixed unwanted conversion problem
+  that only occurs with positive UTC offsets. (#27)
+
+## 0.2.3 (2015-02-27)
+
+### Added
+
+- `DateTime<Tz>` and `Date<Tz>` is now `Copy`/`Send` when `Tz::Offset` is `Copy`/`Send`.
+  The implementations for them were mistakenly omitted. (#25)
+
+### Fixed
+
+- `Local::from_utc_datetime` didn't set a correct offset. (#26)
+
+## 0.2.1 (2015-02-21)
+
+### Changed
+
+- `DelayedFormat` no longer conveys a redundant lifetime.
+
+## 0.2.0 (2015-02-19)
+
+### Added
+
+- `Offset` is splitted into `TimeZone` (constructor) and `Offset` (storage) types.
+  You would normally see only the former, as the latter is mostly an implementation detail.
+  Most importantly, `Local` now can be used to directly construct timezone-aware values.
+
+  Some types (currently, `UTC` and `FixedOffset`) are both `TimeZone` and `Offset`,
+  but others aren't (e.g. `Local` is not what is being stored to each `DateTime` values).
+
+- `LocalResult::map` convenience method has been added.
+
+- `TimeZone` now allows a construction of `DateTime` values from UNIX timestamp,
+  via `timestamp` and `timestamp_opt` methods.
+
+- `TimeZone` now also has a method for parsing `DateTime`, namely `datetime_from_str`.
+
+- The following methods have been added to all date and time types:
+
+    - `checked_add`
+    - `checked_sub`
+    - `format_with_items`
+
+- The following methods have been added to all timezone-aware types:
+
+    - `timezone`
+    - `with_timezone`
+    - `naive_utc`
+    - `naive_local`
+
+- `parse_from_str` method has been added to all naive types and `DateTime<FixedOffset>`.
+
+- All naive types and instances of `DateTime` with time zones `UTC`, `Local` and `FixedOffset`
+  implement the `FromStr` trait. They parse what `std::fmt::Debug` would print.
+
+- `chrono::format` has been greatly rewritten.
+
+    - The formatting syntax parser is modular now, available at `chrono::format::strftime`.
+
+    - The parser and resolution algorithm is also modular, the former is available at
+      `chrono::format::parse` while the latter is available at `chrono::format::parsed`.
+
+    - Explicit support for RFC 2822 and 3339 syntaxes is landed.
+
+    - There is a minor formatting difference with atypical values,
+      e.g. for years not between 1 BCE and 9999 CE.
+
+### Changed
+
+- Most uses of `Offset` are converted to `TimeZone`.
+  In fact, *all* user-facing code is expected to be `Offset`-free.
+
+- `[Naive]DateTime::*num_seconds_from_unix_epoch*` methods have been renamed to
+  simply `timestamp` or `from_timestamp*`. The original names have been deprecated.
+
+### Removed
+
+- `Time` has been removed. This also prompts a related set of methods in `TimeZone`.
+
+  This is in principle possible, but in practice has seen a little use
+  because it can only be meaningfully constructed via an existing `DateTime` value.
+  This made many operations to `Time` unintuitive or ambiguous,
+  so we simply let it go.
+
+  In the case that `Time` is really required, one can use a simpler `NaiveTime`.
+  `NaiveTime` and `NaiveDate` can be freely combined and splitted,
+  and `TimeZone::from_{local,utc}_datetime` can be used to convert from/to the local time.
+
+- `with_offset` method has been removed. Use `with_timezone` method instead.
+  (This is not deprecated since it is an integral part of offset reform.)
+
+## 0.1.14 (2015-01-10)
+
+### Added
+
+- Added a missing `std::fmt::String` impl for `Local`.
+
+## 0.1.13 (2015-01-10)
+
+### Changed
+
+- Most types now implement both `std::fmt::Show` and `std::fmt::String`,
+  with the former used for the stricter output and the latter used for more casual output.
+
+### Removed
+
+- `Offset::name` has been replaced by a `std::fmt::String` implementation to `Offset`.
+
+## 0.1.12 (2015-01-08)
+
+### Removed
+
+- `Duration + T` no longer works due to the updated impl reachability rules.
+  Use `T + Duration` as a workaround.
+
+## 0.1.4 (2014-12-13)
+
+### Fixed
+
+- Fixed a bug that `Date::and_*` methods with an offset that can change the date are
+  off by one day.
+
+## 0.1.3 (2014-11-28)
+
+### Added
+
+- `{Date,Time,DateTime}::with_offset` methods have been added.
+
+- `LocalResult` now implements a common set of traits.
+
+- `LocalResult::and_*` methods have been added.
+  They are useful for safely chaining `LocalResult<Date<Off>>` methods
+  to make `LocalResult<DateTime<Off>>`.
+
+### Changed
+
+- `Offset::name` now returns `SendStr`.
+
+- `{Date,Time} - Duration` overloadings are now allowed.
+
+## 0.1.2 (2014-11-24)
+
+### Added
+
+- `Duration + Date` overloading is now allowed.
+
+### Changed
+
+- Chrono no longer needs `num` dependency.
+
+## 0.1.0 (2014-11-20)
+
+The initial version that was available to `crates.io`.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "chrono"
+version = "0.2.25"
+authors = ["Kang Seonghoon <public+rust@mearie.org>"]
+
+description = "Date and time library for Rust"
+homepage = "https://github.com/lifthrasiir/rust-chrono"
+documentation = "https://lifthrasiir.github.io/rust-chrono/"
+repository = "https://github.com/lifthrasiir/rust-chrono"
+keywords = ["date", "time", "calendar"]
+readme = "README.md"
+license = "MIT/Apache-2.0"
+
+[lib]
+name = "chrono"
+
+[dependencies]
+time = "0.1"
+num = { version = "0.1", default-features = false }
+rustc-serialize = { version = "0.3", optional = true }
+serde = { version = "<0.9", optional = true }
+
+[dev-dependencies]
+serde_json = { version = ">=0.7.0" }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/LICENSE.txt
@@ -0,0 +1,239 @@
+Rust-chrono is dual-licensed under The MIT License [1] and
+Apache 2.0 License [2]. Copyright (c) 2014, Kang Seonghoon.
+
+Nota Bene: This is same as the Rust Project's own license.
+
+
+[1]: <http://opensource.org/licenses/MIT>, which is reproduced below:
+
+~~~~
+The MIT License (MIT)
+
+Copyright (c) 2014, Kang Seonghoon.
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+~~~~
+
+
+[2]: <http://www.apache.org/licenses/LICENSE-2.0>, which is reproduced below:
+
+~~~~
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+~~~~
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/Makefile
@@ -0,0 +1,60 @@
+# this Makefile is mostly for the packaging convenience.
+# casual users should use `cargo` to retrieve the appropriate version of Chrono.
+
+.PHONY: all
+all:
+	@echo 'Try `cargo build` instead.'
+
+.PHONY: authors
+authors:
+	echo 'Chrono is mainly written by Kang Seonghoon <public+rust@mearie.org>,' > AUTHORS.txt
+	echo 'and also the following people (in ascending order):' >> AUTHORS.txt
+	echo >> AUTHORS.txt
+	git log --format='%aN <%aE>' | grep -v 'Kang Seonghoon' | sort -u >> AUTHORS.txt
+
+.PHONY: readme
+readme: README.md
+
+README.md: src/lib.rs
+	# really, really sorry for this mess.
+	awk '/^\/\/! # Chrono /{print "[Chrono][doc]",$$4}' $< > $@
+	awk '/^\/\/! # Chrono /{print "[Chrono][doc]",$$4}' $< | sed 's/./=/g' >> $@
+	echo >> $@
+	echo '[![Chrono on Travis CI][travis-image]][travis]' >> $@
+	echo >> $@
+	echo '[travis-image]: https://travis-ci.org/lifthrasiir/rust-chrono.png' >> $@
+	echo '[travis]: https://travis-ci.org/lifthrasiir/rust-chrono' >> $@
+	awk '/^\/\/! # Chrono /,/^\/\/! ## /' $< | cut -b 5- | grep -v '^#' | \
+		sed 's/](\.\//](https:\/\/lifthrasiir.github.io\/rust-chrono\/chrono\//g' >> $@
+	echo '[Complete Documentation][doc]' >> $@
+	echo >> $@
+	echo '[doc]: https://lifthrasiir.github.io/rust-chrono/' >> $@
+	echo >> $@
+	awk '/^\/\/! ## /,!/^\/\/!/' $< | cut -b 5- | grep -v '^# ' | \
+		sed 's/](\.\//](https:\/\/lifthrasiir.github.io\/rust-chrono\/chrono\//g' >> $@
+
+.PHONY: test
+test:
+	cargo test --features 'serde rustc-serialize'
+
+.PHONY: doc
+doc: authors readme
+	cargo doc --features 'serde rustc-serialize'
+
+.PHONY: doc-publish
+doc-publish: doc
+	( \
+		PKGID="$$(cargo pkgid)"; \
+		PKGNAMEVER="$${PKGID#*#}"; \
+		PKGNAME="$${PKGNAMEVER%:*}"; \
+		REMOTE="$$(git config --get remote.origin.url)"; \
+		cd target/doc && \
+		rm -rf .git && \
+		git init && \
+		git checkout --orphan gh-pages && \
+		echo '<!doctype html><html><head><meta http-equiv="refresh" content="0;URL='$$PKGNAME'/index.html"></head><body></body></html>' > index.html && \
+		git add . && \
+		git commit -m 'updated docs.' && \
+		git push "$$REMOTE" gh-pages -f; \
+	)
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/README.md
@@ -0,0 +1,322 @@
+[Chrono][doc] 0.2.25
+====================
+
+[![Chrono on Travis CI][travis-image]][travis]
+
+[travis-image]: https://travis-ci.org/lifthrasiir/rust-chrono.png
+[travis]: https://travis-ci.org/lifthrasiir/rust-chrono
+
+Date and time handling for Rust. (also known as `rust-chrono`)
+It aims to be a feature-complete superset of
+the [time](https://github.com/rust-lang-deprecated/time) library.
+In particular,
+
+* Chrono strictly adheres to ISO 8601.
+* Chrono is timezone-aware by default, with separate timezone-naive types.
+* Chrono is space-optimal and (while not being the primary goal) reasonably efficient.
+
+There were several previous attempts to bring a good date and time library to Rust,
+which Chrono builts upon and should acknowledge:
+
+* [Initial research on
+   the wiki](https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md)
+* Dietrich Epp's [datetime-rs](https://github.com/depp/datetime-rs)
+* Luis de Bethencourt's [rust-datetime](https://github.com/luisbg/rust-datetime)
+
+[Complete Documentation][doc]
+
+[doc]: https://lifthrasiir.github.io/rust-chrono/
+
+## Usage
+
+Put this in your `Cargo.toml`:
+
+```toml
+[dependencies]
+chrono = "0.2"
+```
+
+Or, if you want [Serde](https://github.com/serde-rs/serde) or
+[rustc-serialize](https://github.com/rust-lang-nursery/rustc-serialize) support,
+include the features like this:
+
+```toml
+[dependencies]
+chrono = { version = "0.2", features = ["serde", "rustc-serialize"] }
+```
+
+Then put this in your crate root:
+
+```rust
+extern crate chrono;
+```
+
+## Overview
+
+### Duration
+
+[**`Duration`**](https://lifthrasiir.github.io/rust-chrono/chrono/struct.Duration.html)
+represents the magnitude of a time span. `Duration` used to be provided by Chrono.
+It has been moved to the `time` crate as the
+[`time::Duration`](https://doc.rust-lang.org/time/time/struct.Duration.html) type, but is
+still re-exported from Chrono.
+
+### Date and Time
+
+Chrono provides a
+[**`DateTime`**](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html)
+type to represent a date and a time in a timezone.
+
+For more abstract moment-in-time tracking such as internal timekeeping
+that is unconcerned with timezones, consider
+[`time::SystemTime`](https://doc.rust-lang.org/std/time/struct.SystemTime.html),
+which tracks your system clock, or
+[`time::Instant`](https://doc.rust-lang.org/std/time/struct.Instant.html), which
+is an opaque but monotonically-increasing representation of a moment in time.
+
+`DateTime` is timezone-aware and must be constructed from
+the [**`TimeZone`**](https://lifthrasiir.github.io/rust-chrono/chrono/offset/trait.TimeZone.html) object,
+which defines how the local date is converted to and back from the UTC date.
+There are three well-known `TimeZone` implementations:
+
+* [**`UTC`**](https://lifthrasiir.github.io/rust-chrono/chrono/offset/utc/struct.UTC.html) specifies the UTC time zone. It is most efficient.
+
+* [**`Local`**](https://lifthrasiir.github.io/rust-chrono/chrono/offset/local/struct.Local.html) specifies the system local time zone.
+
+* [**`FixedOffset`**](https://lifthrasiir.github.io/rust-chrono/chrono/offset/fixed/struct.FixedOffset.html) specifies
+  an arbitrary, fixed time zone such as UTC+09:00 or UTC-10:30.
+  This often results from the parsed textual date and time.
+  Since it stores the most information and does not depend on the system environment,
+  you would want to normalize other `TimeZone`s into this type.
+
+`DateTime`s with different `TimeZone` types are distinct and do not mix,
+but can be converted to each other using
+the [`DateTime::with_timezone`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.with_timezone) method.
+
+You can get the current date and time in the UTC time zone
+([`UTC::now()`](https://lifthrasiir.github.io/rust-chrono/chrono/offset/utc/struct.UTC.html#method.now))
+or in the local time zone
+([`Local::now()`](https://lifthrasiir.github.io/rust-chrono/chrono/offset/local/struct.Local.html#method.now)).
+
+~~~~ {.rust}
+use chrono::*;
+
+let utc: DateTime<UTC> = UTC::now();       // e.g. `2014-11-28T12:45:59.324310806Z`
+let local: DateTime<Local> = Local::now(); // e.g. `2014-11-28T21:45:59.324310806+09:00`
+~~~~
+
+Alternatively, you can create your own date and time.
+This is a bit verbose due to Rust's lack of function and method overloading,
+but in turn we get a rich combination of initialization methods.
+
+~~~~ {.rust}
+use chrono::*;
+
+let dt = UTC.ymd(2014, 7, 8).and_hms(9, 10, 11); // `2014-07-08T09:10:11Z`
+// July 8 is 188th day of the year 2014 (`o` for "ordinal")
+assert_eq!(dt, UTC.yo(2014, 189).and_hms(9, 10, 11));
+// July 8 is Tuesday in ISO week 28 of the year 2014.
+assert_eq!(dt, UTC.isoywd(2014, 28, Weekday::Tue).and_hms(9, 10, 11));
+
+let dt = UTC.ymd(2014, 7, 8).and_hms_milli(9, 10, 11, 12); // `2014-07-08T09:10:11.012Z`
+assert_eq!(dt, UTC.ymd(2014, 7, 8).and_hms_micro(9, 10, 11, 12_000));
+assert_eq!(dt, UTC.ymd(2014, 7, 8).and_hms_nano(9, 10, 11, 12_000_000));
+
+// dynamic verification
+assert_eq!(UTC.ymd_opt(2014, 7, 8).and_hms_opt(21, 15, 33),
+           LocalResult::Single(UTC.ymd(2014, 7, 8).and_hms(21, 15, 33)));
+assert_eq!(UTC.ymd_opt(2014, 7, 8).and_hms_opt(80, 15, 33), LocalResult::None);
+assert_eq!(UTC.ymd_opt(2014, 7, 38).and_hms_opt(21, 15, 33), LocalResult::None);
+
+// other time zone objects can be used to construct a local datetime.
+// obviously, `local_dt` is normally different from `dt`, but `fixed_dt` should be identical.
+let local_dt = Local.ymd(2014, 7, 8).and_hms_milli(9, 10, 11, 12);
+let fixed_dt = FixedOffset::east(9 * 3600).ymd(2014, 7, 8).and_hms_milli(18, 10, 11, 12);
+assert_eq!(dt, fixed_dt);
+~~~~
+
+Various properties are available to the date and time, and can be altered individually.
+Most of them are defined in the traits [`Datelike`](https://lifthrasiir.github.io/rust-chrono/chrono/trait.Datelike.html) and
+[`Timelike`](https://lifthrasiir.github.io/rust-chrono/chrono/trait.Timelike.html) which you should `use` before.
+Addition and subtraction is also supported.
+The following illustrates most supported operations to the date and time:
+
+~~~~ {.rust}
+use chrono::*;
+
+// assume this returned `2014-11-28T21:45:59.324310806+09:00`:
+let dt = Local::now();
+
+// property accessors
+assert_eq!((dt.year(), dt.month(), dt.day()), (2014, 11, 28));
+assert_eq!((dt.month0(), dt.day0()), (10, 27)); // for unfortunate souls
+assert_eq!((dt.hour(), dt.minute(), dt.second()), (21, 45, 59));
+assert_eq!(dt.weekday(), Weekday::Fri);
+assert_eq!(dt.weekday().number_from_monday(), 5); // Mon=1, ..., Sat=7
+assert_eq!(dt.ordinal(), 332); // the day of year
+assert_eq!(dt.num_days_from_ce(), 735565); // the number of days from and including Jan 1, 1
+
+// time zone accessor and manipulation
+assert_eq!(dt.offset().local_minus_utc(), Duration::hours(9));
+assert_eq!(dt.timezone(), FixedOffset::east(9 * 3600));
+assert_eq!(dt.with_timezone(&UTC), UTC.ymd(2014, 11, 28).and_hms_nano(12, 45, 59, 324310806));
+
+// a sample of property manipulations (validates dynamically)
+assert_eq!(dt.with_day(29).unwrap().weekday(), Weekday::Sat); // 2014-11-29 is Saturday
+assert_eq!(dt.with_day(32), None);
+assert_eq!(dt.with_year(-300).unwrap().num_days_from_ce(), -109606); // November 29, 301 BCE
+
+// arithmetic operations
+assert_eq!(UTC.ymd(2014, 11, 14).and_hms(8, 9, 10) - UTC.ymd(2014, 11, 14).and_hms(10, 9, 8),
+           Duration::seconds(-2 * 3600 + 2));
+assert_eq!(UTC.ymd(1970, 1, 1).and_hms(0, 0, 0) + Duration::seconds(1_000_000_000),
+           UTC.ymd(2001, 9, 9).and_hms(1, 46, 40));
+assert_eq!(UTC.ymd(1970, 1, 1).and_hms(0, 0, 0) - Duration::seconds(1_000_000_000),
+           UTC.ymd(1938, 4, 24).and_hms(22, 13, 20));
+~~~~
+
+Formatting is done via the [`format`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.format) method,
+which format is equivalent to the familiar `strftime` format.
+(See the [`format::strftime` module documentation](https://lifthrasiir.github.io/rust-chrono/chrono/format/strftime/index.html#specifiers)
+for full syntax.)
+
+The default `to_string` method and `{:?}` specifier also give a reasonable representation.
+Chrono also provides [`to_rfc2822`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.to_rfc2822) and
+[`to_rfc3339`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.to_rfc3339) methods
+for well-known formats.
+
+~~~~ {.rust}
+use chrono::*;
+
+let dt = UTC.ymd(2014, 11, 28).and_hms(12, 0, 9);
+assert_eq!(dt.format("%Y-%m-%d %H:%M:%S").to_string(), "2014-11-28 12:00:09");
+assert_eq!(dt.format("%a %b %e %T %Y").to_string(), "Fri Nov 28 12:00:09 2014");
+assert_eq!(dt.format("%a %b %e %T %Y").to_string(), dt.format("%c").to_string());
+
+assert_eq!(dt.to_string(), "2014-11-28 12:00:09 UTC");
+assert_eq!(dt.to_rfc2822(), "Fri, 28 Nov 2014 12:00:09 +0000");
+assert_eq!(dt.to_rfc3339(), "2014-11-28T12:00:09+00:00");
+assert_eq!(format!("{:?}", dt), "2014-11-28T12:00:09Z");
+~~~~
+
+Parsing can be done with three methods:
+
+1. The standard [`FromStr`](https://doc.rust-lang.org/std/str/trait.FromStr.html) trait
+   (and [`parse`](https://doc.rust-lang.org/std/primitive.str.html#method.parse) method
+   on a string) can be used for parsing `DateTime<FixedOffset>`, `DateTime<UTC>` and
+   `DateTime<Local>` values. This parses what the `{:?}`
+   ([`std::fmt::Debug`](https://doc.rust-lang.org/std/fmt/trait.Debug.html))
+   format specifier prints, and requires the offset to be present.
+
+2. [`DateTime::parse_from_str`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.parse_from_str) parses
+   a date and time with offsets and returns `DateTime<FixedOffset>`.
+   This should be used when the offset is a part of input and the caller cannot guess that.
+   It *cannot* be used when the offset can be missing.
+   [`DateTime::parse_from_rfc2822`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.parse_from_rfc2822)
+   and
+   [`DateTime::parse_from_rfc3339`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.parse_from_rfc3339)
+   are similar but for well-known formats.
+
+3. [`Offset::datetime_from_str`](https://lifthrasiir.github.io/rust-chrono/chrono/offset/trait.TimeZone.html#method.datetime_from_str) is
+   similar but returns `DateTime` of given offset.
+   When the explicit offset is missing from the input, it simply uses given offset.
+   It issues an error when the input contains an explicit offset different
+   from the current offset.
+
+More detailed control over the parsing process is available via
+[`format`](https://lifthrasiir.github.io/rust-chrono/chrono/format/index.html) module.
+
+~~~~ {.rust}
+use chrono::*;
+
+let dt = UTC.ymd(2014, 11, 28).and_hms(12, 0, 9);
+let fixed_dt = dt.with_timezone(&FixedOffset::east(9*3600));
+
+// method 1
+assert_eq!("2014-11-28T12:00:09Z".parse::<DateTime<UTC>>(), Ok(dt.clone()));
+assert_eq!("2014-11-28T21:00:09+09:00".parse::<DateTime<UTC>>(), Ok(dt.clone()));
+assert_eq!("2014-11-28T21:00:09+09:00".parse::<DateTime<FixedOffset>>(), Ok(fixed_dt.clone()));
+
+// method 2
+assert_eq!(DateTime::parse_from_str("2014-11-28 21:00:09 +09:00", "%Y-%m-%d %H:%M:%S %z"),
+           Ok(fixed_dt.clone()));
+assert_eq!(DateTime::parse_from_rfc2822("Fri, 28 Nov 2014 21:00:09 +0900"),
+           Ok(fixed_dt.clone()));
+assert_eq!(DateTime::parse_from_rfc3339("2014-11-28T21:00:09+09:00"), Ok(fixed_dt.clone()));
+
+// method 3
+assert_eq!(UTC.datetime_from_str("2014-11-28 12:00:09", "%Y-%m-%d %H:%M:%S"), Ok(dt.clone()));
+assert_eq!(UTC.datetime_from_str("Fri Nov 28 12:00:09 2014", "%a %b %e %T %Y"), Ok(dt.clone()));
+
+// oops, the year is missing!
+assert!(UTC.datetime_from_str("Fri Nov 28 12:00:09", "%a %b %e %T %Y").is_err());
+// oops, the format string does not include the year at all!
+assert!(UTC.datetime_from_str("Fri Nov 28 12:00:09", "%a %b %e %T").is_err());
+// oops, the weekday is incorrect!
+assert!(UTC.datetime_from_str("Sat Nov 28 12:00:09 2014", "%a %b %e %T %Y").is_err());
+~~~~
+
+### Individual date
+
+Chrono also provides an individual date type ([**`Date`**](https://lifthrasiir.github.io/rust-chrono/chrono/date/struct.Date.html)).
+It also has time zones attached, and have to be constructed via time zones.
+Most operations available to `DateTime` are also available to `Date` whenever appropriate.
+
+~~~~ {.rust}
+use chrono::*;
+
+assert_eq!(UTC::today(), UTC::now().date());
+assert_eq!(Local::today(), Local::now().date());
+
+assert_eq!(UTC.ymd(2014, 11, 28).weekday(), Weekday::Fri);
+assert_eq!(UTC.ymd_opt(2014, 11, 31), LocalResult::None);
+assert_eq!(UTC.ymd(2014, 11, 28).and_hms_milli(7, 8, 9, 10).format("%H%M%S").to_string(),
+           "070809");
+~~~~
+
+There is no timezone-aware `Time` due to the lack of usefulness and also the complexity.
+
+`DateTime` has [`date`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.date) method
+which returns a `Date` which represents its date component.
+There is also a [`time`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.time) method,
+which simply returns a naive local time described below.
+
+### Naive date and time
+
+Chrono provides naive counterparts to `Date`, (non-existent) `Time` and `DateTime`
+as [**`NaiveDate`**](https://lifthrasiir.github.io/rust-chrono/chrono/naive/date/struct.NaiveDate.html),
+[**`NaiveTime`**](https://lifthrasiir.github.io/rust-chrono/chrono/naive/time/struct.NaiveTime.html) and
+[**`NaiveDateTime`**](https://lifthrasiir.github.io/rust-chrono/chrono/naive/datetime/struct.NaiveDateTime.html) respectively.
+
+They have almost equivalent interfaces as their timezone-aware twins,
+but are not associated to time zones obviously and can be quite low-level.
+They are mostly useful for building blocks for higher-level types.
+
+Timezone-aware `DateTime` and `Date` types have two methods returning naive versions:
+[`naive_local`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.naive_local) returns
+a view to the naive local time,
+and [`naive_utc`](https://lifthrasiir.github.io/rust-chrono/chrono/datetime/struct.DateTime.html#method.naive_utc) returns
+a view to the naive UTC time.
+
+## Limitations
+
+Only proleptic Gregorian calendar (i.e. extended to support older dates) is supported.
+Be very careful if you really have to deal with pre-20C dates, they can be in Julian or others.
+
+Date types are limited in about +/- 262,000 years from the common epoch.
+Time types are limited in the nanosecond accuracy.
+
+[Leap seconds are supported in the representation but
+Chrono doesn't try to make use of them](https://lifthrasiir.github.io/rust-chrono/chrono/naive/time/index.html#leap-second-handling).
+(The main reason is that leap seconds are not really predictable.)
+Almost *every* operation over the possible leap seconds will ignore them.
+Consider using `NaiveDateTime` with the implicit TAI (International Atomic Time) scale
+if you want.
+
+Chrono inherently does not support an inaccurate or partial date and time representation.
+Any operation that can be ambiguous will return `None` in such cases.
+For example, "a month later" of 2014-01-30 is not well-defined
+and consequently `UTC.ymd(2014, 1, 30).with_month(2)` returns `None`.
+
+Advanced time zone handling is not yet supported (but is planned in 0.3).
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/date.rs
@@ -0,0 +1,482 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * ISO 8601 calendar date with time zone.
+ */
+
+use std::{fmt, hash};
+use std::cmp::Ordering;
+use std::ops::{Add, Sub};
+
+use {Weekday, Datelike};
+use duration::Duration;
+use offset::{TimeZone, Offset};
+use offset::utc::UTC;
+use naive;
+use naive::date::NaiveDate;
+use naive::time::NaiveTime;
+use datetime::DateTime;
+use format::{Item, DelayedFormat, StrftimeItems};
+
+/// ISO 8601 calendar date with time zone.
+///
+/// This type should be considered ambiguous at best,
+/// due to the inherent lack of precision required for the time zone resolution.
+/// There are some guarantees on the usage of `Date<Tz>`:
+///
+/// - If properly constructed via `TimeZone::ymd` and others without an error,
+///   the corresponding local date should exist for at least a moment.
+///   (It may still have a gap from the offset changes.)
+///
+/// - The `TimeZone` is free to assign *any* `Offset` to the local date,
+///   as long as that offset did occur in given day.
+///   For example, if `2015-03-08T01:59-08:00` is followed by `2015-03-08T03:00-07:00`,
+///   it may produce either `2015-03-08-08:00` or `2015-03-08-07:00`
+///   but *not* `2015-03-08+00:00` and others.
+///
+/// - Once constructed as a full `DateTime`,
+///   `DateTime::date` and other associated methods should return those for the original `Date`.
+///   For example, if `dt = tz.ymd(y,m,d).hms(h,n,s)` were valid, `dt.date() == tz.ymd(y,m,d)`.
+///
+/// - The date is timezone-agnostic up to one day (i.e. practically always),
+///   so the local date and UTC date should be equal for most cases
+///   even though the raw calculation between `NaiveDate` and `Duration` may not.
+#[derive(Clone)]
+pub struct Date<Tz: TimeZone> {
+    date: NaiveDate,
+    offset: Tz::Offset,
+}
+
+/// The minimum possible `Date`.
+pub const MIN: Date<UTC> = Date { date: naive::date::MIN, offset: UTC };
+/// The maximum possible `Date`.
+pub const MAX: Date<UTC> = Date { date: naive::date::MAX, offset: UTC };
+
+impl<Tz: TimeZone> Date<Tz> {
+    /// Makes a new `Date` with given *UTC* date and offset.
+    /// The local date should be constructed via the `TimeZone` trait.
+    //
+    // note: this constructor is purposedly not named to `new` to discourage the direct usage.
+    #[inline]
+    pub fn from_utc(date: NaiveDate, offset: Tz::Offset) -> Date<Tz> {
+        Date { date: date, offset: offset }
+    }
+
+    /// Makes a new `DateTime` from the current date and given `NaiveTime`.
+    /// The offset in the current date is preserved.
+    ///
+    /// Panics on invalid datetime.
+    #[inline]
+    pub fn and_time(&self, time: NaiveTime) -> Option<DateTime<Tz>> {
+        let localdt = self.naive_local().and_time(time);
+        self.timezone().from_local_datetime(&localdt).single()
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute and second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Panics on invalid hour, minute and/or second.
+    #[inline]
+    pub fn and_hms(&self, hour: u32, min: u32, sec: u32) -> DateTime<Tz> {
+        self.and_hms_opt(hour, min, sec).expect("invalid time")
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute and second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Returns `None` on invalid hour, minute and/or second.
+    #[inline]
+    pub fn and_hms_opt(&self, hour: u32, min: u32, sec: u32) -> Option<DateTime<Tz>> {
+        NaiveTime::from_hms_opt(hour, min, sec).and_then(|time| self.and_time(time))
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and millisecond.
+    /// The millisecond part can exceed 1,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Panics on invalid hour, minute, second and/or millisecond.
+    #[inline]
+    pub fn and_hms_milli(&self, hour: u32, min: u32, sec: u32, milli: u32) -> DateTime<Tz> {
+        self.and_hms_milli_opt(hour, min, sec, milli).expect("invalid time")
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and millisecond.
+    /// The millisecond part can exceed 1,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or millisecond.
+    #[inline]
+    pub fn and_hms_milli_opt(&self, hour: u32, min: u32, sec: u32,
+                             milli: u32) -> Option<DateTime<Tz>> {
+        NaiveTime::from_hms_milli_opt(hour, min, sec, milli).and_then(|time| self.and_time(time))
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and microsecond.
+    /// The microsecond part can exceed 1,000,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Panics on invalid hour, minute, second and/or microsecond.
+    #[inline]
+    pub fn and_hms_micro(&self, hour: u32, min: u32, sec: u32, micro: u32) -> DateTime<Tz> {
+        self.and_hms_micro_opt(hour, min, sec, micro).expect("invalid time")
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and microsecond.
+    /// The microsecond part can exceed 1,000,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or microsecond.
+    #[inline]
+    pub fn and_hms_micro_opt(&self, hour: u32, min: u32, sec: u32,
+                             micro: u32) -> Option<DateTime<Tz>> {
+        NaiveTime::from_hms_micro_opt(hour, min, sec, micro).and_then(|time| self.and_time(time))
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and nanosecond.
+    /// The nanosecond part can exceed 1,000,000,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Panics on invalid hour, minute, second and/or nanosecond.
+    #[inline]
+    pub fn and_hms_nano(&self, hour: u32, min: u32, sec: u32, nano: u32) -> DateTime<Tz> {
+        self.and_hms_nano_opt(hour, min, sec, nano).expect("invalid time")
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and nanosecond.
+    /// The nanosecond part can exceed 1,000,000,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or nanosecond.
+    #[inline]
+    pub fn and_hms_nano_opt(&self, hour: u32, min: u32, sec: u32,
+                            nano: u32) -> Option<DateTime<Tz>> {
+        NaiveTime::from_hms_nano_opt(hour, min, sec, nano).and_then(|time| self.and_time(time))
+    }
+
+    /// Makes a new `Date` for the next date.
+    ///
+    /// Panics when `self` is the last representable date.
+    #[inline]
+    pub fn succ(&self) -> Date<Tz> {
+        self.succ_opt().expect("out of bound")
+    }
+
+    /// Makes a new `Date` for the next date.
+    ///
+    /// Returns `None` when `self` is the last representable date.
+    #[inline]
+    pub fn succ_opt(&self) -> Option<Date<Tz>> {
+        self.date.succ_opt().map(|date| Date::from_utc(date, self.offset.clone()))
+    }
+
+    /// Makes a new `Date` for the prior date.
+    ///
+    /// Panics when `self` is the first representable date.
+    #[inline]
+    pub fn pred(&self) -> Date<Tz> {
+        self.pred_opt().expect("out of bound")
+    }
+
+    /// Makes a new `Date` for the prior date.
+    ///
+    /// Returns `None` when `self` is the first representable date.
+    #[inline]
+    pub fn pred_opt(&self) -> Option<Date<Tz>> {
+        self.date.pred_opt().map(|date| Date::from_utc(date, self.offset.clone()))
+    }
+
+    /// Retrieves an associated offset from UTC.
+    #[inline]
+    pub fn offset<'a>(&'a self) -> &'a Tz::Offset {
+        &self.offset
+    }
+
+    /// Retrieves an associated time zone.
+    #[inline]
+    pub fn timezone(&self) -> Tz {
+        TimeZone::from_offset(&self.offset)
+    }
+
+    /// Changes the associated time zone.
+    /// This does not change the actual `Date` (but will change the string representation).
+    #[inline]
+    pub fn with_timezone<Tz2: TimeZone>(&self, tz: &Tz2) -> Date<Tz2> {
+        tz.from_utc_date(&self.date)
+    }
+
+    /// Adds given `Duration` to the current date.
+    ///
+    /// Returns `None` when it will result in overflow.
+    #[inline]
+    pub fn checked_add(self, rhs: Duration) -> Option<Date<Tz>> {
+        let date = try_opt!(self.date.checked_add(rhs));
+        Some(Date { date: date, offset: self.offset })
+    }
+
+    /// Subtracts given `Duration` from the current date.
+    ///
+    /// Returns `None` when it will result in overflow.
+    #[inline]
+    pub fn checked_sub(self, rhs: Duration) -> Option<Date<Tz>> {
+        let date = try_opt!(self.date.checked_sub(rhs));
+        Some(Date { date: date, offset: self.offset })
+    }
+
+    /// Returns a view to the naive UTC date.
+    #[inline]
+    pub fn naive_utc(&self) -> NaiveDate {
+        self.date
+    }
+
+    /// Returns a view to the naive local date.
+    #[inline]
+    pub fn naive_local(&self) -> NaiveDate {
+        self.date + self.offset.local_minus_utc()
+    }
+}
+
+/// Maps the local date to other date with given conversion function.
+fn map_local<Tz: TimeZone, F>(d: &Date<Tz>, mut f: F) -> Option<Date<Tz>>
+        where F: FnMut(NaiveDate) -> Option<NaiveDate> {
+    f(d.naive_local()).and_then(|date| d.timezone().from_local_date(&date).single())
+}
+
+impl<Tz: TimeZone> Date<Tz> where Tz::Offset: fmt::Display {
+    /// Formats the date with the specified formatting items.
+    #[inline]
+    pub fn format_with_items<'a, I>(&self, items: I) -> DelayedFormat<I>
+            where I: Iterator<Item=Item<'a>> + Clone {
+        DelayedFormat::new_with_offset(Some(self.naive_local()), None, &self.offset, items)
+    }
+
+    /// Formats the date with the specified format string.
+    /// See the [`format::strftime` module](../format/strftime/index.html)
+    /// on the supported escape sequences.
+    #[inline]
+    pub fn format<'a>(&self, fmt: &'a str) -> DelayedFormat<StrftimeItems<'a>> {
+        self.format_with_items(StrftimeItems::new(fmt))
+    }
+}
+
+impl<Tz: TimeZone> Datelike for Date<Tz> {
+    #[inline] fn year(&self) -> i32 { self.naive_local().year() }
+    #[inline] fn month(&self) -> u32 { self.naive_local().month() }
+    #[inline] fn month0(&self) -> u32 { self.naive_local().month0() }
+    #[inline] fn day(&self) -> u32 { self.naive_local().day() }
+    #[inline] fn day0(&self) -> u32 { self.naive_local().day0() }
+    #[inline] fn ordinal(&self) -> u32 { self.naive_local().ordinal() }
+    #[inline] fn ordinal0(&self) -> u32 { self.naive_local().ordinal0() }
+    #[inline] fn weekday(&self) -> Weekday { self.naive_local().weekday() }
+    #[inline] fn isoweekdate(&self) -> (i32, u32, Weekday) { self.naive_local().isoweekdate() }
+
+    #[inline]
+    fn with_year(&self, year: i32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_year(year))
+    }
+
+    #[inline]
+    fn with_month(&self, month: u32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_month(month))
+    }
+
+    #[inline]
+    fn with_month0(&self, month0: u32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_month0(month0))
+    }
+
+    #[inline]
+    fn with_day(&self, day: u32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_day(day))
+    }
+
+    #[inline]
+    fn with_day0(&self, day0: u32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_day0(day0))
+    }
+
+    #[inline]
+    fn with_ordinal(&self, ordinal: u32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_ordinal(ordinal))
+    }
+
+    #[inline]
+    fn with_ordinal0(&self, ordinal0: u32) -> Option<Date<Tz>> {
+        map_local(self, |date| date.with_ordinal0(ordinal0))
+    }
+}
+
+// we need them as automatic impls cannot handle associated types
+impl<Tz: TimeZone> Copy for Date<Tz> where <Tz as TimeZone>::Offset: Copy {}
+unsafe impl<Tz: TimeZone> Send for Date<Tz> where <Tz as TimeZone>::Offset: Send {}
+
+impl<Tz: TimeZone, Tz2: TimeZone> PartialEq<Date<Tz2>> for Date<Tz> {
+    fn eq(&self, other: &Date<Tz2>) -> bool { self.date == other.date }
+}
+
+impl<Tz: TimeZone> Eq for Date<Tz> {
+}
+
+impl<Tz: TimeZone> PartialOrd for Date<Tz> {
+    fn partial_cmp(&self, other: &Date<Tz>) -> Option<Ordering> {
+        self.date.partial_cmp(&other.date)
+    }
+}
+
+impl<Tz: TimeZone> Ord for Date<Tz> {
+    fn cmp(&self, other: &Date<Tz>) -> Ordering { self.date.cmp(&other.date) }
+}
+
+impl<Tz: TimeZone> hash::Hash for Date<Tz> {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) { self.date.hash(state) }
+}
+
+impl<Tz: TimeZone> Add<Duration> for Date<Tz> {
+    type Output = Date<Tz>;
+
+    #[inline]
+    fn add(self, rhs: Duration) -> Date<Tz> {
+        self.checked_add(rhs).expect("`Date + Duration` overflowed")
+    }
+}
+
+impl<Tz: TimeZone, Tz2: TimeZone> Sub<Date<Tz2>> for Date<Tz> {
+    type Output = Duration;
+
+    #[inline]
+    fn sub(self, rhs: Date<Tz2>) -> Duration { self.date - rhs.date }
+}
+
+impl<Tz: TimeZone> Sub<Duration> for Date<Tz> {
+    type Output = Date<Tz>;
+
+    #[inline]
+    fn sub(self, rhs: Duration) -> Date<Tz> {
+        self.checked_sub(rhs).expect("`Date - Duration` overflowed")
+    }
+}
+
+impl<Tz: TimeZone> fmt::Debug for Date<Tz> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{:?}{:?}", self.naive_local(), self.offset)
+    }
+}
+
+impl<Tz: TimeZone> fmt::Display for Date<Tz> where Tz::Offset: fmt::Display {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}{}", self.naive_local(), self.offset)
+    }
+}
+
+#[cfg(feature = "rustc-serialize")]
+mod rustc_serialize {
+    use super::Date;
+    use offset::TimeZone;
+    use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
+
+    // TODO the current serialization format is NEVER intentionally defined.
+    // in the future it is likely to be redefined to more sane and reasonable format.
+
+    impl<Tz: TimeZone> Encodable for Date<Tz> where Tz::Offset: Encodable {
+        fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+            s.emit_struct("Date", 2, |s| {
+                try!(s.emit_struct_field("date", 0, |s| self.date.encode(s)));
+                try!(s.emit_struct_field("offset", 1, |s| self.offset.encode(s)));
+                Ok(())
+            })
+        }
+    }
+
+    impl<Tz: TimeZone> Decodable for Date<Tz> where Tz::Offset: Decodable {
+        fn decode<D: Decoder>(d: &mut D) -> Result<Date<Tz>, D::Error> {
+            d.read_struct("Date", 2, |d| {
+                let date = try!(d.read_struct_field("date", 0, Decodable::decode));
+                let offset = try!(d.read_struct_field("offset", 1, Decodable::decode));
+                Ok(Date::from_utc(date, offset))
+            })
+        }
+    }
+
+    #[test]
+    fn test_encodable() {
+        use offset::utc::UTC;
+        use rustc_serialize::json::encode;
+
+        assert_eq!(encode(&UTC.ymd(2014, 7, 24)).ok(),
+                   Some(r#"{"date":{"ymdf":16501977},"offset":{}}"#.into()));
+    }
+
+    #[test]
+    fn test_decodable() {
+        use offset::utc::UTC;
+        use rustc_serialize::json;
+
+        let decode = |s: &str| json::decode::<Date<UTC>>(s);
+
+        assert_eq!(decode(r#"{"date":{"ymdf":16501977},"offset":{}}"#).ok(),
+                   Some(UTC.ymd(2014, 7, 24)));
+
+        assert!(decode(r#"{"date":{"ymdf":0},"offset":{}}"#).is_err());
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::fmt;
+
+    use Datelike;
+    use duration::Duration;
+    use naive::date::NaiveDate;
+    use naive::datetime::NaiveDateTime;
+    use offset::{TimeZone, Offset, LocalResult};
+    use offset::local::Local;
+
+    #[derive(Copy, Clone, PartialEq, Eq)]
+    struct UTC1y; // same to UTC but with an offset of 365 days
+
+    #[derive(Copy, Clone, PartialEq, Eq)]
+    struct OneYear;
+
+    impl TimeZone for UTC1y {
+        type Offset = OneYear;
+
+        fn from_offset(_offset: &OneYear) -> UTC1y { UTC1y }
+
+        fn offset_from_local_date(&self, _local: &NaiveDate) -> LocalResult<OneYear> {
+            LocalResult::Single(OneYear)
+        }
+        fn offset_from_local_datetime(&self, _local: &NaiveDateTime) -> LocalResult<OneYear> {
+            LocalResult::Single(OneYear)
+        }
+
+        fn offset_from_utc_date(&self, _utc: &NaiveDate) -> OneYear { OneYear }
+        fn offset_from_utc_datetime(&self, _utc: &NaiveDateTime) -> OneYear { OneYear }
+    }
+
+    impl Offset for OneYear {
+        fn local_minus_utc(&self) -> Duration { Duration::days(365) }
+    }
+
+    impl fmt::Debug for OneYear {
+        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "+8760:00") }
+    }
+
+    #[test]
+    fn test_date_weird_offset() {
+        assert_eq!(format!("{:?}", UTC1y.ymd(2012, 2, 29)),
+                   "2012-02-29+8760:00".to_string());
+        assert_eq!(format!("{:?}", UTC1y.ymd(2012, 2, 29).and_hms(5, 6, 7)),
+                   "2012-02-29T05:06:07+8760:00".to_string());
+        assert_eq!(format!("{:?}", UTC1y.ymd(2012, 3, 4)),
+                   "2012-03-04+8760:00".to_string());
+        assert_eq!(format!("{:?}", UTC1y.ymd(2012, 3, 4).and_hms(5, 6, 7)),
+                   "2012-03-04T05:06:07+8760:00".to_string());
+    }
+
+    #[test]
+    fn test_local_date_sanity_check() { // issue #27
+        assert_eq!(Local.ymd(2999, 12, 28).day(), 28);
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/datetime.rs
@@ -0,0 +1,723 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * ISO 8601 date and time with time zone.
+ */
+
+use std::{str, fmt, hash};
+use std::cmp::Ordering;
+use std::ops::{Add, Sub};
+
+use {Weekday, Timelike, Datelike};
+use offset::{TimeZone, Offset};
+use offset::utc::UTC;
+use offset::local::Local;
+use offset::fixed::FixedOffset;
+use duration::Duration;
+use naive::time::NaiveTime;
+use naive::datetime::NaiveDateTime;
+use date::Date;
+use format::{Item, Numeric, Pad, Fixed};
+use format::{parse, Parsed, ParseError, ParseResult, DelayedFormat, StrftimeItems};
+
+/// ISO 8601 combined date and time with time zone.
+#[derive(Clone)]
+pub struct DateTime<Tz: TimeZone> {
+    datetime: NaiveDateTime,
+    offset: Tz::Offset,
+}
+
+impl<Tz: TimeZone> DateTime<Tz> {
+    /// Makes a new `DateTime` with given *UTC* datetime and offset.
+    /// The local datetime should be constructed via the `TimeZone` trait.
+    //
+    // note: this constructor is purposedly not named to `new` to discourage the direct usage.
+    #[inline]
+    pub fn from_utc(datetime: NaiveDateTime, offset: Tz::Offset) -> DateTime<Tz> {
+        DateTime { datetime: datetime, offset: offset }
+    }
+
+    /// Retrieves a date component.
+    #[inline]
+    pub fn date(&self) -> Date<Tz> {
+        Date::from_utc(self.naive_local().date(), self.offset.clone())
+    }
+
+    /// Retrieves a time component.
+    /// Unlike `date`, this is not associated to the time zone.
+    #[inline]
+    pub fn time(&self) -> NaiveTime {
+        self.datetime.time() + self.offset.local_minus_utc()
+    }
+
+    /// Returns the number of non-leap seconds since January 1, 1970 0:00:00 UTC
+    /// (aka "UNIX timestamp").
+    #[inline]
+    pub fn timestamp(&self) -> i64 {
+        self.datetime.timestamp()
+    }
+
+    /// Returns the number of milliseconds since the last second boundary
+    ///
+    /// warning: in event of a leap second, this may exceed 999
+    ///
+    /// note: this is not the number of milliseconds since January 1, 1970 0:00:00 UTC
+    #[inline]
+    pub fn timestamp_subsec_millis(&self) -> u32 {
+        self.datetime.timestamp_subsec_millis()
+    }
+
+    /// Returns the number of microseconds since the last second boundary
+    ///
+    /// warning: in event of a leap second, this may exceed 999_999
+    ///
+    /// note: this is not the number of microseconds since January 1, 1970 0:00:00 UTC
+    #[inline]
+    pub fn timestamp_subsec_micros(&self) -> u32 {
+        self.datetime.timestamp_subsec_micros()
+    }
+
+    /// Returns the number of nanoseconds since the last second boundary
+    ///
+    /// warning: in event of a leap second, this may exceed 999_999_999
+    ///
+    /// note: this is not the number of nanoseconds since January 1, 1970 0:00:00 UTC
+    #[inline]
+    pub fn timestamp_subsec_nanos(&self) -> u32 {
+        self.datetime.timestamp_subsec_nanos()
+    }
+
+    /// *Deprecated*: Same to `DateTime::timestamp`.
+    #[inline]
+    pub fn num_seconds_from_unix_epoch(&self) -> i64 {
+        self.timestamp()
+    }
+
+    /// Retrieves an associated offset from UTC.
+    #[inline]
+    pub fn offset<'a>(&'a self) -> &'a Tz::Offset {
+        &self.offset
+    }
+
+    /// Retrieves an associated time zone.
+    #[inline]
+    pub fn timezone(&self) -> Tz {
+        TimeZone::from_offset(&self.offset)
+    }
+
+    /// Changes the associated time zone.
+    /// This does not change the actual `DateTime` (but will change the string representation).
+    #[inline]
+    pub fn with_timezone<Tz2: TimeZone>(&self, tz: &Tz2) -> DateTime<Tz2> {
+        tz.from_utc_datetime(&self.datetime)
+    }
+
+    /// Adds given `Duration` to the current date and time.
+    ///
+    /// Returns `None` when it will result in overflow.
+    #[inline]
+    pub fn checked_add(self, rhs: Duration) -> Option<DateTime<Tz>> {
+        let datetime = try_opt!(self.datetime.checked_add(rhs));
+        Some(DateTime { datetime: datetime, offset: self.offset })
+    }
+
+    /// Subtracts given `Duration` from the current date and time.
+    ///
+    /// Returns `None` when it will result in overflow.
+    #[inline]
+    pub fn checked_sub(self, rhs: Duration) -> Option<DateTime<Tz>> {
+        let datetime = try_opt!(self.datetime.checked_sub(rhs));
+        Some(DateTime { datetime: datetime, offset: self.offset })
+    }
+
+    /// Returns a view to the naive UTC datetime.
+    #[inline]
+    pub fn naive_utc(&self) -> NaiveDateTime {
+        self.datetime
+    }
+
+    /// Returns a view to the naive local datetime.
+    #[inline]
+    pub fn naive_local(&self) -> NaiveDateTime {
+        self.datetime + self.offset.local_minus_utc()
+    }
+}
+
+/// Maps the local datetime to other datetime with given conversion function.
+fn map_local<Tz: TimeZone, F>(dt: &DateTime<Tz>, mut f: F) -> Option<DateTime<Tz>>
+        where F: FnMut(NaiveDateTime) -> Option<NaiveDateTime> {
+    f(dt.naive_local()).and_then(|datetime| dt.timezone().from_local_datetime(&datetime).single())
+}
+
+impl DateTime<FixedOffset> {
+    /// Parses an RFC 2822 date and time string such as `Tue, 1 Jul 2003 10:52:37 +0200`,
+    /// then returns a new `DateTime` with a parsed `FixedOffset`.
+    pub fn parse_from_rfc2822(s: &str) -> ParseResult<DateTime<FixedOffset>> {
+        const ITEMS: &'static [Item<'static>] = &[Item::Fixed(Fixed::RFC2822)];
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, ITEMS.iter().cloned()));
+        parsed.to_datetime()
+    }
+
+    /// Parses an RFC 3339 and ISO 8601 date and time string such as `1996-12-19T16:39:57-08:00`,
+    /// then returns a new `DateTime` with a parsed `FixedOffset`.
+    ///
+    /// Why isn't this named `parse_from_iso8601`? That's because ISO 8601 allows some freedom
+    /// over the syntax and RFC 3339 exercises that freedom to rigidly define a fixed format.
+    pub fn parse_from_rfc3339(s: &str) -> ParseResult<DateTime<FixedOffset>> {
+        const ITEMS: &'static [Item<'static>] = &[Item::Fixed(Fixed::RFC3339)];
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, ITEMS.iter().cloned()));
+        parsed.to_datetime()
+    }
+
+    /// Parses a string with the specified format string and
+    /// returns a new `DateTime` with a parsed `FixedOffset`.
+    /// See the [`format::strftime` module](../format/strftime/index.html)
+    /// on the supported escape sequences.
+    ///
+    /// See also `Offset::datetime_from_str` which gives a local `DateTime` on specific time zone.
+    pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<DateTime<FixedOffset>> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, StrftimeItems::new(fmt)));
+        parsed.to_datetime()
+    }
+}
+
+impl<Tz: TimeZone> DateTime<Tz> where Tz::Offset: fmt::Display {
+    /// Returns an RFC 2822 date and time string such as `Tue, 1 Jul 2003 10:52:37 +0200`.
+    pub fn to_rfc2822(&self) -> String {
+        const ITEMS: &'static [Item<'static>] = &[Item::Fixed(Fixed::RFC2822)];
+        self.format_with_items(ITEMS.iter().cloned()).to_string()
+    }
+
+    /// Returns an RFC 3339 and ISO 8601 date and time string such as `1996-12-19T16:39:57-08:00`.
+    pub fn to_rfc3339(&self) -> String {
+        const ITEMS: &'static [Item<'static>] = &[Item::Fixed(Fixed::RFC3339)];
+        self.format_with_items(ITEMS.iter().cloned()).to_string()
+    }
+
+    /// Formats the combined date and time with the specified formatting items.
+    #[inline]
+    pub fn format_with_items<'a, I>(&self, items: I) -> DelayedFormat<I>
+            where I: Iterator<Item=Item<'a>> + Clone {
+        let local = self.naive_local();
+        DelayedFormat::new_with_offset(Some(local.date()), Some(local.time()), &self.offset, items)
+    }
+
+    /// Formats the combined date and time with the specified format string.
+    /// See the [`format::strftime` module](../format/strftime/index.html)
+    /// on the supported escape sequences.
+    #[inline]
+    pub fn format<'a>(&self, fmt: &'a str) -> DelayedFormat<StrftimeItems<'a>> {
+        self.format_with_items(StrftimeItems::new(fmt))
+    }
+}
+
+impl<Tz: TimeZone> Datelike for DateTime<Tz> {
+    #[inline] fn year(&self) -> i32 { self.naive_local().year() }
+    #[inline] fn month(&self) -> u32 { self.naive_local().month() }
+    #[inline] fn month0(&self) -> u32 { self.naive_local().month0() }
+    #[inline] fn day(&self) -> u32 { self.naive_local().day() }
+    #[inline] fn day0(&self) -> u32 { self.naive_local().day0() }
+    #[inline] fn ordinal(&self) -> u32 { self.naive_local().ordinal() }
+    #[inline] fn ordinal0(&self) -> u32 { self.naive_local().ordinal0() }
+    #[inline] fn weekday(&self) -> Weekday { self.naive_local().weekday() }
+    #[inline] fn isoweekdate(&self) -> (i32, u32, Weekday) { self.naive_local().isoweekdate() }
+
+    #[inline]
+    fn with_year(&self, year: i32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_year(year))
+    }
+
+    #[inline]
+    fn with_month(&self, month: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_month(month))
+    }
+
+    #[inline]
+    fn with_month0(&self, month0: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_month0(month0))
+    }
+
+    #[inline]
+    fn with_day(&self, day: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_day(day))
+    }
+
+    #[inline]
+    fn with_day0(&self, day0: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_day0(day0))
+    }
+
+    #[inline]
+    fn with_ordinal(&self, ordinal: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_ordinal(ordinal))
+    }
+
+    #[inline]
+    fn with_ordinal0(&self, ordinal0: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_ordinal0(ordinal0))
+    }
+}
+
+impl<Tz: TimeZone> Timelike for DateTime<Tz> {
+    #[inline] fn hour(&self) -> u32 { self.naive_local().hour() }
+    #[inline] fn minute(&self) -> u32 { self.naive_local().minute() }
+    #[inline] fn second(&self) -> u32 { self.naive_local().second() }
+    #[inline] fn nanosecond(&self) -> u32 { self.naive_local().nanosecond() }
+
+    #[inline]
+    fn with_hour(&self, hour: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_hour(hour))
+    }
+
+    #[inline]
+    fn with_minute(&self, min: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_minute(min))
+    }
+
+    #[inline]
+    fn with_second(&self, sec: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_second(sec))
+    }
+
+    #[inline]
+    fn with_nanosecond(&self, nano: u32) -> Option<DateTime<Tz>> {
+        map_local(self, |datetime| datetime.with_nanosecond(nano))
+    }
+}
+
+// we need them as automatic impls cannot handle associated types
+impl<Tz: TimeZone> Copy for DateTime<Tz> where <Tz as TimeZone>::Offset: Copy {}
+unsafe impl<Tz: TimeZone> Send for DateTime<Tz> where <Tz as TimeZone>::Offset: Send {}
+
+impl<Tz: TimeZone, Tz2: TimeZone> PartialEq<DateTime<Tz2>> for DateTime<Tz> {
+    fn eq(&self, other: &DateTime<Tz2>) -> bool { self.datetime == other.datetime }
+}
+
+impl<Tz: TimeZone> Eq for DateTime<Tz> {
+}
+
+impl<Tz: TimeZone> PartialOrd for DateTime<Tz> {
+    fn partial_cmp(&self, other: &DateTime<Tz>) -> Option<Ordering> {
+        self.datetime.partial_cmp(&other.datetime)
+    }
+}
+
+impl<Tz: TimeZone> Ord for DateTime<Tz> {
+    fn cmp(&self, other: &DateTime<Tz>) -> Ordering { self.datetime.cmp(&other.datetime) }
+}
+
+impl<Tz: TimeZone> hash::Hash for DateTime<Tz> {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) { self.datetime.hash(state) }
+}
+
+impl<Tz: TimeZone> Add<Duration> for DateTime<Tz> {
+    type Output = DateTime<Tz>;
+
+    #[inline]
+    fn add(self, rhs: Duration) -> DateTime<Tz> {
+        self.checked_add(rhs).expect("`DateTime + Duration` overflowed")
+    }
+}
+
+impl<Tz: TimeZone, Tz2: TimeZone> Sub<DateTime<Tz2>> for DateTime<Tz> {
+    type Output = Duration;
+
+    #[inline]
+    fn sub(self, rhs: DateTime<Tz2>) -> Duration { self.datetime - rhs.datetime }
+}
+
+impl<Tz: TimeZone> Sub<Duration> for DateTime<Tz> {
+    type Output = DateTime<Tz>;
+
+    #[inline]
+    fn sub(self, rhs: Duration) -> DateTime<Tz> {
+        self.checked_sub(rhs).expect("`DateTime - Duration` overflowed")
+    }
+}
+
+impl<Tz: TimeZone> fmt::Debug for DateTime<Tz> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{:?}{:?}", self.naive_local(), self.offset)
+    }
+}
+
+impl<Tz: TimeZone> fmt::Display for DateTime<Tz> where Tz::Offset: fmt::Display {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} {}", self.naive_local(), self.offset)
+    }
+}
+
+impl str::FromStr for DateTime<FixedOffset> {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> ParseResult<DateTime<FixedOffset>> {
+        const ITEMS: &'static [Item<'static>] = &[
+            Item::Space(""), Item::Numeric(Numeric::Year, Pad::Zero),
+            Item::Space(""), Item::Literal("-"),
+            Item::Space(""), Item::Numeric(Numeric::Month, Pad::Zero),
+            Item::Space(""), Item::Literal("-"),
+            Item::Space(""), Item::Numeric(Numeric::Day, Pad::Zero),
+            Item::Space(""), Item::Literal("T"), // XXX shouldn't this be case-insensitive?
+            Item::Space(""), Item::Numeric(Numeric::Hour, Pad::Zero),
+            Item::Space(""), Item::Literal(":"),
+            Item::Space(""), Item::Numeric(Numeric::Minute, Pad::Zero),
+            Item::Space(""), Item::Literal(":"),
+            Item::Space(""), Item::Numeric(Numeric::Second, Pad::Zero),
+                             Item::Fixed(Fixed::Nanosecond),
+            Item::Space(""), Item::Fixed(Fixed::TimezoneOffsetZ),
+            Item::Space(""),
+        ];
+
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, ITEMS.iter().cloned()));
+        parsed.to_datetime()
+    }
+}
+
+impl str::FromStr for DateTime<UTC> {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> ParseResult<DateTime<UTC>> {
+        s.parse::<DateTime<FixedOffset>>().map(|dt| dt.with_timezone(&UTC))
+    }
+}
+
+impl str::FromStr for DateTime<Local> {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> ParseResult<DateTime<Local>> {
+        s.parse::<DateTime<FixedOffset>>().map(|dt| dt.with_timezone(&Local))
+    }
+}
+
+#[cfg(feature = "rustc-serialize")]
+mod rustc_serialize {
+    use super::DateTime;
+    use offset::TimeZone;
+    use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
+
+    // TODO the current serialization format is NEVER intentionally defined.
+    // in the future it is likely to be redefined to more sane and reasonable format.
+
+    impl<Tz: TimeZone> Encodable for DateTime<Tz> where Tz::Offset: Encodable {
+        fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+            s.emit_struct("DateTime", 2, |s| {
+                try!(s.emit_struct_field("datetime", 0, |s| self.datetime.encode(s)));
+                try!(s.emit_struct_field("offset", 1, |s| self.offset.encode(s)));
+                Ok(())
+            })
+        }
+    }
+
+    impl<Tz: TimeZone> Decodable for DateTime<Tz> where Tz::Offset: Decodable {
+        fn decode<D: Decoder>(d: &mut D) -> Result<DateTime<Tz>, D::Error> {
+            d.read_struct("DateTime", 2, |d| {
+                let datetime = try!(d.read_struct_field("datetime", 0, Decodable::decode));
+                let offset = try!(d.read_struct_field("offset", 1, Decodable::decode));
+                Ok(DateTime::from_utc(datetime, offset))
+            })
+        }
+    }
+
+    #[test]
+    fn test_encodable() {
+        use offset::utc::UTC;
+        use rustc_serialize::json::encode;
+
+        assert_eq!(
+            encode(&UTC.ymd(2014, 7, 24).and_hms(12, 34, 6)).ok(),
+            Some(concat!(r#"{"datetime":{"date":{"ymdf":16501977},"#,
+                                      r#""time":{"secs":45246,"frac":0}},"#,
+                          r#""offset":{}}"#).into()));
+    }
+
+    #[test]
+    fn test_decodable() {
+        use offset::utc::UTC;
+        use rustc_serialize::json;
+
+        let decode = |s: &str| json::decode::<DateTime<UTC>>(s);
+
+        assert_eq!(
+            decode(r#"{"datetime":{"date":{"ymdf":16501977},
+                                   "time":{"secs":45246,"frac":0}},
+                       "offset":{}}"#).ok(),
+            Some(UTC.ymd(2014, 7, 24).and_hms(12, 34, 6)));
+
+        assert_eq!(
+            decode(r#"{"datetime":{"date":{"ymdf":0},
+                                   "time":{"secs":0,"frac":0}},
+                       "offset":{}}"#).ok(),
+            None);
+    }
+}
+
+#[cfg(feature = "serde")]
+mod serde {
+    use super::DateTime;
+    use offset::TimeZone;
+    use offset::utc::UTC;
+    use offset::local::Local;
+    use offset::fixed::FixedOffset;
+    use std::fmt::Display;
+    use serde::{ser, de};
+
+    // TODO not very optimized for space (binary formats would want something better)
+
+    impl<Tz: TimeZone> ser::Serialize for DateTime<Tz>
+        where Tz::Offset: Display
+    {
+        fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
+            where S: ser::Serializer
+        {
+            // Debug formatting is correct RFC3339, and it allows Zulu.
+            serializer.serialize_str(&format!("{:?}", self))
+        }
+    }
+
+    struct DateTimeVisitor;
+
+    impl de::Visitor for DateTimeVisitor {
+        type Value = DateTime<FixedOffset>;
+
+        fn visit_str<E>(&mut self, value: &str) -> Result<DateTime<FixedOffset>, E>
+            where E: de::Error
+        {
+            value.parse().map_err(|err| E::custom(format!("{}", err)))
+        }
+    }
+
+    impl de::Deserialize for DateTime<FixedOffset> {
+        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+            where D: de::Deserializer
+        {
+            deserializer.deserialize(DateTimeVisitor)
+        }
+    }
+
+    impl de::Deserialize for DateTime<UTC> {
+        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+            where D: de::Deserializer
+        {
+            deserializer.deserialize(DateTimeVisitor).map(|dt| dt.with_timezone(&UTC))
+        }
+    }
+
+    impl de::Deserialize for DateTime<Local> {
+        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+            where D: de::Deserializer
+        {
+            deserializer.deserialize(DateTimeVisitor).map(|dt| dt.with_timezone(&Local))
+        }
+    }
+
+    #[cfg(test)] extern crate serde_json;
+
+    #[test]
+    fn test_serde_serialize() {
+        use self::serde_json::to_string;
+
+        assert_eq!(to_string(&UTC.ymd(2014, 7, 24).and_hms(12, 34, 6)).ok(),
+                   Some(r#""2014-07-24T12:34:06Z""#.into()));
+    }
+
+    #[test]
+    fn test_serde_deserialize() {
+        use self::serde_json;
+
+        let from_str = |s: &str| serde_json::from_str::<DateTime<UTC>>(s);
+
+        assert_eq!(from_str(r#""2014-07-24T12:34:06Z""#).ok(),
+                   Some(UTC.ymd(2014, 7, 24).and_hms(12, 34, 6)));
+
+        assert!(from_str(r#""2014-07-32T12:34:06Z""#).is_err());
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::DateTime;
+    use Datelike;
+    use naive::time::NaiveTime;
+    use naive::date::NaiveDate;
+    use duration::Duration;
+    use offset::TimeZone;
+    use offset::utc::UTC;
+    use offset::local::Local;
+    use offset::fixed::FixedOffset;
+
+    #[test]
+    #[allow(non_snake_case)]
+    fn test_datetime_offset() {
+        let EST = FixedOffset::west(5*60*60);
+        let EDT = FixedOffset::west(4*60*60);
+        let KST = FixedOffset::east(9*60*60);
+
+        assert_eq!(format!("{}", UTC.ymd(2014, 5, 6).and_hms(7, 8, 9)),
+                   "2014-05-06 07:08:09 UTC");
+        assert_eq!(format!("{}", EDT.ymd(2014, 5, 6).and_hms(7, 8, 9)),
+                   "2014-05-06 07:08:09 -04:00");
+        assert_eq!(format!("{}", KST.ymd(2014, 5, 6).and_hms(7, 8, 9)),
+                   "2014-05-06 07:08:09 +09:00");
+        assert_eq!(format!("{:?}", UTC.ymd(2014, 5, 6).and_hms(7, 8, 9)),
+                   "2014-05-06T07:08:09Z");
+        assert_eq!(format!("{:?}", EDT.ymd(2014, 5, 6).and_hms(7, 8, 9)),
+                   "2014-05-06T07:08:09-04:00");
+        assert_eq!(format!("{:?}", KST.ymd(2014, 5, 6).and_hms(7, 8, 9)),
+                   "2014-05-06T07:08:09+09:00");
+
+        // edge cases
+        assert_eq!(format!("{:?}", UTC.ymd(2014, 5, 6).and_hms(0, 0, 0)),
+                   "2014-05-06T00:00:00Z");
+        assert_eq!(format!("{:?}", EDT.ymd(2014, 5, 6).and_hms(0, 0, 0)),
+                   "2014-05-06T00:00:00-04:00");
+        assert_eq!(format!("{:?}", KST.ymd(2014, 5, 6).and_hms(0, 0, 0)),
+                   "2014-05-06T00:00:00+09:00");
+        assert_eq!(format!("{:?}", UTC.ymd(2014, 5, 6).and_hms(23, 59, 59)),
+                   "2014-05-06T23:59:59Z");
+        assert_eq!(format!("{:?}", EDT.ymd(2014, 5, 6).and_hms(23, 59, 59)),
+                   "2014-05-06T23:59:59-04:00");
+        assert_eq!(format!("{:?}", KST.ymd(2014, 5, 6).and_hms(23, 59, 59)),
+                   "2014-05-06T23:59:59+09:00");
+
+        assert_eq!(UTC.ymd(2014, 5, 6).and_hms(7, 8, 9), EDT.ymd(2014, 5, 6).and_hms(3, 8, 9));
+        assert_eq!(UTC.ymd(2014, 5, 6).and_hms(7, 8, 9) + Duration::seconds(3600 + 60 + 1),
+                   UTC.ymd(2014, 5, 6).and_hms(8, 9, 10));
+        assert_eq!(UTC.ymd(2014, 5, 6).and_hms(7, 8, 9) - EDT.ymd(2014, 5, 6).and_hms(10, 11, 12),
+                   Duration::seconds(-7*3600 - 3*60 - 3));
+
+        assert_eq!(*UTC.ymd(2014, 5, 6).and_hms(7, 8, 9).offset(), UTC);
+        assert_eq!(*EDT.ymd(2014, 5, 6).and_hms(7, 8, 9).offset(), EDT);
+        assert!(*EDT.ymd(2014, 5, 6).and_hms(7, 8, 9).offset() != EST);
+    }
+
+    #[test]
+    fn test_datetime_date_and_time() {
+        let tz = FixedOffset::east(5*60*60);
+        let d = tz.ymd(2014, 5, 6).and_hms(7, 8, 9);
+        assert_eq!(d.time(), NaiveTime::from_hms(7, 8, 9));
+        assert_eq!(d.date(), tz.ymd(2014, 5, 6));
+        assert_eq!(d.date().naive_local(), NaiveDate::from_ymd(2014, 5, 6));
+        assert_eq!(d.date().and_time(d.time()), Some(d));
+
+        let tz = FixedOffset::east(4*60*60);
+        let d = tz.ymd(2016, 5, 4).and_hms(3, 2, 1);
+        assert_eq!(d.time(), NaiveTime::from_hms(3, 2, 1));
+        assert_eq!(d.date(), tz.ymd(2016, 5, 4));
+        assert_eq!(d.date().naive_local(), NaiveDate::from_ymd(2016, 5, 4));
+        assert_eq!(d.date().and_time(d.time()), Some(d));
+
+        let tz = FixedOffset::west(13*60*60);
+        let d = tz.ymd(2017, 8, 9).and_hms(12, 34, 56);
+        assert_eq!(d.time(), NaiveTime::from_hms(12, 34, 56));
+        assert_eq!(d.date(), tz.ymd(2017, 8, 9));
+        assert_eq!(d.date().naive_local(), NaiveDate::from_ymd(2017, 8, 9));
+        assert_eq!(d.date().and_time(d.time()), Some(d));
+    }
+
+    #[test]
+    fn test_datetime_with_timezone() {
+        let local_now = Local::now();
+        let utc_now = local_now.with_timezone(&UTC);
+        let local_now2 = utc_now.with_timezone(&Local);
+        assert_eq!(local_now, local_now2);
+    }
+
+    #[test]
+    #[allow(non_snake_case)]
+    fn test_datetime_rfc2822_and_rfc3339() {
+        let EDT = FixedOffset::east(5*60*60);
+        assert_eq!(UTC.ymd(2015, 2, 18).and_hms(23, 16, 9).to_rfc2822(),
+                   "Wed, 18 Feb 2015 23:16:09 +0000");
+        assert_eq!(UTC.ymd(2015, 2, 18).and_hms(23, 16, 9).to_rfc3339(),
+                   "2015-02-18T23:16:09+00:00");
+        assert_eq!(EDT.ymd(2015, 2, 18).and_hms_milli(23, 16, 9, 150).to_rfc2822(),
+                   "Wed, 18 Feb 2015 23:16:09 +0500");
+        assert_eq!(EDT.ymd(2015, 2, 18).and_hms_milli(23, 16, 9, 150).to_rfc3339(),
+                   "2015-02-18T23:16:09.150+05:00");
+        assert_eq!(EDT.ymd(2015, 2, 18).and_hms_micro(23, 59, 59, 1_234_567).to_rfc2822(),
+                   "Wed, 18 Feb 2015 23:59:60 +0500");
+        assert_eq!(EDT.ymd(2015, 2, 18).and_hms_micro(23, 59, 59, 1_234_567).to_rfc3339(),
+                   "2015-02-18T23:59:60.234567+05:00");
+
+        assert_eq!(DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 +0000"),
+                   Ok(FixedOffset::east(0).ymd(2015, 2, 18).and_hms(23, 16, 9)));
+        assert_eq!(DateTime::parse_from_rfc3339("2015-02-18T23:16:09Z"),
+                   Ok(FixedOffset::east(0).ymd(2015, 2, 18).and_hms(23, 16, 9)));
+        assert_eq!(DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:59:60 +0500"),
+                   Ok(EDT.ymd(2015, 2, 18).and_hms_milli(23, 59, 59, 1_000)));
+        assert_eq!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00"),
+                   Ok(EDT.ymd(2015, 2, 18).and_hms_micro(23, 59, 59, 1_234_567)));
+    }
+
+    #[test]
+    fn test_datetime_from_str() {
+        assert_eq!("2015-2-18T23:16:9.15Z".parse::<DateTime<FixedOffset>>(),
+                   Ok(FixedOffset::east(0).ymd(2015, 2, 18).and_hms_milli(23, 16, 9, 150)));
+        assert_eq!("2015-2-18T13:16:9.15-10:00".parse::<DateTime<FixedOffset>>(),
+                   Ok(FixedOffset::west(10 * 3600).ymd(2015, 2, 18).and_hms_milli(13, 16, 9, 150)));
+        assert!("2015-2-18T23:16:9.15".parse::<DateTime<FixedOffset>>().is_err());
+
+        assert_eq!("2015-2-18T23:16:9.15Z".parse::<DateTime<UTC>>(),
+                   Ok(UTC.ymd(2015, 2, 18).and_hms_milli(23, 16, 9, 150)));
+        assert_eq!("2015-2-18T13:16:9.15-10:00".parse::<DateTime<UTC>>(),
+                   Ok(UTC.ymd(2015, 2, 18).and_hms_milli(23, 16, 9, 150)));
+        assert!("2015-2-18T23:16:9.15".parse::<DateTime<UTC>>().is_err());
+
+        // no test for `DateTime<Local>`, we cannot verify that much.
+    }
+
+    #[test]
+    fn test_datetime_parse_from_str() {
+        let ymdhms = |y,m,d,h,n,s,off| FixedOffset::east(off).ymd(y,m,d).and_hms(h,n,s);
+        assert_eq!(DateTime::parse_from_str("2014-5-7T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
+                   Ok(ymdhms(2014, 5, 7, 12, 34, 56, 570*60))); // ignore offset
+        assert!(DateTime::parse_from_str("20140507000000", "%Y%m%d%H%M%S").is_err()); // no offset
+        assert!(DateTime::parse_from_str("Fri, 09 Aug 2013 23:54:35 GMT",
+                                         "%a, %d %b %Y %H:%M:%S GMT").is_err());
+        assert_eq!(UTC.datetime_from_str("Fri, 09 Aug 2013 23:54:35 GMT",
+                                         "%a, %d %b %Y %H:%M:%S GMT"),
+                   Ok(UTC.ymd(2013, 8, 9).and_hms(23, 54, 35)));
+    }
+
+    #[test]
+    fn test_datetime_format_with_local() {
+        // if we are not around the year boundary, local and UTC date should have the same year
+        let dt = Local::now().with_month(5).unwrap();
+        assert_eq!(dt.format("%Y").to_string(), dt.with_timezone(&UTC).format("%Y").to_string());
+    }
+
+    #[test]
+    fn test_datetime_is_copy() {
+        // UTC is known to be `Copy`.
+        let a = UTC::now();
+        let b = a;
+        assert_eq!(a, b);
+    }
+
+    #[test]
+    fn test_datetime_is_send() {
+        use std::thread;
+
+        // UTC is known to be `Send`.
+        let a = UTC::now();
+        thread::spawn(move || {
+            let _ = a;
+        }).join().unwrap();
+    }
+
+    #[test]
+    fn test_subsecond_part() {
+        let datetime = UTC.ymd(2014, 7, 8).and_hms_nano(9, 10, 11, 1234567);
+
+        assert_eq!(1,       datetime.timestamp_subsec_millis());
+        assert_eq!(1234,    datetime.timestamp_subsec_micros());
+        assert_eq!(1234567, datetime.timestamp_subsec_nanos());
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/div.rs
@@ -0,0 +1,43 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014, Kang Seonghoon.
+// Copyright 2013-2014 The Rust Project Developers.
+// See README.md and LICENSE.txt for details.
+
+//! Integer division utilities. (Shamelessly copied from [num](https://github.com/rust-lang/num/))
+
+// Algorithm from [Daan Leijen. _Division and Modulus for Computer Scientists_,
+// December 2001](http://research.microsoft.com/pubs/151917/divmodnote-letter.pdf)
+
+pub use num::integer::{div_rem, div_floor, mod_floor, div_mod_floor};
+
+#[cfg(test)]
+mod tests {
+    use super::{mod_floor, div_mod_floor};
+
+    #[test]
+    fn test_mod_floor() {
+        assert_eq!(mod_floor( 8,  3),  2);
+        assert_eq!(mod_floor( 8, -3), -1);
+        assert_eq!(mod_floor(-8,  3),  1);
+        assert_eq!(mod_floor(-8, -3), -2);
+
+        assert_eq!(mod_floor( 1,  2),  1);
+        assert_eq!(mod_floor( 1, -2), -1);
+        assert_eq!(mod_floor(-1,  2),  1);
+        assert_eq!(mod_floor(-1, -2), -1);
+    }
+
+    #[test]
+    fn test_div_mod_floor() {
+        assert_eq!(div_mod_floor( 8,  3), ( 2,  2));
+        assert_eq!(div_mod_floor( 8, -3), (-3, -1));
+        assert_eq!(div_mod_floor(-8,  3), (-3,  1));
+        assert_eq!(div_mod_floor(-8, -3), ( 2, -2));
+
+        assert_eq!(div_mod_floor( 1,  2), ( 0,  1));
+        assert_eq!(div_mod_floor( 1, -2), (-1, -1));
+        assert_eq!(div_mod_floor(-1,  2), (-1,  1));
+        assert_eq!(div_mod_floor(-1, -2), ( 0, -1));
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/format/mod.rs
@@ -0,0 +1,481 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+//! Formatting utilities for date and time.
+
+use std::fmt;
+use std::error::Error;
+
+use {Datelike, Timelike};
+use div::{div_floor, mod_floor};
+use duration::Duration;
+use offset::Offset;
+use naive::date::NaiveDate;
+use naive::time::NaiveTime;
+
+pub use self::strftime::StrftimeItems;
+pub use self::parsed::Parsed;
+pub use self::parse::parse;
+
+/// Padding characters for numeric items.
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Pad {
+    /// No padding.
+    None,
+    /// Zero (`0`) padding.
+    Zero,
+    /// Space padding.
+    Space,
+}
+
+/// Numeric item types.
+/// They have associated formatting width (FW) and parsing width (PW).
+///
+/// The **formatting width** is the minimal width to be formatted.
+/// If the number is too short, and the padding is not [`Pad::None`](./enum.Pad.html#variant.None),
+/// then it is left-padded.
+/// If the number is too long or (in some cases) negative, it is printed as is.
+///
+/// The **parsing width** is the maximal width to be scanned.
+/// The parser only tries to consume from one to given number of digits (greedily). 
+/// It also trims the preceding whitespaces if any.
+/// It cannot parse the negative number, so some date and time cannot be formatted then
+/// parsed with the same formatting items.
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Numeric {
+    /// Full Gregorian year (FW=4, PW=∞).
+    /// May accept years before 1 BCE or after 9999 CE, given an initial sign.
+    Year,
+    /// Gregorian year divided by 100 (century number; FW=PW=2). Implies the non-negative year.
+    YearDiv100,
+    /// Gregorian year modulo 100 (FW=PW=2). Cannot be negative.
+    YearMod100,
+    /// Year in the ISO week date (FW=4, PW=∞).
+    /// May accept years before 1 BCE or after 9999 CE, given an initial sign.
+    IsoYear,
+    /// Year in the ISO week date, divided by 100 (FW=PW=2). Implies the non-negative year.
+    IsoYearDiv100,
+    /// Year in the ISO week date, modulo 100 (FW=PW=2). Cannot be negative.
+    IsoYearMod100,
+    /// Month (FW=PW=2).
+    Month,
+    /// Day of the month (FW=PW=2).
+    Day,
+    /// Week number, where the week 1 starts at the first Sunday of January (FW=PW=2).
+    WeekFromSun,
+    /// Week number, where the week 1 starts at the first Monday of January (FW=PW=2).
+    WeekFromMon,
+    /// Week number in the ISO week date (FW=PW=2).
+    IsoWeek,
+    /// Day of the week, where Sunday = 0 and Saturday = 6 (FW=PW=1).
+    NumDaysFromSun,
+    /// Day of the week, where Monday = 1 and Sunday = 7 (FW=PW=1).
+    WeekdayFromMon,
+    /// Day of the year (FW=PW=3).
+    Ordinal,
+    /// Hour number in the 24-hour clocks (FW=PW=2).
+    Hour,
+    /// Hour number in the 12-hour clocks (FW=PW=2).
+    Hour12,
+    /// The number of minutes since the last whole hour (FW=PW=2).
+    Minute,
+    /// The number of seconds since the last whole minute (FW=PW=2).
+    Second,
+    /// The number of nanoseconds since the last whole second (FW=PW=9).
+    /// Note that this is *not* left-aligned;
+    /// see also [`Fixed::Nanosecond`](./enum.Fixed.html#variant.Nanosecond).
+    Nanosecond,
+    /// The number of non-leap seconds since the midnight UTC on January 1, 1970 (FW=1, PW=∞).
+    /// For formatting, it assumes UTC upon the absence of time zone offset.
+    Timestamp,
+}
+
+/// Fixed-format item types.
+///
+/// They have their own rules of formatting and parsing.
+/// Otherwise noted, they print in the specified cases but parse case-insensitively.
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Fixed {
+    /// Abbreviated month names.
+    ///
+    /// Prints a three-letter-long name in the title case, reads the same name in any case.
+    ShortMonthName,
+    /// Full month names.
+    ///
+    /// Prints a full name in the title case, reads either a short or full name in any case.
+    LongMonthName,
+    /// Abbreviated day of the week names.
+    ///
+    /// Prints a three-letter-long name in the title case, reads the same name in any case.
+    ShortWeekdayName,
+    /// Full day of the week names.
+    ///
+    /// Prints a full name in the title case, reads either a short or full name in any case.
+    LongWeekdayName,
+    /// AM/PM.
+    ///
+    /// Prints in lower case, reads in any case.
+    LowerAmPm,
+    /// AM/PM.
+    ///
+    /// Prints in upper case, reads in any case.
+    UpperAmPm,
+    /// An optional dot plus one or more digits for left-aligned nanoseconds.
+    /// May print nothing, 3, 6 or 9 digits according to the available accuracy.
+    /// See also [`Numeric::Nanosecond`](./enum.Numeric.html#variant.Nanosecond).
+    Nanosecond,
+    /// Same to [`Nanosecond`](#variant.Nanosecond) but the accuracy is fixed to 3.
+    Nanosecond3,
+    /// Same to [`Nanosecond`](#variant.Nanosecond) but the accuracy is fixed to 6.
+    Nanosecond6,
+    /// Same to [`Nanosecond`](#variant.Nanosecond) but the accuracy is fixed to 9.
+    Nanosecond9,
+    /// Timezone name.
+    ///
+    /// It does not support parsing, its use in the parser is an immediate failure.
+    TimezoneName,
+    /// Offset from the local time to UTC (`+09:00` or `-04:00` or `+00:00`).
+    ///
+    /// In the parser, the colon can be omitted and/or surrounded with any amount of whitespaces.
+    /// The offset is limited from `-24:00` to `+24:00`,
+    /// which is same to [`FixedOffset`](../offset/fixed/struct.FixedOffset.html)'s range.
+    TimezoneOffsetColon,
+    /// Offset from the local time to UTC (`+09:00` or `-04:00` or `Z`).
+    ///
+    /// In the parser, the colon can be omitted and/or surrounded with any amount of whitespaces,
+    /// and `Z` can be either in upper case or in lower case.
+    /// The offset is limited from `-24:00` to `+24:00`,
+    /// which is same to [`FixedOffset`](../offset/fixed/struct.FixedOffset.html)'s range.
+    TimezoneOffsetColonZ,
+    /// Same to [`TimezoneOffsetColon`](#variant.TimezoneOffsetColon) but prints no colon.
+    /// Parsing allows an optional colon.
+    TimezoneOffset,
+    /// Same to [`TimezoneOffsetColonZ`](#variant.TimezoneOffsetColonZ) but prints no colon.
+    /// Parsing allows an optional colon.
+    TimezoneOffsetZ,
+    /// RFC 2822 date and time syntax. Commonly used for email and MIME date and time.
+    RFC2822,
+    /// RFC 3339 & ISO 8601 date and time syntax.
+    RFC3339,
+}
+
+/// A single formatting item. This is used for both formatting and parsing.
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Item<'a> {
+    /// A literally printed and parsed text.
+    Literal(&'a str),
+    /// Whitespace. Prints literally but reads zero or more whitespace.
+    Space(&'a str),
+    /// Numeric item. Can be optionally padded to the maximal length (if any) when formatting;
+    /// the parser simply ignores any padded whitespace and zeroes.
+    Numeric(Numeric, Pad),
+    /// Fixed-format item.
+    Fixed(Fixed),
+    /// Issues a formatting error. Used to signal an invalid format string.
+    Error,
+}
+
+macro_rules! lit  { ($x:expr) => (Item::Literal($x)) }
+macro_rules! sp   { ($x:expr) => (Item::Space($x)) }
+macro_rules! num  { ($x:ident) => (Item::Numeric(Numeric::$x, Pad::None)) }
+macro_rules! num0 { ($x:ident) => (Item::Numeric(Numeric::$x, Pad::Zero)) }
+macro_rules! nums { ($x:ident) => (Item::Numeric(Numeric::$x, Pad::Space)) }
+macro_rules! fix  { ($x:ident) => (Item::Fixed(Fixed::$x)) }
+
+/// An error from the `parse` function.
+#[derive(Debug, Clone, PartialEq, Copy)]
+pub struct ParseError(ParseErrorKind);
+
+#[derive(Debug, Clone, PartialEq, Copy)]
+enum ParseErrorKind {
+    /// Given field is out of permitted range.
+    OutOfRange,
+
+    /// There is no possible date and time value with given set of fields.
+    ///
+    /// This does not include the out-of-range conditions, which are trivially invalid.
+    /// It includes the case that there are one or more fields that are inconsistent to each other.
+    Impossible,
+
+    /// Given set of fields is not enough to make a requested date and time value.
+    ///
+    /// Note that there *may* be a case that given fields constrain the possible values so much
+    /// that there is a unique possible value. Chrono only tries to be correct for
+    /// most useful sets of fields however, as such constraint solving can be expensive.
+    NotEnough,
+
+    /// The input string has some invalid character sequence for given formatting items.
+    Invalid,
+
+    /// The input string has been prematurely ended.
+    TooShort,
+
+    /// All formatting items have been read but there is a remaining input.
+    TooLong,
+
+    /// There was an error on the formatting string, or there were non-supported formating items.
+    BadFormat,
+}
+
+/// Same to `Result<T, ParseError>`.
+pub type ParseResult<T> = Result<T, ParseError>;
+
+impl fmt::Display for ParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.description().fmt(f)
+    }
+}
+
+impl Error for ParseError {
+    fn description(&self) -> &str {
+        match self.0 {
+            ParseErrorKind::OutOfRange => "input is out of range",
+            ParseErrorKind::Impossible => "no possible date and time matching input",
+            ParseErrorKind::NotEnough => "input is not enough for unique date and time",
+            ParseErrorKind::Invalid => "input contains invalid characters",
+            ParseErrorKind::TooShort => "premature end of input",
+            ParseErrorKind::TooLong => "trailing input",
+            ParseErrorKind::BadFormat => "bad or unsupported format string",
+        }
+    }
+}
+
+// to be used in this module and submodules
+const OUT_OF_RANGE: ParseError = ParseError(ParseErrorKind::OutOfRange);
+const IMPOSSIBLE:   ParseError = ParseError(ParseErrorKind::Impossible);
+const NOT_ENOUGH:   ParseError = ParseError(ParseErrorKind::NotEnough);
+const INVALID:      ParseError = ParseError(ParseErrorKind::Invalid);
+const TOO_SHORT:    ParseError = ParseError(ParseErrorKind::TooShort);
+const TOO_LONG:     ParseError = ParseError(ParseErrorKind::TooLong);
+const BAD_FORMAT:   ParseError = ParseError(ParseErrorKind::BadFormat);
+
+/// Tries to format given arguments with given formatting items.
+/// Internally used by `DelayedFormat`.
+pub fn format<'a, I>(w: &mut fmt::Formatter, date: Option<&NaiveDate>, time: Option<&NaiveTime>,
+                     off: Option<&(String, Duration)>, items: I) -> fmt::Result
+        where I: Iterator<Item=Item<'a>> {
+    // full and abbreviated month and weekday names
+    static SHORT_MONTHS: [&'static str; 12] =
+        ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+    static LONG_MONTHS: [&'static str; 12] =
+        ["January", "February", "March", "April", "May", "June",
+         "July", "August", "September", "October", "November", "December"];
+    static SHORT_WEEKDAYS: [&'static str; 7] =
+        ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
+    static LONG_WEEKDAYS: [&'static str; 7] =
+        ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
+
+    for item in items {
+        match item {
+            Item::Literal(s) | Item::Space(s) => try!(write!(w, "{}", s)),
+
+            Item::Numeric(spec, pad) => {
+                use self::Numeric::*;
+
+                let week_from_sun = |d: &NaiveDate|
+                    (d.ordinal() as i32 - d.weekday().num_days_from_sunday() as i32 + 7) / 7;
+                let week_from_mon = |d: &NaiveDate|
+                    (d.ordinal() as i32 - d.weekday().num_days_from_monday() as i32 + 7) / 7;
+
+                let (width, v) = match spec {
+                    Year           => (4, date.map(|d| d.year() as i64)),
+                    YearDiv100     => (2, date.map(|d| div_floor(d.year() as i64, 100))),
+                    YearMod100     => (2, date.map(|d| mod_floor(d.year() as i64, 100))),
+                    IsoYear        => (4, date.map(|d| d.isoweekdate().0 as i64)),
+                    IsoYearDiv100  => (2, date.map(|d| div_floor(d.isoweekdate().0 as i64, 100))),
+                    IsoYearMod100  => (2, date.map(|d| mod_floor(d.isoweekdate().0 as i64, 100))),
+                    Month          => (2, date.map(|d| d.month() as i64)),
+                    Day            => (2, date.map(|d| d.day() as i64)),
+                    WeekFromSun    => (2, date.map(|d| week_from_sun(d) as i64)),
+                    WeekFromMon    => (2, date.map(|d| week_from_mon(d) as i64)),
+                    IsoWeek        => (2, date.map(|d| d.isoweekdate().1 as i64)),
+                    NumDaysFromSun => (1, date.map(|d| d.weekday().num_days_from_sunday() as i64)),
+                    WeekdayFromMon => (1, date.map(|d| d.weekday().number_from_monday() as i64)),
+                    Ordinal        => (3, date.map(|d| d.ordinal() as i64)),
+                    Hour           => (2, time.map(|t| t.hour() as i64)),
+                    Hour12         => (2, time.map(|t| t.hour12().1 as i64)),
+                    Minute         => (2, time.map(|t| t.minute() as i64)),
+                    Second         => (2, time.map(|t| (t.second() +
+                                                        t.nanosecond() / 1_000_000_000) as i64)),
+                    Nanosecond     => (9, time.map(|t| (t.nanosecond() % 1_000_000_000) as i64)),
+                    Timestamp      => (1, match (date, time, off) {
+                        (Some(d), Some(t), None) =>
+                            Some(d.and_time(*t).timestamp()),
+                        (Some(d), Some(t), Some(&(_, off))) =>
+                            Some((d.and_time(*t) - off).timestamp()),
+                        (_, _, _) => None
+                    }),
+                };
+
+                if let Some(v) = v {
+                    if (spec == Year || spec == IsoYear) && !(0 <= v && v < 10000) {
+                        // non-four-digit years require an explicit sign as per ISO 8601
+                        match pad {
+                            Pad::None => try!(write!(w, "{:+}", v)),
+                            Pad::Zero => try!(write!(w, "{:+01$}", v, width + 1)),
+                            Pad::Space => try!(write!(w, "{:+1$}", v, width + 1)),
+                        }
+                    } else {
+                        match pad {
+                            Pad::None => try!(write!(w, "{}", v)),
+                            Pad::Zero => try!(write!(w, "{:01$}", v, width)),
+                            Pad::Space => try!(write!(w, "{:1$}", v, width)),
+                        }
+                    }
+                } else {
+                    return Err(fmt::Error); // insufficient arguments for given format
+                }
+            },
+
+            Item::Fixed(spec) => {
+                use self::Fixed::*;
+
+                /// Prints an offset from UTC in the format of `+HHMM` or `+HH:MM`.
+                /// `Z` instead of `+00[:]00` is allowed when `allow_zulu` is true.
+                fn write_local_minus_utc(w: &mut fmt::Formatter, off: Duration,
+                                         allow_zulu: bool, use_colon: bool) -> fmt::Result {
+                    let off = off.num_minutes();
+                    if !allow_zulu || off != 0 {
+                        let (sign, off) = if off < 0 {('-', -off)} else {('+', off)};
+                        if use_colon {
+                            write!(w, "{}{:02}:{:02}", sign, off / 60, off % 60)
+                        } else {
+                            write!(w, "{}{:02}{:02}", sign, off / 60, off % 60)
+                        }
+                    } else {
+                        write!(w, "Z")
+                    }
+                }
+
+                let ret = match spec {
+                    ShortMonthName =>
+                        date.map(|d| write!(w, "{}", SHORT_MONTHS[d.month0() as usize])),
+                    LongMonthName =>
+                        date.map(|d| write!(w, "{}", LONG_MONTHS[d.month0() as usize])),
+                    ShortWeekdayName =>
+                        date.map(|d| write!(w, "{}",
+                            SHORT_WEEKDAYS[d.weekday().num_days_from_monday() as usize])),
+                    LongWeekdayName =>
+                        date.map(|d| write!(w, "{}",
+                            LONG_WEEKDAYS[d.weekday().num_days_from_monday() as usize])),
+                    LowerAmPm =>
+                        time.map(|t| write!(w, "{}", if t.hour12().0 {"pm"} else {"am"})),
+                    UpperAmPm =>
+                        time.map(|t| write!(w, "{}", if t.hour12().0 {"PM"} else {"AM"})),
+                    Nanosecond =>
+                        time.map(|t| {
+                            let nano = t.nanosecond() % 1_000_000_000;
+                            if nano == 0 {
+                                Ok(())
+                            } else if nano % 1_000_000 == 0 {
+                                write!(w, ".{:03}", nano / 1_000_000)
+                            } else if nano % 1_000 == 0 {
+                                write!(w, ".{:06}", nano / 1_000)
+                            } else {
+                                write!(w, ".{:09}", nano)
+                            }
+                        }),
+                    Nanosecond3 =>
+                        time.map(|t| {
+                            let nano = t.nanosecond() % 1_000_000_000;
+                            write!(w, ".{:03}", nano / 1_000_000)
+                        }),
+                    Nanosecond6 =>
+                        time.map(|t| {
+                            let nano = t.nanosecond() % 1_000_000_000;
+                            write!(w, ".{:06}", nano / 1_000)
+                        }),
+                    Nanosecond9 =>
+                        time.map(|t| {
+                            let nano = t.nanosecond() % 1_000_000_000;
+                            write!(w, ".{:09}", nano)
+                        }),
+                    TimezoneName =>
+                        off.map(|&(ref name, _)| write!(w, "{}", *name)),
+                    TimezoneOffsetColon =>
+                        off.map(|&(_, off)| write_local_minus_utc(w, off, false, true)),
+                    TimezoneOffsetColonZ =>
+                        off.map(|&(_, off)| write_local_minus_utc(w, off, true, true)),
+                    TimezoneOffset =>
+                        off.map(|&(_, off)| write_local_minus_utc(w, off, false, false)),
+                    TimezoneOffsetZ =>
+                        off.map(|&(_, off)| write_local_minus_utc(w, off, true, false)),
+                    RFC2822 => // same to `%a, %e %b %Y %H:%M:%S %z`
+                        if let (Some(d), Some(t), Some(&(_, off))) = (date, time, off) {
+                            let sec = t.second() + t.nanosecond() / 1_000_000_000;
+                            try!(write!(w, "{}, {:2} {} {:04} {:02}:{:02}:{:02} ",
+                                        SHORT_WEEKDAYS[d.weekday().num_days_from_monday() as usize],
+                                        d.day(), SHORT_MONTHS[d.month0() as usize], d.year(),
+                                        t.hour(), t.minute(), sec));
+                            Some(write_local_minus_utc(w, off, false, false))
+                        } else {
+                            None
+                        },
+                    RFC3339 => // same to `%Y-%m-%dT%H:%M:%S%.f%:z`
+                        if let (Some(d), Some(t), Some(&(_, off))) = (date, time, off) {
+                            // reuse `Debug` impls which already print ISO 8601 format.
+                            // this is faster in this way.
+                            try!(write!(w, "{:?}T{:?}", d, t));
+                            Some(write_local_minus_utc(w, off, false, true))
+                        } else {
+                            None
+                        },
+                };
+
+                match ret {
+                    Some(ret) => try!(ret),
+                    None => return Err(fmt::Error), // insufficient arguments for given format
+                }
+            },
+
+            Item::Error => return Err(fmt::Error),
+        }
+    }
+
+    Ok(())
+}
+
+pub mod parsed;
+
+// due to the size of parsing routines, they are in separate modules.
+mod scan;
+mod parse;
+
+pub mod strftime;
+
+/// A *temporary* object which can be used as an argument to `format!` or others.
+/// This is normally constructed via `format` methods of each date and time type.
+#[derive(Debug)]
+pub struct DelayedFormat<I> {
+    /// The date view, if any.
+    date: Option<NaiveDate>,
+    /// The time view, if any.
+    time: Option<NaiveTime>,
+    /// The name and local-to-UTC difference for the offset (timezone), if any.
+    off: Option<(String, Duration)>,
+    /// An iterator returning formatting items.
+    items: I,
+}
+
+impl<'a, I: Iterator<Item=Item<'a>> + Clone> DelayedFormat<I> {
+    /// Makes a new `DelayedFormat` value out of local date and time.
+    pub fn new(date: Option<NaiveDate>, time: Option<NaiveTime>, items: I) -> DelayedFormat<I> {
+        DelayedFormat { date: date, time: time, off: None, items: items }
+    }
+
+    /// Makes a new `DelayedFormat` value out of local date and time and UTC offset.
+    pub fn new_with_offset<Off>(date: Option<NaiveDate>, time: Option<NaiveTime>,
+                                offset: &Off, items: I) -> DelayedFormat<I>
+            where Off: Offset + fmt::Display {
+        let name_and_diff = (offset.to_string(), offset.local_minus_utc());
+        DelayedFormat { date: date, time: time, off: Some(name_and_diff), items: items }
+    }
+}
+
+impl<'a, I: Iterator<Item=Item<'a>> + Clone> fmt::Display for DelayedFormat<I> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        format(f, self.date.as_ref(), self.time.as_ref(), self.off.as_ref(), self.items.clone())
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/format/parse.rs
@@ -0,0 +1,720 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// Portions copyright (c) 2015, John Nagle.
+// See README.md and LICENSE.txt for details.
+
+//! Date and time parsing routines.
+
+use std::usize;
+
+use Weekday;
+
+use super::scan;
+use super::{Parsed, ParseResult, Item};
+use super::{OUT_OF_RANGE, INVALID, TOO_SHORT, TOO_LONG, BAD_FORMAT};
+
+fn set_weekday_with_num_days_from_sunday(p: &mut Parsed, v: i64) -> ParseResult<()> {
+    p.set_weekday(match v {
+        0 => Weekday::Sun, 1 => Weekday::Mon, 2 => Weekday::Tue,
+        3 => Weekday::Wed, 4 => Weekday::Thu, 5 => Weekday::Fri,
+        6 => Weekday::Sat, _ => return Err(OUT_OF_RANGE)
+    })
+}
+
+fn set_weekday_with_number_from_monday(p: &mut Parsed, v: i64) -> ParseResult<()> {
+    p.set_weekday(match v {
+        1 => Weekday::Mon, 2 => Weekday::Tue, 3 => Weekday::Wed,
+        4 => Weekday::Thu, 5 => Weekday::Fri, 6 => Weekday::Sat,
+        7 => Weekday::Sun, _ => return Err(OUT_OF_RANGE)
+    })
+}
+
+fn parse_rfc2822<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> {
+    macro_rules! try_consume {
+        ($e:expr) => ({ let (s_, v) = try!($e); s = s_; v })
+    }
+
+    // an adapted RFC 2822 syntax from Section 3.3 and 4.3:
+    //
+    // date-time   = [ day-of-week "," ] date 1*S time *S
+    // day-of-week = *S day-name *S
+    // day-name    = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"
+    // date        = day month year
+    // day         = *S 1*2DIGIT *S
+    // month       = 1*S month-name 1*S
+    // month-name  = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
+    //               "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
+    // year        = *S 2*DIGIT *S
+    // time        = time-of-day 1*S zone
+    // time-of-day = hour ":" minute [ ":" second ]
+    // hour        = *S 2DIGIT *S
+    // minute      = *S 2DIGIT *S
+    // second      = *S 2DIGIT *S
+    // zone        = ( "+" / "-" ) 4DIGIT /
+    //               "UT" / "GMT" /                  ; same to +0000
+    //               "EST" / "CST" / "MST" / "PST" / ; same to -0500 to -0800
+    //               "EDT" / "CDT" / "MDT" / "PDT" / ; same to -0400 to -0700
+    //               1*(%d65-90 / %d97-122)          ; same to -0000
+    //
+    // some notes:
+    //
+    // - quoted characters can be in any mixture of lower and upper cases.
+    //
+    // - we do not recognize a folding white space (FWS) or comment (CFWS).
+    //   for our purposes, instead, we accept any sequence of Unicode
+    //   white space characters (denoted here to `S`). any actual RFC 2822
+    //   parser is expected to parse FWS and/or CFWS themselves and replace
+    //   it with a single SP (`%x20`); this is legitimate.
+    //
+    // - two-digit year < 50 should be interpreted by adding 2000.
+    //   two-digit year >= 50 or three-digit year should be interpreted
+    //   by adding 1900. note that four-or-more-digit years less than 1000
+    //   are *never* affected by this rule.
+    //
+    // - zone of `-0000` and any unrecognized legacy time zones (including
+    //   *every* one-letter military time zones) are considered "missing",
+    //   in such that we don't actually know what time zone is being used.
+    //
+    // - mismatching day-of-week is always an error, which is consistent to
+    //   Chrono's own rules.
+    //
+    // - zones can range from `-9959` to `+9959`, but `FixedOffset` does not
+    //   support offsets larger than 24 hours. this is not *that* problematic
+    //   since we do not directly go to a `DateTime` so one can recover
+    //   the offset information from `Parsed` anyway.
+
+    s = s.trim_left();
+
+    if let Ok((s_, weekday)) = scan::short_weekday(s) {
+        if !s_.starts_with(",") { return Err(INVALID); }
+        s = &s_[1..];
+        try!(parsed.set_weekday(weekday));
+    }
+
+    s = s.trim_left();
+    try!(parsed.set_day(try_consume!(scan::number(s, 1, 2))));
+    s = try!(scan::space(s)); // mandatory
+    try!(parsed.set_month(1 + try_consume!(scan::short_month0(s)) as i64));
+    s = try!(scan::space(s)); // mandatory
+
+    // distinguish two- and three-digit years from four-digit years
+    let prevlen = s.len();
+    let mut year = try_consume!(scan::number(s, 2, usize::MAX));
+    let yearlen = prevlen - s.len();
+    match (yearlen, year) {
+        (2,  0...49) => { year += 2000; } //   47 -> 2047,   05 -> 2005
+        (2, 50...99) => { year += 1900; } //   79 -> 1979
+        (3,       _) => { year += 1900; } //  112 -> 2012,  009 -> 1909
+        (_,       _) => {}                // 1987 -> 1987, 0654 -> 0654
+    }
+    try!(parsed.set_year(year));
+
+    s = try!(scan::space(s)); // mandatory
+    try!(parsed.set_hour(try_consume!(scan::number(s, 2, 2))));
+    s = try!(scan::char(s.trim_left(), b':')).trim_left(); // *S ":" *S
+    try!(parsed.set_minute(try_consume!(scan::number(s, 2, 2))));
+    s = s.trim_left();
+    if !s.is_empty() { // [ ":" *S 2DIGIT ]
+        s = try!(scan::char(s, b':')).trim_left();
+        try!(parsed.set_second(try_consume!(scan::number(s, 2, 2))));
+    }
+
+    s = try!(scan::space(s)); // mandatory
+    if let Some(offset) = try_consume!(scan::timezone_offset_2822(s)) {
+        // only set the offset when it is definitely known (i.e. not `-0000`)
+        try!(parsed.set_offset(offset as i64));
+    }
+
+    Ok((s, ()))
+}
+
+fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> {
+    macro_rules! try_consume {
+        ($e:expr) => ({ let (s_, v) = try!($e); s = s_; v })
+    }
+
+    // an adapted RFC 3339 syntax from Section 5.6:
+    //
+    // date-fullyear  = 4DIGIT
+    // date-month     = 2DIGIT ; 01-12
+    // date-mday      = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
+    // time-hour      = 2DIGIT ; 00-23
+    // time-minute    = 2DIGIT ; 00-59
+    // time-second    = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules
+    // time-secfrac   = "." 1*DIGIT
+    // time-numoffset = ("+" / "-") time-hour ":" time-minute
+    // time-offset    = "Z" / time-numoffset
+    // partial-time   = time-hour ":" time-minute ":" time-second [time-secfrac]
+    // full-date      = date-fullyear "-" date-month "-" date-mday
+    // full-time      = partial-time time-offset
+    // date-time      = full-date "T" full-time
+    //
+    // some notes:
+    //
+    // - quoted characters can be in any mixture of lower and upper cases.
+    //
+    // - it may accept any number of fractional digits for seconds.
+    //   for Chrono, this means that we should skip digits past first 9 digits.
+    //
+    // - unlike RFC 2822, the valid offset ranges from -23:59 to +23:59.
+    //   note that this restriction is unique to RFC 3339 and not ISO 8601.
+    //   since this is not a typical Chrono behavior, we check it earlier.
+
+    try!(parsed.set_year(try_consume!(scan::number(s, 4, 4))));
+    s = try!(scan::char(s, b'-'));
+    try!(parsed.set_month(try_consume!(scan::number(s, 2, 2))));
+    s = try!(scan::char(s, b'-'));
+    try!(parsed.set_day(try_consume!(scan::number(s, 2, 2))));
+
+    s = match s.as_bytes().first() {
+        Some(&b't') | Some(&b'T') => &s[1..],
+        Some(_) => return Err(INVALID),
+        None => return Err(TOO_SHORT),
+    };
+
+    try!(parsed.set_hour(try_consume!(scan::number(s, 2, 2))));
+    s = try!(scan::char(s, b':'));
+    try!(parsed.set_minute(try_consume!(scan::number(s, 2, 2))));
+    s = try!(scan::char(s, b':'));
+    try!(parsed.set_second(try_consume!(scan::number(s, 2, 2))));
+    if s.starts_with(".") {
+        let nanosecond = try_consume!(scan::nanosecond(&s[1..]));
+        try!(parsed.set_nanosecond(nanosecond));
+    }
+
+    let offset = try_consume!(scan::timezone_offset_zulu(s, |s| scan::char(s, b':')));
+    if offset <= -86400 || offset >= 86400 { return Err(OUT_OF_RANGE); }
+    try!(parsed.set_offset(offset as i64));
+
+    Ok((s, ()))
+}
+
+/// Tries to parse given string into `parsed` with given formatting items.
+/// Returns `Ok` when the entire string has been parsed (otherwise `parsed` should not be used).
+/// There should be no trailing string after parsing;
+/// use a stray [`Item::Space`](./enum.Item.html#variant.Space) to trim whitespaces.
+///
+/// This particular date and time parser is:
+///
+/// - Greedy. It will consume the longest possible prefix.
+///   For example, `April` is always consumed entirely when the long month name is requested;
+///   it equally accepts `Apr`, but prefers the longer prefix in this case.
+///
+/// - Padding-agnostic (for numeric items).
+///   The [`Pad`](./enum.Pad.html) field is completely ignored,
+///   so one can prepend any number of whitespace then any number of zeroes before numbers.
+///
+/// - (Still) obeying the intrinsic parsing width. This allows, for example, parsing `HHMMSS`.
+pub fn parse<'a, I>(parsed: &mut Parsed, mut s: &str, items: I) -> ParseResult<()>
+        where I: Iterator<Item=Item<'a>> {
+    macro_rules! try_consume {
+        ($e:expr) => ({ let (s_, v) = try!($e); s = s_; v })
+    }
+
+    for item in items {
+        match item {
+            Item::Literal(prefix) => {
+                if s.len() < prefix.len() { return Err(TOO_SHORT); }
+                if !s.starts_with(prefix) { return Err(INVALID); }
+                s = &s[prefix.len()..];
+            }
+
+            Item::Space(_) => {
+                s = s.trim_left();
+            }
+
+            Item::Numeric(spec, _pad) => {
+                use super::Numeric::*;
+
+                let (width, signed, set): (usize, bool,
+                                           fn(&mut Parsed, i64) -> ParseResult<()>) = match spec {
+                    Year           => (4, true, Parsed::set_year),
+                    YearDiv100     => (2, false, Parsed::set_year_div_100),
+                    YearMod100     => (2, false, Parsed::set_year_mod_100),
+                    IsoYear        => (4, true, Parsed::set_isoyear),
+                    IsoYearDiv100  => (2, false, Parsed::set_isoyear_div_100),
+                    IsoYearMod100  => (2, false, Parsed::set_isoyear_mod_100),
+                    Month          => (2, false, Parsed::set_month),
+                    Day            => (2, false, Parsed::set_day),
+                    WeekFromSun    => (2, false, Parsed::set_week_from_sun),
+                    WeekFromMon    => (2, false, Parsed::set_week_from_mon),
+                    IsoWeek        => (2, false, Parsed::set_isoweek),
+                    NumDaysFromSun => (1, false, set_weekday_with_num_days_from_sunday),
+                    WeekdayFromMon => (1, false, set_weekday_with_number_from_monday),
+                    Ordinal        => (3, false, Parsed::set_ordinal),
+                    Hour           => (2, false, Parsed::set_hour),
+                    Hour12         => (2, false, Parsed::set_hour12),
+                    Minute         => (2, false, Parsed::set_minute),
+                    Second         => (2, false, Parsed::set_second),
+                    Nanosecond     => (9, false, Parsed::set_nanosecond),
+                    Timestamp      => (usize::MAX, false, Parsed::set_timestamp),
+                };
+
+                s = s.trim_left();
+                let v = if signed {
+                    if s.starts_with("-") {
+                        let v = try_consume!(scan::number(&s[1..], 1, usize::MAX));
+                        try!(0i64.checked_sub(v).ok_or(OUT_OF_RANGE))
+                    } else if s.starts_with("+") {
+                        try_consume!(scan::number(&s[1..], 1, usize::MAX))
+                    } else {
+                        // if there is no explicit sign, we respect the original `width`
+                        try_consume!(scan::number(s, 1, width))
+                    }
+                } else {
+                    try_consume!(scan::number(s, 1, width))
+                };
+                try!(set(parsed, v));
+            }
+
+            Item::Fixed(spec) => {
+                use super::Fixed::*;
+
+                match spec {
+                    ShortMonthName => {
+                        let month0 = try_consume!(scan::short_month0(s));
+                        try!(parsed.set_month(month0 as i64 + 1));
+                    }
+
+                    LongMonthName => {
+                        let month0 = try_consume!(scan::short_or_long_month0(s));
+                        try!(parsed.set_month(month0 as i64 + 1));
+                    }
+
+                    ShortWeekdayName => {
+                        let weekday = try_consume!(scan::short_weekday(s));
+                        try!(parsed.set_weekday(weekday));
+                    }
+
+                    LongWeekdayName => {
+                        let weekday = try_consume!(scan::short_or_long_weekday(s));
+                        try!(parsed.set_weekday(weekday));
+                    }
+
+                    LowerAmPm | UpperAmPm => {
+                        if s.len() < 2 { return Err(TOO_SHORT); }
+                        let ampm = match (s.as_bytes()[0] | 32, s.as_bytes()[1] | 32) {
+                            (b'a',b'm') => false,
+                            (b'p',b'm') => true,
+                            _ => return Err(INVALID)
+                        };
+                        try!(parsed.set_ampm(ampm));
+                        s = &s[2..];
+                    }
+
+                    Nanosecond | Nanosecond3 | Nanosecond6 | Nanosecond9=> {
+                        if s.starts_with(".") {
+                            let nano = try_consume!(scan::nanosecond(&s[1..]));
+                            try!(parsed.set_nanosecond(nano));
+                        }
+                    }
+
+                    TimezoneName => return Err(BAD_FORMAT),
+
+                    TimezoneOffsetColon | TimezoneOffset => {
+                        let offset = try_consume!(scan::timezone_offset(s.trim_left(),
+                                                                        scan::colon_or_space));
+                        try!(parsed.set_offset(offset as i64));
+                    }
+
+                    TimezoneOffsetColonZ | TimezoneOffsetZ => {
+                        let offset = try_consume!(scan::timezone_offset_zulu(s.trim_left(),
+                                                                             scan::colon_or_space));
+                        try!(parsed.set_offset(offset as i64));
+                    }
+
+                    RFC2822 => try_consume!(parse_rfc2822(parsed, s)),
+                    RFC3339 => try_consume!(parse_rfc3339(parsed, s)),
+                }
+            }
+
+            Item::Error => {
+                return Err(BAD_FORMAT);
+            }
+        }
+    }
+
+    // if there are trailling chars, it is an error
+    if !s.is_empty() {
+        Err(TOO_LONG)
+    } else {
+        Ok(())
+    }
+}
+
+#[cfg(test)]
+#[test]
+fn test_parse() {
+    use super::*;
+    use super::IMPOSSIBLE;
+
+    // workaround for Rust issue #22255
+    fn parse_all(s: &str, items: &[Item]) -> ParseResult<Parsed> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, items.iter().cloned()));
+        Ok(parsed)
+    }
+
+    macro_rules! check {
+        ($fmt:expr, $items:expr; $err:tt) => (
+            assert_eq!(parse_all($fmt, &$items), Err($err))
+        );
+        ($fmt:expr, $items:expr; $($k:ident: $v:expr),*) => (
+            assert_eq!(parse_all($fmt, &$items), Ok(Parsed { $($k: Some($v),)* ..Parsed::new() }))
+        );
+    }
+
+    // empty string
+    check!("",  []; );
+    check!(" ", []; TOO_LONG);
+    check!("a", []; TOO_LONG);
+
+    // whitespaces
+    check!("",          [sp!("")]; );
+    check!(" ",         [sp!("")]; );
+    check!("\t",        [sp!("")]; );
+    check!(" \n\r  \n", [sp!("")]; );
+    check!("a",         [sp!("")]; TOO_LONG);
+
+    // literal
+    check!("",    [lit!("a")]; TOO_SHORT);
+    check!(" ",   [lit!("a")]; INVALID);
+    check!("a",   [lit!("a")]; );
+    check!("aa",  [lit!("a")]; TOO_LONG);
+    check!("A",   [lit!("a")]; INVALID);
+    check!("xy",  [lit!("xy")]; );
+    check!("xy",  [lit!("x"), lit!("y")]; );
+    check!("x y", [lit!("x"), lit!("y")]; INVALID);
+    check!("xy",  [lit!("x"), sp!(""), lit!("y")]; );
+    check!("x y", [lit!("x"), sp!(""), lit!("y")]; );
+
+    // numeric
+    check!("1987",        [num!(Year)]; year: 1987);
+    check!("1987 ",       [num!(Year)]; TOO_LONG);
+    check!("0x12",        [num!(Year)]; TOO_LONG); // `0` is parsed
+    check!("x123",        [num!(Year)]; INVALID);
+    check!("2015",        [num!(Year)]; year: 2015);
+    check!("0000",        [num!(Year)]; year:    0);
+    check!("9999",        [num!(Year)]; year: 9999);
+    check!(" \t987",      [num!(Year)]; year:  987);
+    check!("5",           [num!(Year)]; year:    5);
+    check!("5\0",         [num!(Year)]; TOO_LONG);
+    check!("\05",         [num!(Year)]; INVALID);
+    check!("",            [num!(Year)]; TOO_SHORT);
+    check!("12345",       [num!(Year), lit!("5")]; year: 1234);
+    check!("12345",       [nums!(Year), lit!("5")]; year: 1234);
+    check!("12345",       [num0!(Year), lit!("5")]; year: 1234);
+    check!("12341234",    [num!(Year), num!(Year)]; year: 1234);
+    check!("1234 1234",   [num!(Year), num!(Year)]; year: 1234);
+    check!("1234 1235",   [num!(Year), num!(Year)]; IMPOSSIBLE);
+    check!("1234 1234",   [num!(Year), lit!("x"), num!(Year)]; INVALID);
+    check!("1234x1234",   [num!(Year), lit!("x"), num!(Year)]; year: 1234);
+    check!("1234xx1234",  [num!(Year), lit!("x"), num!(Year)]; INVALID);
+    check!("1234 x 1234", [num!(Year), lit!("x"), num!(Year)]; INVALID);
+
+    // signed numeric
+    check!("-42",         [num!(Year)]; year: -42);
+    check!("+42",         [num!(Year)]; year: 42);
+    check!("-0042",       [num!(Year)]; year: -42);
+    check!("+0042",       [num!(Year)]; year: 42);
+    check!("-42195",      [num!(Year)]; year: -42195);
+    check!("+42195",      [num!(Year)]; year: 42195);
+    check!("  -42195",    [num!(Year)]; year: -42195);
+    check!("  +42195",    [num!(Year)]; year: 42195);
+    check!("  -   42",    [num!(Year)]; INVALID);
+    check!("  +   42",    [num!(Year)]; INVALID);
+    check!("-",           [num!(Year)]; TOO_SHORT);
+    check!("+",           [num!(Year)]; TOO_SHORT);
+
+    // unsigned numeric
+    check!("345",   [num!(Ordinal)]; ordinal: 345);
+    check!("+345",  [num!(Ordinal)]; INVALID);
+    check!("-345",  [num!(Ordinal)]; INVALID);
+    check!(" 345",  [num!(Ordinal)]; ordinal: 345);
+    check!(" +345", [num!(Ordinal)]; INVALID);
+    check!(" -345", [num!(Ordinal)]; INVALID);
+
+    // various numeric fields
+    check!("1234 5678",
+           [num!(Year), num!(IsoYear)];
+           year: 1234, isoyear: 5678);
+    check!("12 34 56 78",
+           [num!(YearDiv100), num!(YearMod100), num!(IsoYearDiv100), num!(IsoYearMod100)];
+           year_div_100: 12, year_mod_100: 34, isoyear_div_100: 56, isoyear_mod_100: 78);
+    check!("1 2 3 4 5 6",
+           [num!(Month), num!(Day), num!(WeekFromSun), num!(WeekFromMon), num!(IsoWeek),
+            num!(NumDaysFromSun)];
+           month: 1, day: 2, week_from_sun: 3, week_from_mon: 4, isoweek: 5, weekday: Weekday::Sat);
+    check!("7 89 01",
+           [num!(WeekdayFromMon), num!(Ordinal), num!(Hour12)];
+           weekday: Weekday::Sun, ordinal: 89, hour_mod_12: 1);
+    check!("23 45 6 78901234 567890123",
+           [num!(Hour), num!(Minute), num!(Second), num!(Nanosecond), num!(Timestamp)];
+           hour_div_12: 1, hour_mod_12: 11, minute: 45, second: 6, nanosecond: 78_901_234,
+           timestamp: 567_890_123);
+
+    // fixed: month and weekday names
+    check!("apr",       [fix!(ShortMonthName)]; month: 4);
+    check!("Apr",       [fix!(ShortMonthName)]; month: 4);
+    check!("APR",       [fix!(ShortMonthName)]; month: 4);
+    check!("ApR",       [fix!(ShortMonthName)]; month: 4);
+    check!("April",     [fix!(ShortMonthName)]; TOO_LONG); // `Apr` is parsed
+    check!("A",         [fix!(ShortMonthName)]; TOO_SHORT);
+    check!("Sol",       [fix!(ShortMonthName)]; INVALID);
+    check!("Apr",       [fix!(LongMonthName)]; month: 4);
+    check!("Apri",      [fix!(LongMonthName)]; TOO_LONG); // `Apr` is parsed
+    check!("April",     [fix!(LongMonthName)]; month: 4);
+    check!("Aprill",    [fix!(LongMonthName)]; TOO_LONG);
+    check!("Aprill",    [fix!(LongMonthName), lit!("l")]; month: 4);
+    check!("Aprl",      [fix!(LongMonthName), lit!("l")]; month: 4);
+    check!("April",     [fix!(LongMonthName), lit!("il")]; TOO_SHORT); // do not backtrack
+    check!("thu",       [fix!(ShortWeekdayName)]; weekday: Weekday::Thu);
+    check!("Thu",       [fix!(ShortWeekdayName)]; weekday: Weekday::Thu);
+    check!("THU",       [fix!(ShortWeekdayName)]; weekday: Weekday::Thu);
+    check!("tHu",       [fix!(ShortWeekdayName)]; weekday: Weekday::Thu);
+    check!("Thursday",  [fix!(ShortWeekdayName)]; TOO_LONG); // `Thu` is parsed
+    check!("T",         [fix!(ShortWeekdayName)]; TOO_SHORT);
+    check!("The",       [fix!(ShortWeekdayName)]; INVALID);
+    check!("Nop",       [fix!(ShortWeekdayName)]; INVALID);
+    check!("Thu",       [fix!(LongWeekdayName)]; weekday: Weekday::Thu);
+    check!("Thur",      [fix!(LongWeekdayName)]; TOO_LONG); // `Thu` is parsed
+    check!("Thurs",     [fix!(LongWeekdayName)]; TOO_LONG); // ditto
+    check!("Thursday",  [fix!(LongWeekdayName)]; weekday: Weekday::Thu);
+    check!("Thursdays", [fix!(LongWeekdayName)]; TOO_LONG);
+    check!("Thursdays", [fix!(LongWeekdayName), lit!("s")]; weekday: Weekday::Thu);
+    check!("Thus",      [fix!(LongWeekdayName), lit!("s")]; weekday: Weekday::Thu);
+    check!("Thursday",  [fix!(LongWeekdayName), lit!("rsday")]; TOO_SHORT); // do not backtrack
+
+    // fixed: am/pm
+    check!("am",  [fix!(LowerAmPm)]; hour_div_12: 0);
+    check!("pm",  [fix!(LowerAmPm)]; hour_div_12: 1);
+    check!("AM",  [fix!(LowerAmPm)]; hour_div_12: 0);
+    check!("PM",  [fix!(LowerAmPm)]; hour_div_12: 1);
+    check!("am",  [fix!(UpperAmPm)]; hour_div_12: 0);
+    check!("pm",  [fix!(UpperAmPm)]; hour_div_12: 1);
+    check!("AM",  [fix!(UpperAmPm)]; hour_div_12: 0);
+    check!("PM",  [fix!(UpperAmPm)]; hour_div_12: 1);
+    check!("Am",  [fix!(LowerAmPm)]; hour_div_12: 0);
+    check!(" Am", [fix!(LowerAmPm)]; INVALID);
+    check!("ame", [fix!(LowerAmPm)]; TOO_LONG); // `am` is parsed
+    check!("a",   [fix!(LowerAmPm)]; TOO_SHORT);
+    check!("p",   [fix!(LowerAmPm)]; TOO_SHORT);
+    check!("x",   [fix!(LowerAmPm)]; TOO_SHORT);
+    check!("xx",  [fix!(LowerAmPm)]; INVALID);
+    check!("",    [fix!(LowerAmPm)]; TOO_SHORT);
+
+    // fixed: dot plus nanoseconds
+    check!("",              [fix!(Nanosecond)]; ); // no field set, but not an error
+    check!("4",             [fix!(Nanosecond)]; TOO_LONG); // never consumes `4`
+    check!("4",             [fix!(Nanosecond), num!(Second)]; second: 4);
+    check!(".0",            [fix!(Nanosecond)]; nanosecond: 0);
+    check!(".4",            [fix!(Nanosecond)]; nanosecond: 400_000_000);
+    check!(".42",           [fix!(Nanosecond)]; nanosecond: 420_000_000);
+    check!(".421",          [fix!(Nanosecond)]; nanosecond: 421_000_000);
+    check!(".42195",        [fix!(Nanosecond)]; nanosecond: 421_950_000);
+    check!(".421950803",    [fix!(Nanosecond)]; nanosecond: 421_950_803);
+    check!(".421950803547", [fix!(Nanosecond)]; nanosecond: 421_950_803);
+    check!(".000000003547", [fix!(Nanosecond)]; nanosecond: 3);
+    check!(".000000000547", [fix!(Nanosecond)]; nanosecond: 0);
+    check!(".",             [fix!(Nanosecond)]; TOO_SHORT);
+    check!(".4x",           [fix!(Nanosecond)]; TOO_LONG);
+    check!(".  4",          [fix!(Nanosecond)]; INVALID);
+    check!("  .4",          [fix!(Nanosecond)]; TOO_LONG); // no automatic trimming
+
+    // fixed: timezone offsets
+    check!("+00:00",    [fix!(TimezoneOffset)]; offset: 0);
+    check!("-00:00",    [fix!(TimezoneOffset)]; offset: 0);
+    check!("+00:01",    [fix!(TimezoneOffset)]; offset: 60);
+    check!("-00:01",    [fix!(TimezoneOffset)]; offset: -60);
+    check!("+00:30",    [fix!(TimezoneOffset)]; offset: 30 * 60);
+    check!("-00:30",    [fix!(TimezoneOffset)]; offset: -30 * 60);
+    check!("+04:56",    [fix!(TimezoneOffset)]; offset: 296 * 60);
+    check!("-04:56",    [fix!(TimezoneOffset)]; offset: -296 * 60);
+    check!("+24:00",    [fix!(TimezoneOffset)]; offset: 24 * 60 * 60);
+    check!("-24:00",    [fix!(TimezoneOffset)]; offset: -24 * 60 * 60);
+    check!("+99:59",    [fix!(TimezoneOffset)]; offset: (100 * 60 - 1) * 60);
+    check!("-99:59",    [fix!(TimezoneOffset)]; offset: -(100 * 60 - 1) * 60);
+    check!("+00:59",    [fix!(TimezoneOffset)]; offset: 59 * 60);
+    check!("+00:60",    [fix!(TimezoneOffset)]; OUT_OF_RANGE);
+    check!("+00:99",    [fix!(TimezoneOffset)]; OUT_OF_RANGE);
+    check!("#12:34",    [fix!(TimezoneOffset)]; INVALID);
+    check!("12:34",     [fix!(TimezoneOffset)]; INVALID);
+    check!("+12:34 ",   [fix!(TimezoneOffset)]; TOO_LONG);
+    check!(" +12:34",   [fix!(TimezoneOffset)]; offset: 754 * 60);
+    check!("\t -12:34", [fix!(TimezoneOffset)]; offset: -754 * 60);
+    check!("",          [fix!(TimezoneOffset)]; TOO_SHORT);
+    check!("+",         [fix!(TimezoneOffset)]; TOO_SHORT);
+    check!("+1",        [fix!(TimezoneOffset)]; TOO_SHORT);
+    check!("+12",       [fix!(TimezoneOffset)]; TOO_SHORT);
+    check!("+123",      [fix!(TimezoneOffset)]; TOO_SHORT);
+    check!("+1234",     [fix!(TimezoneOffset)]; offset: 754 * 60);
+    check!("+12345",    [fix!(TimezoneOffset)]; TOO_LONG);
+    check!("+12345",    [fix!(TimezoneOffset), num!(Day)]; offset: 754 * 60, day: 5);
+    check!("Z",         [fix!(TimezoneOffset)]; INVALID);
+    check!("z",         [fix!(TimezoneOffset)]; INVALID);
+    check!("Z",         [fix!(TimezoneOffsetZ)]; offset: 0);
+    check!("z",         [fix!(TimezoneOffsetZ)]; offset: 0);
+    check!("Y",         [fix!(TimezoneOffsetZ)]; INVALID);
+    check!("Zulu",      [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 0);
+    check!("zulu",      [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 0);
+    check!("+1234ulu",  [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 754 * 60);
+    check!("+12:34ulu", [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 754 * 60);
+    check!("???",       [fix!(TimezoneName)]; BAD_FORMAT); // not allowed
+
+    // some practical examples
+    check!("2015-02-04T14:37:05+09:00",
+           [num!(Year), lit!("-"), num!(Month), lit!("-"), num!(Day), lit!("T"),
+            num!(Hour), lit!(":"), num!(Minute), lit!(":"), num!(Second), fix!(TimezoneOffset)];
+           year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2,
+           minute: 37, second: 5, offset: 32400);
+    check!("Mon, 10 Jun 2013 09:32:37 GMT",
+           [fix!(ShortWeekdayName), lit!(","), sp!(" "), num!(Day), sp!(" "),
+            fix!(ShortMonthName), sp!(" "), num!(Year), sp!(" "), num!(Hour), lit!(":"),
+            num!(Minute), lit!(":"), num!(Second), sp!(" "), lit!("GMT")];
+           year: 2013, month: 6, day: 10, weekday: Weekday::Mon,
+           hour_div_12: 0, hour_mod_12: 9, minute: 32, second: 37);
+    check!("20060102150405",
+           [num!(Year), num!(Month), num!(Day), num!(Hour), num!(Minute), num!(Second)];
+           year: 2006, month: 1, day: 2, hour_div_12: 1, hour_mod_12: 3, minute: 4, second: 5);
+    check!("3:14PM",
+           [num!(Hour12), lit!(":"), num!(Minute), fix!(LowerAmPm)];
+           hour_div_12: 1, hour_mod_12: 3, minute: 14);
+    check!("12345678901234.56789",
+           [num!(Timestamp), lit!("."), num!(Nanosecond)];
+           nanosecond: 56_789, timestamp: 12_345_678_901_234);
+    check!("12345678901234.56789",
+           [num!(Timestamp), fix!(Nanosecond)];
+           nanosecond: 567_890_000, timestamp: 12_345_678_901_234);
+}
+
+#[cfg(test)]
+#[test]
+fn test_rfc2822() {
+    use datetime::DateTime;
+    use offset::fixed::FixedOffset;
+    use super::*;
+    use super::NOT_ENOUGH;
+
+    // Test data - (input, Ok(expected result after parse and format) or Err(error code))
+    let testdates = [
+        ("Tue, 20 Jan 2015 17:35:20 -0800", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), // normal case
+        ("20 Jan 2015 17:35:20 -0800", Ok("Tue, 20 Jan 2015 17:35:20 -0800")),  // no day of week
+        ("20 JAN 2015 17:35:20 -0800", Ok("Tue, 20 Jan 2015 17:35:20 -0800")),  // upper case month
+        ("11 Sep 2001 09:45:00 EST", Ok("Tue, 11 Sep 2001 09:45:00 -0500")),
+        ("30 Feb 2015 17:35:20 -0800", Err(OUT_OF_RANGE)),      // bad day of month
+        ("Tue, 20 Jan 2015", Err(TOO_SHORT)),                   // omitted fields
+        ("Tue, 20 Avr 2015 17:35:20 -0800", Err(INVALID)),      // bad month name
+        ("Tue, 20 Jan 2015 25:35:20 -0800", Err(OUT_OF_RANGE)), // bad hour
+        ("Tue, 20 Jan 2015 7:35:20 -0800", Err(INVALID)),       // bad # of digits in hour
+        ("Tue, 20 Jan 2015 17:65:20 -0800", Err(OUT_OF_RANGE)), // bad minute
+        ("Tue, 20 Jan 2015 17:35:90 -0800", Err(OUT_OF_RANGE)), // bad second
+        ("Tue, 20 Jan 2015 17:35:20 -0890", Err(OUT_OF_RANGE)), // bad offset
+        ("6 Jun 1944 04:00:00Z", Err(INVALID)),                 // bad offset (zulu not allowed)
+        ("Tue, 20 Jan 2015 17:35:20 HAS", Err(NOT_ENOUGH))      // bad named time zone
+    ];
+
+    fn rfc2822_to_datetime(date: &str) -> ParseResult<DateTime<FixedOffset>> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, date, [Item::Fixed(Fixed::RFC2822)].iter().cloned()));
+        parsed.to_datetime()
+    }
+
+    fn fmt_rfc2822_datetime(dt: DateTime<FixedOffset>) -> String {
+        dt.format_with_items([Item::Fixed(Fixed::RFC2822)].iter().cloned()).to_string()
+    }
+
+    // Test against test data above
+    for &(date, checkdate) in testdates.iter() {
+        let d = rfc2822_to_datetime(date);          // parse a date
+        let dt = match d {                          // did we get a value?
+            Ok(dt) => Ok(fmt_rfc2822_datetime(dt)), // yes, go on
+            Err(e) => Err(e),                       // otherwise keep an error for the comparison
+        };
+        if dt != checkdate.map(|s| s.to_string()) { // check for expected result
+            panic!("Date conversion failed for {}\nReceived: {:?}\nExpected: {:?}",
+                   date, dt, checkdate);
+        }
+    };
+}
+
+
+
+#[cfg(test)]
+#[test]
+fn parse_rfc850() {
+    use ::{UTC, TimeZone};
+
+    static RFC850_FMT: &'static str =  "%A, %d-%b-%y %T GMT";
+
+    let dt_str = "Sunday, 06-Nov-94 08:49:37 GMT";
+    let dt = UTC.ymd(1994, 11, 6).and_hms(8, 49, 37);
+
+    // Check that the format is what we expect
+    assert_eq!(dt.format(RFC850_FMT).to_string(), dt_str);
+
+    // Check that it parses correctly
+    assert_eq!(Ok(dt), UTC.datetime_from_str("Sunday, 06-Nov-94 08:49:37 GMT", RFC850_FMT));
+
+    // Check that the rest of the weekdays parse correctly (this test originally failed because
+    // Sunday parsed incorrectly).
+    let testdates = [
+        (UTC.ymd(1994, 11, 7).and_hms(8, 49, 37),  "Monday, 07-Nov-94 08:49:37 GMT"),
+        (UTC.ymd(1994, 11, 8).and_hms(8, 49, 37),  "Tuesday, 08-Nov-94 08:49:37 GMT"),
+        (UTC.ymd(1994, 11, 9).and_hms(8, 49, 37),  "Wednesday, 09-Nov-94 08:49:37 GMT"),
+        (UTC.ymd(1994, 11, 10).and_hms(8, 49, 37), "Thursday, 10-Nov-94 08:49:37 GMT"),
+        (UTC.ymd(1994, 11, 11).and_hms(8, 49, 37), "Friday, 11-Nov-94 08:49:37 GMT"),
+        (UTC.ymd(1994, 11, 12).and_hms(8, 49, 37), "Saturday, 12-Nov-94 08:49:37 GMT"),
+    ];
+
+    for val in &testdates {
+        assert_eq!(Ok(val.0), UTC.datetime_from_str(val.1, RFC850_FMT));
+    }
+}
+
+#[cfg(test)]
+#[test]
+fn test_rfc3339() {
+    use datetime::DateTime;
+    use offset::fixed::FixedOffset;
+    use super::*;
+
+    // Test data - (input, Ok(expected result after parse and format) or Err(error code))
+    let testdates = [
+        ("2015-01-20T17:35:20-08:00", Ok("2015-01-20T17:35:20-08:00")), // normal case
+        ("1944-06-06T04:04:00Z", Ok("1944-06-06T04:04:00+00:00")),      // D-day
+        ("2001-09-11T09:45:00-08:00", Ok("2001-09-11T09:45:00-08:00")),
+        ("2015-01-20T17:35:20.001-08:00", Ok("2015-01-20T17:35:20.001-08:00")),
+        ("2015-01-20T17:35:20.000031-08:00", Ok("2015-01-20T17:35:20.000031-08:00")),
+        ("2015-01-20T17:35:20.000000004-08:00", Ok("2015-01-20T17:35:20.000000004-08:00")),
+        ("2015-01-20T17:35:20.000000000452-08:00", Ok("2015-01-20T17:35:20-08:00")), // too small
+        ("2015-02-30T17:35:20-08:00", Err(OUT_OF_RANGE)),               // bad day of month
+        ("2015-01-20T25:35:20-08:00", Err(OUT_OF_RANGE)),               // bad hour
+        ("2015-01-20T17:65:20-08:00", Err(OUT_OF_RANGE)),               // bad minute
+        ("2015-01-20T17:35:90-08:00", Err(OUT_OF_RANGE)),               // bad second
+        ("2015-01-20T17:35:20-24:00", Err(OUT_OF_RANGE)),               // bad offset
+    ];
+
+    fn rfc3339_to_datetime(date: &str) -> ParseResult<DateTime<FixedOffset>> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, date, [Item::Fixed(Fixed::RFC3339)].iter().cloned()));
+        parsed.to_datetime()
+    }
+
+    fn fmt_rfc3339_datetime(dt: DateTime<FixedOffset>) -> String {
+        dt.format_with_items([Item::Fixed(Fixed::RFC3339)].iter().cloned()).to_string()
+    }
+
+    // Test against test data above
+    for &(date, checkdate) in testdates.iter() {
+        let d = rfc3339_to_datetime(date);          // parse a date
+        let dt = match d {                          // did we get a value?
+            Ok(dt) => Ok(fmt_rfc3339_datetime(dt)), // yes, go on
+            Err(e) => Err(e),                       // otherwise keep an error for the comparison
+        };
+        if dt != checkdate.map(|s| s.to_string()) { // check for expected result
+            panic!("Date conversion failed for {}\nReceived: {:?}\nExpected: {:?}",
+                   date, dt, checkdate);
+        }
+    };
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/format/parsed.rs
@@ -0,0 +1,1085 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+//! A collection of parsed date and time items.
+//! They can be constructed incrementally while being checked for consistency.
+
+use num::traits::ToPrimitive;
+
+use {Datelike, Timelike};
+use Weekday;
+use div::div_rem;
+use duration::Duration;
+use offset::{TimeZone, Offset, LocalResult};
+use offset::fixed::FixedOffset;
+use naive::date::NaiveDate;
+use naive::time::NaiveTime;
+use naive::datetime::NaiveDateTime;
+use datetime::DateTime;
+use super::{ParseResult, OUT_OF_RANGE, IMPOSSIBLE, NOT_ENOUGH};
+
+/// Parsed parts of date and time. There are two classes of methods:
+///
+/// - `set_*` methods try to set given field(s) while checking for the consistency.
+///   It may or may not check for the range constraint immediately (for efficiency reasons).
+///
+/// - `to_*` methods try to make a concrete date and time value out of set fields.
+///   It fully checks any remaining out-of-range conditions and inconsistent/impossible fields.
+#[allow(missing_copy_implementations)]
+#[derive(Clone, PartialEq, Debug)]
+pub struct Parsed {
+    /// Year.
+    ///
+    /// This can be negative unlike [`year_div_100`](#structfield.year_div_100)
+    /// and [`year_mod_100`](#structfield.year_mod_100) fields.
+    pub year: Option<i32>,
+
+    /// Year divided by 100. Implies that the year is >= 1 BCE when set.
+    ///
+    /// Due to the common usage, if this field is missing but
+    /// [`year_mod_100`](#structfield.year_mod_100) is present,
+    /// it is inferred to 19 when `year_mod_100 >= 70` and 20 otherwise.
+    pub year_div_100: Option<i32>,
+
+    /// Year modulo 100. Implies that the year is >= 1 BCE when set.
+    pub year_mod_100: Option<i32>,
+
+    /// Year in the [ISO week date](../../naive/date/index.html#week-date).
+    ///
+    /// This can be negative unlike [`isoyear_div_100`](#structfield.isoyear_div_100) and
+    /// [`isoyear_mod_100`](#structfield.isoyear_mod_100) fields.
+    pub isoyear: Option<i32>,
+
+    /// Year in the [ISO week date](../../naive/date/index.html#week-date), divided by 100.
+    /// Implies that the year is >= 1 BCE when set.
+    ///
+    /// Due to the common usage, if this field is missing but
+    /// [`isoyear_mod_100`](#structfield.isoyear_mod_100) is present,
+    /// it is inferred to 19 when `isoyear_mod_100 >= 70` and 20 otherwise.
+    pub isoyear_div_100: Option<i32>,
+
+    /// Year in the [ISO week date](../../naive/date/index.html#week-date), modulo 100.
+    /// Implies that the year is >= 1 BCE when set.
+    pub isoyear_mod_100: Option<i32>,
+
+    /// Month (1--12).
+    pub month: Option<u32>,
+
+    /// Week number, where the week 1 starts at the first Sunday of January
+    /// (0--53, 1--53 or 1--52 depending on the year).
+    pub week_from_sun: Option<u32>,
+
+    /// Week number, where the week 1 starts at the first Monday of January
+    /// (0--53, 1--53 or 1--52 depending on the year).
+    pub week_from_mon: Option<u32>,
+
+    /// [ISO week number](../../naive/date/index.html#week-date)
+    /// (1--52 or 1--53 depending on the year).
+    pub isoweek: Option<u32>,
+
+    /// Day of the week.
+    pub weekday: Option<Weekday>,
+
+    /// Day of the year (1--365 or 1--366 depending on the year).
+    pub ordinal: Option<u32>,
+
+    /// Day of the month (1--28, 1--29, 1--30 or 1--31 depending on the month).
+    pub day: Option<u32>,
+
+    /// Hour number divided by 12 (0--1). 0 indicates AM and 1 indicates PM.
+    pub hour_div_12: Option<u32>,
+
+    /// Hour number modulo 12 (0--11).
+    pub hour_mod_12: Option<u32>,
+
+    /// Minute number (0--59).
+    pub minute: Option<u32>,
+
+    /// Second number (0--60, accounting for leap seconds).
+    pub second: Option<u32>,
+
+    /// The number of nanoseconds since the whole second (0--999,999,999).
+    pub nanosecond: Option<u32>,
+
+    /// The number of non-leap seconds since the midnight UTC on January 1, 1970.
+    ///
+    /// This can be off by one if [`second`](#structfield.second) is 60 (a leap second).
+    pub timestamp: Option<i64>,
+
+    /// Offset from the local time to UTC, in seconds.
+    pub offset: Option<i32>,
+}
+
+/// Checks if `old` is either empty or has the same value to `new` (i.e. "consistent"),
+/// and if it is empty, set `old` to `new` as well.
+fn set_if_consistent<T: PartialEq>(old: &mut Option<T>, new: T) -> ParseResult<()> {
+    if let Some(ref old) = *old {
+        if *old == new {Ok(())} else {Err(IMPOSSIBLE)}
+    } else {
+        *old = Some(new);
+        Ok(())
+    }
+}
+
+impl Parsed {
+    /// Returns the initial value of parsed parts.
+    pub fn new() -> Parsed {
+        Parsed { year: None, year_div_100: None, year_mod_100: None, isoyear: None,
+                 isoyear_div_100: None, isoyear_mod_100: None, month: None,
+                 week_from_sun: None, week_from_mon: None, isoweek: None, weekday: None,
+                 ordinal: None, day: None, hour_div_12: None, hour_mod_12: None, minute: None,
+                 second: None, nanosecond: None, timestamp: None, offset: None }
+    }
+
+    /// Tries to set the [`year`](#structfield.year) field from given value.
+    pub fn set_year(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.year, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`year_div_100`](#structfield.year_div_100) field from given value.
+    pub fn set_year_div_100(&mut self, value: i64) -> ParseResult<()> {
+        if value < 0 { return Err(OUT_OF_RANGE); }
+        set_if_consistent(&mut self.year_div_100, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`year_mod_100`](#structfield.year_mod_100) field from given value.
+    pub fn set_year_mod_100(&mut self, value: i64) -> ParseResult<()> {
+        if value < 0 { return Err(OUT_OF_RANGE); }
+        set_if_consistent(&mut self.year_mod_100, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`isoyear`](#structfield.isoyear) field from given value.
+    pub fn set_isoyear(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.isoyear, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`isoyear_div_100`](#structfield.isoyear_div_100) field from given value.
+    pub fn set_isoyear_div_100(&mut self, value: i64) -> ParseResult<()> {
+        if value < 0 { return Err(OUT_OF_RANGE); }
+        set_if_consistent(&mut self.isoyear_div_100, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`isoyear_mod_100`](#structfield.isoyear_mod_100) field from given value.
+    pub fn set_isoyear_mod_100(&mut self, value: i64) -> ParseResult<()> {
+        if value < 0 { return Err(OUT_OF_RANGE); }
+        set_if_consistent(&mut self.isoyear_mod_100, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`month`](#structfield.month) field from given value.
+    pub fn set_month(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.month, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`week_from_sun`](#structfield.week_from_sun) field from given value.
+    pub fn set_week_from_sun(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.week_from_sun, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`week_from_mon`](#structfield.week_from_mon) field from given value.
+    pub fn set_week_from_mon(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.week_from_mon, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`isoweek`](#structfield.isoweek) field from given value.
+    pub fn set_isoweek(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.isoweek, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`weekday`](#structfield.weekday) field from given value.
+    pub fn set_weekday(&mut self, value: Weekday) -> ParseResult<()> {
+        set_if_consistent(&mut self.weekday, value)
+    }
+
+    /// Tries to set the [`ordinal`](#structfield.ordinal) field from given value.
+    pub fn set_ordinal(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.ordinal, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`day`](#structfield.day) field from given value.
+    pub fn set_day(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.day, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`hour_div_12`](#structfield.hour_div_12) field from given value.
+    /// (`false` for AM, `true` for PM)
+    pub fn set_ampm(&mut self, value: bool) -> ParseResult<()> {
+        set_if_consistent(&mut self.hour_div_12, if value {1} else {0})
+    }
+
+    /// Tries to set the [`hour_mod_12`](#structfield.hour_mod_12) field from
+    /// given hour number in 12-hour clocks.
+    pub fn set_hour12(&mut self, value: i64) -> ParseResult<()> {
+        if value < 1 || value > 12 { return Err(OUT_OF_RANGE); }
+        set_if_consistent(&mut self.hour_mod_12, value as u32 % 12)
+    }
+
+    /// Tries to set both [`hour_div_12`](#structfield.hour_div_12) and
+    /// [`hour_mod_12`](#structfield.hour_mod_12) fields from given value.
+    pub fn set_hour(&mut self, value: i64) -> ParseResult<()> {
+        let v = try!(value.to_u32().ok_or(OUT_OF_RANGE));
+        try!(set_if_consistent(&mut self.hour_div_12, v / 12));
+        try!(set_if_consistent(&mut self.hour_mod_12, v % 12));
+        Ok(())
+    }
+
+    /// Tries to set the [`minute`](#structfield.minute) field from given value.
+    pub fn set_minute(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.minute, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`second`](#structfield.second) field from given value.
+    pub fn set_second(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.second, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`nanosecond`](#structfield.nanosecond) field from given value.
+    pub fn set_nanosecond(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.nanosecond, try!(value.to_u32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Tries to set the [`timestamp`](#structfield.timestamp) field from given value.
+    pub fn set_timestamp(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.timestamp, value)
+    }
+
+    /// Tries to set the [`offset`](#structfield.offset) field from given value.
+    pub fn set_offset(&mut self, value: i64) -> ParseResult<()> {
+        set_if_consistent(&mut self.offset, try!(value.to_i32().ok_or(OUT_OF_RANGE)))
+    }
+
+    /// Returns a parsed naive date out of given fields.
+    ///
+    /// This method is able to determine the date from given subset of fields:
+    ///
+    /// - Year, month, day.
+    /// - Year, day of the year (ordinal).
+    /// - Year, week number counted from Sunday or Monday, day of the week.
+    /// - ISO week date.
+    ///
+    /// Gregorian year and ISO week date year can have their century number (`*_div_100`) omitted,
+    /// the two-digit year is used to guess the century number then.
+    pub fn to_naive_date(&self) -> ParseResult<NaiveDate> {
+        fn resolve_year(y: Option<i32>, q: Option<i32>,
+                        r: Option<i32>) -> ParseResult<Option<i32>> {
+            match (y, q, r) {
+                // if there is no further information, simply return the given full year.
+                // this is a common case, so let's avoid division here.
+                (y, None, None) => Ok(y),
+
+                // if there is a full year *and* also quotient and/or modulo,
+                // check if present quotient and/or modulo is consistent to the full year.
+                // since the presence of those fields means a positive full year,
+                // we should filter a negative full year first.
+                (Some(y), q, r @ Some(0...99)) | (Some(y), q, r @ None) => {
+                    if y < 0 { return Err(OUT_OF_RANGE); }
+                    let (q_, r_) = div_rem(y, 100);
+                    if q.unwrap_or(q_) == q_ && r.unwrap_or(r_) == r_ {
+                        Ok(Some(y))
+                    } else {
+                        Err(IMPOSSIBLE)
+                    }
+                },
+
+                // the full year is missing but we have quotient and modulo.
+                // reconstruct the full year. make sure that the result is always positive.
+                (None, Some(q), Some(r @ 0...99)) => {
+                    if q < 0 { return Err(OUT_OF_RANGE); }
+                    let y = q.checked_mul(100).and_then(|v| v.checked_add(r));
+                    Ok(Some(try!(y.ok_or(OUT_OF_RANGE))))
+                },
+
+                // we only have modulo. try to interpret a modulo as a conventional two-digit year.
+                // note: we are affected by Rust issue #18060. avoid multiple range patterns.
+                (None, None, Some(r @ 0...99)) => Ok(Some(r + if r < 70 {2000} else {1900})),
+
+                // otherwise it is an out-of-bound or insufficient condition.
+                (None, Some(_), None) => Err(NOT_ENOUGH),
+                (_, _, Some(_)) => Err(OUT_OF_RANGE),
+            }
+        }
+
+        let given_year =
+            try!(resolve_year(self.year, self.year_div_100, self.year_mod_100));
+        let given_isoyear =
+            try!(resolve_year(self.isoyear, self.isoyear_div_100, self.isoyear_mod_100));
+
+        // verify the normal year-month-day date.
+        let verify_ymd = |date: NaiveDate| {
+            let year = date.year();
+            let (year_div_100, year_mod_100) = if year >= 0 {
+                let (q, r) = div_rem(year, 100);
+                (Some(q), Some(r))
+            } else {
+                (None, None) // they should be empty to be consistent
+            };
+            let month = date.month();
+            let day = date.day();
+            (self.year.unwrap_or(year) == year &&
+             self.year_div_100.or(year_div_100) == year_div_100 &&
+             self.year_mod_100.or(year_mod_100) == year_mod_100 &&
+             self.month.unwrap_or(month) == month &&
+             self.day.unwrap_or(day) == day)
+        };
+
+        // verify the ISO week date.
+        let verify_isoweekdate = |date: NaiveDate| {
+            let (isoyear, isoweek, weekday) = date.isoweekdate();
+            let (isoyear_div_100, isoyear_mod_100) = if isoyear >= 0 {
+                let (q, r) = div_rem(isoyear, 100);
+                (Some(q), Some(r))
+            } else {
+                (None, None) // they should be empty to be consistent
+            };
+            (self.isoyear.unwrap_or(isoyear) == isoyear &&
+             self.isoyear_div_100.or(isoyear_div_100) == isoyear_div_100 &&
+             self.isoyear_mod_100.or(isoyear_mod_100) == isoyear_mod_100 &&
+             self.isoweek.unwrap_or(isoweek) == isoweek &&
+             self.weekday.unwrap_or(weekday) == weekday)
+        };
+
+        // verify the ordinal and other (non-ISO) week dates.
+        let verify_ordinal = |date: NaiveDate| {
+            let ordinal = date.ordinal();
+            let weekday = date.weekday();
+            let week_from_sun = (ordinal as i32 - weekday.num_days_from_sunday() as i32 + 7) / 7;
+            let week_from_mon = (ordinal as i32 - weekday.num_days_from_monday() as i32 + 7) / 7;
+            (self.ordinal.unwrap_or(ordinal) == ordinal &&
+             self.week_from_sun.map_or(week_from_sun, |v| v as i32) == week_from_sun &&
+             self.week_from_mon.map_or(week_from_mon, |v| v as i32) == week_from_mon)
+        };
+
+        // test several possibilities.
+        // tries to construct a full `NaiveDate` as much as possible, then verifies that
+        // it is consistent with other given fields.
+        let (verified, parsed_date) = match (given_year, given_isoyear, self) {
+            (Some(year), _, &Parsed { month: Some(month), day: Some(day), .. }) => {
+                // year, month, day
+                let date = try!(NaiveDate::from_ymd_opt(year, month, day).ok_or(OUT_OF_RANGE));
+                (verify_isoweekdate(date) && verify_ordinal(date), date)
+            },
+
+            (Some(year), _, &Parsed { ordinal: Some(ordinal), .. }) => {
+                // year, day of the year
+                let date = try!(NaiveDate::from_yo_opt(year, ordinal).ok_or(OUT_OF_RANGE));
+                (verify_ymd(date) && verify_isoweekdate(date) && verify_ordinal(date), date)
+            },
+
+            (Some(year), _, &Parsed { week_from_sun: Some(week_from_sun),
+                                      weekday: Some(weekday), .. }) => {
+                // year, week (starting at 1st Sunday), day of the week
+                let newyear = try!(NaiveDate::from_yo_opt(year, 1).ok_or(OUT_OF_RANGE));
+                let firstweek = match newyear.weekday() {
+                    Weekday::Sun => 0,
+                    Weekday::Mon => 6,
+                    Weekday::Tue => 5,
+                    Weekday::Wed => 4,
+                    Weekday::Thu => 3,
+                    Weekday::Fri => 2,
+                    Weekday::Sat => 1,
+                };
+
+                // `firstweek+1`-th day of January is the beginning of the week 1.
+                if week_from_sun > 53 { return Err(OUT_OF_RANGE); } // can it overflow?
+                let ndays = firstweek + (week_from_sun as i32 - 1) * 7 +
+                            weekday.num_days_from_sunday() as i32;
+                let date = try!(newyear.checked_add(Duration::days(ndays as i64))
+                                       .ok_or(OUT_OF_RANGE));
+                if date.year() != year { return Err(OUT_OF_RANGE); } // early exit for correct error
+
+                (verify_ymd(date) && verify_isoweekdate(date) && verify_ordinal(date), date)
+            },
+
+            (Some(year), _, &Parsed { week_from_mon: Some(week_from_mon),
+                                      weekday: Some(weekday), .. }) => {
+                // year, week (starting at 1st Monday), day of the week
+                let newyear = try!(NaiveDate::from_yo_opt(year, 1).ok_or(OUT_OF_RANGE));
+                let firstweek = match newyear.weekday() {
+                    Weekday::Sun => 1,
+                    Weekday::Mon => 0,
+                    Weekday::Tue => 6,
+                    Weekday::Wed => 5,
+                    Weekday::Thu => 4,
+                    Weekday::Fri => 3,
+                    Weekday::Sat => 2,
+                };
+
+                // `firstweek+1`-th day of January is the beginning of the week 1.
+                if week_from_mon > 53 { return Err(OUT_OF_RANGE); } // can it overflow?
+                let ndays = firstweek + (week_from_mon as i32 - 1) * 7 +
+                            weekday.num_days_from_monday() as i32;
+                let date = try!(newyear.checked_add(Duration::days(ndays as i64))
+                                       .ok_or(OUT_OF_RANGE));
+                if date.year() != year { return Err(OUT_OF_RANGE); } // early exit for correct error
+
+                (verify_ymd(date) && verify_isoweekdate(date) && verify_ordinal(date), date)
+            },
+
+            (_, Some(isoyear), &Parsed { isoweek: Some(isoweek), weekday: Some(weekday), .. }) => {
+                // ISO year, week, day of the week
+                let date = NaiveDate::from_isoywd_opt(isoyear, isoweek, weekday);
+                let date = try!(date.ok_or(OUT_OF_RANGE));
+                (verify_ymd(date) && verify_ordinal(date), date)
+            },
+
+            (_, _, _) => return Err(NOT_ENOUGH)
+        };
+
+        if verified {
+            Ok(parsed_date)
+        } else {
+            Err(IMPOSSIBLE)
+        }
+    }
+
+    /// Returns a parsed naive time out of given fields.
+    ///
+    /// This method is able to determine the time from given subset of fields:
+    ///
+    /// - Hour, minute. (second and nanosecond assumed to be 0)
+    /// - Hour, minute, second. (nanosecond assumed to be 0)
+    /// - Hour, minute, second, nanosecond.
+    ///
+    /// It is able to handle leap seconds when given second is 60.
+    pub fn to_naive_time(&self) -> ParseResult<NaiveTime> {
+        let hour_div_12 = match self.hour_div_12 {
+            Some(v @ 0...1) => v,
+            Some(_) => return Err(OUT_OF_RANGE),
+            None => return Err(NOT_ENOUGH),
+        };
+        let hour_mod_12 = match self.hour_mod_12 {
+            Some(v @ 0...11) => v,
+            Some(_) => return Err(OUT_OF_RANGE),
+            None => return Err(NOT_ENOUGH),
+        };
+        let hour = hour_div_12 * 12 + hour_mod_12;
+
+        let minute = match self.minute {
+            Some(v @ 0...59) => v,
+            Some(_) => return Err(OUT_OF_RANGE),
+            None => return Err(NOT_ENOUGH),
+        };
+
+        // we allow omitting seconds or nanoseconds, but they should be in the range.
+        let (second, mut nano) = match self.second.unwrap_or(0) {
+            v @ 0...59 => (v, 0),
+            60 => (59, 1_000_000_000),
+            _ => return Err(OUT_OF_RANGE),
+        };
+        nano += match self.nanosecond {
+            Some(v @ 0...999_999_999) if self.second.is_some() => v,
+            Some(0...999_999_999) => return Err(NOT_ENOUGH), // second is missing
+            Some(_) => return Err(OUT_OF_RANGE),
+            None => 0,
+        };
+
+        NaiveTime::from_hms_nano_opt(hour, minute, second, nano).ok_or(OUT_OF_RANGE)
+    }
+
+    /// Returns a parsed naive date and time out of given fields,
+    /// except for the [`offset`](#structfield.offset) field (assumed to have a given value).
+    /// This is required for parsing a local time or other known-timezone inputs.
+    ///
+    /// This method is able to determine the combined date and time
+    /// from date and time fields or a single [`timestamp`](#structfield.timestamp) field.
+    /// Either way those fields have to be consistent to each other.
+    pub fn to_naive_datetime_with_offset(&self, offset: i32) -> ParseResult<NaiveDateTime> {
+        let date = self.to_naive_date();
+        let time = self.to_naive_time();
+        if let (Ok(date), Ok(time)) = (date, time) {
+            let datetime = date.and_time(time);
+
+            // verify the timestamp field if any
+            // the following is safe, `timestamp` is very limited in range
+            let timestamp = datetime.timestamp() - offset as i64;
+            if let Some(given_timestamp) = self.timestamp {
+                // if `datetime` represents a leap second, it might be off by one second.
+                if given_timestamp != timestamp &&
+                   !(datetime.nanosecond() >= 1_000_000_000 && given_timestamp == timestamp + 1) {
+                    return Err(IMPOSSIBLE);
+                }
+            }
+
+            Ok(datetime)
+        } else if let Some(timestamp) = self.timestamp {
+            use super::ParseError as PE;
+            use super::ParseErrorKind::{OutOfRange, Impossible};
+
+            // if date and time is problematic already, there is no point proceeding.
+            // we at least try to give a correct error though.
+            match (date, time) {
+                (Err(PE(OutOfRange)), _) | (_, Err(PE(OutOfRange))) => return Err(OUT_OF_RANGE),
+                (Err(PE(Impossible)), _) | (_, Err(PE(Impossible))) => return Err(IMPOSSIBLE),
+                (_, _) => {} // one of them is insufficient
+            }
+
+            // reconstruct date and time fields from timestamp
+            let ts = try!(timestamp.checked_add(offset as i64).ok_or(OUT_OF_RANGE));
+            let datetime = NaiveDateTime::from_timestamp_opt(ts, 0);
+            let mut datetime = try!(datetime.ok_or(OUT_OF_RANGE));
+
+            // fill year, ordinal, hour, minute and second fields from timestamp.
+            // if existing fields are consistent, this will allow the full date/time reconstruction.
+            let mut parsed = self.clone();
+            if parsed.second == Some(60) {
+                // `datetime.second()` cannot be 60, so this is the only case for a leap second.
+                match datetime.second() {
+                    // it's okay, just do not try to overwrite the existing field.
+                    59 => {}
+                    // `datetime` is known to be off by one second.
+                    0 => { datetime = datetime - Duration::seconds(1); }
+                    // otherwise it is impossible.
+                    _ => return Err(IMPOSSIBLE)
+                }
+                // ...and we have the correct candidates for other fields.
+            } else {
+                try!(parsed.set_second(datetime.second() as i64));
+            }
+            try!(parsed.set_year   (datetime.year()    as i64));
+            try!(parsed.set_ordinal(datetime.ordinal() as i64)); // more efficient than ymd
+            try!(parsed.set_hour   (datetime.hour()    as i64));
+            try!(parsed.set_minute (datetime.minute()  as i64));
+            try!(parsed.set_nanosecond(0)); // no nanosecond precision in timestamp
+
+            // validate other fields (e.g. week) and return
+            let date = try!(parsed.to_naive_date());
+            let time = try!(parsed.to_naive_time());
+            Ok(date.and_time(time))
+        } else {
+            // reproduce the previous error(s)
+            try!(date);
+            try!(time);
+            unreachable!()
+        }
+    }
+
+    /// Returns a parsed fixed time zone offset out of given fields.
+    pub fn to_fixed_offset(&self) -> ParseResult<FixedOffset> {
+        self.offset.and_then(|offset| FixedOffset::east_opt(offset)).ok_or(OUT_OF_RANGE)
+    }
+
+    /// Returns a parsed timezone-aware date and time out of given fields.
+    ///
+    /// This method is able to determine the combined date and time
+    /// from date and time fields or a single [`timestamp`](#structfield.timestamp) field,
+    /// plus a time zone offset.
+    /// Either way those fields have to be consistent to each other.
+    pub fn to_datetime(&self) -> ParseResult<DateTime<FixedOffset>> {
+        let offset = try!(self.offset.ok_or(NOT_ENOUGH));
+        let datetime = try!(self.to_naive_datetime_with_offset(offset));
+        let offset = try!(FixedOffset::east_opt(offset).ok_or(OUT_OF_RANGE));
+        match offset.from_local_datetime(&datetime) {
+            LocalResult::None => Err(IMPOSSIBLE),
+            LocalResult::Single(t) => Ok(t),
+            LocalResult::Ambiguous(..) => Err(NOT_ENOUGH),
+        }
+    }
+
+    /// Returns a parsed timezone-aware date and time out of given fields,
+    /// with an additional `TimeZone` used to interpret and validate the local date.
+    ///
+    /// This method is able to determine the combined date and time
+    /// from date and time fields or a single [`timestamp`](#structfield.timestamp) field,
+    /// plus a time zone offset.
+    /// Either way those fields have to be consistent to each other.
+    /// If parsed fields include an UTC offset, it also has to be consistent to
+    /// [`offset`](#structfield.offset).
+    pub fn to_datetime_with_timezone<Tz: TimeZone>(&self, tz: &Tz) -> ParseResult<DateTime<Tz>> {
+        // if we have `timestamp` specified, guess an offset from that.
+        let mut guessed_offset = 0;
+        if let Some(timestamp) = self.timestamp {
+            // make a naive `DateTime` from given timestamp and (if any) nanosecond.
+            // an empty `nanosecond` is always equal to zero, so missing nanosecond is fine.
+            let nanosecond = self.nanosecond.unwrap_or(0);
+            let dt = NaiveDateTime::from_timestamp_opt(timestamp, nanosecond);
+            let dt = try!(dt.ok_or(OUT_OF_RANGE));
+
+            // we cannot handle offsets larger than i32 at all. give up if so.
+            // we can instead make `to_naive_datetime_with_offset` to accept i64, but this makes
+            // the algorithm too complex and tons of edge cases. i32 should be enough for all.
+            let offset = tz.offset_from_utc_datetime(&dt).local_minus_utc().num_seconds();
+            guessed_offset = try!(offset.to_i32().ok_or(OUT_OF_RANGE));
+        }
+
+        // checks if the given `DateTime` has a consistent `Offset` with given `self.offset`.
+        let check_offset = |dt: &DateTime<Tz>| {
+            if let Some(offset) = self.offset {
+                let delta = dt.offset().local_minus_utc().num_seconds();
+                // if `delta` does not fit in `i32`, it cannot equal to `self.offset` anyway.
+                delta.to_i32() == Some(offset)
+            } else {
+                true
+            }
+        };
+
+        // `guessed_offset` should be correct when `self.timestamp` is given.
+        // it will be 0 otherwise, but this is fine as the algorithm ignores offset for that case.
+        let datetime = try!(self.to_naive_datetime_with_offset(guessed_offset));
+        match tz.from_local_datetime(&datetime) {
+            LocalResult::None => Err(IMPOSSIBLE),
+            LocalResult::Single(t) => if check_offset(&t) {Ok(t)} else {Err(IMPOSSIBLE)},
+            LocalResult::Ambiguous(min, max) => {
+                // try to disambiguate two possible local dates by offset.
+                match (check_offset(&min), check_offset(&max)) {
+                    (false, false) => Err(IMPOSSIBLE),
+                    (false, true) => Ok(max),
+                    (true, false) => Ok(min),
+                    (true, true) => Err(NOT_ENOUGH),
+                }
+            }
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::Parsed;
+    use super::super::{OUT_OF_RANGE, IMPOSSIBLE, NOT_ENOUGH};
+    use Datelike;
+    use Weekday::*;
+    use naive::date::{self, NaiveDate};
+    use naive::time::NaiveTime;
+    use offset::TimeZone;
+    use offset::utc::UTC;
+    use offset::fixed::FixedOffset;
+
+    #[test]
+    fn test_parsed_set_fields() {
+        // year*, isoyear*
+        let mut p = Parsed::new();
+        assert_eq!(p.set_year(1987), Ok(()));
+        assert_eq!(p.set_year(1986), Err(IMPOSSIBLE));
+        assert_eq!(p.set_year(1988), Err(IMPOSSIBLE));
+        assert_eq!(p.set_year(1987), Ok(()));
+        assert_eq!(p.set_year_div_100(20), Ok(())); // independent to `year`
+        assert_eq!(p.set_year_div_100(21), Err(IMPOSSIBLE));
+        assert_eq!(p.set_year_div_100(19), Err(IMPOSSIBLE));
+        assert_eq!(p.set_year_mod_100(37), Ok(())); // ditto
+        assert_eq!(p.set_year_mod_100(38), Err(IMPOSSIBLE));
+        assert_eq!(p.set_year_mod_100(36), Err(IMPOSSIBLE));
+
+        let mut p = Parsed::new();
+        assert_eq!(p.set_year(0), Ok(()));
+        assert_eq!(p.set_year_div_100(0), Ok(()));
+        assert_eq!(p.set_year_mod_100(0), Ok(()));
+
+        let mut p = Parsed::new();
+        assert_eq!(p.set_year_div_100(-1), Err(OUT_OF_RANGE));
+        assert_eq!(p.set_year_mod_100(-1), Err(OUT_OF_RANGE));
+        assert_eq!(p.set_year(-1), Ok(()));
+        assert_eq!(p.set_year(-2), Err(IMPOSSIBLE));
+        assert_eq!(p.set_year(0), Err(IMPOSSIBLE));
+
+        let mut p = Parsed::new();
+        assert_eq!(p.set_year_div_100(0x1_0000_0008), Err(OUT_OF_RANGE));
+        assert_eq!(p.set_year_div_100(8), Ok(()));
+        assert_eq!(p.set_year_div_100(0x1_0000_0008), Err(OUT_OF_RANGE));
+
+        // month, week*, isoweek, ordinal, day, minute, second, nanosecond, offset
+        let mut p = Parsed::new();
+        assert_eq!(p.set_month(7), Ok(()));
+        assert_eq!(p.set_month(1), Err(IMPOSSIBLE));
+        assert_eq!(p.set_month(6), Err(IMPOSSIBLE));
+        assert_eq!(p.set_month(8), Err(IMPOSSIBLE));
+        assert_eq!(p.set_month(12), Err(IMPOSSIBLE));
+
+        let mut p = Parsed::new();
+        assert_eq!(p.set_month(8), Ok(()));
+        assert_eq!(p.set_month(0x1_0000_0008), Err(OUT_OF_RANGE));
+
+        // hour
+        let mut p = Parsed::new();
+        assert_eq!(p.set_hour(12), Ok(()));
+        assert_eq!(p.set_hour(11), Err(IMPOSSIBLE));
+        assert_eq!(p.set_hour(13), Err(IMPOSSIBLE));
+        assert_eq!(p.set_hour(12), Ok(()));
+        assert_eq!(p.set_ampm(false), Err(IMPOSSIBLE));
+        assert_eq!(p.set_ampm(true), Ok(()));
+        assert_eq!(p.set_hour12(12), Ok(()));
+        assert_eq!(p.set_hour12(0), Err(OUT_OF_RANGE)); // requires canonical representation
+        assert_eq!(p.set_hour12(1), Err(IMPOSSIBLE));
+        assert_eq!(p.set_hour12(11), Err(IMPOSSIBLE));
+
+        let mut p = Parsed::new();
+        assert_eq!(p.set_ampm(true), Ok(()));
+        assert_eq!(p.set_hour12(7), Ok(()));
+        assert_eq!(p.set_hour(7), Err(IMPOSSIBLE));
+        assert_eq!(p.set_hour(18), Err(IMPOSSIBLE));
+        assert_eq!(p.set_hour(19), Ok(()));
+
+        // timestamp
+        let mut p = Parsed::new();
+        assert_eq!(p.set_timestamp(1_234_567_890), Ok(()));
+        assert_eq!(p.set_timestamp(1_234_567_889), Err(IMPOSSIBLE));
+        assert_eq!(p.set_timestamp(1_234_567_891), Err(IMPOSSIBLE));
+    }
+
+    #[test]
+    fn test_parsed_to_naive_date() {
+        macro_rules! parse {
+            ($($k:ident: $v:expr),*) => (
+                Parsed { $($k: Some($v),)* ..Parsed::new() }.to_naive_date()
+            )
+        }
+
+        let ymd = |y,m,d| Ok(NaiveDate::from_ymd(y, m, d));
+
+        // ymd: omission of fields
+        assert_eq!(parse!(), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 1984), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 1984, month: 1), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 1984, month: 1, day: 2), ymd(1984, 1, 2));
+        assert_eq!(parse!(year: 1984, day: 2), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year_div_100: 19), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 84), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 84, month: 1), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 84, month: 1, day: 2), ymd(1984, 1, 2));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 84, day: 2), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year_div_100: 19, month: 1, day: 2), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year_mod_100: 70, month: 1, day: 2), ymd(1970, 1, 2));
+        assert_eq!(parse!(year_mod_100: 69, month: 1, day: 2), ymd(2069, 1, 2));
+
+        // ymd: out-of-range conditions
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 84, month: 2, day: 29),
+                   ymd(1984, 2, 29));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 83, month: 2, day: 29),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 83, month: 13, day: 1),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 83, month: 12, day: 31),
+                   ymd(1983, 12, 31));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 83, month: 12, day: 32),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 83, month: 12, day: 0),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: 100, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year_div_100: 19, year_mod_100: -1, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year_div_100: 0, year_mod_100: 0, month: 1, day: 1),
+                   ymd(0, 1, 1));
+        assert_eq!(parse!(year_div_100: -1, year_mod_100: 42, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+        let max_year = date::MAX.year();
+        assert_eq!(parse!(year_div_100: max_year / 100,
+                          year_mod_100: max_year % 100, month: 1, day: 1),
+                   ymd(max_year, 1, 1));
+        assert_eq!(parse!(year_div_100: (max_year + 1) / 100,
+                          year_mod_100: (max_year + 1) % 100, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+
+        // ymd: conflicting inputs
+        assert_eq!(parse!(year: 1984, year_div_100: 19, month: 1, day: 1), ymd(1984, 1, 1));
+        assert_eq!(parse!(year: 1984, year_div_100: 20, month: 1, day: 1), Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 1984, year_mod_100: 84, month: 1, day: 1), ymd(1984, 1, 1));
+        assert_eq!(parse!(year: 1984, year_mod_100: 83, month: 1, day: 1), Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 1984, year_div_100: 19, year_mod_100: 84, month: 1, day: 1),
+                   ymd(1984, 1, 1));
+        assert_eq!(parse!(year: 1984, year_div_100: 18, year_mod_100: 94, month: 1, day: 1),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 1984, year_div_100: 18, year_mod_100: 184, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: -1, year_div_100: 0, year_mod_100: -1, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: -1, year_div_100: -1, year_mod_100: 99, month: 1, day: 1),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: -1, year_div_100: 0, month: 1, day: 1), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: -1, year_mod_100: 99, month: 1, day: 1), Err(OUT_OF_RANGE));
+
+        // weekdates
+        assert_eq!(parse!(year: 2000, week_from_mon: 0), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2000, week_from_sun: 0), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2000, weekday: Sun), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2000, week_from_mon: 0, weekday: Fri), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2000, week_from_sun: 0, weekday: Fri), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2000, week_from_mon: 0, weekday: Sat), ymd(2000, 1, 1));
+        assert_eq!(parse!(year: 2000, week_from_sun: 0, weekday: Sat), ymd(2000, 1, 1));
+        assert_eq!(parse!(year: 2000, week_from_mon: 0, weekday: Sun), ymd(2000, 1, 2));
+        assert_eq!(parse!(year: 2000, week_from_sun: 1, weekday: Sun), ymd(2000, 1, 2));
+        assert_eq!(parse!(year: 2000, week_from_mon: 1, weekday: Mon), ymd(2000, 1, 3));
+        assert_eq!(parse!(year: 2000, week_from_sun: 1, weekday: Mon), ymd(2000, 1, 3));
+        assert_eq!(parse!(year: 2000, week_from_mon: 1, weekday: Sat), ymd(2000, 1, 8));
+        assert_eq!(parse!(year: 2000, week_from_sun: 1, weekday: Sat), ymd(2000, 1, 8));
+        assert_eq!(parse!(year: 2000, week_from_mon: 1, weekday: Sun), ymd(2000, 1, 9));
+        assert_eq!(parse!(year: 2000, week_from_sun: 2, weekday: Sun), ymd(2000, 1, 9));
+        assert_eq!(parse!(year: 2000, week_from_mon: 2, weekday: Mon), ymd(2000, 1, 10));
+        assert_eq!(parse!(year: 2000, week_from_sun: 52, weekday: Sat), ymd(2000, 12, 30));
+        assert_eq!(parse!(year: 2000, week_from_sun: 53, weekday: Sun), ymd(2000, 12, 31));
+        assert_eq!(parse!(year: 2000, week_from_sun: 53, weekday: Mon), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2000, week_from_sun: 0xffffffff, weekday: Mon), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2006, week_from_sun: 0, weekday: Sat), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2006, week_from_sun: 1, weekday: Sun), ymd(2006, 1, 1));
+
+        // weekdates: conflicting inputs
+        assert_eq!(parse!(year: 2000, week_from_mon: 1, week_from_sun: 1, weekday: Sat),
+                   ymd(2000, 1, 8));
+        assert_eq!(parse!(year: 2000, week_from_mon: 1, week_from_sun: 2, weekday: Sun),
+                   ymd(2000, 1, 9));
+        assert_eq!(parse!(year: 2000, week_from_mon: 1, week_from_sun: 1, weekday: Sun),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 2000, week_from_mon: 2, week_from_sun: 2, weekday: Sun),
+                   Err(IMPOSSIBLE));
+
+        // ISO weekdates
+        assert_eq!(parse!(isoyear: 2004, isoweek: 53), Err(NOT_ENOUGH));
+        assert_eq!(parse!(isoyear: 2004, isoweek: 53, weekday: Fri), ymd(2004, 12, 31));
+        assert_eq!(parse!(isoyear: 2004, isoweek: 53, weekday: Sat), ymd(2005, 1, 1));
+        assert_eq!(parse!(isoyear: 2004, isoweek: 0xffffffff, weekday: Sat), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(isoyear: 2005, isoweek: 0, weekday: Thu), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(isoyear: 2005, isoweek: 5, weekday: Thu), ymd(2005, 2, 3));
+        assert_eq!(parse!(isoyear: 2005, weekday: Thu), Err(NOT_ENOUGH));
+
+        // year and ordinal
+        assert_eq!(parse!(ordinal: 123), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2000, ordinal: 0), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2000, ordinal: 1), ymd(2000, 1, 1));
+        assert_eq!(parse!(year: 2000, ordinal: 60), ymd(2000, 2, 29));
+        assert_eq!(parse!(year: 2000, ordinal: 61), ymd(2000, 3, 1));
+        assert_eq!(parse!(year: 2000, ordinal: 366), ymd(2000, 12, 31));
+        assert_eq!(parse!(year: 2000, ordinal: 367), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2000, ordinal: 0xffffffff), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2100, ordinal: 0), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2100, ordinal: 1), ymd(2100, 1, 1));
+        assert_eq!(parse!(year: 2100, ordinal: 59), ymd(2100, 2, 28));
+        assert_eq!(parse!(year: 2100, ordinal: 60), ymd(2100, 3, 1));
+        assert_eq!(parse!(year: 2100, ordinal: 365), ymd(2100, 12, 31));
+        assert_eq!(parse!(year: 2100, ordinal: 366), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(year: 2100, ordinal: 0xffffffff), Err(OUT_OF_RANGE));
+
+        // more complex cases
+        assert_eq!(parse!(year: 2014, month: 12, day: 31, ordinal: 365, isoyear: 2015, isoweek: 1,
+                          week_from_sun: 52, week_from_mon: 52, weekday: Wed),
+                   ymd(2014, 12, 31));
+        assert_eq!(parse!(year: 2014, month: 12, ordinal: 365, isoyear: 2015, isoweek: 1,
+                          week_from_sun: 52, week_from_mon: 52),
+                   ymd(2014, 12, 31));
+        assert_eq!(parse!(year: 2014, month: 12, day: 31, ordinal: 365, isoyear: 2014, isoweek: 53,
+                          week_from_sun: 52, week_from_mon: 52, weekday: Wed),
+                   Err(IMPOSSIBLE)); // no ISO week date 2014-W53-3
+        assert_eq!(parse!(year: 2012, isoyear: 2015, isoweek: 1,
+                          week_from_sun: 52, week_from_mon: 52),
+                   Err(NOT_ENOUGH)); // ambiguous (2014-12-29, 2014-12-30, 2014-12-31)
+        assert_eq!(parse!(year_div_100: 20, isoyear_mod_100: 15, ordinal: 366),
+                   Err(NOT_ENOUGH)); // technically unique (2014-12-31) but Chrono gives up
+    }
+
+    #[test]
+    fn test_parsed_to_naive_time() {
+        macro_rules! parse {
+            ($($k:ident: $v:expr),*) => (
+                Parsed { $($k: Some($v),)* ..Parsed::new() }.to_naive_time()
+            )
+        }
+
+        let hms = |h,m,s| Ok(NaiveTime::from_hms(h, m, s));
+        let hmsn = |h,m,s,n| Ok(NaiveTime::from_hms_nano(h, m, s, n));
+
+        // omission of fields
+        assert_eq!(parse!(), Err(NOT_ENOUGH));
+        assert_eq!(parse!(hour_div_12: 0), Err(NOT_ENOUGH));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1), Err(NOT_ENOUGH));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23), hms(1,23,0));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, second: 45), hms(1,23,45));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, second: 45,
+                          nanosecond: 678_901_234),
+                   hmsn(1,23,45,678_901_234));
+        assert_eq!(parse!(hour_div_12: 1, hour_mod_12: 11, minute: 45, second: 6), hms(23,45,6));
+        assert_eq!(parse!(hour_mod_12: 1, minute: 23), Err(NOT_ENOUGH));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, nanosecond: 456_789_012),
+                   Err(NOT_ENOUGH));
+
+        // out-of-range conditions
+        assert_eq!(parse!(hour_div_12: 2, hour_mod_12: 0, minute: 0), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(hour_div_12: 1, hour_mod_12: 12, minute: 0), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 60), Err(OUT_OF_RANGE));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, second: 61),
+                   Err(OUT_OF_RANGE));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, second: 34,
+                          nanosecond: 1_000_000_000),
+                   Err(OUT_OF_RANGE));
+
+        // leap seconds
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, second: 60),
+                   hmsn(1,23,59,1_000_000_000));
+        assert_eq!(parse!(hour_div_12: 0, hour_mod_12: 1, minute: 23, second: 60,
+                          nanosecond: 999_999_999),
+                   hmsn(1,23,59,1_999_999_999));
+    }
+
+    #[test]
+    fn test_parsed_to_naive_datetime_with_offset() {
+        macro_rules! parse {
+            (offset = $offset:expr; $($k:ident: $v:expr),*) => (
+                Parsed { $($k: Some($v),)* ..Parsed::new() }.to_naive_datetime_with_offset($offset)
+            );
+            ($($k:ident: $v:expr),*) => (parse!(offset = 0; $($k: $v),*))
+        }
+
+        let ymdhms = |y,m,d,h,n,s| Ok(NaiveDate::from_ymd(y, m, d).and_hms(h, n, s));
+        let ymdhmsn =
+            |y,m,d,h,n,s,nano| Ok(NaiveDate::from_ymd(y, m, d).and_hms_nano(h, n, s, nano));
+
+        // omission of fields
+        assert_eq!(parse!(), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2015, month: 1, day: 30,
+                          hour_div_12: 1, hour_mod_12: 2, minute: 38),
+                   ymdhms(2015,1,30, 14,38,0));
+        assert_eq!(parse!(year: 1997, month: 1, day: 30,
+                          hour_div_12: 1, hour_mod_12: 2, minute: 38, second: 5),
+                   ymdhms(1997,1,30, 14,38,5));
+        assert_eq!(parse!(year: 2012, ordinal: 34, hour_div_12: 0, hour_mod_12: 5,
+                          minute: 6, second: 7, nanosecond: 890_123_456),
+                   ymdhmsn(2012,2,3, 5,6,7,890_123_456));
+        assert_eq!(parse!(timestamp: 0), ymdhms(1970,1,1, 0,0,0));
+        assert_eq!(parse!(timestamp: 1, nanosecond: 0), ymdhms(1970,1,1, 0,0,1));
+        assert_eq!(parse!(timestamp: 1, nanosecond: 1), Err(IMPOSSIBLE));
+        assert_eq!(parse!(timestamp: 1_420_000_000), ymdhms(2014,12,31, 4,26,40));
+        assert_eq!(parse!(timestamp: -0x1_0000_0000), ymdhms(1833,11,24, 17,31,44));
+
+        // full fields
+        assert_eq!(parse!(year: 2014, year_div_100: 20, year_mod_100: 14, month: 12, day: 31,
+                          ordinal: 365, isoyear: 2015, isoyear_div_100: 20, isoyear_mod_100: 15,
+                          isoweek: 1, week_from_sun: 52, week_from_mon: 52, weekday: Wed,
+                          hour_div_12: 0, hour_mod_12: 4, minute: 26, second: 40,
+                          nanosecond: 12_345_678, timestamp: 1_420_000_000),
+                   ymdhmsn(2014,12,31, 4,26,40,12_345_678));
+        assert_eq!(parse!(year: 2014, year_div_100: 20, year_mod_100: 14, month: 12, day: 31,
+                          ordinal: 365, isoyear: 2015, isoyear_div_100: 20, isoyear_mod_100: 15,
+                          isoweek: 1, week_from_sun: 52, week_from_mon: 52, weekday: Wed,
+                          hour_div_12: 0, hour_mod_12: 4, minute: 26, second: 40,
+                          nanosecond: 12_345_678, timestamp: 1_419_999_999),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(offset = 32400;
+                          year: 2014, year_div_100: 20, year_mod_100: 14, month: 12, day: 31,
+                          ordinal: 365, isoyear: 2015, isoyear_div_100: 20, isoyear_mod_100: 15,
+                          isoweek: 1, week_from_sun: 52, week_from_mon: 52, weekday: Wed,
+                          hour_div_12: 0, hour_mod_12: 4, minute: 26, second: 40,
+                          nanosecond: 12_345_678, timestamp: 1_419_967_600),
+                   ymdhmsn(2014,12,31, 4,26,40,12_345_678));
+
+        // more timestamps
+        let max_days_from_year_1970 = date::MAX - NaiveDate::from_ymd(1970,1,1);
+        let year_0_from_year_1970 = NaiveDate::from_ymd(0,1,1) - NaiveDate::from_ymd(1970,1,1);
+        let min_days_from_year_1970 = date::MIN - NaiveDate::from_ymd(1970,1,1);
+        assert_eq!(parse!(timestamp: min_days_from_year_1970.num_seconds()),
+                   ymdhms(date::MIN.year(),1,1, 0,0,0));
+        assert_eq!(parse!(timestamp: year_0_from_year_1970.num_seconds()),
+                   ymdhms(0,1,1, 0,0,0));
+        assert_eq!(parse!(timestamp: max_days_from_year_1970.num_seconds() + 86399),
+                   ymdhms(date::MAX.year(),12,31, 23,59,59));
+
+        // leap seconds #1: partial fields
+        assert_eq!(parse!(second: 59, timestamp: 1_341_100_798), Err(IMPOSSIBLE));
+        assert_eq!(parse!(second: 59, timestamp: 1_341_100_799), ymdhms(2012,6,30, 23,59,59));
+        assert_eq!(parse!(second: 59, timestamp: 1_341_100_800), Err(IMPOSSIBLE));
+        assert_eq!(parse!(second: 60, timestamp: 1_341_100_799),
+                   ymdhmsn(2012,6,30, 23,59,59,1_000_000_000));
+        assert_eq!(parse!(second: 60, timestamp: 1_341_100_800),
+                   ymdhmsn(2012,6,30, 23,59,59,1_000_000_000));
+        assert_eq!(parse!(second: 0, timestamp: 1_341_100_800), ymdhms(2012,7,1, 0,0,0));
+        assert_eq!(parse!(second: 1, timestamp: 1_341_100_800), Err(IMPOSSIBLE));
+        assert_eq!(parse!(second: 60, timestamp: 1_341_100_801), Err(IMPOSSIBLE));
+
+        // leap seconds #2: full fields
+        // we need to have separate tests for them since it uses another control flow.
+        assert_eq!(parse!(year: 2012, ordinal: 182, hour_div_12: 1, hour_mod_12: 11,
+                          minute: 59, second: 59, timestamp: 1_341_100_798),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 2012, ordinal: 182, hour_div_12: 1, hour_mod_12: 11,
+                          minute: 59, second: 59, timestamp: 1_341_100_799),
+                   ymdhms(2012,6,30, 23,59,59));
+        assert_eq!(parse!(year: 2012, ordinal: 182, hour_div_12: 1, hour_mod_12: 11,
+                          minute: 59, second: 59, timestamp: 1_341_100_800),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 2012, ordinal: 182, hour_div_12: 1, hour_mod_12: 11,
+                          minute: 59, second: 60, timestamp: 1_341_100_799),
+                   ymdhmsn(2012,6,30, 23,59,59,1_000_000_000));
+        assert_eq!(parse!(year: 2012, ordinal: 182, hour_div_12: 1, hour_mod_12: 11,
+                          minute: 59, second: 60, timestamp: 1_341_100_800),
+                   ymdhmsn(2012,6,30, 23,59,59,1_000_000_000));
+        assert_eq!(parse!(year: 2012, ordinal: 183, hour_div_12: 0, hour_mod_12: 0,
+                          minute: 0, second: 0, timestamp: 1_341_100_800),
+                   ymdhms(2012,7,1, 0,0,0));
+        assert_eq!(parse!(year: 2012, ordinal: 183, hour_div_12: 0, hour_mod_12: 0,
+                          minute: 0, second: 1, timestamp: 1_341_100_800),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(year: 2012, ordinal: 182, hour_div_12: 1, hour_mod_12: 11,
+                          minute: 59, second: 60, timestamp: 1_341_100_801),
+                   Err(IMPOSSIBLE));
+
+        // error codes
+        assert_eq!(parse!(year: 2015, month: 1, day: 20, weekday: Tue,
+                          hour_div_12: 2, hour_mod_12: 1, minute: 35, second: 20),
+                   Err(OUT_OF_RANGE)); // `hour_div_12` is out of range
+    }
+
+    #[test]
+    fn test_parsed_to_datetime() {
+        macro_rules! parse {
+            ($($k:ident: $v:expr),*) => (
+                Parsed { $($k: Some($v),)* ..Parsed::new() }.to_datetime()
+            )
+        }
+
+        let ymdhmsn = |y,m,d,h,n,s,nano,off| Ok(FixedOffset::east(off).ymd(y, m, d)
+                                                                      .and_hms_nano(h, n, s, nano));
+
+        assert_eq!(parse!(offset: 0), Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2014, ordinal: 365, hour_div_12: 0, hour_mod_12: 4,
+                          minute: 26, second: 40, nanosecond: 12_345_678),
+                   Err(NOT_ENOUGH));
+        assert_eq!(parse!(year: 2014, ordinal: 365, hour_div_12: 0, hour_mod_12: 4,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 0),
+                   ymdhmsn(2014,12,31, 4,26,40,12_345_678, 0));
+        assert_eq!(parse!(year: 2014, ordinal: 365, hour_div_12: 1, hour_mod_12: 1,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 32400),
+                   ymdhmsn(2014,12,31, 13,26,40,12_345_678, 32400));
+        assert_eq!(parse!(year: 2014, ordinal: 365, hour_div_12: 0, hour_mod_12: 1,
+                          minute: 42, second: 4, nanosecond: 12_345_678, offset: -9876),
+                   ymdhmsn(2014,12,31, 1,42,4,12_345_678, -9876));
+        assert_eq!(parse!(year: 2015, ordinal: 1, hour_div_12: 0, hour_mod_12: 4,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 86400),
+                   Err(OUT_OF_RANGE)); // `FixedOffset` does not support such huge offset
+    }
+
+    #[test]
+    fn test_parsed_to_datetime_with_timezone() {
+        macro_rules! parse {
+            ($tz:expr; $($k:ident: $v:expr),*) => (
+                Parsed { $($k: Some($v),)* ..Parsed::new() }.to_datetime_with_timezone(&$tz)
+            )
+        }
+
+        // single result from ymdhms
+        assert_eq!(parse!(UTC;
+                          year: 2014, ordinal: 365, hour_div_12: 0, hour_mod_12: 4,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 0),
+                   Ok(UTC.ymd(2014, 12, 31).and_hms_nano(4, 26, 40, 12_345_678)));
+        assert_eq!(parse!(UTC;
+                          year: 2014, ordinal: 365, hour_div_12: 1, hour_mod_12: 1,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 32400),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(FixedOffset::east(32400);
+                          year: 2014, ordinal: 365, hour_div_12: 0, hour_mod_12: 4,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 0),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(FixedOffset::east(32400);
+                          year: 2014, ordinal: 365, hour_div_12: 1, hour_mod_12: 1,
+                          minute: 26, second: 40, nanosecond: 12_345_678, offset: 32400),
+                   Ok(FixedOffset::east(32400).ymd(2014, 12, 31)
+                                              .and_hms_nano(13, 26, 40, 12_345_678)));
+
+        // single result from timestamp
+        assert_eq!(parse!(UTC; timestamp: 1_420_000_000, offset: 0),
+                   Ok(UTC.ymd(2014, 12, 31).and_hms(4, 26, 40)));
+        assert_eq!(parse!(UTC; timestamp: 1_420_000_000, offset: 32400),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(FixedOffset::east(32400); timestamp: 1_420_000_000, offset: 0),
+                   Err(IMPOSSIBLE));
+        assert_eq!(parse!(FixedOffset::east(32400); timestamp: 1_420_000_000, offset: 32400),
+                   Ok(FixedOffset::east(32400).ymd(2014, 12, 31).and_hms(13, 26, 40)));
+
+        // TODO test with a variable time zone (for None and Ambiguous cases)
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/format/scan.rs
@@ -0,0 +1,262 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * Various scanning routines for the parser.
+ */
+
+use Weekday;
+use super::{ParseResult, TOO_SHORT, INVALID, OUT_OF_RANGE};
+
+/// Returns true when two slices are equal case-insensitively (in ASCII).
+/// Assumes that the `pattern` is already converted to lower case.
+fn equals(s: &str, pattern: &str) -> bool {
+    let mut xs = s.as_bytes().iter().map(|&c| match c { b'A'...b'Z' => c + 32, _ => c });
+    let mut ys = pattern.as_bytes().iter().cloned();
+    loop {
+        match (xs.next(), ys.next()) {
+            (None, None) => return true,
+            (None, _) | (_, None) => return false,
+            (Some(x), Some(y)) if x != y => return false,
+            _ => (),
+        }
+    }
+}
+
+/// Tries to parse the non-negative number from `min` to `max` digits.
+///
+/// The absence of digits at all is an unconditional error.
+/// More than `max` digits are consumed up to the first `max` digits.
+/// Any number that does not fit in `i64` is an error.
+pub fn number(s: &str, min: usize, max: usize) -> ParseResult<(&str, i64)> {
+    assert!(min <= max);
+
+    // limit `s` to given number of digits
+    let mut window = s.as_bytes();
+    if window.len() > max { window = &window[..max]; }
+
+    // scan digits
+    let upto = window.iter().position(|&c| c < b'0' || b'9' < c).unwrap_or(window.len());
+    if upto < min {
+        return Err(if window.is_empty() {TOO_SHORT} else {INVALID});
+    }
+
+    // we can overflow here, which is the only possible cause of error from `parse`.
+    let v: i64 = try!(s[..upto].parse().map_err(|_| OUT_OF_RANGE));
+    Ok((&s[upto..], v))
+}
+
+/// Tries to consume at least one digits as a fractional second.
+/// Returns the number of whole nanoseconds (0--999,999,999).
+pub fn nanosecond(s: &str) -> ParseResult<(&str, i64)> {
+    // record the number of digits consumed for later scaling.
+    let origlen = s.len();
+    let (s, v) = try!(number(s, 1, 9));
+    let consumed = origlen - s.len();
+
+    // scale the number accordingly.
+    static SCALE: [i64; 10] = [0, 100_000_000, 10_000_000, 1_000_000, 100_000, 10_000,
+                               1_000, 100, 10, 1];
+    let v = try!(v.checked_mul(SCALE[consumed]).ok_or(OUT_OF_RANGE));
+
+    // if there are more than 9 digits, skip next digits.
+    let s = s.trim_left_matches(|c: char| '0' <= c && c <= '9');
+
+    Ok((s, v))
+}
+
+/// Tries to parse the month index (0 through 11) with the first three ASCII letters.
+pub fn short_month0(s: &str) -> ParseResult<(&str, u8)> {
+    if s.len() < 3 { return Err(TOO_SHORT); }
+    let buf = s.as_bytes();
+    let month0 = match (buf[0] | 32, buf[1] | 32, buf[2] | 32) {
+        (b'j',b'a',b'n') => 0,
+        (b'f',b'e',b'b') => 1,
+        (b'm',b'a',b'r') => 2,
+        (b'a',b'p',b'r') => 3,
+        (b'm',b'a',b'y') => 4,
+        (b'j',b'u',b'n') => 5,
+        (b'j',b'u',b'l') => 6,
+        (b'a',b'u',b'g') => 7,
+        (b's',b'e',b'p') => 8,
+        (b'o',b'c',b't') => 9,
+        (b'n',b'o',b'v') => 10,
+        (b'd',b'e',b'c') => 11,
+        _ => return Err(INVALID)
+    };
+    Ok((&s[3..], month0))
+}
+
+/// Tries to parse the weekday with the first three ASCII letters.
+pub fn short_weekday(s: &str) -> ParseResult<(&str, Weekday)> {
+    if s.len() < 3 { return Err(TOO_SHORT); }
+    let buf = s.as_bytes();
+    let weekday = match (buf[0] | 32, buf[1] | 32, buf[2] | 32) {
+        (b'm',b'o',b'n') => Weekday::Mon,
+        (b't',b'u',b'e') => Weekday::Tue,
+        (b'w',b'e',b'd') => Weekday::Wed,
+        (b't',b'h',b'u') => Weekday::Thu,
+        (b'f',b'r',b'i') => Weekday::Fri,
+        (b's',b'a',b't') => Weekday::Sat,
+        (b's',b'u',b'n') => Weekday::Sun,
+        _ => return Err(INVALID)
+    };
+    Ok((&s[3..], weekday))
+}
+
+/// Tries to parse the month index (0 through 11) with short or long month names.
+/// It prefers long month names to short month names when both are possible.
+pub fn short_or_long_month0(s: &str) -> ParseResult<(&str, u8)> {
+    // lowercased month names, minus first three chars
+    static LONG_MONTH_SUFFIXES: [&'static str; 12] =
+        ["uary", "ruary", "ch", "il", "", "e", "y", "ust", "tember", "ober", "ember", "ember"];
+
+    let (mut s, month0) = try!(short_month0(s));
+
+    // tries to consume the suffix if possible
+    let suffix = LONG_MONTH_SUFFIXES[month0 as usize];
+    if s.len() >= suffix.len() && equals(&s[..suffix.len()], suffix) {
+        s = &s[suffix.len()..];
+    }
+
+    Ok((s, month0))
+}
+
+/// Tries to parse the weekday with short or long weekday names.
+/// It prefers long weekday names to short weekday names when both are possible.
+pub fn short_or_long_weekday(s: &str) -> ParseResult<(&str, Weekday)> {
+    // lowercased weekday names, minus first three chars
+    static LONG_WEEKDAY_SUFFIXES: [&'static str; 7] =
+        ["day", "sday", "nesday", "rsday", "day", "urday", "day"];
+
+    let (mut s, weekday) = try!(short_weekday(s));
+
+    // tries to consume the suffix if possible
+    let suffix = LONG_WEEKDAY_SUFFIXES[weekday.num_days_from_monday() as usize];
+    if s.len() >= suffix.len() && equals(&s[..suffix.len()], suffix) {
+        s = &s[suffix.len()..];
+    }
+
+    Ok((s, weekday))
+}
+
+/// Tries to consume exactly one given character.
+pub fn char(s: &str, c1: u8) -> ParseResult<&str> {
+    match s.as_bytes().first() {
+        Some(&c) if c == c1 => Ok(&s[1..]),
+        Some(_) => Err(INVALID),
+        None => Err(TOO_SHORT),
+    }
+}
+
+/// Tries to consume one or more whitespace.
+pub fn space(s: &str) -> ParseResult<&str> {
+    let s_ = s.trim_left();
+    if s_.len() < s.len() {
+        Ok(s_)
+    } else if s.is_empty() {
+        Err(TOO_SHORT)
+    } else {
+        Err(INVALID)
+    }
+}
+
+/// Consumes any number (including zero) of colon or spaces.
+pub fn colon_or_space(s: &str) -> ParseResult<&str> {
+    Ok(s.trim_left_matches(|c: char| c == ':' || c.is_whitespace()))
+}
+
+/// Tries to parse `[-+]\d\d` continued by `\d\d`. Return an offset in seconds if possible.
+///
+/// The additional `colon` may be used to parse a mandatory or optional `:`
+/// between hours and minutes, and should return either a new suffix or `Err` when parsing fails.
+pub fn timezone_offset<F>(mut s: &str, mut colon: F) -> ParseResult<(&str, i32)>
+        where F: FnMut(&str) -> ParseResult<&str> {
+    fn digits(s: &str) -> ParseResult<(u8, u8)> {
+        let b = s.as_bytes();
+        if b.len() < 2 {
+            Err(TOO_SHORT)
+        } else {
+            Ok((b[0], b[1]))
+        }
+    }
+    let negative = match s.as_bytes().first() {
+        Some(&b'+') => false,
+        Some(&b'-') => true,
+        Some(_) => return Err(INVALID),
+        None => return Err(TOO_SHORT),
+    };
+    s = &s[1..];
+
+    // hours (00--99)
+    let hours = match try!(digits(s)) {
+        (h1 @ b'0'...b'9', h2 @ b'0'...b'9') => ((h1 - b'0') * 10 + (h2 - b'0')) as i32,
+        _ => return Err(INVALID),
+    };
+    s = &s[2..];
+
+    // colons (and possibly other separators)
+    s = try!(colon(s));
+
+    // minutes (00--59)
+    let minutes = match try!(digits(s)) {
+        (m1 @ b'0'...b'5', m2 @ b'0'...b'9') => ((m1 - b'0') * 10 + (m2 - b'0')) as i32,
+        (b'6'...b'9', b'0'...b'9') => return Err(OUT_OF_RANGE),
+        _ => return Err(INVALID),
+    };
+    s = &s[2..];
+
+    let seconds = hours * 3600 + minutes * 60;
+    Ok((s, if negative {-seconds} else {seconds}))
+}
+
+/// Same to `timezone_offset` but also allows for `z`/`Z` which is same to `+00:00`.
+pub fn timezone_offset_zulu<F>(s: &str, colon: F) -> ParseResult<(&str, i32)>
+        where F: FnMut(&str) -> ParseResult<&str> {
+    match s.as_bytes().first() {
+        Some(&b'z') | Some(&b'Z') => Ok((&s[1..], 0)),
+        _ => timezone_offset(s, colon),
+    }
+}
+
+/// Same to `timezone_offset` but also allows for RFC 2822 legacy timezones.
+/// May return `None` which indicates an insufficient offset data (i.e. `-0000`).
+pub fn timezone_offset_2822(s: &str) -> ParseResult<(&str, Option<i32>)> {
+    // tries to parse legacy time zone names
+    let upto = s.as_bytes().iter().position(|&c| match c { b'a'...b'z' | b'A'...b'Z' => false,
+                                                           _ => true }).unwrap_or(s.len());
+    if upto > 0 {
+        let name = &s[..upto];
+        let s = &s[upto..];
+        if equals(name, "gmt") || equals(name, "ut") {
+            Ok((s, Some(0)))
+        } else if equals(name, "est") {
+            Ok((s, Some(-5 * 3600)))
+        } else if equals(name, "edt") {
+            Ok((s, Some(-4 * 3600)))
+        } else if equals(name, "cst") {
+            Ok((s, Some(-6 * 3600)))
+        } else if equals(name, "cdt") {
+            Ok((s, Some(-5 * 3600)))
+        } else if equals(name, "mst") {
+            Ok((s, Some(-7 * 3600)))
+        } else if equals(name, "mdt") {
+            Ok((s, Some(-6 * 3600)))
+        } else if equals(name, "pst") {
+            Ok((s, Some(-8 * 3600)))
+        } else if equals(name, "pdt") {
+            Ok((s, Some(-7 * 3600)))
+        } else {
+            Ok((s, None)) // recommended by RFC 2822: consume but treat it as -0000
+        }
+    } else {
+        let (s_, offset) = try!(timezone_offset(s, |s| Ok(s)));
+        if offset == 0 && s.starts_with("-") { // -0000 is not same to +0000
+            Ok((s_, None))
+        } else {
+            Ok((s_, Some(offset)))
+        }
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/format/strftime.rs
@@ -0,0 +1,443 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+`strftime`/`strptime`-inspired date and time formatting syntax.
+
+## Specifiers
+
+The following specifiers are available both to formatting and parsing.
+
+Spec. | Example       | Description
+----- | ------------- | -----------
+      |               | **DATE SPECIFIERS:**
+`%Y`  | `2001`        | The full proleptic Gregorian year, zero-padded to 4 digits. [1]
+`%C`  | `20`          | The proleptic Gregorian year divided by 100, zero-padded to 2 digits. [2]
+`%y`  | `01`          | The proleptic Gregorian year modulo 100, zero-padded to 2 digits. [2]
+      |               |
+`%m`  | `07`          | Month number (01--12), zero-padded to 2 digits.
+`%b`  | `Jul`         | Abbreviated month name. Always 3 letters.
+`%B`  | `July`        | Full month name. Also accepts corresponding abbreviation in parsing.
+`%h`  | `Jul`         | Same to `%b`.
+      |               |
+`%d`  | `08`          | Day number (01--31), zero-padded to 2 digits.
+`%e`  | ` 8`          | Same to `%d` but space-padded. Same to `%_d`.
+      |               |
+`%a`  | `Sun`         | Abbreviated weekday name. Always 3 letters.
+`%A`  | `Sunday`      | Full weekday name. Also accepts corresponding abbreviation in parsing.
+`%w`  | `0`           | Sunday = 0, Monday = 1, ..., Saturday = 6.
+`%u`  | `7`           | Monday = 1, Tuesday = 2, ..., Sunday = 7. (ISO 8601)
+      |               |
+`%U`  | `28`          | Week number starting with Sunday (00--53), zero-padded to 2 digits. [3]
+`%W`  | `27`          | Same to `%U`, but week 1 starts with the first Monday in that year instead.
+      |               |
+`%G`  | `2001`        | Same to `%Y` but uses the year number in ISO 8601 week date. [4]
+`%g`  | `01`          | Same to `%y` but uses the year number in ISO 8601 week date. [4]
+`%V`  | `27`          | Same to `%U` but uses the week number in ISO 8601 week date (01--53). [4]
+      |               |
+`%j`  | `189`         | Day of the year (001--366), zero-padded to 3 digits.
+      |               |
+`%D`  | `07/08/01`    | Month-day-year format. Same to `%m/%d/%y`.
+`%x`  | `07/08/01`    | Same to `%D`.
+`%F`  | `2001-07-08`  | Year-month-day format (ISO 8601). Same to `%Y-%m-%d`.
+`%v`  | ` 8-Jul-2001` | Day-month-year format. Same to `%e-%b-%Y`.
+      |               |
+      |               | **TIME SPECIFIERS:**
+`%H`  | `00`          | Hour number (00--23), zero-padded to 2 digits.
+`%k`  | ` 0`          | Same to `%H` but space-padded. Same to `%_H`.
+`%I`  | `12`          | Hour number in 12-hour clocks (01--12), zero-padded to 2 digits.
+`%l`  | `12`          | Same to `%I` but space-padded. Same to `%_I`.
+      |               |
+`%P`  | `am`          | `am` or `pm` in 12-hour clocks.
+`%p`  | `AM`          | `AM` or `PM` in 12-hour clocks.
+      |               |
+`%M`  | `34`          | Minute number (00--59), zero-padded to 2 digits.
+`%S`  | `60`          | Second number (00--60), zero-padded to 2 digits. [5]
+`%f`  | `026490000`   | The fractional seconds (in nanoseconds) since last whole second. [8]
+`%.f` | `.026490`     | Similar to `.%f` but left-aligned. [8]
+`%.3f`| `.026`        | Similar to `.%f` but left-aligned but fixed to a length of 3. [8]
+`%.6f`| `.026490`     | Similar to `.%f` but left-aligned but fixed to a length of 6. [8]
+`%.9f`| `.026490000`  | Similar to `.%f` but left-aligned but fixed to a length of 9. [8]
+      |               |
+`%R`  | `00:34`       | Hour-minute format. Same to `%H:%M`.
+`%T`  | `00:34:60`    | Hour-minute-second format. Same to `%H:%M:%S`.
+`%X`  | `00:34:60`    | Same to `%T`.
+`%r`  | `12:34:60 AM` | Hour-minute-second format in 12-hour clocks. Same to `%I:%M:%S %p`.
+      |               |
+      |               | **TIME ZONE SPECIFIERS:**
+`%Z`  | `ACST`        | *Formatting only:* Local time zone name.
+`%z`  | `+0930`       | Offset from the local time to UTC (with UTC being `+0000`).
+`%:z` | `+09:30`      | Same to `%z` but with a colon.
+      |               |
+      |               | **DATE & TIME SPECIFIERS:**
+`%c`  | `Sun Jul  8 00:34:60 2001` | `ctime` date & time format. Same to `%a %b %e %T %Y` sans `\n`.
+`%+`  | `2001-07-08T00:34:60.026490+09:30` | ISO 8601 / RFC 3339 date & time format. [6]
+      |               |
+`%s`  | `994518299`   | UNIX timestamp, the number of seconds since 1970-01-01 00:00 UTC. [7]
+      |               |
+      |               | **SPECIAL SPECIFIERS:**
+`%t`  |               | Literal tab (`\t`).
+`%n`  |               | Literal newline (`\n`).
+`%%`  |               | Literal percent sign.
+
+It is possible to override the default padding behavior of numeric specifiers `%?`.
+This is not allowed for other specifiers and will result in the `BAD_FORMAT` error.
+
+Modifier | Description
+-------- | -----------
+`%-?`    | Suppresses any padding including spaces and zeroes. (e.g. `%j` = `012`, `%-j` = `12`)
+`%_?`    | Uses spaces as a padding. (e.g. `%j` = `012`, `%_j` = ` 12`)
+`%0?`    | Uses zeroes as a padding. (e.g. `%e` = ` 9`, `%0e` = `09`)
+
+Notes:
+
+1. `%Y`:
+   Negative years are allowed in formatting but not in parsing.
+
+2. `%C`, `%y`:
+   This is floor division, so 100 BCE (year number -99) will print `-1` and `99` respectively.
+
+3. `%U`:
+   Week 1 starts with the first Sunday in that year.
+   It is possible to have week 0 for days before the first Sunday.
+
+4. `%G`, `%g`, `%V`:
+   Week 1 is the first week with at least 4 days in that year.
+   Week 0 does not exist, so this should be used with `%G` or `%g`.
+
+5. `%S`:
+   It accounts for leap seconds, so `60` is possible.
+
+6. `%+`:
+   Same to `%Y-%m-%dT%H:%M:%S%.f%:z`,
+   i.e. 0, 3, 6 or 9 fractional digits for seconds and colons in the time zone offset.
+
+   The typical `strftime` implementations have
+   different (and locale-dependent) formats for this specifier.
+   While Chrono's format for `%+` is far more stable,
+   it is best to avoid this specifier if you want to control the exact output.
+
+7. `%s`:
+   This is not padded and can be negative.
+   For the purpose of Chrono, it only accounts for non-leap seconds
+   so it slightly differs from ISO C `strftime` behavior.
+
+8. `%f`, `%.f`, `%.3f`, `%.6f`, `%.9f`:
+
+   The default `%f` is right-aligned and always zero-padded to 9 digits
+   for the compatibility with glibc and others,
+   so it always counts the number of nanoseconds since the last whole second.
+   E.g. 7ms after the last second will print `007000000`,
+   and parsing `7000000` will yield the same.
+
+   The variant `%.f` is left-aligned and print 0, 3, 6 or 9 fractional digits
+   according to the precision.
+   E.g. 70ms after the last second under `%.f` will print `.070` (note: not `.07`),
+   and parsing `.07`, `.070000` etc. will yield the same.
+   Note that they can print or read nothing if the fractional part is zero or
+   the next character is not `.`.
+
+   The variant `%.3f`, `%.6f` and `%.9f` are left-aligned and print 3, 6 or 9 fractional digits
+   according to the number preceding `f`.
+   E.g. 70ms after the last second under `%.3f` will print `.070` (note: not `.07`),
+   and parsing `.07`, `.070000` etc. will yield the same.
+   Note that they can read nothing if the fractional part is zero or
+   the next character is not `.` however will print with the specified length.
+
+*/
+
+use super::{Item, Numeric, Fixed, Pad};
+
+/// Parsing iterator for `strftime`-like format strings.
+#[derive(Clone)]
+pub struct StrftimeItems<'a> {
+    /// Remaining portion of the string.
+    remainder: &'a str,
+    /// If the current specifier is composed of multiple formatting items (e.g. `%+`),
+    /// parser refers to the statically reconstructed slice of them.
+    /// If `recons` is not empty they have to be returned earlier than the `remainder`.
+    recons: &'static [Item<'static>],
+}
+
+impl<'a> StrftimeItems<'a> {
+    /// Creates a new parsing iterator from the `strftime`-like format string.
+    pub fn new(s: &'a str) -> StrftimeItems<'a> {
+        static FMT_NONE: [Item<'static>; 0] = [];
+        StrftimeItems { remainder: s, recons: &FMT_NONE }
+    }
+}
+
+impl<'a> Iterator for StrftimeItems<'a> {
+    type Item = Item<'a>;
+
+    fn next(&mut self) -> Option<Item<'a>> {
+        // we have some reconstructed items to return
+        if !self.recons.is_empty() {
+            let item = self.recons[0];
+            self.recons = &self.recons[1..];
+            return Some(item);
+        }
+
+        match self.remainder.chars().next() {
+            // we are done
+            None => return None,
+
+            // the next item is a specifier
+            Some('%') => {
+                self.remainder = &self.remainder[1..];
+
+                macro_rules! next {
+                    () => (
+                        match self.remainder.chars().next() {
+                            Some(x) => {
+                                self.remainder = &self.remainder[x.len_utf8()..];
+                                x
+                            },
+                            None => return Some(Item::Error), // premature end of string
+                        }
+                    )
+                }
+
+                let spec = next!();
+                let pad_override = match spec {
+                    '-' => Some(Pad::None),
+                    '0' => Some(Pad::Zero),
+                    '_' => Some(Pad::Space),
+                    _ => None,
+                };
+                let spec = if pad_override.is_some() { next!() } else { spec };
+
+                macro_rules! recons {
+                    [$head:expr, $($tail:expr),+] => ({
+                        const RECONS: &'static [Item<'static>] = &[$($tail),+];
+                        self.recons = RECONS;
+                        $head
+                    })
+                }
+
+                let item = match spec {
+                    'A' => fix!(LongWeekdayName),
+                    'B' => fix!(LongMonthName),
+                    'C' => num0!(YearDiv100),
+                    'D' => recons![num0!(Month), lit!("/"), num0!(Day), lit!("/"),
+                                   num0!(YearMod100)],
+                    'F' => recons![num0!(Year), lit!("-"), num0!(Month), lit!("-"), num0!(Day)],
+                    'G' => num0!(IsoYear),
+                    'H' => num0!(Hour),
+                    'I' => num0!(Hour12),
+                    'M' => num0!(Minute),
+                    'P' => fix!(LowerAmPm),
+                    'R' => recons![num0!(Hour), lit!(":"), num0!(Minute)],
+                    'S' => num0!(Second),
+                    'T' => recons![num0!(Hour), lit!(":"), num0!(Minute), lit!(":"), num0!(Second)],
+                    'U' => num0!(WeekFromSun),
+                    'V' => num0!(IsoWeek),
+                    'W' => num0!(WeekFromMon),
+                    'X' => recons![num0!(Hour), lit!(":"), num0!(Minute), lit!(":"), num0!(Second)],
+                    'Y' => num0!(Year),
+                    'Z' => fix!(TimezoneName),
+                    'a' => fix!(ShortWeekdayName),
+                    'b' => fix!(ShortMonthName),
+                    'c' => recons![fix!(ShortWeekdayName), sp!(" "), fix!(ShortMonthName),
+                                   sp!(" "), nums!(Day), sp!(" "), num0!(Hour), lit!(":"),
+                                   num0!(Minute), lit!(":"), num0!(Second), sp!(" "), num0!(Year)],
+                    'd' => num0!(Day),
+                    'e' => nums!(Day),
+                    'f' => num0!(Nanosecond),
+                    'g' => num0!(IsoYearMod100),
+                    'h' => fix!(ShortMonthName),
+                    'j' => num0!(Ordinal),
+                    'k' => nums!(Hour),
+                    'l' => nums!(Hour12),
+                    'm' => num0!(Month),
+                    'n' => sp!("\n"),
+                    'p' => fix!(UpperAmPm),
+                    'r' => recons![num0!(Hour12), lit!(":"), num0!(Minute), lit!(":"),
+                                   num0!(Second), sp!(" "), fix!(UpperAmPm)],
+                    's' => num!(Timestamp),
+                    't' => sp!("\t"),
+                    'u' => num!(WeekdayFromMon),
+                    'v' => recons![nums!(Day), lit!("-"), fix!(ShortMonthName), lit!("-"),
+                                   num0!(Year)],
+                    'w' => num!(NumDaysFromSun),
+                    'x' => recons![num0!(Month), lit!("/"), num0!(Day), lit!("/"),
+                                   num0!(YearMod100)],
+                    'y' => num0!(YearMod100),
+                    'z' => fix!(TimezoneOffset),
+                    '+' => fix!(RFC3339),
+                    ':' => match next!() {
+                        'z' => fix!(TimezoneOffsetColon),
+                        _ => Item::Error,
+                    },
+                    '.' => match next!() {
+                        '3' => match next!() {
+                            'f' => fix!(Nanosecond3),
+                            _ => Item::Error,
+                        },
+                        '6' => match next!() {
+                            'f' => fix!(Nanosecond6),
+                            _ => Item::Error,
+                        },
+                        '9' => match next!() {
+                            'f' => fix!(Nanosecond9),
+                            _ => Item::Error,
+                        },
+                        'f' => fix!(Nanosecond),
+                        _ => Item::Error,
+                    },
+                    '%' => lit!("%"),
+                    _ => Item::Error, // no such specifier
+                };
+
+                // adjust `item` if we have any padding modifier
+                if let Some(new_pad) = pad_override {
+                    match item {
+                        Item::Numeric(kind, _pad) if self.recons.is_empty() =>
+                            Some(Item::Numeric(kind, new_pad)),
+                        _ => Some(Item::Error), // no reconstructed or non-numeric item allowed
+                    }
+                } else {
+                    Some(item)
+                }
+            },
+
+            // the next item is space
+            Some(c) if c.is_whitespace() => {
+                // `%` is not a whitespace, so `c != '%'` is redundant
+                let nextspec = self.remainder.find(|c: char| !c.is_whitespace())
+                                             .unwrap_or(self.remainder.len());
+                assert!(nextspec > 0);
+                let item = sp!(&self.remainder[..nextspec]);
+                self.remainder = &self.remainder[nextspec..];
+                Some(item)
+            },
+
+            // the next item is literal
+            _ => {
+                let nextspec = self.remainder.find(|c: char| c.is_whitespace() || c == '%')
+                                             .unwrap_or(self.remainder.len());
+                assert!(nextspec > 0);
+                let item = lit!(&self.remainder[..nextspec]);
+                self.remainder = &self.remainder[nextspec..];
+                Some(item)
+            },
+        }
+    }
+}
+
+#[cfg(test)]
+#[test]
+fn test_strftime_items() {
+    fn parse_and_collect<'a>(s: &'a str) -> Vec<Item<'a>> {
+        // map any error into `[Item::Error]`. useful for easy testing.
+        let items = StrftimeItems::new(s);
+        let items = items.map(|spec| if spec == Item::Error {None} else {Some(spec)});
+        items.collect::<Option<Vec<_>>>().unwrap_or(vec![Item::Error])
+    }
+
+    assert_eq!(parse_and_collect(""), []);
+    assert_eq!(parse_and_collect(" \t\n\r "), [sp!(" \t\n\r ")]);
+    assert_eq!(parse_and_collect("hello?"), [lit!("hello?")]);
+    assert_eq!(parse_and_collect("a  b\t\nc"), [lit!("a"), sp!("  "), lit!("b"), sp!("\t\n"),
+                                                lit!("c")]);
+    assert_eq!(parse_and_collect("100%%"), [lit!("100"), lit!("%")]);
+    assert_eq!(parse_and_collect("100%% ok"), [lit!("100"), lit!("%"), sp!(" "), lit!("ok")]);
+    assert_eq!(parse_and_collect("%%PDF-1.0"), [lit!("%"), lit!("PDF-1.0")]);
+    assert_eq!(parse_and_collect("%Y-%m-%d"), [num0!(Year), lit!("-"), num0!(Month), lit!("-"),
+                                               num0!(Day)]);
+    assert_eq!(parse_and_collect("[%F]"), parse_and_collect("[%Y-%m-%d]"));
+    assert_eq!(parse_and_collect("%m %d"), [num0!(Month), sp!(" "), num0!(Day)]);
+    assert_eq!(parse_and_collect("%"), [Item::Error]);
+    assert_eq!(parse_and_collect("%%"), [lit!("%")]);
+    assert_eq!(parse_and_collect("%%%"), [Item::Error]);
+    assert_eq!(parse_and_collect("%%%%"), [lit!("%"), lit!("%")]);
+    assert_eq!(parse_and_collect("foo%?"), [Item::Error]);
+    assert_eq!(parse_and_collect("bar%42"), [Item::Error]);
+    assert_eq!(parse_and_collect("quux% +"), [Item::Error]);
+    assert_eq!(parse_and_collect("%.Z"), [Item::Error]);
+    assert_eq!(parse_and_collect("%:Z"), [Item::Error]);
+    assert_eq!(parse_and_collect("%-Z"), [Item::Error]);
+    assert_eq!(parse_and_collect("%0Z"), [Item::Error]);
+    assert_eq!(parse_and_collect("%_Z"), [Item::Error]);
+    assert_eq!(parse_and_collect("%.j"), [Item::Error]);
+    assert_eq!(parse_and_collect("%:j"), [Item::Error]);
+    assert_eq!(parse_and_collect("%-j"), [num!(Ordinal)]);
+    assert_eq!(parse_and_collect("%0j"), [num0!(Ordinal)]);
+    assert_eq!(parse_and_collect("%_j"), [nums!(Ordinal)]);
+    assert_eq!(parse_and_collect("%.e"), [Item::Error]);
+    assert_eq!(parse_and_collect("%:e"), [Item::Error]);
+    assert_eq!(parse_and_collect("%-e"), [num!(Day)]);
+    assert_eq!(parse_and_collect("%0e"), [num0!(Day)]);
+    assert_eq!(parse_and_collect("%_e"), [nums!(Day)]);
+}
+
+#[cfg(test)]
+#[test]
+fn test_strftime_docs() {
+    use {FixedOffset, TimeZone};
+
+    let dt = FixedOffset::east(34200).ymd(2001, 7, 8).and_hms_nano(0, 34, 59, 1_026_490_000);
+
+    // date specifiers
+    assert_eq!(dt.format("%Y").to_string(), "2001");
+    assert_eq!(dt.format("%C").to_string(), "20");
+    assert_eq!(dt.format("%y").to_string(), "01");
+    assert_eq!(dt.format("%m").to_string(), "07");
+    assert_eq!(dt.format("%b").to_string(), "Jul");
+    assert_eq!(dt.format("%B").to_string(), "July");
+    assert_eq!(dt.format("%h").to_string(), "Jul");
+    assert_eq!(dt.format("%d").to_string(), "08");
+    assert_eq!(dt.format("%e").to_string(), " 8");
+    assert_eq!(dt.format("%e").to_string(), dt.format("%_d").to_string());
+    assert_eq!(dt.format("%a").to_string(), "Sun");
+    assert_eq!(dt.format("%A").to_string(), "Sunday");
+    assert_eq!(dt.format("%w").to_string(), "0");
+    assert_eq!(dt.format("%u").to_string(), "7");
+    assert_eq!(dt.format("%U").to_string(), "28");
+    assert_eq!(dt.format("%W").to_string(), "27");
+    assert_eq!(dt.format("%G").to_string(), "2001");
+    assert_eq!(dt.format("%g").to_string(), "01");
+    assert_eq!(dt.format("%V").to_string(), "27");
+    assert_eq!(dt.format("%j").to_string(), "189");
+    assert_eq!(dt.format("%D").to_string(), "07/08/01");
+    assert_eq!(dt.format("%x").to_string(), "07/08/01");
+    assert_eq!(dt.format("%F").to_string(), "2001-07-08");
+    assert_eq!(dt.format("%v").to_string(), " 8-Jul-2001");
+
+    // time specifiers
+    assert_eq!(dt.format("%H").to_string(), "00");
+    assert_eq!(dt.format("%k").to_string(), " 0");
+    assert_eq!(dt.format("%k").to_string(), dt.format("%_H").to_string());
+    assert_eq!(dt.format("%I").to_string(), "12");
+    assert_eq!(dt.format("%l").to_string(), "12");
+    assert_eq!(dt.format("%l").to_string(), dt.format("%_I").to_string());
+    assert_eq!(dt.format("%P").to_string(), "am");
+    assert_eq!(dt.format("%p").to_string(), "AM");
+    assert_eq!(dt.format("%M").to_string(), "34");
+    assert_eq!(dt.format("%S").to_string(), "60");
+    assert_eq!(dt.format("%f").to_string(), "026490000");
+    assert_eq!(dt.format("%.f").to_string(), ".026490");
+    assert_eq!(dt.format("%.3f").to_string(), ".026");
+    assert_eq!(dt.format("%.6f").to_string(), ".026490");
+    assert_eq!(dt.format("%.9f").to_string(), ".026490000");
+    assert_eq!(dt.format("%R").to_string(), "00:34");
+    assert_eq!(dt.format("%T").to_string(), "00:34:60");
+    assert_eq!(dt.format("%X").to_string(), "00:34:60");
+    assert_eq!(dt.format("%r").to_string(), "12:34:60 AM");
+
+    // time zone specifiers
+    //assert_eq!(dt.format("%Z").to_string(), "ACST");
+    assert_eq!(dt.format("%z").to_string(), "+0930");
+    assert_eq!(dt.format("%:z").to_string(), "+09:30");
+
+    // date & time specifiers
+    assert_eq!(dt.format("%c").to_string(), "Sun Jul  8 00:34:60 2001");
+    assert_eq!(dt.format("%+").to_string(), "2001-07-08T00:34:60.026490+09:30");
+    assert_eq!(dt.format("%s").to_string(), "994518299");
+
+    // special specifiers
+    assert_eq!(dt.format("%t").to_string(), "\t");
+    assert_eq!(dt.format("%n").to_string(), "\n");
+    assert_eq!(dt.format("%%").to_string(), "%");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/lib.rs
@@ -0,0 +1,732 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+//! # Chrono 0.2.25
+//!
+//! Date and time handling for Rust. (also known as `rust-chrono`)
+//! It aims to be a feature-complete superset of
+//! the [time](https://github.com/rust-lang-deprecated/time) library.
+//! In particular,
+//!
+//! * Chrono strictly adheres to ISO 8601.
+//! * Chrono is timezone-aware by default, with separate timezone-naive types.
+//! * Chrono is space-optimal and (while not being the primary goal) reasonably efficient.
+//!
+//! There were several previous attempts to bring a good date and time library to Rust,
+//! which Chrono builts upon and should acknowledge:
+//!
+//! * [Initial research on
+//!    the wiki](https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md)
+//! * Dietrich Epp's [datetime-rs](https://github.com/depp/datetime-rs)
+//! * Luis de Bethencourt's [rust-datetime](https://github.com/luisbg/rust-datetime)
+//!
+//! ## Usage
+//!
+//! Put this in your `Cargo.toml`:
+//!
+//! ```toml
+//! [dependencies]
+//! chrono = "0.2"
+//! ```
+//!
+//! Or, if you want [Serde](https://github.com/serde-rs/serde) or
+//! [rustc-serialize](https://github.com/rust-lang-nursery/rustc-serialize) support,
+//! include the features like this:
+//!
+//! ```toml
+//! [dependencies]
+//! chrono = { version = "0.2", features = ["serde", "rustc-serialize"] }
+//! ```
+//!
+//! Then put this in your crate root:
+//!
+//! ```rust
+//! extern crate chrono;
+//! ```
+//!
+//! ## Overview
+//!
+//! ### Duration
+//!
+//! [**`Duration`**](./struct.Duration.html)
+//! represents the magnitude of a time span. `Duration` used to be provided by Chrono.
+//! It has been moved to the `time` crate as the
+//! [`time::Duration`](https://doc.rust-lang.org/time/time/struct.Duration.html) type, but is
+//! still re-exported from Chrono.
+//!
+//! ### Date and Time
+//!
+//! Chrono provides a
+//! [**`DateTime`**](./datetime/struct.DateTime.html)
+//! type to represent a date and a time in a timezone.
+//!
+//! For more abstract moment-in-time tracking such as internal timekeeping
+//! that is unconcerned with timezones, consider
+//! [`time::SystemTime`](https://doc.rust-lang.org/std/time/struct.SystemTime.html),
+//! which tracks your system clock, or
+//! [`time::Instant`](https://doc.rust-lang.org/std/time/struct.Instant.html), which
+//! is an opaque but monotonically-increasing representation of a moment in time.
+//!
+//! `DateTime` is timezone-aware and must be constructed from
+//! the [**`TimeZone`**](./offset/trait.TimeZone.html) object,
+//! which defines how the local date is converted to and back from the UTC date.
+//! There are three well-known `TimeZone` implementations:
+//!
+//! * [**`UTC`**](./offset/utc/struct.UTC.html) specifies the UTC time zone. It is most efficient.
+//!
+//! * [**`Local`**](./offset/local/struct.Local.html) specifies the system local time zone.
+//!
+//! * [**`FixedOffset`**](./offset/fixed/struct.FixedOffset.html) specifies
+//!   an arbitrary, fixed time zone such as UTC+09:00 or UTC-10:30.
+//!   This often results from the parsed textual date and time.
+//!   Since it stores the most information and does not depend on the system environment,
+//!   you would want to normalize other `TimeZone`s into this type.
+//!
+//! `DateTime`s with different `TimeZone` types are distinct and do not mix,
+//! but can be converted to each other using
+//! the [`DateTime::with_timezone`](./datetime/struct.DateTime.html#method.with_timezone) method.
+//!
+//! You can get the current date and time in the UTC time zone
+//! ([`UTC::now()`](./offset/utc/struct.UTC.html#method.now))
+//! or in the local time zone
+//! ([`Local::now()`](./offset/local/struct.Local.html#method.now)).
+//!
+//! ~~~~ {.rust}
+//! use chrono::*;
+//!
+//! let utc: DateTime<UTC> = UTC::now();       // e.g. `2014-11-28T12:45:59.324310806Z`
+//! let local: DateTime<Local> = Local::now(); // e.g. `2014-11-28T21:45:59.324310806+09:00`
+//! # let _ = utc; let _ = local;
+//! ~~~~
+//!
+//! Alternatively, you can create your own date and time.
+//! This is a bit verbose due to Rust's lack of function and method overloading,
+//! but in turn we get a rich combination of initialization methods.
+//!
+//! ~~~~ {.rust}
+//! use chrono::*;
+//!
+//! let dt = UTC.ymd(2014, 7, 8).and_hms(9, 10, 11); // `2014-07-08T09:10:11Z`
+//! // July 8 is 188th day of the year 2014 (`o` for "ordinal")
+//! assert_eq!(dt, UTC.yo(2014, 189).and_hms(9, 10, 11));
+//! // July 8 is Tuesday in ISO week 28 of the year 2014.
+//! assert_eq!(dt, UTC.isoywd(2014, 28, Weekday::Tue).and_hms(9, 10, 11));
+//!
+//! let dt = UTC.ymd(2014, 7, 8).and_hms_milli(9, 10, 11, 12); // `2014-07-08T09:10:11.012Z`
+//! assert_eq!(dt, UTC.ymd(2014, 7, 8).and_hms_micro(9, 10, 11, 12_000));
+//! assert_eq!(dt, UTC.ymd(2014, 7, 8).and_hms_nano(9, 10, 11, 12_000_000));
+//!
+//! // dynamic verification
+//! assert_eq!(UTC.ymd_opt(2014, 7, 8).and_hms_opt(21, 15, 33),
+//!            LocalResult::Single(UTC.ymd(2014, 7, 8).and_hms(21, 15, 33)));
+//! assert_eq!(UTC.ymd_opt(2014, 7, 8).and_hms_opt(80, 15, 33), LocalResult::None);
+//! assert_eq!(UTC.ymd_opt(2014, 7, 38).and_hms_opt(21, 15, 33), LocalResult::None);
+//!
+//! // other time zone objects can be used to construct a local datetime.
+//! // obviously, `local_dt` is normally different from `dt`, but `fixed_dt` should be identical.
+//! let local_dt = Local.ymd(2014, 7, 8).and_hms_milli(9, 10, 11, 12);
+//! let fixed_dt = FixedOffset::east(9 * 3600).ymd(2014, 7, 8).and_hms_milli(18, 10, 11, 12);
+//! assert_eq!(dt, fixed_dt);
+//! # let _ = local_dt;
+//! ~~~~
+//!
+//! Various properties are available to the date and time, and can be altered individually.
+//! Most of them are defined in the traits [`Datelike`](./trait.Datelike.html) and
+//! [`Timelike`](./trait.Timelike.html) which you should `use` before.
+//! Addition and subtraction is also supported.
+//! The following illustrates most supported operations to the date and time:
+//!
+//! ~~~~ {.rust}
+//! use chrono::*;
+//!
+//! # /* we intentionally fake the datetime...
+//! // assume this returned `2014-11-28T21:45:59.324310806+09:00`:
+//! let dt = Local::now();
+//! # */ // up to here. we now define a fixed datetime for the illustrative purpose.
+//! # let dt = FixedOffset::east(9*3600).ymd(2014, 11, 28).and_hms_nano(21, 45, 59, 324310806);
+//!
+//! // property accessors
+//! assert_eq!((dt.year(), dt.month(), dt.day()), (2014, 11, 28));
+//! assert_eq!((dt.month0(), dt.day0()), (10, 27)); // for unfortunate souls
+//! assert_eq!((dt.hour(), dt.minute(), dt.second()), (21, 45, 59));
+//! assert_eq!(dt.weekday(), Weekday::Fri);
+//! assert_eq!(dt.weekday().number_from_monday(), 5); // Mon=1, ..., Sat=7
+//! assert_eq!(dt.ordinal(), 332); // the day of year
+//! assert_eq!(dt.num_days_from_ce(), 735565); // the number of days from and including Jan 1, 1
+//!
+//! // time zone accessor and manipulation
+//! assert_eq!(dt.offset().local_minus_utc(), Duration::hours(9));
+//! assert_eq!(dt.timezone(), FixedOffset::east(9 * 3600));
+//! assert_eq!(dt.with_timezone(&UTC), UTC.ymd(2014, 11, 28).and_hms_nano(12, 45, 59, 324310806));
+//!
+//! // a sample of property manipulations (validates dynamically)
+//! assert_eq!(dt.with_day(29).unwrap().weekday(), Weekday::Sat); // 2014-11-29 is Saturday
+//! assert_eq!(dt.with_day(32), None);
+//! assert_eq!(dt.with_year(-300).unwrap().num_days_from_ce(), -109606); // November 29, 301 BCE
+//!
+//! // arithmetic operations
+//! assert_eq!(UTC.ymd(2014, 11, 14).and_hms(8, 9, 10) - UTC.ymd(2014, 11, 14).and_hms(10, 9, 8),
+//!            Duration::seconds(-2 * 3600 + 2));
+//! assert_eq!(UTC.ymd(1970, 1, 1).and_hms(0, 0, 0) + Duration::seconds(1_000_000_000),
+//!            UTC.ymd(2001, 9, 9).and_hms(1, 46, 40));
+//! assert_eq!(UTC.ymd(1970, 1, 1).and_hms(0, 0, 0) - Duration::seconds(1_000_000_000),
+//!            UTC.ymd(1938, 4, 24).and_hms(22, 13, 20));
+//! ~~~~
+//!
+//! Formatting is done via the [`format`](./datetime/struct.DateTime.html#method.format) method,
+//! which format is equivalent to the familiar `strftime` format.
+//! (See the [`format::strftime` module documentation](./format/strftime/index.html#specifiers)
+//! for full syntax.)
+//!
+//! The default `to_string` method and `{:?}` specifier also give a reasonable representation.
+//! Chrono also provides [`to_rfc2822`](./datetime/struct.DateTime.html#method.to_rfc2822) and
+//! [`to_rfc3339`](./datetime/struct.DateTime.html#method.to_rfc3339) methods
+//! for well-known formats.
+//!
+//! ~~~~ {.rust}
+//! use chrono::*;
+//!
+//! let dt = UTC.ymd(2014, 11, 28).and_hms(12, 0, 9);
+//! assert_eq!(dt.format("%Y-%m-%d %H:%M:%S").to_string(), "2014-11-28 12:00:09");
+//! assert_eq!(dt.format("%a %b %e %T %Y").to_string(), "Fri Nov 28 12:00:09 2014");
+//! assert_eq!(dt.format("%a %b %e %T %Y").to_string(), dt.format("%c").to_string());
+//!
+//! assert_eq!(dt.to_string(), "2014-11-28 12:00:09 UTC");
+//! assert_eq!(dt.to_rfc2822(), "Fri, 28 Nov 2014 12:00:09 +0000");
+//! assert_eq!(dt.to_rfc3339(), "2014-11-28T12:00:09+00:00");
+//! assert_eq!(format!("{:?}", dt), "2014-11-28T12:00:09Z");
+//! ~~~~
+//!
+//! Parsing can be done with three methods:
+//!
+//! 1. The standard [`FromStr`](https://doc.rust-lang.org/std/str/trait.FromStr.html) trait
+//!    (and [`parse`](https://doc.rust-lang.org/std/primitive.str.html#method.parse) method
+//!    on a string) can be used for parsing `DateTime<FixedOffset>`, `DateTime<UTC>` and
+//!    `DateTime<Local>` values. This parses what the `{:?}`
+//!    ([`std::fmt::Debug`](https://doc.rust-lang.org/std/fmt/trait.Debug.html))
+//!    format specifier prints, and requires the offset to be present.
+//!
+//! 2. [`DateTime::parse_from_str`](./datetime/struct.DateTime.html#method.parse_from_str) parses
+//!    a date and time with offsets and returns `DateTime<FixedOffset>`.
+//!    This should be used when the offset is a part of input and the caller cannot guess that.
+//!    It *cannot* be used when the offset can be missing.
+//!    [`DateTime::parse_from_rfc2822`](./datetime/struct.DateTime.html#method.parse_from_rfc2822)
+//!    and
+//!    [`DateTime::parse_from_rfc3339`](./datetime/struct.DateTime.html#method.parse_from_rfc3339)
+//!    are similar but for well-known formats.
+//!
+//! 3. [`Offset::datetime_from_str`](./offset/trait.TimeZone.html#method.datetime_from_str) is
+//!    similar but returns `DateTime` of given offset.
+//!    When the explicit offset is missing from the input, it simply uses given offset.
+//!    It issues an error when the input contains an explicit offset different
+//!    from the current offset.
+//!
+//! More detailed control over the parsing process is available via
+//! [`format`](./format/index.html) module.
+//!
+//! ~~~~ {.rust}
+//! use chrono::*;
+//!
+//! let dt = UTC.ymd(2014, 11, 28).and_hms(12, 0, 9);
+//! let fixed_dt = dt.with_timezone(&FixedOffset::east(9*3600));
+//!
+//! // method 1
+//! assert_eq!("2014-11-28T12:00:09Z".parse::<DateTime<UTC>>(), Ok(dt.clone()));
+//! assert_eq!("2014-11-28T21:00:09+09:00".parse::<DateTime<UTC>>(), Ok(dt.clone()));
+//! assert_eq!("2014-11-28T21:00:09+09:00".parse::<DateTime<FixedOffset>>(), Ok(fixed_dt.clone()));
+//!
+//! // method 2
+//! assert_eq!(DateTime::parse_from_str("2014-11-28 21:00:09 +09:00", "%Y-%m-%d %H:%M:%S %z"),
+//!            Ok(fixed_dt.clone()));
+//! assert_eq!(DateTime::parse_from_rfc2822("Fri, 28 Nov 2014 21:00:09 +0900"),
+//!            Ok(fixed_dt.clone()));
+//! assert_eq!(DateTime::parse_from_rfc3339("2014-11-28T21:00:09+09:00"), Ok(fixed_dt.clone()));
+//!
+//! // method 3
+//! assert_eq!(UTC.datetime_from_str("2014-11-28 12:00:09", "%Y-%m-%d %H:%M:%S"), Ok(dt.clone()));
+//! assert_eq!(UTC.datetime_from_str("Fri Nov 28 12:00:09 2014", "%a %b %e %T %Y"), Ok(dt.clone()));
+//!
+//! // oops, the year is missing!
+//! assert!(UTC.datetime_from_str("Fri Nov 28 12:00:09", "%a %b %e %T %Y").is_err());
+//! // oops, the format string does not include the year at all!
+//! assert!(UTC.datetime_from_str("Fri Nov 28 12:00:09", "%a %b %e %T").is_err());
+//! // oops, the weekday is incorrect!
+//! assert!(UTC.datetime_from_str("Sat Nov 28 12:00:09 2014", "%a %b %e %T %Y").is_err());
+//! ~~~~
+//!
+//! ### Individual date
+//!
+//! Chrono also provides an individual date type ([**`Date`**](./date/struct.Date.html)).
+//! It also has time zones attached, and have to be constructed via time zones.
+//! Most operations available to `DateTime` are also available to `Date` whenever appropriate.
+//!
+//! ~~~~ {.rust}
+//! use chrono::*;
+//!
+//! # // these *may* fail, but only very rarely. just rerun the test if you were that unfortunate ;)
+//! assert_eq!(UTC::today(), UTC::now().date());
+//! assert_eq!(Local::today(), Local::now().date());
+//!
+//! assert_eq!(UTC.ymd(2014, 11, 28).weekday(), Weekday::Fri);
+//! assert_eq!(UTC.ymd_opt(2014, 11, 31), LocalResult::None);
+//! assert_eq!(UTC.ymd(2014, 11, 28).and_hms_milli(7, 8, 9, 10).format("%H%M%S").to_string(),
+//!            "070809");
+//! ~~~~
+//!
+//! There is no timezone-aware `Time` due to the lack of usefulness and also the complexity.
+//!
+//! `DateTime` has [`date`](./datetime/struct.DateTime.html#method.date) method
+//! which returns a `Date` which represents its date component.
+//! There is also a [`time`](./datetime/struct.DateTime.html#method.time) method,
+//! which simply returns a naive local time described below.
+//!
+//! ### Naive date and time
+//!
+//! Chrono provides naive counterparts to `Date`, (non-existent) `Time` and `DateTime`
+//! as [**`NaiveDate`**](./naive/date/struct.NaiveDate.html),
+//! [**`NaiveTime`**](./naive/time/struct.NaiveTime.html) and
+//! [**`NaiveDateTime`**](./naive/datetime/struct.NaiveDateTime.html) respectively.
+//!
+//! They have almost equivalent interfaces as their timezone-aware twins,
+//! but are not associated to time zones obviously and can be quite low-level.
+//! They are mostly useful for building blocks for higher-level types.
+//!
+//! Timezone-aware `DateTime` and `Date` types have two methods returning naive versions:
+//! [`naive_local`](./datetime/struct.DateTime.html#method.naive_local) returns
+//! a view to the naive local time,
+//! and [`naive_utc`](./datetime/struct.DateTime.html#method.naive_utc) returns
+//! a view to the naive UTC time.
+//!
+//! ## Limitations
+//!
+//! Only proleptic Gregorian calendar (i.e. extended to support older dates) is supported.
+//! Be very careful if you really have to deal with pre-20C dates, they can be in Julian or others.
+//!
+//! Date types are limited in about +/- 262,000 years from the common epoch.
+//! Time types are limited in the nanosecond accuracy.
+//!
+//! [Leap seconds are supported in the representation but
+//! Chrono doesn't try to make use of them](./naive/time/index.html#leap-second-handling).
+//! (The main reason is that leap seconds are not really predictable.)
+//! Almost *every* operation over the possible leap seconds will ignore them.
+//! Consider using `NaiveDateTime` with the implicit TAI (International Atomic Time) scale
+//! if you want.
+//!
+//! Chrono inherently does not support an inaccurate or partial date and time representation.
+//! Any operation that can be ambiguous will return `None` in such cases.
+//! For example, "a month later" of 2014-01-30 is not well-defined
+//! and consequently `UTC.ymd(2014, 1, 30).with_month(2)` returns `None`.
+//!
+//! Advanced time zone handling is not yet supported (but is planned in 0.3).
+
+#![doc(html_root_url = "https://lifthrasiir.github.io/rust-chrono/")]
+
+#![cfg_attr(bench, feature(test))] // lib stability features as per RFC #507
+#![deny(missing_docs)]
+
+extern crate time as stdtime;
+extern crate num;
+#[cfg(feature = "rustc-serialize")]
+extern crate rustc_serialize;
+#[cfg(feature = "serde")]
+extern crate serde;
+
+pub use duration::Duration;
+pub use offset::{TimeZone, Offset, LocalResult};
+pub use offset::utc::UTC;
+pub use offset::fixed::FixedOffset;
+pub use offset::local::Local;
+pub use naive::date::NaiveDate;
+pub use naive::time::NaiveTime;
+pub use naive::datetime::NaiveDateTime;
+pub use date::Date;
+pub use datetime::DateTime;
+pub use format::{ParseError, ParseResult};
+
+// useful throughout the codebase
+macro_rules! try_opt {
+    ($e:expr) => (match $e { Some(v) => v, None => return None })
+}
+
+mod div;
+pub mod duration {
+    //! ISO 8601 duration.
+    //!
+    //! This used to be a part of rust-chrono,
+    //! but has been subsequently merged into Rust's standard library.
+    pub use stdtime::Duration;
+}
+pub mod offset;
+pub mod naive {
+    //! Date and time types which do not concern about the timezones.
+    //!
+    //! They are primarily building blocks for other types
+    //! (e.g. [`TimeZone`](../offset/trait.TimeZone.html)),
+    //! but can be also used for the simpler date and time handling.
+    pub mod date;
+    pub mod time;
+    pub mod datetime;
+}
+pub mod date;
+pub mod datetime;
+pub mod format;
+
+/// The day of week.
+///
+/// The order of the days of week depends on the context.
+/// (This is why this type does *not* implement `PartialOrd` or `Ord` traits.)
+/// One should prefer `*_from_monday` or `*_from_sunday` methods to get the correct result.
+#[derive(PartialEq, Eq, Copy, Clone, Debug)]
+#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
+pub enum Weekday {
+    /// Monday.
+    Mon = 0,
+    /// Tuesday.
+    Tue = 1,
+    /// Wednesday.
+    Wed = 2,
+    /// Thursday.
+    Thu = 3,
+    /// Friday.
+    Fri = 4,
+    /// Saturday.
+    Sat = 5,
+    /// Sunday.
+    Sun = 6,
+}
+
+impl Weekday {
+    /// The next day in the week.
+    ///
+    /// `w`:        | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`
+    /// ----------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
+    /// `w.succ()`: | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun` | `Mon`
+    #[inline]
+    pub fn succ(&self) -> Weekday {
+        match *self {
+            Weekday::Mon => Weekday::Tue,
+            Weekday::Tue => Weekday::Wed,
+            Weekday::Wed => Weekday::Thu,
+            Weekday::Thu => Weekday::Fri,
+            Weekday::Fri => Weekday::Sat,
+            Weekday::Sat => Weekday::Sun,
+            Weekday::Sun => Weekday::Mon,
+        }
+    }
+
+    /// The previous day in the week.
+    ///
+    /// `w`:        | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`
+    /// ----------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
+    /// `w.pred()`: | `Sun` | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat`
+    #[inline]
+    pub fn pred(&self) -> Weekday {
+        match *self {
+            Weekday::Mon => Weekday::Sun,
+            Weekday::Tue => Weekday::Mon,
+            Weekday::Wed => Weekday::Tue,
+            Weekday::Thu => Weekday::Wed,
+            Weekday::Fri => Weekday::Thu,
+            Weekday::Sat => Weekday::Fri,
+            Weekday::Sun => Weekday::Sat,
+        }
+    }
+
+    /// Returns a day-of-week number starting from Monday = 1. (ISO 8601 weekday number)
+    ///
+    /// `w`:                      | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`
+    /// ------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
+    /// `w.number_from_monday()`: | 1     | 2     | 3     | 4     | 5     | 6     | 7
+    #[inline]
+    pub fn number_from_monday(&self) -> u32 {
+        match *self {
+            Weekday::Mon => 1,
+            Weekday::Tue => 2,
+            Weekday::Wed => 3,
+            Weekday::Thu => 4,
+            Weekday::Fri => 5,
+            Weekday::Sat => 6,
+            Weekday::Sun => 7,
+        }
+    }
+
+    /// Returns a day-of-week number starting from Sunday = 1.
+    ///
+    /// `w`:                      | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`
+    /// ------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
+    /// `w.number_from_sunday()`: | 2     | 3     | 4     | 5     | 6     | 7     | 1
+    #[inline]
+    pub fn number_from_sunday(&self) -> u32 {
+        match *self {
+            Weekday::Mon => 2,
+            Weekday::Tue => 3,
+            Weekday::Wed => 4,
+            Weekday::Thu => 5,
+            Weekday::Fri => 6,
+            Weekday::Sat => 7,
+            Weekday::Sun => 1,
+        }
+    }
+
+    /// Returns a day-of-week number starting from Monday = 0.
+    ///
+    /// `w`:                        | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`
+    /// --------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
+    /// `w.num_days_from_monday()`: | 0     | 1     | 2     | 3     | 4     | 5     | 6
+    #[inline]
+    pub fn num_days_from_monday(&self) -> u32 {
+        match *self {
+            Weekday::Mon => 0,
+            Weekday::Tue => 1,
+            Weekday::Wed => 2,
+            Weekday::Thu => 3,
+            Weekday::Fri => 4,
+            Weekday::Sat => 5,
+            Weekday::Sun => 6,
+        }
+    }
+
+    /// Returns a day-of-week number starting from Sunday = 0.
+    ///
+    /// `w`:                        | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`
+    /// --------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
+    /// `w.num_days_from_sunday()`: | 1     | 2     | 3     | 4     | 5     | 6     | 0
+    #[inline]
+    pub fn num_days_from_sunday(&self) -> u32 {
+        match *self {
+            Weekday::Mon => 1,
+            Weekday::Tue => 2,
+            Weekday::Wed => 3,
+            Weekday::Thu => 4,
+            Weekday::Fri => 5,
+            Weekday::Sat => 6,
+            Weekday::Sun => 0,
+        }
+    }
+}
+
+/// Any weekday can be represented as an integer from 0 to 6, which equals to
+/// [`Weekday::num_days_from_monday`](#method.num_days_from_monday) in this implementation.
+/// Do not heavily depend on this though; use explicit methods whenever possible.
+impl num::traits::FromPrimitive for Weekday {
+    #[inline]
+    fn from_i64(n: i64) -> Option<Weekday> {
+        match n {
+            0 => Some(Weekday::Mon),
+            1 => Some(Weekday::Tue),
+            2 => Some(Weekday::Wed),
+            3 => Some(Weekday::Thu),
+            4 => Some(Weekday::Fri),
+            5 => Some(Weekday::Sat),
+            6 => Some(Weekday::Sun),
+            _ => None,
+        }
+    }
+
+    #[inline]
+    fn from_u64(n: u64) -> Option<Weekday> {
+        match n {
+            0 => Some(Weekday::Mon),
+            1 => Some(Weekday::Tue),
+            2 => Some(Weekday::Wed),
+            3 => Some(Weekday::Thu),
+            4 => Some(Weekday::Fri),
+            5 => Some(Weekday::Sat),
+            6 => Some(Weekday::Sun),
+            _ => None,
+        }
+    }
+}
+
+
+/// The common set of methods for date component.
+pub trait Datelike: Sized {
+    /// Returns the year number in the [calendar date](./naive/date/index.html#calendar-date).
+    fn year(&self) -> i32;
+
+    /// Returns the absolute year number starting from 1 with a boolean flag,
+    /// which is false when the year predates the epoch (BCE/BC) and true otherwise (CE/AD).
+    #[inline]
+    fn year_ce(&self) -> (bool, u32) {
+        let year = self.year();
+        if year < 1 {
+            (false, (1 - year) as u32)
+        } else {
+            (true, year as u32)
+        }
+    }
+
+    /// Returns the month number starting from 1.
+    ///
+    /// The return value ranges from 1 to 12.
+    fn month(&self) -> u32;
+
+    /// Returns the month number starting from 0.
+    ///
+    /// The return value ranges from 0 to 11.
+    fn month0(&self) -> u32;
+
+    /// Returns the day of month starting from 1.
+    ///
+    /// The return value ranges from 1 to 31. (The last day of month differs by months.)
+    fn day(&self) -> u32;
+
+    /// Returns the day of month starting from 0.
+    ///
+    /// The return value ranges from 0 to 30. (The last day of month differs by months.)
+    fn day0(&self) -> u32;
+
+    /// Returns the day of year starting from 1.
+    ///
+    /// The return value ranges from 1 to 366. (The last day of year differs by years.)
+    fn ordinal(&self) -> u32;
+
+    /// Returns the day of year starting from 0.
+    ///
+    /// The return value ranges from 0 to 365. (The last day of year differs by years.)
+    fn ordinal0(&self) -> u32;
+
+    /// Returns the day of week.
+    fn weekday(&self) -> Weekday;
+
+    /// Returns the ISO week date: an adjusted year, week number and day of week.
+    /// The adjusted year may differ from that of the calendar date.
+    fn isoweekdate(&self) -> (i32, u32, Weekday);
+
+    /// Makes a new value with the year number changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_year(&self, year: i32) -> Option<Self>;
+
+    /// Makes a new value with the month number (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_month(&self, month: u32) -> Option<Self>;
+
+    /// Makes a new value with the month number (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_month0(&self, month0: u32) -> Option<Self>;
+
+    /// Makes a new value with the day of month (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_day(&self, day: u32) -> Option<Self>;
+
+    /// Makes a new value with the day of month (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_day0(&self, day0: u32) -> Option<Self>;
+
+    /// Makes a new value with the day of year (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_ordinal(&self, ordinal: u32) -> Option<Self>;
+
+    /// Makes a new value with the day of year (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_ordinal0(&self, ordinal0: u32) -> Option<Self>;
+
+    /// Returns the number of days since January 1, 1 (Day 1) in the proleptic Gregorian calendar.
+    fn num_days_from_ce(&self) -> i32 {
+        // we know this wouldn't overflow since year is limited to 1/2^13 of i32's full range.
+        let mut year = self.year() - 1;
+        let mut ndays = 0;
+        if year < 0 {
+            let excess = 1 + (-year) / 400;
+            year += excess * 400;
+            ndays -= excess * 146097;
+        }
+        let div_100 = year / 100;
+        ndays += ((year * 1461) >> 2) - div_100 + (div_100 >> 2);
+        ndays + self.ordinal() as i32
+    }
+}
+
+/// The common set of methods for time component.
+pub trait Timelike: Sized {
+    /// Returns the hour number from 0 to 23.
+    fn hour(&self) -> u32;
+
+    /// Returns the hour number from 1 to 12 with a boolean flag,
+    /// which is false for AM and true for PM.
+    #[inline]
+    fn hour12(&self) -> (bool, u32) {
+        let hour = self.hour();
+        let mut hour12 = hour % 12;
+        if hour12 == 0 {
+            hour12 = 12;
+        }
+        (hour >= 12, hour12)
+    }
+
+    /// Returns the minute number from 0 to 59.
+    fn minute(&self) -> u32;
+
+    /// Returns the second number from 0 to 59.
+    fn second(&self) -> u32;
+
+    /// Returns the number of nanoseconds since the whole non-leap second.
+    /// The range from 1,000,000,000 to 1,999,999,999 represents
+    /// the [leap second](./naive/time/index.html#leap-second-handling).
+    fn nanosecond(&self) -> u32;
+
+    /// Makes a new value with the hour number changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_hour(&self, hour: u32) -> Option<Self>;
+
+    /// Makes a new value with the minute number changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    fn with_minute(&self, min: u32) -> Option<Self>;
+
+    /// Makes a new value with the second number changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    /// As with the [`second`](#tymethod.second) method,
+    /// the input range is restricted to 0 through 59.
+    fn with_second(&self, sec: u32) -> Option<Self>;
+
+    /// Makes a new value with nanoseconds since the whole non-leap second changed.
+    ///
+    /// Returns `None` when the resulting value would be invalid.
+    /// As with the [`nanosecond`](#tymethod.nanosecond) method,
+    /// the input range can exceed 1,000,000,000 for leap seconds.
+    fn with_nanosecond(&self, nano: u32) -> Option<Self>;
+
+    /// Returns the number of non-leap seconds past the last midnight.
+    #[inline]
+    fn num_seconds_from_midnight(&self) -> u32 {
+        self.hour() * 3600 + self.minute() * 60 + self.second()
+    }
+}
+
+#[test]
+fn test_readme_doomsday() {
+    use num::iter::range_inclusive;
+
+    for y in range_inclusive(naive::date::MIN.year(), naive::date::MAX.year()) {
+        // even months
+        let d4 = NaiveDate::from_ymd(y, 4, 4);
+        let d6 = NaiveDate::from_ymd(y, 6, 6);
+        let d8 = NaiveDate::from_ymd(y, 8, 8);
+        let d10 = NaiveDate::from_ymd(y, 10, 10);
+        let d12 = NaiveDate::from_ymd(y, 12, 12);
+
+        // nine to five, seven-eleven
+        let d59 = NaiveDate::from_ymd(y, 5, 9);
+        let d95 = NaiveDate::from_ymd(y, 9, 5);
+        let d711 = NaiveDate::from_ymd(y, 7, 11);
+        let d117 = NaiveDate::from_ymd(y, 11, 7);
+
+        // "March 0"
+        let d30 = NaiveDate::from_ymd(y, 3, 1).pred();
+
+        let weekday = d30.weekday();
+        let other_dates = [d4, d6, d8, d10, d12, d59, d95, d711, d117];
+        assert!(other_dates.iter().all(|d| d.weekday() == weekday));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/naive/date.rs
@@ -0,0 +1,2806 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+//! ISO 8601 calendar date without timezone.
+//!
+//! # Calendar Date
+//!
+//! The ISO 8601 **calendar date** follows the proleptic Gregorian calendar.
+//! It is like a normal civil calendar but note some slight differences:
+//!
+//! * Dates before the Gregorian calendar's inception in 1582 are defined via the extrapolation.
+//!   Be careful, as historical dates are often noted in the Julian calendar and others
+//!   and the transition to Gregorian may differ across countries (as late as early 20C).
+//!
+//!   (Some example: Both Shakespeare from Britain and Cervantes from Spain seemingly died
+//!   on the same calendar date---April 23, 1616---but in the different calendar.
+//!   Britain used the Julian calendar at that time, so Shakespeare's death is later.)
+//!
+//! * ISO 8601 calendars has the year 0, which is 1 BCE (a year before 1 CE).
+//!   If you need a typical BCE/BC and CE/AD notation for year numbers,
+//!   use the [`Datelike::year_ce`](../../trait.Datelike.html#method.year_ce) method.
+//!
+//! # Week Date
+//!
+//! The ISO 8601 **week date** is a triple of year number, week number
+//! and [day of the week](../../enum.Weekday.html) with the following rules:
+//!
+//! * A week consists of Monday through Sunday, and is always numbered within some year.
+//!   The week number ranges from 1 to 52 or 53 depending on the year.
+//!
+//! * The week 1 of given year is defined as the first week containing January 4 of that year,
+//!   or equivalently, the first week containing four or more days in that year.
+//!
+//! * The year number in the week date may *not* correspond to the actual Gregorian year.
+//!   For example, January 3, 2016 (Sunday) was on the last (53rd) week of 2015.
+//!
+//! Chrono's date types default to the ISO 8601 [calendar date](#calendar-date),
+//! but the [`Datelike::isoweekdate`](../../trait.Datelike.html#tymethod.isoweekdate) method
+//! can be used to get the corresponding week date.
+//!
+//! # Ordinal Date
+//!
+//! The ISO 8601 **ordinal date** is a pair of year number and day of the year ("ordinal").
+//! The ordinal number ranges from 1 to 365 or 366 depending on the year.
+//! The year number is same to that of the [calendar date](#calendar-date).
+//!
+//! This is currently the internal format of Chrono's date types.
+
+use std::{str, fmt, hash};
+use std::ops::{Add, Sub};
+use num::traits::ToPrimitive;
+
+use {Weekday, Datelike};
+use div::div_mod_floor;
+use duration::Duration;
+use naive::time::NaiveTime;
+use naive::datetime::NaiveDateTime;
+use format::{Item, Numeric, Pad};
+use format::{parse, Parsed, ParseError, ParseResult, DelayedFormat, StrftimeItems};
+
+use self::internals::{DateImpl, Of, Mdf, YearFlags};
+
+const MAX_YEAR: i32 = internals::MAX_YEAR;
+const MIN_YEAR: i32 = internals::MIN_YEAR;
+
+//   MAX_YEAR-12-31 minus 0000-01-01
+// = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + (0001-01-01 minus 0000-01-01) - 1 day
+// = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + 365 days
+// = MAX_YEAR * 365 + (# of leap years from 0001 to MAX_YEAR) + 365 days
+#[cfg(test)] // only used for testing
+const MAX_DAYS_FROM_YEAR_0: i32 = MAX_YEAR * 365 +
+                                  MAX_YEAR / 4 -
+                                  MAX_YEAR / 100 +
+                                  MAX_YEAR / 400 + 365;
+
+//   MIN_YEAR-01-01 minus 0000-01-01
+// = (MIN_YEAR+400n+1)-01-01 minus (400n+1)-01-01
+// = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - ((400n+1)-01-01 minus 0001-01-01)
+// = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - 146097n days
+//
+// n is set to 1000 for convenience.
+#[cfg(test)] // only used for testing
+const MIN_DAYS_FROM_YEAR_0: i32 = (MIN_YEAR + 400_000) * 365 +
+                                  (MIN_YEAR + 400_000) / 4 -
+                                  (MIN_YEAR + 400_000) / 100 +
+                                  (MIN_YEAR + 400_000) / 400 - 146097_000;
+
+/// ISO 8601 calendar date without timezone.
+/// Allows for every [proleptic Gregorian date](./index.html#calendar-date)
+/// from Jan 1, 262145 BCE to Dec 31, 262143 CE.
+/// Also supports the conversion from ISO 8601 ordinal and week date.
+#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]
+pub struct NaiveDate {
+    ymdf: DateImpl, // (year << 13) | of
+}
+
+/// The minimum possible `NaiveDate` (January 1, 262145 BCE).
+pub const MIN: NaiveDate = NaiveDate { ymdf: (MIN_YEAR << 13) | (1 << 4) | 0o07 /*FE*/ };
+/// The maximum possible `NaiveDate` (December 31, 262143 CE).
+pub const MAX: NaiveDate = NaiveDate { ymdf: (MAX_YEAR << 13) | (365 << 4) | 0o17 /*F*/ };
+
+// as it is hard to verify year flags in `MIN` and `MAX`, we use a separate run-time test.
+#[test]
+fn test_date_bounds() {
+    let calculated_min = NaiveDate::from_ymd(MIN_YEAR, 1, 1);
+    let calculated_max = NaiveDate::from_ymd(MAX_YEAR, 12, 31);
+    assert!(MIN == calculated_min,
+            "`MIN` should have a year flag {:?}", calculated_min.of().flags());
+    assert!(MAX == calculated_max,
+            "`MAX` should have a year flag {:?}", calculated_max.of().flags());
+}
+
+impl NaiveDate {
+    /// Makes a new `NaiveDate` from year and packed ordinal-flags, with a verification.
+    fn from_of(year: i32, of: Of) -> Option<NaiveDate> {
+        if year >= MIN_YEAR && year <= MAX_YEAR && of.valid() {
+            let Of(of) = of;
+            Some(NaiveDate { ymdf: (year << 13) | (of as DateImpl) })
+        } else {
+            None
+        }
+    }
+
+    /// Makes a new `NaiveDate` from year and packed month-day-flags, with a verification.
+    fn from_mdf(year: i32, mdf: Mdf) -> Option<NaiveDate> {
+        NaiveDate::from_of(year, mdf.to_of())
+    }
+
+    /// Makes a new `NaiveDate` from the serialized representation.
+    /// Used for serialization formats.
+    #[cfg(feature = "rustc-serialize")]
+    fn from_serialized(ymdf: i32) -> Option<NaiveDate> {
+        // check if the year flag is correct
+        if (ymdf & 0b1111) as u8 != YearFlags::from_year(ymdf >> 13).0 { return None; }
+
+        // check if the ordinal is in the range
+        let date = NaiveDate { ymdf: ymdf };
+        if !date.of().valid() { return None; }
+
+        Some(date)
+    }
+
+    /// Returns a serialized representation of this `NaiveDate`.
+    #[cfg(feature = "rustc-serialize")]
+    fn to_serialized(&self) -> i32 {
+        self.ymdf
+    }
+
+    /// Makes a new `NaiveDate` from the [calendar date](./index.html#calendar-date)
+    /// (year, month and day).
+    ///
+    /// Panics on the out-of-range date, invalid month and/or day.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 3, 14);
+    /// assert_eq!(d.year(), 2015);
+    /// assert_eq!(d.month(), 3);
+    /// assert_eq!(d.day(), 14);
+    /// assert_eq!(d.ordinal(), 73); // day of year
+    /// assert_eq!(d.isoweekdate(), (2015, 11, Weekday::Sat)); // ISO week and weekday
+    /// assert_eq!(d.num_days_from_ce(), 735671); // days since January 1, 1 CE
+    /// ~~~~
+    pub fn from_ymd(year: i32, month: u32, day: u32) -> NaiveDate {
+        NaiveDate::from_ymd_opt(year, month, day).expect("invalid or out-of-range date")
+    }
+
+    /// Makes a new `NaiveDate` from the [calendar date](./index.html#calendar-date)
+    /// (year, month and day).
+    ///
+    /// Returns `None` on the out-of-range date, invalid month and/or day.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let ymd = |y,m,d| NaiveDate::from_ymd_opt(y, m, d);
+    /// assert!(ymd(2015, 3, 14).is_some());
+    /// assert!(ymd(2015, 0, 14).is_none());
+    /// assert!(ymd(2015, 2, 29).is_none());
+    /// assert!(ymd(-4, 2, 29).is_some()); // 5 BCE is a leap year
+    /// assert!(ymd(400000, 1, 1).is_none());
+    /// assert!(ymd(-400000, 1, 1).is_none());
+    /// ~~~~
+    pub fn from_ymd_opt(year: i32, month: u32, day: u32) -> Option<NaiveDate> {
+        let flags = YearFlags::from_year(year);
+        NaiveDate::from_mdf(year, Mdf::new(month, day, flags))
+    }
+
+    /// Makes a new `NaiveDate` from the [ordinal date](./index.html#ordinal-date)
+    /// (year and day of the year).
+    ///
+    /// Panics on the out-of-range date and/or invalid day of year.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_yo(2015, 73);
+    /// assert_eq!(d.ordinal(), 73);
+    /// assert_eq!(d.year(), 2015);
+    /// assert_eq!(d.month(), 3);
+    /// assert_eq!(d.day(), 14);
+    /// assert_eq!(d.isoweekdate(), (2015, 11, Weekday::Sat)); // ISO week and weekday
+    /// assert_eq!(d.num_days_from_ce(), 735671); // days since January 1, 1 CE
+    /// ~~~~
+    pub fn from_yo(year: i32, ordinal: u32) -> NaiveDate {
+        NaiveDate::from_yo_opt(year, ordinal).expect("invalid or out-of-range date")
+    }
+
+    /// Makes a new `NaiveDate` from the [ordinal date](./index.html#ordinal-date)
+    /// (year and day of the year).
+    ///
+    /// Returns `None` on the out-of-range date and/or invalid day of year.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let yo = |y,o| NaiveDate::from_yo_opt(y, o);
+    /// assert!(yo(2015, 100).is_some());
+    /// assert!(yo(2015, 0).is_none());
+    /// assert!(yo(2015, 365).is_some());
+    /// assert!(yo(2015, 366).is_none());
+    /// assert!(yo(-4, 366).is_some()); // 5 BCE is a leap year
+    /// assert!(yo(400000, 1).is_none());
+    /// assert!(yo(-400000, 1).is_none());
+    /// ~~~~
+    pub fn from_yo_opt(year: i32, ordinal: u32) -> Option<NaiveDate> {
+        let flags = YearFlags::from_year(year);
+        NaiveDate::from_of(year, Of::new(ordinal, flags))
+    }
+
+    /// Makes a new `NaiveDate` from the [ISO week date](./index.html#week-date)
+    /// (year, week number and day of the week).
+    /// The resulting `NaiveDate` may have a different year from the input year.
+    ///
+    /// Panics on the out-of-range date and/or invalid week number.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_isoywd(2015, 11, Weekday::Sat);
+    /// assert_eq!(d.isoweekdate(), (2015, 11, Weekday::Sat));
+    /// assert_eq!(d.year(), 2015);
+    /// assert_eq!(d.month(), 3);
+    /// assert_eq!(d.day(), 14);
+    /// assert_eq!(d.ordinal(), 73); // day of year
+    /// assert_eq!(d.num_days_from_ce(), 735671); // days since January 1, 1 CE
+    /// ~~~~
+    pub fn from_isoywd(year: i32, week: u32, weekday: Weekday) -> NaiveDate {
+        NaiveDate::from_isoywd_opt(year, week, weekday).expect("invalid or out-of-range date")
+    }
+
+    /// Makes a new `NaiveDate` from the [ISO week date](./index.html#week-date)
+    /// (year, week number and day of the week).
+    /// The resulting `NaiveDate` may have a different year from the input year.
+    ///
+    /// Returns `None` on the out-of-range date and/or invalid week number.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Weekday};
+    ///
+    /// let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+    /// let isoywd = |y,w,d| NaiveDate::from_isoywd_opt(y, w, d);
+    ///
+    /// assert_eq!(isoywd(2015, 0, Weekday::Sun), None);
+    /// assert_eq!(isoywd(2015, 10, Weekday::Sun), Some(ymd(2015, 3, 8)));
+    /// assert_eq!(isoywd(2015, 30, Weekday::Mon), Some(ymd(2015, 7, 20)));
+    /// assert_eq!(isoywd(2015, 60, Weekday::Mon), None);
+    ///
+    /// assert_eq!(isoywd(400000, 10, Weekday::Fri), None);
+    /// assert_eq!(isoywd(-400000, 10, Weekday::Sat), None);
+    /// ~~~~
+    ///
+    /// The year number of ISO week date may differ from that of the calendar date.
+    ///
+    /// ~~~~
+    /// # use chrono::{NaiveDate, Weekday};
+    /// # let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+    /// # let isoywd = |y,w,d| NaiveDate::from_isoywd_opt(y, w, d);
+    /// //           Mo Tu We Th Fr Sa Su
+    /// // 2014-W52  22 23 24 25 26 27 28    has 4+ days of new year,
+    /// // 2015-W01  29 30 31  1  2  3  4 <- so this is the first week
+    /// assert_eq!(isoywd(2014, 52, Weekday::Sun), Some(ymd(2014, 12, 28)));
+    /// assert_eq!(isoywd(2014, 53, Weekday::Mon), None);
+    /// assert_eq!(isoywd(2015, 1, Weekday::Mon), Some(ymd(2014, 12, 29)));
+    ///
+    /// // 2015-W52  21 22 23 24 25 26 27    has 4+ days of old year,
+    /// // 2015-W53  28 29 30 31  1  2  3 <- so this is the last week
+    /// // 2016-W01   4  5  6  7  8  9 10
+    /// assert_eq!(isoywd(2015, 52, Weekday::Sun), Some(ymd(2015, 12, 27)));
+    /// assert_eq!(isoywd(2015, 53, Weekday::Sun), Some(ymd(2016, 1, 3)));
+    /// assert_eq!(isoywd(2015, 54, Weekday::Mon), None);
+    /// assert_eq!(isoywd(2016, 1, Weekday::Mon), Some(ymd(2016, 1, 4)));
+    /// ~~~~
+    pub fn from_isoywd_opt(year: i32, week: u32, weekday: Weekday) -> Option<NaiveDate> {
+        let flags = YearFlags::from_year(year);
+        let nweeks = flags.nisoweeks();
+        if 1 <= week && week <= nweeks {
+            // ordinal = week ordinal - delta
+            let weekord = week * 7 + weekday as u32;
+            let delta = flags.isoweek_delta();
+            if weekord <= delta { // ordinal < 1, previous year
+                let prevflags = YearFlags::from_year(year - 1);
+                NaiveDate::from_of(year - 1, Of::new(weekord + prevflags.ndays() - delta,
+                                                     prevflags))
+            } else {
+                let ordinal = weekord - delta;
+                let ndays = flags.ndays();
+                if ordinal <= ndays { // this year
+                    NaiveDate::from_of(year, Of::new(ordinal, flags))
+                } else { // ordinal > ndays, next year
+                    let nextflags = YearFlags::from_year(year + 1);
+                    NaiveDate::from_of(year + 1, Of::new(ordinal - ndays, nextflags))
+                }
+            }
+        } else {
+            None
+        }
+    }
+
+    /// Makes a new `NaiveDate` from the number of days since January 1, 1 (Day 1)
+    /// in the proleptic Gregorian calendar.
+    ///
+    /// Panics on the out-of-range date.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_num_days_from_ce(735671);
+    /// assert_eq!(d.num_days_from_ce(), 735671); // days since January 1, 1 CE
+    /// assert_eq!(d.year(), 2015);
+    /// assert_eq!(d.month(), 3);
+    /// assert_eq!(d.day(), 14);
+    /// assert_eq!(d.ordinal(), 73); // day of year
+    /// assert_eq!(d.isoweekdate(), (2015, 11, Weekday::Sat)); // ISO week and weekday
+    /// ~~~~
+    ///
+    /// While not directly supported by Chrono,
+    /// it is easy to convert from the Julian day number
+    /// (January 1, 4713 BCE in the *Julian* calendar being Day 0)
+    /// to Gregorian with this method.
+    /// (Note that this panics when `jd` is out of range.)
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// fn jd_to_date(jd: i32) -> NaiveDate {
+    ///     // keep in mind that the Julian day number is 0-based
+    ///     // while this method requires an 1-based number.
+    ///     NaiveDate::from_num_days_from_ce(jd - 1721425)
+    /// }
+    ///
+    /// // January 1, 4713 BCE in Julian = November 24, 4714 BCE in Gregorian
+    /// assert_eq!(jd_to_date(0), NaiveDate::from_ymd(-4713, 11, 24));
+    ///
+    /// assert_eq!(jd_to_date(1721426), NaiveDate::from_ymd(1, 1, 1));
+    /// assert_eq!(jd_to_date(2450000), NaiveDate::from_ymd(1995, 10, 9));
+    /// assert_eq!(jd_to_date(2451545), NaiveDate::from_ymd(2000, 1, 1));
+    /// ~~~~
+    #[inline]
+    pub fn from_num_days_from_ce(days: i32) -> NaiveDate {
+        NaiveDate::from_num_days_from_ce_opt(days).expect("out-of-range date")
+    }
+
+    /// Makes a new `NaiveDate` from the number of days since January 1, 1 (Day 1)
+    /// in the proleptic Gregorian calendar.
+    ///
+    /// Returns `None` on the out-of-range date.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let days = |ndays| NaiveDate::from_num_days_from_ce_opt(ndays);
+    /// assert_eq!(days(730000),     Some(NaiveDate::from_ymd(1999, 9, 3)));
+    /// assert_eq!(days(1),          Some(NaiveDate::from_ymd(1, 1, 1)));
+    /// assert_eq!(days(0),          Some(NaiveDate::from_ymd(0, 12, 31)));
+    /// assert_eq!(days(-1),         Some(NaiveDate::from_ymd(0, 12, 30)));
+    /// assert_eq!(days(100000000),  None);
+    /// assert_eq!(days(-100000000), None);
+    /// ~~~~
+    pub fn from_num_days_from_ce_opt(days: i32) -> Option<NaiveDate> {
+        let days = days + 365; // make December 31, 1 BCE equal to day 0
+        let (year_div_400, cycle) = div_mod_floor(days, 146097);
+        let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32);
+        let flags = YearFlags::from_year_mod_400(year_mod_400 as i32);
+        NaiveDate::from_of(year_div_400 * 400 + year_mod_400 as i32,
+                           Of::new(ordinal, flags))
+    }
+
+    /// Parses a string with the specified format string and returns a new `NaiveDate`.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// assert_eq!(NaiveDate::parse_from_str("2015-09-05", "%Y-%m-%d"),
+    ///            Ok(NaiveDate::from_ymd(2015, 9, 5)));
+    /// assert_eq!(NaiveDate::parse_from_str("5sep2015", "%d%b%Y"),
+    ///            Ok(NaiveDate::from_ymd(2015, 9, 5)));
+    /// ~~~~
+    ///
+    /// Time and offset is ignored for the purpose of parsing.
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveDate;
+    /// assert_eq!(NaiveDate::parse_from_str("2014-5-17T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
+    ///            Ok(NaiveDate::from_ymd(2014, 5, 17)));
+    /// ~~~~
+    ///
+    /// Out-of-bound dates or insufficient fields are errors.
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveDate;
+    /// assert!(NaiveDate::parse_from_str("2015/9", "%Y/%m").is_err());
+    /// assert!(NaiveDate::parse_from_str("2015/9/31", "%Y/%m/%d").is_err());
+    /// ~~~~
+    ///
+    /// All parsed fields should be consistent to each other, otherwise it's an error.
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveDate;
+    /// assert!(NaiveDate::parse_from_str("Sat, 09 Aug 2013", "%a, %d %b %Y").is_err());
+    /// ~~~~
+    pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveDate> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, StrftimeItems::new(fmt)));
+        parsed.to_naive_date()
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date and given `NaiveTime`.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveTime, NaiveDateTime};
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    /// let t = NaiveTime::from_hms_milli(12, 34, 56, 789);
+    ///
+    /// let dt: NaiveDateTime = d.and_time(t);
+    /// assert_eq!(dt.date(), d);
+    /// assert_eq!(dt.time(), t);
+    /// ~~~~
+    #[inline]
+    pub fn and_time(&self, time: NaiveTime) -> NaiveDateTime {
+        NaiveDateTime::new(self.clone(), time)
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute and second.
+    ///
+    /// No [leap second](../time/index.html#leap-second-handling) is allowed here;
+    /// use `NaiveDate::and_hms_*` methods with a subsecond parameter instead.
+    ///
+    /// Panics on invalid hour, minute and/or second.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike, Timelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    ///
+    /// let dt: NaiveDateTime = d.and_hms(12, 34, 56);
+    /// assert_eq!(dt.year(), 2015);
+    /// assert_eq!(dt.weekday(), Weekday::Wed);
+    /// assert_eq!(dt.second(), 56);
+    /// ~~~~
+    #[inline]
+    pub fn and_hms(&self, hour: u32, min: u32, sec: u32) -> NaiveDateTime {
+        self.and_hms_opt(hour, min, sec).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute and second.
+    ///
+    /// No [leap second](../time/index.html#leap-second-handling) is allowed here;
+    /// use `NaiveDate::and_hms_*_opt` methods with a subsecond parameter instead.
+    ///
+    /// Returns `None` on invalid hour, minute and/or second.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    /// assert!(d.and_hms_opt(12, 34, 56).is_some());
+    /// assert!(d.and_hms_opt(12, 34, 60).is_none()); // use `and_hms_milli_opt` instead
+    /// assert!(d.and_hms_opt(12, 60, 56).is_none());
+    /// assert!(d.and_hms_opt(24, 34, 56).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_opt(&self, hour: u32, min: u32, sec: u32) -> Option<NaiveDateTime> {
+        NaiveTime::from_hms_opt(hour, min, sec).map(|time| self.and_time(time))
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and millisecond.
+    ///
+    /// The millisecond part can exceed 1,000
+    /// in order to represent the [leap second](../time/index.html#leap-second-handling).
+    ///
+    /// Panics on invalid hour, minute, second and/or millisecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike, Timelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    ///
+    /// let dt: NaiveDateTime = d.and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.year(), 2015);
+    /// assert_eq!(dt.weekday(), Weekday::Wed);
+    /// assert_eq!(dt.second(), 56);
+    /// assert_eq!(dt.nanosecond(), 789_000_000);
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_milli(&self, hour: u32, min: u32, sec: u32, milli: u32) -> NaiveDateTime {
+        self.and_hms_milli_opt(hour, min, sec, milli).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and millisecond.
+    ///
+    /// The millisecond part can exceed 1,000
+    /// in order to represent the [leap second](../time/index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or millisecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    /// assert!(d.and_hms_milli_opt(12, 34, 56,   789).is_some());
+    /// assert!(d.and_hms_milli_opt(12, 34, 59, 1_789).is_some()); // leap second
+    /// assert!(d.and_hms_milli_opt(12, 34, 59, 2_789).is_none());
+    /// assert!(d.and_hms_milli_opt(12, 34, 60,   789).is_none());
+    /// assert!(d.and_hms_milli_opt(12, 60, 56,   789).is_none());
+    /// assert!(d.and_hms_milli_opt(24, 34, 56,   789).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_milli_opt(&self, hour: u32, min: u32, sec: u32,
+                             milli: u32) -> Option<NaiveDateTime> {
+        NaiveTime::from_hms_milli_opt(hour, min, sec, milli).map(|time| self.and_time(time))
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and microsecond.
+    ///
+    /// The microsecond part can exceed 1,000,000
+    /// in order to represent the [leap second](../time/index.html#leap-second-handling).
+    ///
+    /// Panics on invalid hour, minute, second and/or microsecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike, Timelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    ///
+    /// let dt: NaiveDateTime = d.and_hms_micro(12, 34, 56, 789_012);
+    /// assert_eq!(dt.year(), 2015);
+    /// assert_eq!(dt.weekday(), Weekday::Wed);
+    /// assert_eq!(dt.second(), 56);
+    /// assert_eq!(dt.nanosecond(), 789_012_000);
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_micro(&self, hour: u32, min: u32, sec: u32, micro: u32) -> NaiveDateTime {
+        self.and_hms_micro_opt(hour, min, sec, micro).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and microsecond.
+    ///
+    /// The microsecond part can exceed 1,000,000
+    /// in order to represent the [leap second](../time/index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or microsecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    /// assert!(d.and_hms_micro_opt(12, 34, 56,   789_012).is_some());
+    /// assert!(d.and_hms_micro_opt(12, 34, 59, 1_789_012).is_some()); // leap second
+    /// assert!(d.and_hms_micro_opt(12, 34, 59, 2_789_012).is_none());
+    /// assert!(d.and_hms_micro_opt(12, 34, 60,   789_012).is_none());
+    /// assert!(d.and_hms_micro_opt(12, 60, 56,   789_012).is_none());
+    /// assert!(d.and_hms_micro_opt(24, 34, 56,   789_012).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_micro_opt(&self, hour: u32, min: u32, sec: u32,
+                             micro: u32) -> Option<NaiveDateTime> {
+        NaiveTime::from_hms_micro_opt(hour, min, sec, micro).map(|time| self.and_time(time))
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and nanosecond.
+    ///
+    /// The nanosecond part can exceed 1,000,000,000
+    /// in order to represent the [leap second](../time/index.html#leap-second-handling).
+    ///
+    /// Panics on invalid hour, minute, second and/or nanosecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike, Timelike, Weekday};
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    ///
+    /// let dt: NaiveDateTime = d.and_hms_nano(12, 34, 56, 789_012_345);
+    /// assert_eq!(dt.year(), 2015);
+    /// assert_eq!(dt.weekday(), Weekday::Wed);
+    /// assert_eq!(dt.second(), 56);
+    /// assert_eq!(dt.nanosecond(), 789_012_345);
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_nano(&self, hour: u32, min: u32, sec: u32, nano: u32) -> NaiveDateTime {
+        self.and_hms_nano_opt(hour, min, sec, nano).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and nanosecond.
+    ///
+    /// The nanosecond part can exceed 1,000,000,000
+    /// in order to represent the [leap second](../time/index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or nanosecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 6, 3);
+    /// assert!(d.and_hms_nano_opt(12, 34, 56,   789_012_345).is_some());
+    /// assert!(d.and_hms_nano_opt(12, 34, 59, 1_789_012_345).is_some()); // leap second
+    /// assert!(d.and_hms_nano_opt(12, 34, 59, 2_789_012_345).is_none());
+    /// assert!(d.and_hms_nano_opt(12, 34, 60,   789_012_345).is_none());
+    /// assert!(d.and_hms_nano_opt(12, 60, 56,   789_012_345).is_none());
+    /// assert!(d.and_hms_nano_opt(24, 34, 56,   789_012_345).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn and_hms_nano_opt(&self, hour: u32, min: u32, sec: u32,
+                            nano: u32) -> Option<NaiveDateTime> {
+        NaiveTime::from_hms_nano_opt(hour, min, sec, nano).map(|time| self.and_time(time))
+    }
+
+    /// Returns the packed month-day-flags.
+    #[inline]
+    fn mdf(&self) -> Mdf {
+        self.of().to_mdf()
+    }
+
+    /// Returns the packed ordinal-flags.
+    #[inline]
+    fn of(&self) -> Of {
+        Of((self.ymdf & 0b1111_11111_1111) as u32)
+    }
+
+    /// Makes a new `NaiveDate` with the packed month-day-flags changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    #[inline]
+    fn with_mdf(&self, mdf: Mdf) -> Option<NaiveDate> {
+        self.with_of(mdf.to_of())
+    }
+
+    /// Makes a new `NaiveDate` with the packed ordinal-flags changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    #[inline]
+    fn with_of(&self, of: Of) -> Option<NaiveDate> {
+        if of.valid() {
+            let Of(of) = of;
+            Some(NaiveDate { ymdf: (self.ymdf & !0b111111111_1111) | of as DateImpl })
+        } else {
+            None
+        }
+    }
+
+    /// Makes a new `NaiveDate` for the next calendar date.
+    ///
+    /// Panics when `self` is the last representable date.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015,  6,  3).succ(), NaiveDate::from_ymd(2015, 6, 4));
+    /// assert_eq!(NaiveDate::from_ymd(2015,  6, 30).succ(), NaiveDate::from_ymd(2015, 7, 1));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 12, 31).succ(), NaiveDate::from_ymd(2016, 1, 1));
+    /// ~~~~
+    #[inline]
+    pub fn succ(&self) -> NaiveDate {
+        self.succ_opt().expect("out of bound")
+    }
+
+    /// Makes a new `NaiveDate` for the next calendar date.
+    ///
+    /// Returns `None` when `self` is the last representable date.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    /// use chrono::naive::date::MAX;
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 6, 3).succ_opt(),
+    ///            Some(NaiveDate::from_ymd(2015, 6, 4)));
+    /// assert_eq!(MAX.succ_opt(), None);
+    /// ~~~~
+    #[inline]
+    pub fn succ_opt(&self) -> Option<NaiveDate> {
+        self.with_of(self.of().succ()).or_else(|| NaiveDate::from_ymd_opt(self.year() + 1, 1, 1))
+    }
+
+    /// Makes a new `NaiveDate` for the previous calendar date.
+    ///
+    /// Panics when `self` is the first representable date.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 6, 3).pred(), NaiveDate::from_ymd(2015,  6,  2));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 6, 1).pred(), NaiveDate::from_ymd(2015,  5, 31));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 1, 1).pred(), NaiveDate::from_ymd(2014, 12, 31));
+    /// ~~~~
+    #[inline]
+    pub fn pred(&self) -> NaiveDate {
+        self.pred_opt().expect("out of bound")
+    }
+
+    /// Makes a new `NaiveDate` for the previous calendar date.
+    ///
+    /// Returns `None` when `self` is the first representable date.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    /// use chrono::naive::date::MIN;
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 6, 3).pred_opt(),
+    ///            Some(NaiveDate::from_ymd(2015, 6, 2)));
+    /// assert_eq!(MIN.pred_opt(), None);
+    /// ~~~~
+    #[inline]
+    pub fn pred_opt(&self) -> Option<NaiveDate> {
+        self.with_of(self.of().pred()).or_else(|| NaiveDate::from_ymd_opt(self.year() - 1, 12, 31))
+    }
+
+    /// Adds the `days` part of given `Duration` to the current date.
+    ///
+    /// Returns `None` when it will result in overflow.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Duration};
+    /// use chrono::naive::date::MAX;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 9, 5);
+    /// assert_eq!(d.checked_add(Duration::days(40)), Some(NaiveDate::from_ymd(2015, 10, 15)));
+    /// assert_eq!(d.checked_add(Duration::days(-40)), Some(NaiveDate::from_ymd(2015, 7, 27)));
+    /// assert_eq!(d.checked_add(Duration::days(1000_000_000)), None);
+    /// assert_eq!(d.checked_add(Duration::days(-1000_000_000)), None);
+    /// assert_eq!(MAX.checked_add(Duration::days(1)), None);
+    /// ~~~~
+    pub fn checked_add(self, rhs: Duration) -> Option<NaiveDate> {
+        let year = self.year();
+        let (mut year_div_400, year_mod_400) = div_mod_floor(year, 400);
+        let cycle = internals::yo_to_cycle(year_mod_400 as u32, self.of().ordinal());
+        let cycle = try_opt!((cycle as i32).checked_add(try_opt!(rhs.num_days().to_i32())));
+        let (cycle_div_400y, cycle) = div_mod_floor(cycle, 146097);
+        year_div_400 += cycle_div_400y;
+
+        let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32);
+        let flags = YearFlags::from_year_mod_400(year_mod_400 as i32);
+        NaiveDate::from_of(year_div_400 * 400 + year_mod_400 as i32,
+                           Of::new(ordinal, flags))
+    }
+
+    /// Subtracts the `days` part of given `Duration` from the current date.
+    ///
+    /// Returns `None` when it will result in overflow.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Duration};
+    /// use chrono::naive::date::MIN;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 9, 5);
+    /// assert_eq!(d.checked_sub(Duration::days(40)), Some(NaiveDate::from_ymd(2015, 7, 27)));
+    /// assert_eq!(d.checked_sub(Duration::days(-40)), Some(NaiveDate::from_ymd(2015, 10, 15)));
+    /// assert_eq!(d.checked_sub(Duration::days(1000_000_000)), None);
+    /// assert_eq!(d.checked_sub(Duration::days(-1000_000_000)), None);
+    /// assert_eq!(MIN.checked_sub(Duration::days(1)), None);
+    /// ~~~~
+    pub fn checked_sub(self, rhs: Duration) -> Option<NaiveDate> {
+        let year = self.year();
+        let (mut year_div_400, year_mod_400) = div_mod_floor(year, 400);
+        let cycle = internals::yo_to_cycle(year_mod_400 as u32, self.of().ordinal());
+        let cycle = try_opt!((cycle as i32).checked_sub(try_opt!(rhs.num_days().to_i32())));
+        let (cycle_div_400y, cycle) = div_mod_floor(cycle, 146097);
+        year_div_400 += cycle_div_400y;
+
+        let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32);
+        let flags = YearFlags::from_year_mod_400(year_mod_400 as i32);
+        NaiveDate::from_of(year_div_400 * 400 + year_mod_400 as i32,
+                           Of::new(ordinal, flags))
+    }
+
+    /// Formats the date with the specified formatting items.
+    /// Otherwise it is same to the ordinary `format` method.
+    ///
+    /// The `Iterator` of items should be `Clone`able,
+    /// since the resulting `DelayedFormat` value may be formatted multiple times.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    /// use chrono::format::strftime::StrftimeItems;
+    ///
+    /// let fmt = StrftimeItems::new("%Y-%m-%d");
+    /// let d = NaiveDate::from_ymd(2015, 9, 5);
+    /// assert_eq!(d.format_with_items(fmt.clone()).to_string(), "2015-09-05");
+    /// assert_eq!(d.format("%Y-%m-%d").to_string(), "2015-09-05");
+    /// ~~~~
+    #[inline]
+    pub fn format_with_items<'a, I>(&self, items: I) -> DelayedFormat<I>
+            where I: Iterator<Item=Item<'a>> + Clone {
+        DelayedFormat::new(Some(self.clone()), None, items)
+    }
+
+    /// Formats the date with the specified format string.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    ///
+    /// This returns a `DelayedFormat`,
+    /// which gets converted to a string only when actual formatting happens.
+    /// You may use the `to_string` method to get a `String`,
+    /// or just feed it into `print!` and other formatting macros.
+    /// (In this way it avoids the redundant memory allocation.)
+    ///
+    /// A wrong format string does *not* issue an error immediately.
+    /// Rather, converting or formatting the `DelayedFormat` fails.
+    /// You are recommended to immediately use `DelayedFormat` for this reason.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveDate;
+    ///
+    /// let d = NaiveDate::from_ymd(2015, 9, 5);
+    /// assert_eq!(d.format("%Y-%m-%d").to_string(), "2015-09-05");
+    /// assert_eq!(d.format("%A, %-d %B, %C%y").to_string(), "Saturday, 5 September, 2015");
+    /// ~~~~
+    #[inline]
+    pub fn format<'a>(&self, fmt: &'a str) -> DelayedFormat<StrftimeItems<'a>> {
+        self.format_with_items(StrftimeItems::new(fmt))
+    }
+}
+
+impl Datelike for NaiveDate {
+    /// Returns the year number in the [calendar date](./index.html#calendar-date).
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).year(), 2015);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).year(), -308); // 309 BCE
+    /// ~~~~
+    #[inline]
+    fn year(&self) -> i32 {
+        self.ymdf >> 13
+    }
+
+    /// Returns the month number starting from 1.
+    ///
+    /// The return value ranges from 1 to 12.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).month(), 9);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).month(), 3);
+    /// ~~~~
+    #[inline]
+    fn month(&self) -> u32 {
+        self.mdf().month()
+    }
+
+    /// Returns the month number starting from 0.
+    ///
+    /// The return value ranges from 0 to 11.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).month0(), 8);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).month0(), 2);
+    /// ~~~~
+    #[inline]
+    fn month0(&self) -> u32 {
+        self.mdf().month() - 1
+    }
+
+    /// Returns the day of month starting from 1.
+    ///
+    /// The return value ranges from 1 to 31. (The last day of month differs by months.)
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).day(), 8);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).day(), 14);
+    /// ~~~~
+    ///
+    /// Combined with [`NaiveDate::pred`](./struct.NaiveDate.html#method.pred),
+    /// one can determine the number of days in a particular month.
+    /// (Note that this panics when `year` is out of range.)
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// fn ndays_in_month(year: i32, month: u32) -> u32 {
+    ///     // the first day of the next month...
+    ///     let (y, m) = if month == 12 { (year + 1, 1) } else { (year, month + 1) };
+    ///     let d = NaiveDate::from_ymd(y, m, 1);
+    ///
+    ///     // ...is preceded by the last day of the original month
+    ///     d.pred().day()
+    /// }
+    ///
+    /// assert_eq!(ndays_in_month(2015, 8), 31);
+    /// assert_eq!(ndays_in_month(2015, 9), 30);
+    /// assert_eq!(ndays_in_month(2015, 12), 31);
+    /// assert_eq!(ndays_in_month(2016, 2), 29);
+    /// assert_eq!(ndays_in_month(2017, 2), 28);
+    /// ~~~~
+    #[inline]
+    fn day(&self) -> u32 {
+        self.mdf().day()
+    }
+
+    /// Returns the day of month starting from 0.
+    ///
+    /// The return value ranges from 0 to 30. (The last day of month differs by months.)
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).day0(), 7);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).day0(), 13);
+    /// ~~~~
+    #[inline]
+    fn day0(&self) -> u32 {
+        self.mdf().day() - 1
+    }
+
+    /// Returns the day of year starting from 1.
+    ///
+    /// The return value ranges from 1 to 366. (The last day of year differs by years.)
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).ordinal(), 251);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).ordinal(), 74);
+    /// ~~~~
+    ///
+    /// Combined with [`NaiveDate::pred`](./struct.NaiveDate.html#method.pred),
+    /// one can determine the number of days in a particular year.
+    /// (Note that this panics when `year` is out of range.)
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// fn ndays_in_year(year: i32) -> u32 {
+    ///     // the first day of the next year...
+    ///     let d = NaiveDate::from_ymd(year + 1, 1, 1);
+    ///
+    ///     // ...is preceded by the last day of the original year
+    ///     d.pred().ordinal()
+    /// }
+    ///
+    /// assert_eq!(ndays_in_year(2015), 365);
+    /// assert_eq!(ndays_in_year(2016), 366);
+    /// assert_eq!(ndays_in_year(2017), 365);
+    /// assert_eq!(ndays_in_year(2000), 366);
+    /// assert_eq!(ndays_in_year(2100), 365);
+    /// ~~~~
+    #[inline]
+    fn ordinal(&self) -> u32 {
+        self.of().ordinal()
+    }
+
+    /// Returns the day of year starting from 0.
+    ///
+    /// The return value ranges from 0 to 365. (The last day of year differs by years.)
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).ordinal0(), 250);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).ordinal0(), 73);
+    /// ~~~~
+    #[inline]
+    fn ordinal0(&self) -> u32 {
+        self.of().ordinal() - 1
+    }
+
+    /// Returns the day of week.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike, Weekday};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).weekday(), Weekday::Tue);
+    /// assert_eq!(NaiveDate::from_ymd(-308, 3, 14).weekday(), Weekday::Fri);
+    /// ~~~~
+    #[inline]
+    fn weekday(&self) -> Weekday {
+        self.of().weekday()
+    }
+
+    fn isoweekdate(&self) -> (i32, u32, Weekday) {
+        let of = self.of();
+        let year = self.year();
+        let (rawweek, weekday) = of.isoweekdate_raw();
+        if rawweek < 1 { // previous year
+            let prevlastweek = YearFlags::from_year(year - 1).nisoweeks();
+            (year - 1, prevlastweek, weekday)
+        } else {
+            let lastweek = of.flags().nisoweeks();
+            if rawweek > lastweek { // next year
+                (year + 1, 1, weekday)
+            } else {
+                (year, rawweek, weekday)
+            }
+        }
+    }
+
+    /// Makes a new `NaiveDate` with the year number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_year(2016),
+    ///            Some(NaiveDate::from_ymd(2016, 9, 8)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_year(-308),
+    ///            Some(NaiveDate::from_ymd(-308, 9, 8)));
+    /// ~~~~
+    ///
+    /// A leap day (February 29) is a good example that this method can return `None`.
+    ///
+    /// ~~~~
+    /// # use chrono::{NaiveDate, Datelike};
+    /// assert!(NaiveDate::from_ymd(2016, 2, 29).with_year(2015).is_none());
+    /// assert!(NaiveDate::from_ymd(2016, 2, 29).with_year(2020).is_some());
+    /// ~~~~
+    #[inline]
+    fn with_year(&self, year: i32) -> Option<NaiveDate> {
+        // we need to operate with `mdf` since we should keep the month and day number as is
+        let mdf = self.mdf();
+
+        // adjust the flags as needed
+        let flags = YearFlags::from_year(year);
+        let mdf = mdf.with_flags(flags);
+
+        NaiveDate::from_mdf(year, mdf)
+    }
+
+    /// Makes a new `NaiveDate` with the month number (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_month(10),
+    ///            Some(NaiveDate::from_ymd(2015, 10, 8)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_month(13), None); // no month 13
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 30).with_month(2), None); // no February 30
+    /// ~~~~
+    #[inline]
+    fn with_month(&self, month: u32) -> Option<NaiveDate> {
+        self.with_mdf(self.mdf().with_month(month))
+    }
+
+    /// Makes a new `NaiveDate` with the month number (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_month0(9),
+    ///            Some(NaiveDate::from_ymd(2015, 10, 8)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_month0(12), None); // no month 13
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 30).with_month0(1), None); // no February 30
+    /// ~~~~
+    #[inline]
+    fn with_month0(&self, month0: u32) -> Option<NaiveDate> {
+        self.with_mdf(self.mdf().with_month(month0 + 1))
+    }
+
+    /// Makes a new `NaiveDate` with the day of month (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_day(30),
+    ///            Some(NaiveDate::from_ymd(2015, 9, 30)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_day(31),
+    ///            None); // no September 31
+    /// ~~~~
+    #[inline]
+    fn with_day(&self, day: u32) -> Option<NaiveDate> {
+        self.with_mdf(self.mdf().with_day(day))
+    }
+
+    /// Makes a new `NaiveDate` with the day of month (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_day0(29),
+    ///            Some(NaiveDate::from_ymd(2015, 9, 30)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 9, 8).with_day0(30),
+    ///            None); // no September 31
+    /// ~~~~
+    #[inline]
+    fn with_day0(&self, day0: u32) -> Option<NaiveDate> {
+        self.with_mdf(self.mdf().with_day(day0 + 1))
+    }
+
+    /// Makes a new `NaiveDate` with the day of year (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 1, 1).with_ordinal(60),
+    ///            Some(NaiveDate::from_ymd(2015, 3, 1)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 1, 1).with_ordinal(366),
+    ///            None); // 2015 had only 365 days
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2016, 1, 1).with_ordinal(60),
+    ///            Some(NaiveDate::from_ymd(2016, 2, 29)));
+    /// assert_eq!(NaiveDate::from_ymd(2016, 1, 1).with_ordinal(366),
+    ///            Some(NaiveDate::from_ymd(2016, 12, 31)));
+    /// ~~~~
+    #[inline]
+    fn with_ordinal(&self, ordinal: u32) -> Option<NaiveDate> {
+        self.with_of(self.of().with_ordinal(ordinal))
+    }
+
+    /// Makes a new `NaiveDate` with the day of year (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDate` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, Datelike};
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2015, 1, 1).with_ordinal0(59),
+    ///            Some(NaiveDate::from_ymd(2015, 3, 1)));
+    /// assert_eq!(NaiveDate::from_ymd(2015, 1, 1).with_ordinal0(365),
+    ///            None); // 2015 had only 365 days
+    ///
+    /// assert_eq!(NaiveDate::from_ymd(2016, 1, 1).with_ordinal0(59),
+    ///            Some(NaiveDate::from_ymd(2016, 2, 29)));
+    /// assert_eq!(NaiveDate::from_ymd(2016, 1, 1).with_ordinal0(365),
+    ///            Some(NaiveDate::from_ymd(2016, 12, 31)));
+    /// ~~~~
+    #[inline]
+    fn with_ordinal0(&self, ordinal0: u32) -> Option<NaiveDate> {
+        self.with_of(self.of().with_ordinal(ordinal0 + 1))
+    }
+}
+
+/// `NaiveDate` can be used as a key to the hash maps.
+impl hash::Hash for NaiveDate {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) {
+        // don't need to strip flags, as we can safely assume that it is correct
+        self.ymdf.hash(state);
+    }
+}
+
+/// An addition of `Duration` to `NaiveDate` discards the fractional days,
+/// rounding to the closest integral number of days towards `Duration::zero()`.
+///
+/// Panics on underflow or overflow.
+/// Use [`NaiveDate::checked_add`](#method.checked_add) to detect that.
+///
+/// # Example
+///
+/// ~~~~
+/// use chrono::{NaiveDate, Duration};
+///
+/// let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+/// assert_eq!(ymd(2014, 1, 1) + Duration::zero(),             ymd(2014, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::seconds(86399),     ymd(2014, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::seconds(-86399),    ymd(2014, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::days(1),            ymd(2014, 1, 2));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::days(-1),           ymd(2013, 12, 31));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::days(364),          ymd(2014, 12, 31));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::days(365*4 + 1),    ymd(2018, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) + Duration::days(365*400 + 97), ymd(2414, 1, 1));
+/// ~~~~
+impl Add<Duration> for NaiveDate {
+    type Output = NaiveDate;
+
+    #[inline]
+    fn add(self, rhs: Duration) -> NaiveDate {
+        self.checked_add(rhs).expect("`NaiveDate + Duration` overflowed")
+    }
+}
+
+/// A subtraction of `NaiveDate` from `NaiveDate` yields a `Duration` of integral numbers.
+///
+/// This does not overflow or underflow at all,
+/// as all possible output fits in the range of `Duration`.
+///
+/// # Example
+///
+/// ~~~~
+/// use chrono::{NaiveDate, Duration};
+///
+/// let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+/// assert_eq!(ymd(2014, 1, 1) - ymd(2014, 1, 1),   Duration::zero());
+/// assert_eq!(ymd(2014, 1, 1) - ymd(2013, 12, 31), Duration::days(1));
+/// assert_eq!(ymd(2014, 1, 1) - ymd(2014, 1, 2),   Duration::days(-1));
+/// assert_eq!(ymd(2014, 1, 1) - ymd(2013, 9, 23),  Duration::days(100));
+/// assert_eq!(ymd(2014, 1, 1) - ymd(2013, 1, 1),   Duration::days(365));
+/// assert_eq!(ymd(2014, 1, 1) - ymd(2010, 1, 1),   Duration::days(365*4 + 1));
+/// assert_eq!(ymd(2014, 1, 1) - ymd(1614, 1, 1),   Duration::days(365*400 + 97));
+/// ~~~~
+impl Sub<NaiveDate> for NaiveDate {
+    type Output = Duration;
+
+    fn sub(self, rhs: NaiveDate) -> Duration {
+        let year1 = self.year();
+        let year2 = rhs.year();
+        let (year1_div_400, year1_mod_400) = div_mod_floor(year1, 400);
+        let (year2_div_400, year2_mod_400) = div_mod_floor(year2, 400);
+        let cycle1 = internals::yo_to_cycle(year1_mod_400 as u32, self.of().ordinal()) as i64;
+        let cycle2 = internals::yo_to_cycle(year2_mod_400 as u32, rhs.of().ordinal()) as i64;
+        Duration::days((year1_div_400 as i64 - year2_div_400 as i64) * 146097 + (cycle1 - cycle2))
+    }
+}
+
+/// A subtraction of `Duration` from `NaiveDate` discards the fractional days,
+/// rounding to the closest integral number of days towards `Duration::zero()`.
+///
+/// Panics on underflow or overflow.
+/// Use [`NaiveDate::checked_sub`](#method.checked_sub) to detect that.
+///
+/// # Example
+///
+/// ~~~~
+/// use chrono::{NaiveDate, Duration};
+///
+/// let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+/// assert_eq!(ymd(2014, 1, 1) - Duration::zero(),             ymd(2014, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::seconds(86399),     ymd(2014, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::seconds(-86399),    ymd(2014, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::days(1),            ymd(2013, 12, 31));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::days(-1),           ymd(2014, 1, 2));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::days(364),          ymd(2013, 1, 2));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::days(365*4 + 1),    ymd(2010, 1, 1));
+/// assert_eq!(ymd(2014, 1, 1) - Duration::days(365*400 + 97), ymd(1614, 1, 1));
+/// ~~~~
+impl Sub<Duration> for NaiveDate {
+    type Output = NaiveDate;
+
+    #[inline]
+    fn sub(self, rhs: Duration) -> NaiveDate {
+        self.checked_sub(rhs).expect("`NaiveDate - Duration` overflowed")
+    }
+}
+
+/// The `Debug` output of the naive date `d` is same to `d.format("%Y-%m-%d")`.
+///
+/// The string printed can be readily parsed via the `parse` method on `str`.
+///
+/// # Example
+///
+/// ~~~~
+/// use chrono::NaiveDate;
+///
+/// assert_eq!(format!("{:?}", NaiveDate::from_ymd(2015,  9,  5)), "2015-09-05");
+/// assert_eq!(format!("{:?}", NaiveDate::from_ymd(   0,  1,  1)), "0000-01-01");
+/// assert_eq!(format!("{:?}", NaiveDate::from_ymd(9999, 12, 31)), "9999-12-31");
+/// ~~~~
+///
+/// ISO 8601 requires an explicit sign for years before 1 BCE or after 9999 CE.
+///
+/// ~~~~
+/// # use chrono::NaiveDate;
+/// assert_eq!(format!("{:?}", NaiveDate::from_ymd(   -1,  1,  1)),  "-0001-01-01");
+/// assert_eq!(format!("{:?}", NaiveDate::from_ymd(10000, 12, 31)), "+10000-12-31");
+/// ~~~~
+impl fmt::Debug for NaiveDate {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let year = self.year();
+        let mdf = self.mdf();
+        if 0 <= year && year <= 9999 {
+            write!(f, "{:04}-{:02}-{:02}", year, mdf.month(), mdf.day())
+        } else {
+            // ISO 8601 requires the explicit sign for out-of-range years
+            write!(f, "{:+05}-{:02}-{:02}", year, mdf.month(), mdf.day())
+        }
+    }
+}
+
+/// The `Display` output of the naive date `d` is same to `d.format("%Y-%m-%d")`.
+///
+/// The string printed can be readily parsed via the `parse` method on `str`.
+///
+/// # Example
+///
+/// ~~~~
+/// use chrono::NaiveDate;
+///
+/// assert_eq!(format!("{}", NaiveDate::from_ymd(2015,  9,  5)), "2015-09-05");
+/// assert_eq!(format!("{}", NaiveDate::from_ymd(   0,  1,  1)), "0000-01-01");
+/// assert_eq!(format!("{}", NaiveDate::from_ymd(9999, 12, 31)), "9999-12-31");
+/// ~~~~
+///
+/// ISO 8601 requires an explicit sign for years before 1 BCE or after 9999 CE.
+///
+/// ~~~~
+/// # use chrono::NaiveDate;
+/// assert_eq!(format!("{}", NaiveDate::from_ymd(   -1,  1,  1)),  "-0001-01-01");
+/// assert_eq!(format!("{}", NaiveDate::from_ymd(10000, 12, 31)), "+10000-12-31");
+/// ~~~~
+impl fmt::Display for NaiveDate {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Debug::fmt(self, f) }
+}
+
+/// Parsing a str into a `NaiveDate` uses the same format, `%Y-%m-%d`, as `Debug` and `Display`.
+///
+/// # Example
+///
+/// ~~~~
+/// use chrono::NaiveDate;
+///
+/// let d = NaiveDate::from_ymd(2015, 9, 18);
+/// assert_eq!(format!("{}", d).parse::<NaiveDate>(), Ok(d));
+///
+/// let d = NaiveDate::from_ymd(12345, 6, 7);
+/// assert_eq!(format!("{}", d).parse::<NaiveDate>(), Ok(d));
+///
+/// assert!("foo".parse::<NaiveDate>().is_err());
+/// ~~~~
+impl str::FromStr for NaiveDate {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> ParseResult<NaiveDate> {
+        const ITEMS: &'static [Item<'static>] = &[
+            Item::Space(""), Item::Numeric(Numeric::Year, Pad::Zero),
+            Item::Space(""), Item::Literal("-"),
+            Item::Space(""), Item::Numeric(Numeric::Month, Pad::Zero),
+            Item::Space(""), Item::Literal("-"),
+            Item::Space(""), Item::Numeric(Numeric::Day, Pad::Zero),
+            Item::Space(""),
+        ];
+
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, ITEMS.iter().cloned()));
+        parsed.to_naive_date()
+    }
+}
+
+#[cfg(feature = "rustc-serialize")]
+mod rustc_serialize {
+    use super::NaiveDate;
+    use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
+
+    // TODO the current serialization format is NEVER intentionally defined.
+    // this basically follows the automatically generated implementation for those traits,
+    // plus manual verification steps for avoiding security problem.
+    // in the future it is likely to be redefined to more sane and reasonable format.
+
+    impl Encodable for NaiveDate {
+        fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+            let ymdf = self.to_serialized();
+            s.emit_struct("NaiveDate", 1, |s| {
+                try!(s.emit_struct_field("ymdf", 0, |s| ymdf.encode(s)));
+                Ok(())
+            })
+        }
+    }
+
+    impl Decodable for NaiveDate {
+        fn decode<D: Decoder>(d: &mut D) -> Result<NaiveDate, D::Error> {
+            d.read_struct("NaiveDate", 1, |d| {
+                let ymdf = try!(d.read_struct_field("ymdf", 0, Decodable::decode));
+                NaiveDate::from_serialized(ymdf).ok_or_else(|| d.error("invalid date"))
+            })
+        }
+    }
+
+    #[test]
+    fn test_encodable() {
+        use rustc_serialize::json::encode;
+
+        assert_eq!(encode(&NaiveDate::from_ymd(2016, 7, 8)).ok(),
+                   Some(r#"{"ymdf":16518115}"#.into()));
+        assert_eq!(encode(&NaiveDate::from_ymd(0, 1, 1)).ok(),
+                   Some(r#"{"ymdf":20}"#.into()));
+        assert_eq!(encode(&NaiveDate::from_ymd(-1, 12, 31)).ok(),
+                   Some(r#"{"ymdf":-2341}"#.into()));
+        assert_eq!(encode(&super::MIN).ok(),
+                   Some(r#"{"ymdf":-2147483625}"#.into()));
+        assert_eq!(encode(&super::MAX).ok(),
+                   Some(r#"{"ymdf":2147481311}"#.into()));
+    }
+
+    #[test]
+    fn test_decodable() {
+        use rustc_serialize::json;
+        use std::{i32, i64};
+
+        let decode = |s: &str| json::decode::<NaiveDate>(s);
+
+        assert_eq!(decode(r#"{"ymdf":16518115}"#).ok(), Some(NaiveDate::from_ymd(2016, 7, 8)));
+        assert_eq!(decode(r#"{"ymdf":20}"#).ok(), Some(NaiveDate::from_ymd(0, 1, 1)));
+        assert_eq!(decode(r#"{"ymdf":-2341}"#).ok(), Some(NaiveDate::from_ymd(-1, 12, 31)));
+        assert_eq!(decode(r#"{"ymdf":-2147483625}"#).ok(), Some(super::MIN));
+        assert_eq!(decode(r#"{"ymdf":2147481311}"#).ok(), Some(super::MAX));
+
+        // some extreme values and zero are always invalid
+        assert!(decode(r#"{"ymdf":0}"#).is_err());
+        assert!(decode(r#"{"ymdf":1}"#).is_err());
+        assert!(decode(r#"{"ymdf":-1}"#).is_err());
+        assert!(decode(&format!(r#"{{"ymdf":{}}}"#, i32::MIN)).is_err());
+        assert!(decode(&format!(r#"{{"ymdf":{}}}"#, i32::MAX)).is_err());
+        assert!(decode(&format!(r#"{{"ymdf":{}}}"#, i64::MIN)).is_err());
+        assert!(decode(&format!(r#"{{"ymdf":{}}}"#, i64::MAX)).is_err());
+
+        // bad formats
+        assert!(decode(r#"{"ymdf":20.01}"#).is_err());
+        assert!(decode(r#"{"ymdf":"string"}"#).is_err());
+        assert!(decode(r#"{"ymdf":null}"#).is_err());
+        assert!(decode(r#"{}"#).is_err());
+        assert!(decode(r#"{"date":20}"#).is_err());
+        assert!(decode(r#"20"#).is_err());
+        assert!(decode(r#""string""#).is_err());
+        assert!(decode(r#""2016-07-08""#).is_err()); // :(
+        assert!(decode(r#"null"#).is_err());
+    }
+}
+
+#[cfg(feature = "serde")]
+mod serde {
+    use super::NaiveDate;
+    use serde::{ser, de};
+
+    // TODO not very optimized for space (binary formats would want something better)
+
+    impl ser::Serialize for NaiveDate {
+        fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
+            where S: ser::Serializer
+        {
+            serializer.serialize_str(&format!("{:?}", self))
+        }
+    }
+
+    struct NaiveDateVisitor;
+
+    impl de::Visitor for NaiveDateVisitor {
+        type Value = NaiveDate;
+
+        fn visit_str<E>(&mut self, value: &str) -> Result<NaiveDate, E>
+            where E: de::Error
+        {
+            value.parse().map_err(|err| E::custom(format!("{}", err)))
+        }
+    }
+
+    impl de::Deserialize for NaiveDate {
+        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+            where D: de::Deserializer
+        {
+            deserializer.deserialize(NaiveDateVisitor)
+        }
+    }
+
+    #[cfg(test)] extern crate serde_json;
+
+    #[test]
+    fn test_serde_serialize() {
+        use self::serde_json::to_string;
+
+        assert_eq!(to_string(&NaiveDate::from_ymd(2014, 7, 24)).ok(),
+                   Some(r#""2014-07-24""#.into()));
+        assert_eq!(to_string(&NaiveDate::from_ymd(0, 1, 1)).ok(),
+                   Some(r#""0000-01-01""#.into()));
+        assert_eq!(to_string(&NaiveDate::from_ymd(-1, 12, 31)).ok(),
+                   Some(r#""-0001-12-31""#.into()));
+        assert_eq!(to_string(&super::MIN).ok(),
+                   Some(r#""-262144-01-01""#.into()));
+        assert_eq!(to_string(&super::MAX).ok(),
+                   Some(r#""+262143-12-31""#.into()));
+    }
+
+    #[test]
+    fn test_serde_deserialize() {
+        use self::serde_json;
+        use std::{i32, i64};
+
+        let from_str = |s: &str| serde_json::from_str::<NaiveDate>(s);
+
+        assert_eq!(from_str(r#""2016-07-08""#).ok(), Some(NaiveDate::from_ymd(2016, 7, 8)));
+        assert_eq!(from_str(r#""2016-7-8""#).ok(), Some(NaiveDate::from_ymd(2016, 7, 8)));
+        assert_eq!(from_str(r#""+002016-07-08""#).ok(), Some(NaiveDate::from_ymd(2016, 7, 8)));
+        assert_eq!(from_str(r#""0000-01-01""#).ok(), Some(NaiveDate::from_ymd(0, 1, 1)));
+        assert_eq!(from_str(r#""0-1-1""#).ok(), Some(NaiveDate::from_ymd(0, 1, 1)));
+        assert_eq!(from_str(r#""-0001-12-31""#).ok(), Some(NaiveDate::from_ymd(-1, 12, 31)));
+        assert_eq!(from_str(r#""-262144-01-01""#).ok(), Some(super::MIN));
+        assert_eq!(from_str(r#""+262143-12-31""#).ok(), Some(super::MAX));
+
+        // bad formats
+        assert!(from_str(r#""""#).is_err());
+        assert!(from_str(r#""20001231""#).is_err());
+        assert!(from_str(r#""2000-00-00""#).is_err());
+        assert!(from_str(r#""2000-02-30""#).is_err());
+        assert!(from_str(r#""2001-02-29""#).is_err());
+        assert!(from_str(r#""2002-002-28""#).is_err());
+        assert!(from_str(r#""yyyy-mm-dd""#).is_err());
+        assert!(from_str(r#"0"#).is_err());
+        assert!(from_str(r#"20.01"#).is_err());
+        assert!(from_str(&i32::MIN.to_string()).is_err());
+        assert!(from_str(&i32::MAX.to_string()).is_err());
+        assert!(from_str(&i64::MIN.to_string()).is_err());
+        assert!(from_str(&i64::MAX.to_string()).is_err());
+        assert!(from_str(r#"{}"#).is_err());
+        assert!(from_str(r#"{"ymdf":20}"#).is_err()); // :(
+        assert!(from_str(r#"null"#).is_err());
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::NaiveDate;
+    use super::{MIN, MIN_YEAR, MIN_DAYS_FROM_YEAR_0};
+    use super::{MAX, MAX_YEAR, MAX_DAYS_FROM_YEAR_0};
+    use {Datelike, Weekday};
+    use duration::Duration;
+    use std::{i32, u32};
+
+    #[test]
+    fn test_date_from_ymd() {
+        let ymd_opt = |y,m,d| NaiveDate::from_ymd_opt(y, m, d);
+
+        assert!(ymd_opt(2012, 0, 1).is_none());
+        assert!(ymd_opt(2012, 1, 1).is_some());
+        assert!(ymd_opt(2012, 2, 29).is_some());
+        assert!(ymd_opt(2014, 2, 29).is_none());
+        assert!(ymd_opt(2014, 3, 0).is_none());
+        assert!(ymd_opt(2014, 3, 1).is_some());
+        assert!(ymd_opt(2014, 3, 31).is_some());
+        assert!(ymd_opt(2014, 3, 32).is_none());
+        assert!(ymd_opt(2014, 12, 31).is_some());
+        assert!(ymd_opt(2014, 13, 1).is_none());
+    }
+
+    #[test]
+    fn test_date_from_yo() {
+        let yo_opt = |y,o| NaiveDate::from_yo_opt(y, o);
+        let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+
+        assert_eq!(yo_opt(2012, 0), None);
+        assert_eq!(yo_opt(2012, 1), Some(ymd(2012, 1, 1)));
+        assert_eq!(yo_opt(2012, 2), Some(ymd(2012, 1, 2)));
+        assert_eq!(yo_opt(2012, 32), Some(ymd(2012, 2, 1)));
+        assert_eq!(yo_opt(2012, 60), Some(ymd(2012, 2, 29)));
+        assert_eq!(yo_opt(2012, 61), Some(ymd(2012, 3, 1)));
+        assert_eq!(yo_opt(2012, 100), Some(ymd(2012, 4, 9)));
+        assert_eq!(yo_opt(2012, 200), Some(ymd(2012, 7, 18)));
+        assert_eq!(yo_opt(2012, 300), Some(ymd(2012, 10, 26)));
+        assert_eq!(yo_opt(2012, 366), Some(ymd(2012, 12, 31)));
+        assert_eq!(yo_opt(2012, 367), None);
+
+        assert_eq!(yo_opt(2014, 0), None);
+        assert_eq!(yo_opt(2014, 1), Some(ymd(2014, 1, 1)));
+        assert_eq!(yo_opt(2014, 2), Some(ymd(2014, 1, 2)));
+        assert_eq!(yo_opt(2014, 32), Some(ymd(2014, 2, 1)));
+        assert_eq!(yo_opt(2014, 59), Some(ymd(2014, 2, 28)));
+        assert_eq!(yo_opt(2014, 60), Some(ymd(2014, 3, 1)));
+        assert_eq!(yo_opt(2014, 100), Some(ymd(2014, 4, 10)));
+        assert_eq!(yo_opt(2014, 200), Some(ymd(2014, 7, 19)));
+        assert_eq!(yo_opt(2014, 300), Some(ymd(2014, 10, 27)));
+        assert_eq!(yo_opt(2014, 365), Some(ymd(2014, 12, 31)));
+        assert_eq!(yo_opt(2014, 366), None);
+    }
+
+    #[test]
+    fn test_date_from_isoywd() {
+        let isoywd_opt = |y,w,d| NaiveDate::from_isoywd_opt(y, w, d);
+        let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+
+        assert_eq!(isoywd_opt(2004, 0, Weekday::Sun), None);
+        assert_eq!(isoywd_opt(2004, 1, Weekday::Mon), Some(ymd(2003, 12, 29)));
+        assert_eq!(isoywd_opt(2004, 1, Weekday::Sun), Some(ymd(2004, 1, 4)));
+        assert_eq!(isoywd_opt(2004, 2, Weekday::Mon), Some(ymd(2004, 1, 5)));
+        assert_eq!(isoywd_opt(2004, 2, Weekday::Sun), Some(ymd(2004, 1, 11)));
+        assert_eq!(isoywd_opt(2004, 52, Weekday::Mon), Some(ymd(2004, 12, 20)));
+        assert_eq!(isoywd_opt(2004, 52, Weekday::Sun), Some(ymd(2004, 12, 26)));
+        assert_eq!(isoywd_opt(2004, 53, Weekday::Mon), Some(ymd(2004, 12, 27)));
+        assert_eq!(isoywd_opt(2004, 53, Weekday::Sun), Some(ymd(2005, 1, 2)));
+        assert_eq!(isoywd_opt(2004, 54, Weekday::Mon), None);
+
+        assert_eq!(isoywd_opt(2011, 0, Weekday::Sun), None);
+        assert_eq!(isoywd_opt(2011, 1, Weekday::Mon), Some(ymd(2011, 1, 3)));
+        assert_eq!(isoywd_opt(2011, 1, Weekday::Sun), Some(ymd(2011, 1, 9)));
+        assert_eq!(isoywd_opt(2011, 2, Weekday::Mon), Some(ymd(2011, 1, 10)));
+        assert_eq!(isoywd_opt(2011, 2, Weekday::Sun), Some(ymd(2011, 1, 16)));
+
+        assert_eq!(isoywd_opt(2018, 51, Weekday::Mon), Some(ymd(2018, 12, 17)));
+        assert_eq!(isoywd_opt(2018, 51, Weekday::Sun), Some(ymd(2018, 12, 23)));
+        assert_eq!(isoywd_opt(2018, 52, Weekday::Mon), Some(ymd(2018, 12, 24)));
+        assert_eq!(isoywd_opt(2018, 52, Weekday::Sun), Some(ymd(2018, 12, 30)));
+        assert_eq!(isoywd_opt(2018, 53, Weekday::Mon), None);
+    }
+
+    #[test]
+    fn test_date_from_isoymd_and_isoweekdate() {
+        for year in 2000..2401 {
+            for week in 1..54 {
+                for &weekday in [Weekday::Mon, Weekday::Tue, Weekday::Wed, Weekday::Thu,
+                                 Weekday::Fri, Weekday::Sat, Weekday::Sun].iter() {
+                    let d = NaiveDate::from_isoywd_opt(year, week, weekday);
+                    if d.is_some() {
+                        let d = d.unwrap();
+                        assert_eq!(d.weekday(), weekday);
+                        let (year_, week_, weekday_) = d.isoweekdate();
+                        assert_eq!(year_, year);
+                        assert_eq!(week_, week);
+                        assert_eq!(weekday_, weekday);
+                    }
+                }
+            }
+        }
+
+        for year in 2000..2401 {
+            for month in 1..13 {
+                for day in 1..32 {
+                    let d = NaiveDate::from_ymd_opt(year, month, day);
+                    if d.is_some() {
+                        let d = d.unwrap();
+                        let (year_, week_, weekday_) = d.isoweekdate();
+                        let d_ = NaiveDate::from_isoywd(year_, week_, weekday_);
+                        assert_eq!(d, d_);
+                    }
+                }
+            }
+        }
+    }
+
+    #[test]
+    fn test_date_from_num_days_from_ce() {
+        let from_ndays_from_ce = |days| NaiveDate::from_num_days_from_ce_opt(days);
+        assert_eq!(from_ndays_from_ce(1), Some(NaiveDate::from_ymd(1, 1, 1)));
+        assert_eq!(from_ndays_from_ce(2), Some(NaiveDate::from_ymd(1, 1, 2)));
+        assert_eq!(from_ndays_from_ce(31), Some(NaiveDate::from_ymd(1, 1, 31)));
+        assert_eq!(from_ndays_from_ce(32), Some(NaiveDate::from_ymd(1, 2, 1)));
+        assert_eq!(from_ndays_from_ce(59), Some(NaiveDate::from_ymd(1, 2, 28)));
+        assert_eq!(from_ndays_from_ce(60), Some(NaiveDate::from_ymd(1, 3, 1)));
+        assert_eq!(from_ndays_from_ce(365), Some(NaiveDate::from_ymd(1, 12, 31)));
+        assert_eq!(from_ndays_from_ce(365*1 + 1), Some(NaiveDate::from_ymd(2, 1, 1)));
+        assert_eq!(from_ndays_from_ce(365*2 + 1), Some(NaiveDate::from_ymd(3, 1, 1)));
+        assert_eq!(from_ndays_from_ce(365*3 + 1), Some(NaiveDate::from_ymd(4, 1, 1)));
+        assert_eq!(from_ndays_from_ce(365*4 + 2), Some(NaiveDate::from_ymd(5, 1, 1)));
+        assert_eq!(from_ndays_from_ce(146097 + 1), Some(NaiveDate::from_ymd(401, 1, 1)));
+        assert_eq!(from_ndays_from_ce(146097*5 + 1), Some(NaiveDate::from_ymd(2001, 1, 1)));
+        assert_eq!(from_ndays_from_ce(719163), Some(NaiveDate::from_ymd(1970, 1, 1)));
+        assert_eq!(from_ndays_from_ce(0), Some(NaiveDate::from_ymd(0, 12, 31))); // 1 BCE
+        assert_eq!(from_ndays_from_ce(-365), Some(NaiveDate::from_ymd(0, 1, 1)));
+        assert_eq!(from_ndays_from_ce(-366), Some(NaiveDate::from_ymd(-1, 12, 31))); // 2 BCE
+
+        for days in (-9999..10001).map(|x| x * 100) {
+            assert_eq!(from_ndays_from_ce(days).map(|d| d.num_days_from_ce()), Some(days));
+        }
+
+        assert_eq!(from_ndays_from_ce(MIN.num_days_from_ce()), Some(MIN));
+        assert_eq!(from_ndays_from_ce(MIN.num_days_from_ce() - 1), None);
+        assert_eq!(from_ndays_from_ce(MAX.num_days_from_ce()), Some(MAX));
+        assert_eq!(from_ndays_from_ce(MAX.num_days_from_ce() + 1), None);
+    }
+
+    #[test]
+    fn test_date_fields() {
+        fn check(year: i32, month: u32, day: u32, ordinal: u32) {
+            let d1 = NaiveDate::from_ymd(year, month, day);
+            assert_eq!(d1.year(), year);
+            assert_eq!(d1.month(), month);
+            assert_eq!(d1.day(), day);
+            assert_eq!(d1.ordinal(), ordinal);
+
+            let d2 = NaiveDate::from_yo(year, ordinal);
+            assert_eq!(d2.year(), year);
+            assert_eq!(d2.month(), month);
+            assert_eq!(d2.day(), day);
+            assert_eq!(d2.ordinal(), ordinal);
+
+            assert_eq!(d1, d2);
+        }
+
+        check(2012, 1, 1, 1);
+        check(2012, 1, 2, 2);
+        check(2012, 2, 1, 32);
+        check(2012, 2, 29, 60);
+        check(2012, 3, 1, 61);
+        check(2012, 4, 9, 100);
+        check(2012, 7, 18, 200);
+        check(2012, 10, 26, 300);
+        check(2012, 12, 31, 366);
+
+        check(2014, 1, 1, 1);
+        check(2014, 1, 2, 2);
+        check(2014, 2, 1, 32);
+        check(2014, 2, 28, 59);
+        check(2014, 3, 1, 60);
+        check(2014, 4, 10, 100);
+        check(2014, 7, 19, 200);
+        check(2014, 10, 27, 300);
+        check(2014, 12, 31, 365);
+    }
+
+    #[test]
+    fn test_date_weekday() {
+        assert_eq!(NaiveDate::from_ymd(1582, 10, 15).weekday(), Weekday::Fri);
+        // May 20, 1875 = ISO 8601 reference date
+        assert_eq!(NaiveDate::from_ymd(1875, 5, 20).weekday(), Weekday::Thu);
+        assert_eq!(NaiveDate::from_ymd(2000, 1, 1).weekday(), Weekday::Sat);
+    }
+
+    #[test]
+    fn test_date_with_fields() {
+        let d = NaiveDate::from_ymd(2000, 2, 29);
+        assert_eq!(d.with_year(-400), Some(NaiveDate::from_ymd(-400, 2, 29)));
+        assert_eq!(d.with_year(-100), None);
+        assert_eq!(d.with_year(1600), Some(NaiveDate::from_ymd(1600, 2, 29)));
+        assert_eq!(d.with_year(1900), None);
+        assert_eq!(d.with_year(2000), Some(NaiveDate::from_ymd(2000, 2, 29)));
+        assert_eq!(d.with_year(2001), None);
+        assert_eq!(d.with_year(2004), Some(NaiveDate::from_ymd(2004, 2, 29)));
+        assert_eq!(d.with_year(i32::MAX), None);
+
+        let d = NaiveDate::from_ymd(2000, 4, 30);
+        assert_eq!(d.with_month(0), None);
+        assert_eq!(d.with_month(1), Some(NaiveDate::from_ymd(2000, 1, 30)));
+        assert_eq!(d.with_month(2), None);
+        assert_eq!(d.with_month(3), Some(NaiveDate::from_ymd(2000, 3, 30)));
+        assert_eq!(d.with_month(4), Some(NaiveDate::from_ymd(2000, 4, 30)));
+        assert_eq!(d.with_month(12), Some(NaiveDate::from_ymd(2000, 12, 30)));
+        assert_eq!(d.with_month(13), None);
+        assert_eq!(d.with_month(u32::MAX), None);
+
+        let d = NaiveDate::from_ymd(2000, 2, 8);
+        assert_eq!(d.with_day(0), None);
+        assert_eq!(d.with_day(1), Some(NaiveDate::from_ymd(2000, 2, 1)));
+        assert_eq!(d.with_day(29), Some(NaiveDate::from_ymd(2000, 2, 29)));
+        assert_eq!(d.with_day(30), None);
+        assert_eq!(d.with_day(u32::MAX), None);
+
+        let d = NaiveDate::from_ymd(2000, 5, 5);
+        assert_eq!(d.with_ordinal(0), None);
+        assert_eq!(d.with_ordinal(1), Some(NaiveDate::from_ymd(2000, 1, 1)));
+        assert_eq!(d.with_ordinal(60), Some(NaiveDate::from_ymd(2000, 2, 29)));
+        assert_eq!(d.with_ordinal(61), Some(NaiveDate::from_ymd(2000, 3, 1)));
+        assert_eq!(d.with_ordinal(366), Some(NaiveDate::from_ymd(2000, 12, 31)));
+        assert_eq!(d.with_ordinal(367), None);
+        assert_eq!(d.with_ordinal(u32::MAX), None);
+    }
+
+    #[test]
+    fn test_date_num_days_from_ce() {
+        assert_eq!(NaiveDate::from_ymd(1, 1, 1).num_days_from_ce(), 1);
+
+        for year in -9999..10001 {
+            assert_eq!(NaiveDate::from_ymd(year, 1, 1).num_days_from_ce(),
+                       NaiveDate::from_ymd(year - 1, 12, 31).num_days_from_ce() + 1);
+        }
+    }
+
+    #[test]
+    fn test_date_succ() {
+        let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+        assert_eq!(ymd(2014, 5, 6).succ_opt(), Some(ymd(2014, 5, 7)));
+        assert_eq!(ymd(2014, 5, 31).succ_opt(), Some(ymd(2014, 6, 1)));
+        assert_eq!(ymd(2014, 12, 31).succ_opt(), Some(ymd(2015, 1, 1)));
+        assert_eq!(ymd(2016, 2, 28).succ_opt(), Some(ymd(2016, 2, 29)));
+        assert_eq!(ymd(MAX.year(), 12, 31).succ_opt(), None);
+    }
+
+    #[test]
+    fn test_date_pred() {
+        let ymd = |y,m,d| NaiveDate::from_ymd(y, m, d);
+        assert_eq!(ymd(2016, 3, 1).pred_opt(), Some(ymd(2016, 2, 29)));
+        assert_eq!(ymd(2015, 1, 1).pred_opt(), Some(ymd(2014, 12, 31)));
+        assert_eq!(ymd(2014, 6, 1).pred_opt(), Some(ymd(2014, 5, 31)));
+        assert_eq!(ymd(2014, 5, 7).pred_opt(), Some(ymd(2014, 5, 6)));
+        assert_eq!(ymd(MIN.year(), 1, 1).pred_opt(), None);
+    }
+
+    #[test]
+    fn test_date_add() {
+        fn check((y1,m1,d1): (i32, u32, u32), rhs: Duration, ymd: Option<(i32, u32, u32)>) {
+            let lhs = NaiveDate::from_ymd(y1, m1, d1);
+            let sum = ymd.map(|(y,m,d)| NaiveDate::from_ymd(y, m, d));
+            assert_eq!(lhs.checked_add(rhs), sum);
+            assert_eq!(lhs.checked_sub(-rhs), sum);
+        }
+
+        check((2014, 1, 1), Duration::zero(), Some((2014, 1, 1)));
+        check((2014, 1, 1), Duration::seconds(86399), Some((2014, 1, 1)));
+        // always round towards zero
+        check((2014, 1, 1), Duration::seconds(-86399), Some((2014, 1, 1)));
+        check((2014, 1, 1), Duration::days(1), Some((2014, 1, 2)));
+        check((2014, 1, 1), Duration::days(-1), Some((2013, 12, 31)));
+        check((2014, 1, 1), Duration::days(364), Some((2014, 12, 31)));
+        check((2014, 1, 1), Duration::days(365*4 + 1), Some((2018, 1, 1)));
+        check((2014, 1, 1), Duration::days(365*400 + 97), Some((2414, 1, 1)));
+
+        check((-7, 1, 1), Duration::days(365*12 + 3), Some((5, 1, 1)));
+
+        // overflow check
+        check((0, 1, 1), Duration::days(MAX_DAYS_FROM_YEAR_0 as i64), Some((MAX_YEAR, 12, 31)));
+        check((0, 1, 1), Duration::days(MAX_DAYS_FROM_YEAR_0 as i64 + 1), None);
+        check((0, 1, 1), Duration::max_value(), None);
+        check((0, 1, 1), Duration::days(MIN_DAYS_FROM_YEAR_0 as i64), Some((MIN_YEAR, 1, 1)));
+        check((0, 1, 1), Duration::days(MIN_DAYS_FROM_YEAR_0 as i64 - 1), None);
+        check((0, 1, 1), Duration::min_value(), None);
+    }
+
+    #[test]
+    fn test_date_sub() {
+        fn check((y1,m1,d1): (i32, u32, u32), (y2,m2,d2): (i32, u32, u32), diff: Duration) {
+            let lhs = NaiveDate::from_ymd(y1, m1, d1);
+            let rhs = NaiveDate::from_ymd(y2, m2, d2);
+            assert_eq!(lhs - rhs, diff);
+            assert_eq!(rhs - lhs, -diff);
+        }
+
+        check((2014, 1, 1), (2014, 1, 1), Duration::zero());
+        check((2014, 1, 2), (2014, 1, 1), Duration::days(1));
+        check((2014, 12, 31), (2014, 1, 1), Duration::days(364));
+        check((2015, 1, 3), (2014, 1, 1), Duration::days(365 + 2));
+        check((2018, 1, 1), (2014, 1, 1), Duration::days(365*4 + 1));
+        check((2414, 1, 1), (2014, 1, 1), Duration::days(365*400 + 97));
+
+        check((MAX_YEAR, 12, 31), (0, 1, 1), Duration::days(MAX_DAYS_FROM_YEAR_0 as i64));
+        check((MIN_YEAR, 1, 1), (0, 1, 1), Duration::days(MIN_DAYS_FROM_YEAR_0 as i64));
+    }
+
+    #[test]
+    fn test_date_fmt() {
+        assert_eq!(format!("{:?}", NaiveDate::from_ymd(2012,  3, 4)),   "2012-03-04");
+        assert_eq!(format!("{:?}", NaiveDate::from_ymd(0,     3, 4)),   "0000-03-04");
+        assert_eq!(format!("{:?}", NaiveDate::from_ymd(-307,  3, 4)),  "-0307-03-04");
+        assert_eq!(format!("{:?}", NaiveDate::from_ymd(12345, 3, 4)), "+12345-03-04");
+
+        assert_eq!(NaiveDate::from_ymd(2012,  3, 4).to_string(),   "2012-03-04");
+        assert_eq!(NaiveDate::from_ymd(0,     3, 4).to_string(),   "0000-03-04");
+        assert_eq!(NaiveDate::from_ymd(-307,  3, 4).to_string(),  "-0307-03-04");
+        assert_eq!(NaiveDate::from_ymd(12345, 3, 4).to_string(), "+12345-03-04");
+
+        // the format specifier should have no effect on `NaiveTime`
+        assert_eq!(format!("{:+30?}", NaiveDate::from_ymd(1234, 5, 6)), "1234-05-06");
+        assert_eq!(format!("{:30?}", NaiveDate::from_ymd(12345, 6, 7)), "+12345-06-07");
+    }
+
+    #[test]
+    fn test_date_from_str() {
+        // valid cases
+        let valid = [
+            "-0000000123456-1-2",
+            "    -123456 - 1 - 2    ",
+            "-12345-1-2",
+            "-1234-12-31",
+            "-7-6-5",
+            "350-2-28",
+            "360-02-29",
+            "0360-02-29",
+            "2015-2 -18",
+            "+70-2-18",
+            "+70000-2-18",
+            "+00007-2-18",
+        ];
+        for &s in &valid {
+            let d = match s.parse::<NaiveDate>() {
+                Ok(d) => d,
+                Err(e) => panic!("parsing `{}` has failed: {}", s, e)
+            };
+            let s_ = format!("{:?}", d);
+            // `s` and `s_` may differ, but `s.parse()` and `s_.parse()` must be same
+            let d_ = match s_.parse::<NaiveDate>() {
+                Ok(d) => d,
+                Err(e) => panic!("`{}` is parsed into `{:?}`, but reparsing that has failed: {}",
+                                 s, d, e)
+            };
+            assert!(d == d_, "`{}` is parsed into `{:?}`, but reparsed result \
+                              `{:?}` does not match", s, d, d_);
+        }
+
+        // some invalid cases
+        // since `ParseErrorKind` is private, all we can do is to check if there was an error
+        assert!("".parse::<NaiveDate>().is_err());
+        assert!("x".parse::<NaiveDate>().is_err());
+        assert!("2014".parse::<NaiveDate>().is_err());
+        assert!("2014-01".parse::<NaiveDate>().is_err());
+        assert!("2014-01-00".parse::<NaiveDate>().is_err());
+        assert!("2014-13-57".parse::<NaiveDate>().is_err());
+        assert!("9999999-9-9".parse::<NaiveDate>().is_err()); // out-of-bounds
+    }
+
+    #[test]
+    fn test_date_parse_from_str() {
+        let ymd = |y,m,d| NaiveDate::from_ymd(y,m,d);
+        assert_eq!(NaiveDate::parse_from_str("2014-5-7T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
+                   Ok(ymd(2014, 5, 7))); // ignore time and offset
+        assert_eq!(NaiveDate::parse_from_str("2015-W06-1=2015-033", "%G-W%V-%u = %Y-%j"),
+                   Ok(ymd(2015, 2, 2)));
+        assert_eq!(NaiveDate::parse_from_str("Fri, 09 Aug 13", "%a, %d %b %y"),
+                   Ok(ymd(2013, 8, 9)));
+        assert!(NaiveDate::parse_from_str("Sat, 09 Aug 2013", "%a, %d %b %Y").is_err());
+        assert!(NaiveDate::parse_from_str("2014-57", "%Y-%m-%d").is_err());
+        assert!(NaiveDate::parse_from_str("2014", "%Y").is_err()); // insufficient
+    }
+
+    #[test]
+    fn test_date_format() {
+        let d = NaiveDate::from_ymd(2012, 3, 4);
+        assert_eq!(d.format("%Y,%C,%y,%G,%g").to_string(), "2012,20,12,2012,12");
+        assert_eq!(d.format("%m,%b,%h,%B").to_string(), "03,Mar,Mar,March");
+        assert_eq!(d.format("%d,%e").to_string(), "04, 4");
+        assert_eq!(d.format("%U,%W,%V").to_string(), "10,09,09");
+        assert_eq!(d.format("%a,%A,%w,%u").to_string(), "Sun,Sunday,0,7");
+        assert_eq!(d.format("%j").to_string(), "064"); // since 2012 is a leap year
+        assert_eq!(d.format("%D,%x").to_string(), "03/04/12,03/04/12");
+        assert_eq!(d.format("%F").to_string(), "2012-03-04");
+        assert_eq!(d.format("%v").to_string(), " 4-Mar-2012");
+        assert_eq!(d.format("%t%n%%%n%t").to_string(), "\t\n%\n\t");
+
+        // non-four-digit years
+        assert_eq!(NaiveDate::from_ymd(12345,  1, 1).format("%Y").to_string(), "+12345");
+        assert_eq!(NaiveDate::from_ymd(1234,   1, 1).format("%Y").to_string(), "1234");
+        assert_eq!(NaiveDate::from_ymd(123,    1, 1).format("%Y").to_string(), "0123");
+        assert_eq!(NaiveDate::from_ymd(12,     1, 1).format("%Y").to_string(), "0012");
+        assert_eq!(NaiveDate::from_ymd(1,      1, 1).format("%Y").to_string(), "0001");
+        assert_eq!(NaiveDate::from_ymd(0,      1, 1).format("%Y").to_string(), "0000");
+        assert_eq!(NaiveDate::from_ymd(-1,     1, 1).format("%Y").to_string(), "-0001");
+        assert_eq!(NaiveDate::from_ymd(-12,    1, 1).format("%Y").to_string(), "-0012");
+        assert_eq!(NaiveDate::from_ymd(-123,   1, 1).format("%Y").to_string(), "-0123");
+        assert_eq!(NaiveDate::from_ymd(-1234,  1, 1).format("%Y").to_string(), "-1234");
+        assert_eq!(NaiveDate::from_ymd(-12345, 1, 1).format("%Y").to_string(), "-12345");
+
+        // corner cases
+        assert_eq!(NaiveDate::from_ymd(2007, 12, 31).format("%G,%g,%U,%W,%V").to_string(),
+                   "2008,08,53,53,01");
+        assert_eq!(NaiveDate::from_ymd(2010, 1, 3).format("%G,%g,%U,%W,%V").to_string(),
+                   "2009,09,01,00,53");
+    }
+}
+
+/// The internal implementation of the calendar and ordinal date.
+///
+/// The current implementation is optimized for determining year, month, day and day of week.
+/// 4-bit `YearFlags` map to one of 14 possible classes of year in the Gregorian calendar,
+/// which are included in every packed `NaiveDate` instance.
+/// The conversion between the packed calendar date (`Mdf`) and the ordinal date (`Of`) is
+/// based on the moderately-sized lookup table (~1.5KB)
+/// and the packed representation is chosen for the efficient lookup.
+/// Every internal data structure does not validate its input,
+/// but the conversion keeps the valid value valid and the invalid value invalid
+/// so that the user-facing `NaiveDate` can validate the input as late as possible.
+#[allow(dead_code)] // some internal methods have been left for consistency
+mod internals {
+    use std::{i32, fmt};
+    use num::traits::FromPrimitive;
+    use Weekday;
+    use div::{div_rem, mod_floor};
+
+    /// The internal date representation. This also includes the packed `Mdf` value.
+    pub type DateImpl = i32;
+
+    pub const MAX_YEAR: DateImpl = i32::MAX >> 13;
+    pub const MIN_YEAR: DateImpl = i32::MIN >> 13;
+
+    /// The year flags (aka the dominical letter).
+    ///
+    /// There are 14 possible classes of year in the Gregorian calendar:
+    /// common and leap years starting with Monday through Sunday.
+    /// The `YearFlags` stores this information into 4 bits `abbb`,
+    /// where `a` is `1` for the common year (simplifies the `Of` validation)
+    /// and `bbb` is a non-zero `Weekday` (mapping `Mon` to 7) of the last day in the past year
+    /// (simplifies the day of week calculation from the 1-based ordinal).
+    #[derive(PartialEq, Eq, Copy, Clone)]
+    pub struct YearFlags(pub u8);
+
+    pub const A: YearFlags = YearFlags(0o15); pub const AG: YearFlags = YearFlags(0o05);
+    pub const B: YearFlags = YearFlags(0o14); pub const BA: YearFlags = YearFlags(0o04);
+    pub const C: YearFlags = YearFlags(0o13); pub const CB: YearFlags = YearFlags(0o03);
+    pub const D: YearFlags = YearFlags(0o12); pub const DC: YearFlags = YearFlags(0o02);
+    pub const E: YearFlags = YearFlags(0o11); pub const ED: YearFlags = YearFlags(0o01);
+    pub const F: YearFlags = YearFlags(0o17); pub const FE: YearFlags = YearFlags(0o07);
+    pub const G: YearFlags = YearFlags(0o16); pub const GF: YearFlags = YearFlags(0o06);
+
+    static YEAR_TO_FLAGS: [YearFlags; 400] = [
+        BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F,
+        ED, C, B, A, GF, E, D, C, BA, G, F, E, DC, B, A, G, FE, D, C, B,
+        AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C, BA, G, F, E,
+        DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A,
+        GF, E, D, C, BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D, // 100
+        C,  B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A,
+        GF, E, D, C, BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D,
+        CB, A, G, F, ED, C, B, A, GF, E, D, C, BA, G, F, E, DC, B, A, G,
+        FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C,
+        BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, // 200
+        E,  D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C,
+        BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F,
+        ED, C, B, A, GF, E, D, C, BA, G, F, E, DC, B, A, G, FE, D, C, B,
+        AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C, BA, G, F, E,
+        DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A, // 300
+        G,  F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C, BA, G, F, E,
+        DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A,
+        GF, E, D, C, BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D,
+        CB, A, G, F, ED, C, B, A, GF, E, D, C, BA, G, F, E, DC, B, A, G,
+        FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C, // 400
+    ];
+
+    static YEAR_DELTAS: [u8; 401] = [
+         0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  5,  5,  5,
+         5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10,
+        10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15,
+        15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20,
+        20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, // 100
+        25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29,
+        29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34,
+        34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39,
+        39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44,
+        44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, // 200
+        49, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53,
+        53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58,
+        58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63,
+        63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68,
+        68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, // 300
+        73, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77,
+        77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82,
+        82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87,
+        87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92,
+        92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97 // 400+1
+    ];
+
+    pub fn cycle_to_yo(cycle: u32) -> (u32, u32) {
+        let (mut year_mod_400, mut ordinal0) = div_rem(cycle, 365);
+        let delta = YEAR_DELTAS[year_mod_400 as usize] as u32;
+        if ordinal0 < delta {
+            year_mod_400 -= 1;
+            ordinal0 += 365 - YEAR_DELTAS[year_mod_400 as usize] as u32;
+        } else {
+            ordinal0 -= delta;
+        }
+        (year_mod_400, ordinal0 + 1)
+    }
+
+    pub fn yo_to_cycle(year_mod_400: u32, ordinal: u32) -> u32 {
+        year_mod_400 * 365 + YEAR_DELTAS[year_mod_400 as usize] as u32 + ordinal - 1
+    }
+
+    impl YearFlags {
+        #[inline]
+        pub fn from_year(year: i32) -> YearFlags {
+            let year = mod_floor(year, 400);
+            YearFlags::from_year_mod_400(year)
+        }
+
+        #[inline]
+        pub fn from_year_mod_400(year: i32) -> YearFlags {
+            YEAR_TO_FLAGS[year as usize]
+        }
+
+        #[inline]
+        pub fn ndays(&self) -> u32 {
+            let YearFlags(flags) = *self;
+            366 - (flags >> 3) as u32
+        }
+
+        #[inline]
+        pub fn isoweek_delta(&self) -> u32 {
+            let YearFlags(flags) = *self;
+            let mut delta = flags as u32 & 0b111;
+            if delta < 3 { delta += 7; }
+            delta
+        }
+
+        #[inline]
+        pub fn nisoweeks(&self) -> u32 {
+            let YearFlags(flags) = *self;
+            52 + ((0b00000100_00000110 >> flags as usize) & 1)
+        }
+    }
+
+    impl fmt::Debug for YearFlags {
+        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+            let YearFlags(flags) = *self;
+            match flags {
+                0o15 => "A".fmt(f),  0o05 => "AG".fmt(f),
+                0o14 => "B".fmt(f),  0o04 => "BA".fmt(f),
+                0o13 => "C".fmt(f),  0o03 => "CB".fmt(f),
+                0o12 => "D".fmt(f),  0o02 => "DC".fmt(f),
+                0o11 => "E".fmt(f),  0o01 => "ED".fmt(f),
+                0o10 => "F?".fmt(f), 0o00 => "FE?".fmt(f), // non-canonical
+                0o17 => "F".fmt(f),  0o07 => "FE".fmt(f),
+                0o16 => "G".fmt(f),  0o06 => "GF".fmt(f),
+                _ => write!(f, "YearFlags({})", flags),
+            }
+        }
+    }
+
+    pub const MIN_OL: u32 = 1 << 1;
+    pub const MAX_OL: u32 = 366 << 1; // larger than the non-leap last day `(365 << 1) | 1`
+    pub const MIN_MDL: u32 = (1 << 6) | (1 << 1);
+    pub const MAX_MDL: u32 = (12 << 6) | (31 << 1) | 1;
+
+    const XX: i8 = -128;
+    static MDL_TO_OL: [i8; (MAX_MDL as usize + 1)] = [
+         XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
+         XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
+         XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
+         XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, // 0
+         XX, XX, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, // 1
+         XX, XX, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+         66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+         66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+         66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, XX, XX, XX, XX, XX, // 2
+         XX, XX, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74,
+         72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74,
+         72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74,
+         72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, // 3
+         XX, XX, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76,
+         74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76,
+         74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76,
+         74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, XX, XX, // 4
+         XX, XX, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80,
+         78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80,
+         78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80,
+         78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, // 5
+         XX, XX, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82,
+         80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82,
+         80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82,
+         80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, XX, XX, // 6
+         XX, XX, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86,
+         84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86,
+         84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86,
+         84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, // 7
+         XX, XX, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88,
+         86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88,
+         86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88,
+         86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, // 8
+         XX, XX, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90,
+         88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90,
+         88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90,
+         88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, XX, XX, // 9
+         XX, XX, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94,
+         92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94,
+         92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94,
+         92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, // 10
+         XX, XX, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96,
+         94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96,
+         94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96,
+         94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, XX, XX, // 11
+         XX, XX, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100,
+         98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100,
+         98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100,
+         98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, // 12
+    ];
+
+    static OL_TO_MDL: [u8; (MAX_OL as usize + 1)] = [
+          0,  0,                                                         // 0
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+         64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,         // 1
+         66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+         66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+         66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+         66, 66, 66, 66, 66, 66, 66, 66, 66,                             // 2
+             74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74,
+         72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74,
+         72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74,
+         72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72, 74, 72,     // 3
+             76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76,
+         74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76,
+         74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76,
+         74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74, 76, 74,             // 4
+             80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80,
+         78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80,
+         78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80,
+         78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78, 80, 78,     // 5
+             82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82,
+         80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82,
+         80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82,
+         80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80, 82, 80,             // 6
+             86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86,
+         84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86,
+         84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86,
+         84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84, 86, 84,     // 7
+             88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88,
+         86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88,
+         86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88,
+         86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86, 88, 86,     // 8
+             90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90,
+         88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90,
+         88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90,
+         88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88, 90, 88,             // 9
+             94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94,
+         92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94,
+         92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94,
+         92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92, 94, 92,     // 10
+             96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96,
+         94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96,
+         94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96,
+         94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94, 96, 94,             // 11
+            100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100,
+         98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100,
+         98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100,
+         98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,100, 98,     // 12
+    ];
+
+    /// Ordinal (day of year) and year flags: `(ordinal << 4) | flags`.
+    ///
+    /// The whole bits except for the least 3 bits are referred as `Ol` (ordinal and leap flag),
+    /// which is an index to the `OL_TO_MDL` lookup table.
+    #[derive(PartialEq, PartialOrd, Copy, Clone)]
+    pub struct Of(pub u32);
+
+    impl Of {
+        #[inline]
+        fn clamp_ordinal(ordinal: u32) -> u32 {
+            if ordinal > 366 {0} else {ordinal}
+        }
+
+        #[inline]
+        pub fn new(ordinal: u32, YearFlags(flags): YearFlags) -> Of {
+            let ordinal = Of::clamp_ordinal(ordinal);
+            Of((ordinal << 4) | (flags as u32))
+        }
+
+        #[inline]
+        pub fn from_mdf(Mdf(mdf): Mdf) -> Of {
+            let mdl = mdf >> 3;
+            match MDL_TO_OL.get(mdl as usize) {
+                Some(&v) => Of(mdf.wrapping_sub((v as i32 as u32 & 0x3ff) << 3)),
+                None => Of(0)
+            }
+        }
+
+        #[inline]
+        pub fn valid(&self) -> bool {
+            let Of(of) = *self;
+            let ol = of >> 3;
+            MIN_OL <= ol && ol <= MAX_OL
+        }
+
+        #[inline]
+        pub fn ordinal(&self) -> u32 {
+            let Of(of) = *self;
+            of >> 4
+        }
+
+        #[inline]
+        pub fn with_ordinal(&self, ordinal: u32) -> Of {
+            let ordinal = Of::clamp_ordinal(ordinal);
+            let Of(of) = *self;
+            Of((of & 0b1111) | (ordinal << 4))
+        }
+
+        #[inline]
+        pub fn flags(&self) -> YearFlags {
+            let Of(of) = *self;
+            YearFlags((of & 0b1111) as u8)
+        }
+
+        #[inline]
+        pub fn with_flags(&self, YearFlags(flags): YearFlags) -> Of {
+            let Of(of) = *self;
+            Of((of & !0b1111) | (flags as u32))
+        }
+
+        #[inline]
+        pub fn weekday(&self) -> Weekday {
+            let Of(of) = *self;
+            Weekday::from_u32(((of >> 4) + (of & 0b111)) % 7).unwrap()
+        }
+
+        #[inline]
+        pub fn isoweekdate_raw(&self) -> (u32, Weekday) {
+            // week ordinal = ordinal + delta
+            let Of(of) = *self;
+            let weekord = (of >> 4).wrapping_add(self.flags().isoweek_delta());
+            (weekord / 7, Weekday::from_u32(weekord % 7).unwrap())
+        }
+
+        #[inline]
+        pub fn to_mdf(&self) -> Mdf {
+            Mdf::from_of(*self)
+        }
+
+        #[inline]
+        pub fn succ(&self) -> Of {
+            let Of(of) = *self;
+            Of(of + (1 << 4))
+        }
+
+        #[inline]
+        pub fn pred(&self) -> Of {
+            let Of(of) = *self;
+            Of(of - (1 << 4))
+        }
+    }
+
+    impl fmt::Debug for Of {
+        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+            let Of(of) = *self;
+            write!(f, "Of(({} << 4) | {:#04o} /*{:?}*/)",
+                   of >> 4, of & 0b1111, YearFlags((of & 0b1111) as u8))
+        }
+    }
+
+    /// Month, day of month and year flags: `(month << 9) | (day << 4) | flags`
+    ///
+    /// The whole bits except for the least 3 bits are referred as `Mdl`
+    /// (month, day of month and leap flag),
+    /// which is an index to the `MDL_TO_OL` lookup table.
+    #[derive(PartialEq, PartialOrd, Copy, Clone)]
+    pub struct Mdf(pub u32);
+
+    impl Mdf {
+        #[inline]
+        fn clamp_month(month: u32) -> u32 {
+            if month > 12 {0} else {month}
+        }
+
+        #[inline]
+        fn clamp_day(day: u32) -> u32 {
+            if day > 31 {0} else {day}
+        }
+
+        #[inline]
+        pub fn new(month: u32, day: u32, YearFlags(flags): YearFlags) -> Mdf {
+            let month = Mdf::clamp_month(month);
+            let day = Mdf::clamp_day(day);
+            Mdf((month << 9) | (day << 4) | (flags as u32))
+        }
+
+        #[inline]
+        pub fn from_of(Of(of): Of) -> Mdf {
+            let ol = of >> 3;
+            match OL_TO_MDL.get(ol as usize) {
+                Some(&v) => Mdf(of + ((v as u32) << 3)),
+                None => Mdf(0)
+            }
+        }
+
+        #[inline]
+        pub fn valid(&self) -> bool {
+            let Mdf(mdf) = *self;
+            let mdl = mdf >> 3;
+            match MDL_TO_OL.get(mdl as usize) {
+                Some(&v) => v >= 0,
+                None => false
+            }
+        }
+
+        #[inline]
+        pub fn month(&self) -> u32 {
+            let Mdf(mdf) = *self;
+            mdf >> 9
+        }
+
+        #[inline]
+        pub fn with_month(&self, month: u32) -> Mdf {
+            let month = Mdf::clamp_month(month);
+            let Mdf(mdf) = *self;
+            Mdf((mdf & 0b11111_1111) | (month << 9))
+        }
+
+        #[inline]
+        pub fn day(&self) -> u32 {
+            let Mdf(mdf) = *self;
+            (mdf >> 4) & 0b11111
+        }
+
+        #[inline]
+        pub fn with_day(&self, day: u32) -> Mdf {
+            let day = Mdf::clamp_day(day);
+            let Mdf(mdf) = *self;
+            Mdf((mdf & !0b11111_0000) | (day << 4))
+        }
+
+        #[inline]
+        pub fn flags(&self) -> YearFlags {
+            let Mdf(mdf) = *self;
+            YearFlags((mdf & 0b1111) as u8)
+        }
+
+        #[inline]
+        pub fn with_flags(&self, YearFlags(flags): YearFlags) -> Mdf {
+            let Mdf(mdf) = *self;
+            Mdf((mdf & !0b1111) | (flags as u32))
+        }
+
+        #[inline]
+        pub fn to_of(&self) -> Of {
+            Of::from_mdf(*self)
+        }
+    }
+
+    impl fmt::Debug for Mdf {
+        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+            let Mdf(mdf) = *self;
+            write!(f, "Mdf(({} << 9) | ({} << 4) | {:#04o} /*{:?}*/)",
+                   mdf >> 9, (mdf >> 4) & 0b11111, mdf & 0b1111, YearFlags((mdf & 0b1111) as u8))
+        }
+    }
+
+    #[cfg(test)]
+    mod tests {
+        #[cfg(bench)] extern crate test;
+
+        use Weekday;
+        use super::{Of, Mdf};
+        use super::{YearFlags, A, B, C, D, E, F, G, AG, BA, CB, DC, ED, FE, GF};
+        use num::iter::range_inclusive;
+        use std::u32;
+
+        const NONLEAP_FLAGS: [YearFlags; 7] = [A, B, C, D, E, F, G];
+        const LEAP_FLAGS: [YearFlags; 7] = [AG, BA, CB, DC, ED, FE, GF];
+        const FLAGS: [YearFlags; 14] = [A, B, C, D, E, F, G, AG, BA, CB, DC, ED, FE, GF];
+
+        #[test]
+        fn test_year_flags_ndays_from_year() {
+            assert_eq!(YearFlags::from_year(2014).ndays(), 365);
+            assert_eq!(YearFlags::from_year(2012).ndays(), 366);
+            assert_eq!(YearFlags::from_year(2000).ndays(), 366);
+            assert_eq!(YearFlags::from_year(1900).ndays(), 365);
+            assert_eq!(YearFlags::from_year(1600).ndays(), 366);
+            assert_eq!(YearFlags::from_year(   1).ndays(), 365);
+            assert_eq!(YearFlags::from_year(   0).ndays(), 366); // 1 BCE (proleptic Gregorian)
+            assert_eq!(YearFlags::from_year(  -1).ndays(), 365); // 2 BCE
+            assert_eq!(YearFlags::from_year(  -4).ndays(), 366); // 5 BCE
+            assert_eq!(YearFlags::from_year( -99).ndays(), 365); // 100 BCE
+            assert_eq!(YearFlags::from_year(-100).ndays(), 365); // 101 BCE
+            assert_eq!(YearFlags::from_year(-399).ndays(), 365); // 400 BCE
+            assert_eq!(YearFlags::from_year(-400).ndays(), 366); // 401 BCE
+        }
+
+        #[test]
+        fn test_year_flags_nisoweeks() {
+            assert_eq!(A.nisoweeks(), 52);
+            assert_eq!(B.nisoweeks(), 52);
+            assert_eq!(C.nisoweeks(), 52);
+            assert_eq!(D.nisoweeks(), 53);
+            assert_eq!(E.nisoweeks(), 52);
+            assert_eq!(F.nisoweeks(), 52);
+            assert_eq!(G.nisoweeks(), 52);
+            assert_eq!(AG.nisoweeks(), 52);
+            assert_eq!(BA.nisoweeks(), 52);
+            assert_eq!(CB.nisoweeks(), 52);
+            assert_eq!(DC.nisoweeks(), 53);
+            assert_eq!(ED.nisoweeks(), 53);
+            assert_eq!(FE.nisoweeks(), 52);
+            assert_eq!(GF.nisoweeks(), 52);
+        }
+
+        #[cfg(bench)]
+        #[bench]
+        fn bench_year_flags_from_year(bh: &mut test::Bencher) {
+            bh.iter(|| {
+                for year in -999i32..1000 {
+                    YearFlags::from_year(year);
+                }
+            });
+        }
+
+        #[test]
+        fn test_of() {
+            fn check(expected: bool, flags: YearFlags, ordinal1: u32, ordinal2: u32) {
+                for ordinal in range_inclusive(ordinal1, ordinal2) {
+                    let of = Of::new(ordinal, flags);
+                    assert!(of.valid() == expected,
+                            "ordinal {} = {:?} should be {} for dominical year {:?}",
+                            ordinal, of, if expected {"valid"} else {"invalid"}, flags);
+                }
+            }
+
+            for &flags in NONLEAP_FLAGS.iter() {
+                check(false, flags, 0, 0);
+                check(true, flags, 1, 365);
+                check(false, flags, 366, 1024);
+                check(false, flags, u32::MAX, u32::MAX);
+            }
+
+            for &flags in LEAP_FLAGS.iter() {
+                check(false, flags, 0, 0);
+                check(true, flags, 1, 366);
+                check(false, flags, 367, 1024);
+                check(false, flags, u32::MAX, u32::MAX);
+            }
+        }
+
+        #[test]
+        fn test_mdf_valid() {
+            fn check(expected: bool, flags: YearFlags, month1: u32, day1: u32,
+                     month2: u32, day2: u32) {
+                for month in range_inclusive(month1, month2) {
+                    for day in range_inclusive(day1, day2) {
+                        let mdf = Mdf::new(month, day, flags);
+                        assert!(mdf.valid() == expected,
+                                "month {} day {} = {:?} should be {} for dominical year {:?}",
+                                month, day, mdf, if expected {"valid"} else {"invalid"}, flags);
+                    }
+                }
+            }
+
+            for &flags in NONLEAP_FLAGS.iter() {
+                check(false, flags, 0, 0, 0, 1024);
+                check(false, flags, 0, 0, 16, 0);
+                check(true, flags,  1, 1,  1, 31); check(false, flags,  1, 32,  1, 1024);
+                check(true, flags,  2, 1,  2, 28); check(false, flags,  2, 29,  2, 1024);
+                check(true, flags,  3, 1,  3, 31); check(false, flags,  3, 32,  3, 1024);
+                check(true, flags,  4, 1,  4, 30); check(false, flags,  4, 31,  4, 1024);
+                check(true, flags,  5, 1,  5, 31); check(false, flags,  5, 32,  5, 1024);
+                check(true, flags,  6, 1,  6, 30); check(false, flags,  6, 31,  6, 1024);
+                check(true, flags,  7, 1,  7, 31); check(false, flags,  7, 32,  7, 1024);
+                check(true, flags,  8, 1,  8, 31); check(false, flags,  8, 32,  8, 1024);
+                check(true, flags,  9, 1,  9, 30); check(false, flags,  9, 31,  9, 1024);
+                check(true, flags, 10, 1, 10, 31); check(false, flags, 10, 32, 10, 1024);
+                check(true, flags, 11, 1, 11, 30); check(false, flags, 11, 31, 11, 1024);
+                check(true, flags, 12, 1, 12, 31); check(false, flags, 12, 32, 12, 1024);
+                check(false, flags, 13, 0, 16, 1024);
+                check(false, flags, u32::MAX, 0, u32::MAX, 1024);
+                check(false, flags, 0, u32::MAX, 16, u32::MAX);
+                check(false, flags, u32::MAX, u32::MAX, u32::MAX, u32::MAX);
+            }
+
+            for &flags in LEAP_FLAGS.iter() {
+                check(false, flags, 0, 0, 0, 1024);
+                check(false, flags, 0, 0, 16, 0);
+                check(true, flags,  1, 1,  1, 31); check(false, flags,  1, 32,  1, 1024);
+                check(true, flags,  2, 1,  2, 29); check(false, flags,  2, 30,  2, 1024);
+                check(true, flags,  3, 1,  3, 31); check(false, flags,  3, 32,  3, 1024);
+                check(true, flags,  4, 1,  4, 30); check(false, flags,  4, 31,  4, 1024);
+                check(true, flags,  5, 1,  5, 31); check(false, flags,  5, 32,  5, 1024);
+                check(true, flags,  6, 1,  6, 30); check(false, flags,  6, 31,  6, 1024);
+                check(true, flags,  7, 1,  7, 31); check(false, flags,  7, 32,  7, 1024);
+                check(true, flags,  8, 1,  8, 31); check(false, flags,  8, 32,  8, 1024);
+                check(true, flags,  9, 1,  9, 30); check(false, flags,  9, 31,  9, 1024);
+                check(true, flags, 10, 1, 10, 31); check(false, flags, 10, 32, 10, 1024);
+                check(true, flags, 11, 1, 11, 30); check(false, flags, 11, 31, 11, 1024);
+                check(true, flags, 12, 1, 12, 31); check(false, flags, 12, 32, 12, 1024);
+                check(false, flags, 13, 0, 16, 1024);
+                check(false, flags, u32::MAX, 0, u32::MAX, 1024);
+                check(false, flags, 0, u32::MAX, 16, u32::MAX);
+                check(false, flags, u32::MAX, u32::MAX, u32::MAX, u32::MAX);
+            }
+        }
+
+        #[test]
+        fn test_of_fields() {
+            for &flags in FLAGS.iter() {
+                for ordinal in range_inclusive(1u32, 366) {
+                    let of = Of::new(ordinal, flags);
+                    if of.valid() {
+                        assert_eq!(of.ordinal(), ordinal);
+                    }
+                }
+            }
+        }
+
+        #[test]
+        fn test_of_with_fields() {
+            fn check(flags: YearFlags, ordinal: u32) {
+                let of = Of::new(ordinal, flags);
+
+                for ordinal in range_inclusive(0u32, 1024) {
+                    let of = of.with_ordinal(ordinal);
+                    assert_eq!(of.valid(), Of::new(ordinal, flags).valid());
+                    if of.valid() {
+                        assert_eq!(of.ordinal(), ordinal);
+                    }
+                }
+            }
+
+            for &flags in NONLEAP_FLAGS.iter() {
+                check(flags, 1);
+                check(flags, 365);
+            }
+            for &flags in LEAP_FLAGS.iter() {
+                check(flags, 1);
+                check(flags, 366);
+            }
+        }
+
+        #[test]
+        fn test_of_weekday() {
+            assert_eq!(Of::new(1, A).weekday(), Weekday::Sun);
+            assert_eq!(Of::new(1, B).weekday(), Weekday::Sat);
+            assert_eq!(Of::new(1, C).weekday(), Weekday::Fri);
+            assert_eq!(Of::new(1, D).weekday(), Weekday::Thu);
+            assert_eq!(Of::new(1, E).weekday(), Weekday::Wed);
+            assert_eq!(Of::new(1, F).weekday(), Weekday::Tue);
+            assert_eq!(Of::new(1, G).weekday(), Weekday::Mon);
+            assert_eq!(Of::new(1, AG).weekday(), Weekday::Sun);
+            assert_eq!(Of::new(1, BA).weekday(), Weekday::Sat);
+            assert_eq!(Of::new(1, CB).weekday(), Weekday::Fri);
+            assert_eq!(Of::new(1, DC).weekday(), Weekday::Thu);
+            assert_eq!(Of::new(1, ED).weekday(), Weekday::Wed);
+            assert_eq!(Of::new(1, FE).weekday(), Weekday::Tue);
+            assert_eq!(Of::new(1, GF).weekday(), Weekday::Mon);
+
+            for &flags in FLAGS.iter() {
+                let mut prev = Of::new(1, flags).weekday();
+                for ordinal in range_inclusive(2u32, flags.ndays()) {
+                    let of = Of::new(ordinal, flags);
+                    let expected = prev.succ();
+                    assert_eq!(of.weekday(), expected);
+                    prev = expected;
+                }
+            }
+        }
+
+        #[test]
+        fn test_mdf_fields() {
+            for &flags in FLAGS.iter() {
+                for month in range_inclusive(1u32, 12) {
+                    for day in range_inclusive(1u32, 31) {
+                        let mdf = Mdf::new(month, day, flags);
+                        if mdf.valid() {
+                            assert_eq!(mdf.month(), month);
+                            assert_eq!(mdf.day(), day);
+                        }
+                    }
+                }
+            }
+        }
+
+        #[test]
+        fn test_mdf_with_fields() {
+            fn check(flags: YearFlags, month: u32, day: u32) {
+                let mdf = Mdf::new(month, day, flags);
+
+                for month in range_inclusive(0u32, 16) {
+                    let mdf = mdf.with_month(month);
+                    assert_eq!(mdf.valid(), Mdf::new(month, day, flags).valid());
+                    if mdf.valid() {
+                        assert_eq!(mdf.month(), month);
+                        assert_eq!(mdf.day(), day);
+                    }
+                }
+
+                for day in range_inclusive(0u32, 1024) {
+                    let mdf = mdf.with_day(day);
+                    assert_eq!(mdf.valid(), Mdf::new(month, day, flags).valid());
+                    if mdf.valid() {
+                        assert_eq!(mdf.month(), month);
+                        assert_eq!(mdf.day(), day);
+                    }
+                }
+            }
+
+            for &flags in NONLEAP_FLAGS.iter() {
+                check(flags, 1, 1);
+                check(flags, 1, 31);
+                check(flags, 2, 1);
+                check(flags, 2, 28);
+                check(flags, 2, 29);
+                check(flags, 12, 31);
+            }
+            for &flags in LEAP_FLAGS.iter() {
+                check(flags, 1, 1);
+                check(flags, 1, 31);
+                check(flags, 2, 1);
+                check(flags, 2, 29);
+                check(flags, 2, 30);
+                check(flags, 12, 31);
+            }
+        }
+
+        #[test]
+        fn test_of_isoweekdate_raw() {
+            for &flags in FLAGS.iter() {
+                // January 4 should be in the first week
+                let (week, _) = Of::new(4 /* January 4 */, flags).isoweekdate_raw();
+                assert_eq!(week, 1);
+            }
+        }
+
+        #[test]
+        fn test_of_to_mdf() {
+            for i in range_inclusive(0u32, 8192) {
+                let of = Of(i);
+                assert_eq!(of.valid(), of.to_mdf().valid());
+            }
+        }
+
+        #[test]
+        fn test_mdf_to_of() {
+            for i in range_inclusive(0u32, 8192) {
+                let mdf = Mdf(i);
+                assert_eq!(mdf.valid(), mdf.to_of().valid());
+            }
+        }
+
+        #[test]
+        fn test_of_to_mdf_to_of() {
+            for i in range_inclusive(0u32, 8192) {
+                let of = Of(i);
+                if of.valid() {
+                    assert_eq!(of, of.to_mdf().to_of());
+                }
+            }
+        }
+
+        #[test]
+        fn test_mdf_to_of_to_mdf() {
+            for i in range_inclusive(0u32, 8192) {
+                let mdf = Mdf(i);
+                if mdf.valid() {
+                    assert_eq!(mdf, mdf.to_of().to_mdf());
+                }
+            }
+        }
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/naive/datetime.rs
@@ -0,0 +1,1134 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+//! ISO 8601 date and time without timezone.
+
+use std::{str, fmt, hash};
+use std::ops::{Add, Sub};
+use num::traits::ToPrimitive;
+
+use {Weekday, Timelike, Datelike};
+use div::div_mod_floor;
+use duration::Duration;
+use naive::time::NaiveTime;
+use naive::date::NaiveDate;
+use format::{Item, Numeric, Pad, Fixed};
+use format::{parse, Parsed, ParseError, ParseResult, DelayedFormat, StrftimeItems};
+
+/// ISO 8601 combined date and time without timezone.
+#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]
+pub struct NaiveDateTime {
+    date: NaiveDate,
+    time: NaiveTime,
+}
+
+impl NaiveDateTime {
+    /// Makes a new `NaiveDateTime` from date and time components.
+    /// Equivalent to `date.and_time(time)` and many other helper constructors on `NaiveDate`.
+    #[inline]
+    pub fn new(date: NaiveDate, time: NaiveTime) -> NaiveDateTime {
+        NaiveDateTime { date: date, time: time }
+    }
+
+    /// Makes a new `NaiveDateTime` from the number of non-leap seconds
+    /// since the midnight UTC on January 1, 1970 (aka "UNIX timestamp")
+    /// and the number of nanoseconds since the last whole non-leap second.
+    ///
+    /// Panics on the out-of-range number of seconds and/or invalid nanosecond.
+    #[inline]
+    pub fn from_timestamp(secs: i64, nsecs: u32) -> NaiveDateTime {
+        let datetime = NaiveDateTime::from_timestamp_opt(secs, nsecs);
+        datetime.expect("invalid or out-of-range datetime")
+    }
+
+    /// Makes a new `NaiveDateTime` from the number of non-leap seconds
+    /// since the midnight UTC on January 1, 1970 (aka "UNIX timestamp")
+    /// and the number of nanoseconds since the last whole non-leap second.
+    ///
+    /// Returns `None` on the out-of-range number of seconds and/or invalid nanosecond.
+    #[inline]
+    pub fn from_timestamp_opt(secs: i64, nsecs: u32) -> Option<NaiveDateTime> {
+        let (days, secs) = div_mod_floor(secs, 86400);
+        let date = days.to_i32().and_then(|days| days.checked_add(719163))
+                                .and_then(|days_ce| NaiveDate::from_num_days_from_ce_opt(days_ce));
+        let time = NaiveTime::from_num_seconds_from_midnight_opt(secs as u32, nsecs);
+        match (date, time) {
+            (Some(date), Some(time)) => Some(NaiveDateTime { date: date, time: time }),
+            (_, _) => None,
+        }
+    }
+
+    /// *Deprecated:* Same to [`NaiveDateTime::from_timestamp`](#method.from_timestamp).
+    #[inline]
+    pub fn from_num_seconds_from_unix_epoch(secs: i64, nsecs: u32) -> NaiveDateTime {
+        NaiveDateTime::from_timestamp(secs, nsecs)
+    }
+
+    /// *Deprecated:* Same to [`NaiveDateTime::from_timestamp_opt`](#method.from_timestamp_opt).
+    #[inline]
+    pub fn from_num_seconds_from_unix_epoch_opt(secs: i64, nsecs: u32) -> Option<NaiveDateTime> {
+        NaiveDateTime::from_timestamp_opt(secs, nsecs)
+    }
+
+    /// Parses a string with the specified format string and returns a new `NaiveDateTime`.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveDateTime> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, StrftimeItems::new(fmt)));
+        parsed.to_naive_datetime_with_offset(0) // no offset adjustment
+    }
+
+    /// Retrieves a date component.
+    #[inline]
+    pub fn date(&self) -> NaiveDate {
+        self.date
+    }
+
+    /// Retrieves a time component.
+    #[inline]
+    pub fn time(&self) -> NaiveTime {
+        self.time
+    }
+
+    /// Returns the number of non-leap seconds since the midnight on January 1, 1970.
+    ///
+    /// Note that this does *not* account for the timezone!
+    /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch.
+    #[inline]
+    pub fn timestamp(&self) -> i64 {
+        let ndays = self.date.num_days_from_ce() as i64;
+        let nseconds = self.time.num_seconds_from_midnight() as i64;
+        (ndays - 719163) * 86400 + nseconds
+    }
+
+    /// Returns the number of milliseconds since the last whole non-leap second.
+    ///
+    /// The return value ranges from 0 to 999,
+    /// or for [leap seconds](../time/index.html#leap-second-handling), to 1,999.
+    #[inline]
+    pub fn timestamp_subsec_millis(&self) -> u32 {
+        self.timestamp_subsec_nanos() / 1_000_000
+    }
+
+    /// Returns the number of microseconds since the last whole non-leap second.
+    ///
+    /// The return value ranges from 0 to 999,999,
+    /// or for [leap seconds](../time/index.html#leap-second-handling), to 1,999,999.
+    #[inline]
+    pub fn timestamp_subsec_micros(&self) -> u32 {
+        self.timestamp_subsec_nanos() / 1_000
+    }
+
+    /// Returns the number of nanoseconds since the last whole non-leap second.
+    ///
+    /// The return value ranges from 0 to 999,999,999,
+    /// or for [leap seconds](../time/index.html#leap-second-handling), to 1,999,999,999.
+    #[inline]
+    pub fn timestamp_subsec_nanos(&self) -> u32 {
+        self.time.nanosecond()
+    }
+
+    /// *Deprecated:* Same to [`NaiveDateTime::timestamp`](#method.timestamp).
+    #[inline]
+    pub fn num_seconds_from_unix_epoch(&self) -> i64 {
+        self.timestamp()
+    }
+
+    /// Adds given `Duration` to the current date and time.
+    ///
+    /// Returns `None` when it will result in overflow.
+    pub fn checked_add(self, rhs: Duration) -> Option<NaiveDateTime> {
+        // Duration does not directly give its parts, so we need some additional calculations.
+        let days = rhs.num_days();
+        let nanos = (rhs - Duration::days(days)).num_nanoseconds().unwrap();
+        debug_assert!(Duration::days(days) + Duration::nanoseconds(nanos) == rhs);
+        debug_assert!(-86400_000_000_000 < nanos && nanos < 86400_000_000_000);
+
+        let mut date = try_opt!(self.date.checked_add(Duration::days(days)));
+        let time = self.time + Duration::nanoseconds(nanos);
+
+        // time always wraps around, but date needs to be adjusted for overflow.
+        if nanos < 0 && time > self.time {
+            date = try_opt!(date.pred_opt());
+        } else if nanos > 0 && time < self.time {
+            date = try_opt!(date.succ_opt());
+        }
+        Some(NaiveDateTime { date: date, time: time })
+    }
+
+    /// Subtracts given `Duration` from the current date and time.
+    ///
+    /// Returns `None` when it will result in overflow.
+    pub fn checked_sub(self, rhs: Duration) -> Option<NaiveDateTime> {
+        // Duration does not directly give its parts, so we need some additional calculations.
+        let days = rhs.num_days();
+        let nanos = (rhs - Duration::days(days)).num_nanoseconds().unwrap();
+        debug_assert!(Duration::days(days) + Duration::nanoseconds(nanos) == rhs);
+        debug_assert!(-86400_000_000_000 < nanos && nanos < 86400_000_000_000);
+
+        let mut date = try_opt!(self.date.checked_sub(Duration::days(days)));
+        let time = self.time - Duration::nanoseconds(nanos);
+
+        // time always wraps around, but date needs to be adjusted for overflow.
+        if nanos > 0 && time > self.time {
+            date = try_opt!(date.pred_opt());
+        } else if nanos < 0 && time < self.time {
+            date = try_opt!(date.succ_opt());
+        }
+        Some(NaiveDateTime { date: date, time: time })
+    }
+
+    /// Formats the combined date and time with the specified formatting items.
+    #[inline]
+    pub fn format_with_items<'a, I>(&self, items: I) -> DelayedFormat<I>
+            where I: Iterator<Item=Item<'a>> + Clone {
+        DelayedFormat::new(Some(self.date.clone()), Some(self.time.clone()), items)
+    }
+
+    /// Formats the combined date and time with the specified format string.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    #[inline]
+    pub fn format<'a>(&self, fmt: &'a str) -> DelayedFormat<StrftimeItems<'a>> {
+        self.format_with_items(StrftimeItems::new(fmt))
+    }
+}
+
+impl Datelike for NaiveDateTime {
+    /// Returns the year number in the [calendar date](./index.html#calendar-date).
+    ///
+    /// See also the [`NaiveDate::year`](../date/struct.NaiveDate.html#method.year) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.year(), 2015);
+    /// ~~~~
+    #[inline]
+    fn year(&self) -> i32 {
+        self.date.year()
+    }
+
+    /// Returns the month number starting from 1.
+    ///
+    /// The return value ranges from 1 to 12.
+    ///
+    /// See also the [`NaiveDate::month`](../date/struct.NaiveDate.html#method.month) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.month(), 9);
+    /// ~~~~
+    #[inline]
+    fn month(&self) -> u32 {
+        self.date.month()
+    }
+
+    /// Returns the month number starting from 0.
+    ///
+    /// The return value ranges from 0 to 11.
+    ///
+    /// See also the [`NaiveDate::month0`](../date/struct.NaiveDate.html#method.month0) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.month0(), 8);
+    /// ~~~~
+    #[inline]
+    fn month0(&self) -> u32 {
+        self.date.month0()
+    }
+
+    /// Returns the day of month starting from 1.
+    ///
+    /// The return value ranges from 1 to 31. (The last day of month differs by months.)
+    ///
+    /// See also the [`NaiveDate::day`](../date/struct.NaiveDate.html#method.day) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.day(), 25);
+    /// ~~~~
+    #[inline]
+    fn day(&self) -> u32 {
+        self.date.day()
+    }
+
+    /// Returns the day of month starting from 0.
+    ///
+    /// The return value ranges from 0 to 30. (The last day of month differs by months.)
+    ///
+    /// See also the [`NaiveDate::day0`](../date/struct.NaiveDate.html#method.day0) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.day0(), 24);
+    /// ~~~~
+    #[inline]
+    fn day0(&self) -> u32 {
+        self.date.day0()
+    }
+
+    /// Returns the day of year starting from 1.
+    ///
+    /// The return value ranges from 1 to 366. (The last day of year differs by years.)
+    ///
+    /// See also the [`NaiveDate::ordinal`](../date/struct.NaiveDate.html#method.ordinal) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.ordinal(), 268);
+    /// ~~~~
+    #[inline]
+    fn ordinal(&self) -> u32 {
+        self.date.ordinal()
+    }
+
+    /// Returns the day of year starting from 0.
+    ///
+    /// The return value ranges from 0 to 365. (The last day of year differs by years.)
+    ///
+    /// See also the [`NaiveDate::ordinal0`](../date/struct.NaiveDate.html#method.ordinal0) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.ordinal0(), 267);
+    /// ~~~~
+    #[inline]
+    fn ordinal0(&self) -> u32 {
+        self.date.ordinal0()
+    }
+
+    /// Returns the day of week.
+    ///
+    /// See also the [`NaiveDate::weekday`](../date/struct.NaiveDate.html#method.weekday) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike, Weekday};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.weekday(), Weekday::Fri);
+    /// ~~~~
+    #[inline]
+    fn weekday(&self) -> Weekday {
+        self.date.weekday()
+    }
+
+    #[inline]
+    fn isoweekdate(&self) -> (i32, u32, Weekday) {
+        self.date.isoweekdate()
+    }
+
+    /// Makes a new `NaiveDateTime` with the year number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_year`](../date/struct.NaiveDate.html#method.with_year) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 25).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_year(2016), Some(NaiveDate::from_ymd(2016, 9, 25).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_year(-308), Some(NaiveDate::from_ymd(-308, 9, 25).and_hms(12, 34, 56)));
+    /// ~~~~
+    #[inline]
+    fn with_year(&self, year: i32) -> Option<NaiveDateTime> {
+        self.date.with_year(year).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the month number (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_month`](../date/struct.NaiveDate.html#method.with_month) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 30).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_month(10), Some(NaiveDate::from_ymd(2015, 10, 30).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_month(13), None); // no month 13
+    /// assert_eq!(dt.with_month(2), None); // no February 30
+    /// ~~~~
+    #[inline]
+    fn with_month(&self, month: u32) -> Option<NaiveDateTime> {
+        self.date.with_month(month).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the month number (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_month0`](../date/struct.NaiveDate.html#method.with_month0) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 30).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_month0(9), Some(NaiveDate::from_ymd(2015, 10, 30).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_month0(12), None); // no month 13
+    /// assert_eq!(dt.with_month0(1), None); // no February 30
+    /// ~~~~
+    #[inline]
+    fn with_month0(&self, month0: u32) -> Option<NaiveDateTime> {
+        self.date.with_month0(month0).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the day of month (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_day`](../date/struct.NaiveDate.html#method.with_day) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_day(30), Some(NaiveDate::from_ymd(2015, 9, 30).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_day(31), None); // no September 31
+    /// ~~~~
+    #[inline]
+    fn with_day(&self, day: u32) -> Option<NaiveDateTime> {
+        self.date.with_day(day).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the day of month (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_day0`](../date/struct.NaiveDate.html#method.with_day0) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_day0(29), Some(NaiveDate::from_ymd(2015, 9, 30).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_day0(30), None); // no September 31
+    /// ~~~~
+    #[inline]
+    fn with_day0(&self, day0: u32) -> Option<NaiveDateTime> {
+        self.date.with_day0(day0).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the day of year (starting from 1) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_ordinal`](../date/struct.NaiveDate.html#method.with_ordinal) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_ordinal(60),
+    ///            Some(NaiveDate::from_ymd(2015, 3, 1).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_ordinal(366), None); // 2015 had only 365 days
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2016, 9, 8).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_ordinal(60),
+    ///            Some(NaiveDate::from_ymd(2016, 2, 29).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_ordinal(366),
+    ///            Some(NaiveDate::from_ymd(2016, 12, 31).and_hms(12, 34, 56)));
+    /// ~~~~
+    #[inline]
+    fn with_ordinal(&self, ordinal: u32) -> Option<NaiveDateTime> {
+        self.date.with_ordinal(ordinal).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the day of year (starting from 0) changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveDate::with_ordinal0`](../date/struct.NaiveDate.html#method.with_ordinal0) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_ordinal0(59),
+    ///            Some(NaiveDate::from_ymd(2015, 3, 1).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_ordinal0(365), None); // 2015 had only 365 days
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2016, 9, 8).and_hms(12, 34, 56);
+    /// assert_eq!(dt.with_ordinal0(59),
+    ///            Some(NaiveDate::from_ymd(2016, 2, 29).and_hms(12, 34, 56)));
+    /// assert_eq!(dt.with_ordinal0(365),
+    ///            Some(NaiveDate::from_ymd(2016, 12, 31).and_hms(12, 34, 56)));
+    /// ~~~~
+    #[inline]
+    fn with_ordinal0(&self, ordinal0: u32) -> Option<NaiveDateTime> {
+        self.date.with_ordinal0(ordinal0).map(|d| NaiveDateTime { date: d, ..*self })
+    }
+}
+
+impl Timelike for NaiveDateTime {
+    /// Returns the hour number from 0 to 23.
+    ///
+    /// See also the [`NaiveTime::hour`](../time/struct.NaiveTime.html#method.hour) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.hour(), 12);
+    /// ~~~~
+    #[inline]
+    fn hour(&self) -> u32 {
+        self.time.hour()
+    }
+
+    /// Returns the minute number from 0 to 59.
+    ///
+    /// See also the [`NaiveTime::minute`](../time/struct.NaiveTime.html#method.minute) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.minute(), 34);
+    /// ~~~~
+    #[inline]
+    fn minute(&self) -> u32 {
+        self.time.minute()
+    }
+
+    /// Returns the second number from 0 to 59.
+    ///
+    /// See also the [`NaiveTime::second`](../time/struct.NaiveTime.html#method.second) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.second(), 56);
+    /// ~~~~
+    #[inline]
+    fn second(&self) -> u32 {
+        self.time.second()
+    }
+
+    /// Returns the number of nanoseconds since the whole non-leap second.
+    /// The range from 1,000,000,000 to 1,999,999,999 represents
+    /// the [leap second](./naive/time/index.html#leap-second-handling).
+    ///
+    /// See also the
+    /// [`NaiveTime::nanosecond`](../time/struct.NaiveTime.html#method.nanosecond) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.nanosecond(), 789_000_000);
+    /// ~~~~
+    #[inline]
+    fn nanosecond(&self) -> u32 {
+        self.time.nanosecond()
+    }
+
+    /// Makes a new `NaiveDateTime` with the hour number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveTime::with_hour`](../time/struct.NaiveTime.html#method.with_hour) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.with_hour(7),
+    ///            Some(NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(7, 34, 56, 789)));
+    /// assert_eq!(dt.with_hour(24), None);
+    /// ~~~~
+    #[inline]
+    fn with_hour(&self, hour: u32) -> Option<NaiveDateTime> {
+        self.time.with_hour(hour).map(|t| NaiveDateTime { time: t, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the minute number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    ///
+    /// See also the
+    /// [`NaiveTime::with_minute`](../time/struct.NaiveTime.html#method.with_minute) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.with_minute(45),
+    ///            Some(NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 45, 56, 789)));
+    /// assert_eq!(dt.with_minute(60), None);
+    /// ~~~~
+    #[inline]
+    fn with_minute(&self, min: u32) -> Option<NaiveDateTime> {
+        self.time.with_minute(min).map(|t| NaiveDateTime { time: t, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with the second number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    /// As with the [`second`](#method.second) method,
+    /// the input range is restricted to 0 through 59.
+    ///
+    /// See also the
+    /// [`NaiveTime::with_second`](../time/struct.NaiveTime.html#method.with_second) method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.with_second(17),
+    ///            Some(NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 17, 789)));
+    /// assert_eq!(dt.with_second(60), None);
+    /// ~~~~
+    #[inline]
+    fn with_second(&self, sec: u32) -> Option<NaiveDateTime> {
+        self.time.with_second(sec).map(|t| NaiveDateTime { time: t, ..*self })
+    }
+
+    /// Makes a new `NaiveDateTime` with nanoseconds since the whole non-leap second changed.
+    ///
+    /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
+    /// As with the [`nanosecond`](#method.nanosecond) method,
+    /// the input range can exceed 1,000,000,000 for leap seconds.
+    ///
+    /// See also the
+    /// [`NaiveTime::with_nanosecond`](../time/struct.NaiveTime.html#method.with_nanosecond)
+    /// method.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
+    ///
+    /// let dt: NaiveDateTime = NaiveDate::from_ymd(2015, 9, 8).and_hms_milli(12, 34, 56, 789);
+    /// assert_eq!(dt.with_nanosecond(333_333_333),
+    ///            Some(NaiveDate::from_ymd(2015, 9, 8).and_hms_nano(12, 34, 56, 333_333_333)));
+    /// assert_eq!(dt.with_nanosecond(1_333_333_333), // leap second
+    ///            Some(NaiveDate::from_ymd(2015, 9, 8).and_hms_nano(12, 34, 56, 1_333_333_333)));
+    /// assert_eq!(dt.with_nanosecond(2_000_000_000), None);
+    /// ~~~~
+    #[inline]
+    fn with_nanosecond(&self, nano: u32) -> Option<NaiveDateTime> {
+        self.time.with_nanosecond(nano).map(|t| NaiveDateTime { time: t, ..*self })
+    }
+}
+
+/// `NaiveDateTime` can be used as a key to the hash maps (in principle).
+///
+/// Practically this also takes account of fractional seconds, so it is not recommended.
+/// (For the obvious reason this also distinguishes leap seconds from non-leap seconds.)
+impl hash::Hash for NaiveDateTime {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) {
+        self.date.hash(state);
+        self.time.hash(state);
+    }
+}
+
+impl Add<Duration> for NaiveDateTime {
+    type Output = NaiveDateTime;
+
+    #[inline]
+    fn add(self, rhs: Duration) -> NaiveDateTime {
+        self.checked_add(rhs).expect("`NaiveDateTime + Duration` overflowed")
+    }
+}
+
+impl Sub<NaiveDateTime> for NaiveDateTime {
+    type Output = Duration;
+
+    fn sub(self, rhs: NaiveDateTime) -> Duration {
+        (self.date - rhs.date) + (self.time - rhs.time)
+    }
+}
+
+impl Sub<Duration> for NaiveDateTime {
+    type Output = NaiveDateTime;
+
+    #[inline]
+    fn sub(self, rhs: Duration) -> NaiveDateTime {
+        self.checked_sub(rhs).expect("`NaiveDateTime - Duration` overflowed")
+    }
+}
+
+impl fmt::Debug for NaiveDateTime {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{:?}T{:?}", self.date, self.time)
+    }
+}
+
+impl fmt::Display for NaiveDateTime {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} {}", self.date, self.time)
+    }
+}
+
+impl str::FromStr for NaiveDateTime {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> ParseResult<NaiveDateTime> {
+        const ITEMS: &'static [Item<'static>] = &[
+            Item::Space(""), Item::Numeric(Numeric::Year, Pad::Zero),
+            Item::Space(""), Item::Literal("-"),
+            Item::Space(""), Item::Numeric(Numeric::Month, Pad::Zero),
+            Item::Space(""), Item::Literal("-"),
+            Item::Space(""), Item::Numeric(Numeric::Day, Pad::Zero),
+            Item::Space(""), Item::Literal("T"), // XXX shouldn't this be case-insensitive?
+            Item::Space(""), Item::Numeric(Numeric::Hour, Pad::Zero),
+            Item::Space(""), Item::Literal(":"),
+            Item::Space(""), Item::Numeric(Numeric::Minute, Pad::Zero),
+            Item::Space(""), Item::Literal(":"),
+            Item::Space(""), Item::Numeric(Numeric::Second, Pad::Zero),
+            Item::Fixed(Fixed::Nanosecond), Item::Space(""),
+        ];
+
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, ITEMS.iter().cloned()));
+        parsed.to_naive_datetime_with_offset(0)
+    }
+}
+
+#[cfg(feature = "rustc-serialize")]
+mod rustc_serialize {
+    use super::NaiveDateTime;
+    use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
+
+    // TODO the current serialization format is NEVER intentionally defined.
+    // in the future it is likely to be redefined to more sane and reasonable format.
+
+    impl Encodable for NaiveDateTime {
+        fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+            s.emit_struct("NaiveDateTime", 2, |s| {
+                try!(s.emit_struct_field("date", 0, |s| self.date.encode(s)));
+                try!(s.emit_struct_field("time", 1, |s| self.time.encode(s)));
+                Ok(())
+            })
+        }
+    }
+
+    impl Decodable for NaiveDateTime {
+        fn decode<D: Decoder>(d: &mut D) -> Result<NaiveDateTime, D::Error> {
+            d.read_struct("NaiveDateTime", 2, |d| {
+                let date = try!(d.read_struct_field("date", 0, Decodable::decode));
+                let time = try!(d.read_struct_field("time", 1, Decodable::decode));
+                Ok(NaiveDateTime::new(date, time))
+            })
+        }
+    }
+
+    #[test]
+    fn test_encodable() {
+        use naive::date::{self, NaiveDate};
+        use rustc_serialize::json::encode;
+
+        assert_eq!(
+            encode(&NaiveDate::from_ymd(2016, 7, 8).and_hms_milli(9, 10, 48, 90)).ok(),
+            Some(r#"{"date":{"ymdf":16518115},"time":{"secs":33048,"frac":90000000}}"#.into()));
+        assert_eq!(
+            encode(&NaiveDate::from_ymd(2014, 7, 24).and_hms(12, 34, 6)).ok(),
+            Some(r#"{"date":{"ymdf":16501977},"time":{"secs":45246,"frac":0}}"#.into()));
+        assert_eq!(
+            encode(&NaiveDate::from_ymd(0, 1, 1).and_hms_milli(0, 0, 59, 1_000)).ok(),
+            Some(r#"{"date":{"ymdf":20},"time":{"secs":59,"frac":1000000000}}"#.into()));
+        assert_eq!(
+            encode(&NaiveDate::from_ymd(-1, 12, 31).and_hms_nano(23, 59, 59, 7)).ok(),
+            Some(r#"{"date":{"ymdf":-2341},"time":{"secs":86399,"frac":7}}"#.into()));
+        assert_eq!(
+            encode(&date::MIN.and_hms(0, 0, 0)).ok(),
+            Some(r#"{"date":{"ymdf":-2147483625},"time":{"secs":0,"frac":0}}"#.into()));
+        assert_eq!(
+            encode(&date::MAX.and_hms_nano(23, 59, 59, 1_999_999_999)).ok(),
+            Some(r#"{"date":{"ymdf":2147481311},"time":{"secs":86399,"frac":1999999999}}"#.into()));
+    }
+
+    #[test]
+    fn test_decodable() {
+        use naive::date::{self, NaiveDate};
+        use rustc_serialize::json;
+
+        let decode = |s: &str| json::decode::<NaiveDateTime>(s);
+
+        assert_eq!(
+            decode(r#"{"date":{"ymdf":16518115},"time":{"secs":33048,"frac":90000000}}"#).ok(),
+            Some(NaiveDate::from_ymd(2016, 7, 8).and_hms_milli(9, 10, 48, 90)));
+        assert_eq!(
+            decode(r#"{"time":{"frac":0,"secs":45246},"date":{"ymdf":16501977}}"#).ok(),
+            Some(NaiveDate::from_ymd(2014, 7, 24).and_hms(12, 34, 6)));
+        assert_eq!(
+            decode(r#"{"date": {"ymdf": 20},
+                       "time": {"secs": 59,
+                                "frac": 1000000000}}"#).ok(),
+            Some(NaiveDate::from_ymd(0, 1, 1).and_hms_milli(0, 0, 59, 1_000)));
+        assert_eq!(
+            decode(r#"{"date":{"ymdf":-2341},"time":{"secs":86399,"frac":7}}"#).ok(),
+            Some(NaiveDate::from_ymd(-1, 12, 31).and_hms_nano(23, 59, 59, 7)));
+        assert_eq!(
+            decode(r#"{"date":{"ymdf":-2147483625},"time":{"secs":0,"frac":0}}"#).ok(),
+            Some(date::MIN.and_hms(0, 0, 0)));
+        assert_eq!(
+            decode(r#"{"date":{"ymdf":2147481311},"time":{"secs":86399,"frac":1999999999}}"#).ok(),
+            Some(date::MAX.and_hms_nano(23, 59, 59, 1_999_999_999)));
+
+        // bad formats
+        assert!(decode(r#"{"date":{},"time":{}}"#).is_err());
+        assert!(decode(r#"{"date":{"ymdf":0},"time":{"secs":0,"frac":0}}"#).is_err());
+        assert!(decode(r#"{"date":{"ymdf":20},"time":{"secs":86400,"frac":0}}"#).is_err());
+        assert!(decode(r#"{"date":{"ymdf":20},"time":{"secs":0,"frac":-1}}"#).is_err());
+        assert!(decode(r#"{"date":20,"time":{"secs":0,"frac":0}}"#).is_err());
+        assert!(decode(r#"{"date":"2016-08-04","time":"01:02:03.456"}"#).is_err());
+        assert!(decode(r#"{"date":{"ymdf":20}}"#).is_err());
+        assert!(decode(r#"{"time":{"secs":0,"frac":0}}"#).is_err());
+        assert!(decode(r#"{"ymdf":20}"#).is_err());
+        assert!(decode(r#"{"secs":0,"frac":0}"#).is_err());
+        assert!(decode(r#"{}"#).is_err());
+        assert!(decode(r#"0"#).is_err());
+        assert!(decode(r#"-1"#).is_err());
+        assert!(decode(r#""string""#).is_err());
+        assert!(decode(r#""2016-08-04T12:34:56""#).is_err()); // :(
+        assert!(decode(r#""2016-08-04T12:34:56.789""#).is_err()); // :(
+        assert!(decode(r#"null"#).is_err());
+    }
+}
+
+#[cfg(feature = "serde")]
+mod serde {
+    use super::NaiveDateTime;
+    use serde::{ser, de};
+
+    // TODO not very optimized for space (binary formats would want something better)
+
+    impl ser::Serialize for NaiveDateTime {
+        fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
+            where S: ser::Serializer
+        {
+            serializer.serialize_str(&format!("{:?}", self))
+        }
+    }
+
+    struct NaiveDateTimeVisitor;
+
+    impl de::Visitor for NaiveDateTimeVisitor {
+        type Value = NaiveDateTime;
+
+        fn visit_str<E>(&mut self, value: &str) -> Result<NaiveDateTime, E>
+            where E: de::Error
+        {
+            value.parse().map_err(|err| E::custom(format!("{}", err)))
+        }
+    }
+
+    impl de::Deserialize for NaiveDateTime {
+        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+            where D: de::Deserializer
+        {
+            deserializer.deserialize(NaiveDateTimeVisitor)
+        }
+    }
+
+    #[cfg(test)] extern crate serde_json;
+
+    #[test]
+    fn test_serde_serialize() {
+        use naive::date::{self, NaiveDate};
+        use self::serde_json::to_string;
+
+        assert_eq!(
+            to_string(&NaiveDate::from_ymd(2016, 7, 8).and_hms_milli(9, 10, 48, 90)).ok(),
+            Some(r#""2016-07-08T09:10:48.090""#.into()));
+        assert_eq!(
+            to_string(&NaiveDate::from_ymd(2014, 7, 24).and_hms(12, 34, 6)).ok(),
+            Some(r#""2014-07-24T12:34:06""#.into()));
+        assert_eq!(
+            to_string(&NaiveDate::from_ymd(0, 1, 1).and_hms_milli(0, 0, 59, 1_000)).ok(),
+            Some(r#""0000-01-01T00:00:60""#.into()));
+        assert_eq!(
+            to_string(&NaiveDate::from_ymd(-1, 12, 31).and_hms_nano(23, 59, 59, 7)).ok(),
+            Some(r#""-0001-12-31T23:59:59.000000007""#.into()));
+        assert_eq!(
+            to_string(&date::MIN.and_hms(0, 0, 0)).ok(),
+            Some(r#""-262144-01-01T00:00:00""#.into()));
+        assert_eq!(
+            to_string(&date::MAX.and_hms_nano(23, 59, 59, 1_999_999_999)).ok(),
+            Some(r#""+262143-12-31T23:59:60.999999999""#.into()));
+    }
+
+    #[test]
+    fn test_serde_deserialize() {
+        use naive::date::{self, NaiveDate};
+        use self::serde_json::from_str;
+
+        let from_str = |s: &str| serde_json::from_str::<NaiveDateTime>(s);
+
+        assert_eq!(
+            from_str(r#""2016-07-08T09:10:48.090""#).ok(),
+            Some(NaiveDate::from_ymd(2016, 7, 8).and_hms_milli(9, 10, 48, 90)));
+        assert_eq!(
+            from_str(r#""2016-7-8T9:10:48.09""#).ok(),
+            Some(NaiveDate::from_ymd(2016, 7, 8).and_hms_milli(9, 10, 48, 90)));
+        assert_eq!(
+            from_str(r#""2014-07-24T12:34:06""#).ok(),
+            Some(NaiveDate::from_ymd(2014, 7, 24).and_hms(12, 34, 6)));
+        assert_eq!(
+            from_str(r#""0000-01-01T00:00:60""#).ok(),
+            Some(NaiveDate::from_ymd(0, 1, 1).and_hms_milli(0, 0, 59, 1_000)));
+        assert_eq!(
+            from_str(r#""0-1-1T0:0:60""#).ok(),
+            Some(NaiveDate::from_ymd(0, 1, 1).and_hms_milli(0, 0, 59, 1_000)));
+        assert_eq!(
+            from_str(r#""-0001-12-31T23:59:59.000000007""#).ok(),
+            Some(NaiveDate::from_ymd(-1, 12, 31).and_hms_nano(23, 59, 59, 7)));
+        assert_eq!(
+            from_str(r#""-262144-01-01T00:00:00""#).ok(),
+            Some(date::MIN.and_hms(0, 0, 0)));
+        assert_eq!(
+            from_str(r#""+262143-12-31T23:59:60.999999999""#).ok(),
+            Some(date::MAX.and_hms_nano(23, 59, 59, 1_999_999_999)));
+        assert_eq!(
+            from_str(r#""+262143-12-31T23:59:60.9999999999997""#).ok(), // excess digits are ignored
+            Some(date::MAX.and_hms_nano(23, 59, 59, 1_999_999_999)));
+
+        // bad formats
+        assert!(from_str(r#""""#).is_err());
+        assert!(from_str(r#""2016-07-08""#).is_err());
+        assert!(from_str(r#""09:10:48.090""#).is_err());
+        assert!(from_str(r#""20160708T091048.090""#).is_err());
+        assert!(from_str(r#""2000-00-00T00:00:00""#).is_err());
+        assert!(from_str(r#""2000-02-30T00:00:00""#).is_err());
+        assert!(from_str(r#""2001-02-29T00:00:00""#).is_err());
+        assert!(from_str(r#""2002-02-28T24:00:00""#).is_err());
+        assert!(from_str(r#""2002-02-28T23:60:00""#).is_err());
+        assert!(from_str(r#""2002-02-28T23:59:61""#).is_err());
+        assert!(from_str(r#""2016-07-08T09:10:48,090""#).is_err());
+        assert!(from_str(r#""2016-07-08 09:10:48.090""#).is_err());
+        assert!(from_str(r#""2016-007-08T09:10:48.090""#).is_err());
+        assert!(from_str(r#""yyyy-mm-ddThh:mm:ss.fffffffff""#).is_err());
+        assert!(from_str(r#"0"#).is_err());
+        assert!(from_str(r#"20160708000000"#).is_err());
+        assert!(from_str(r#"{}"#).is_err());
+        assert!(from_str(r#"{"date":{"ymdf":20},"time":{"secs":0,"frac":0}}"#).is_err()); // :(
+        assert!(from_str(r#"null"#).is_err());
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::NaiveDateTime;
+    use Datelike;
+    use duration::Duration;
+    use naive::date as naive_date;
+    use naive::date::NaiveDate;
+    use std::i64;
+
+    #[test]
+    fn test_datetime_from_timestamp() {
+        let from_timestamp = |secs| NaiveDateTime::from_timestamp_opt(secs, 0);
+        let ymdhms = |y,m,d,h,n,s| NaiveDate::from_ymd(y,m,d).and_hms(h,n,s);
+        assert_eq!(from_timestamp(-1), Some(ymdhms(1969, 12, 31, 23, 59, 59)));
+        assert_eq!(from_timestamp(0), Some(ymdhms(1970, 1, 1, 0, 0, 0)));
+        assert_eq!(from_timestamp(1), Some(ymdhms(1970, 1, 1, 0, 0, 1)));
+        assert_eq!(from_timestamp(1_000_000_000), Some(ymdhms(2001, 9, 9, 1, 46, 40)));
+        assert_eq!(from_timestamp(0x7fffffff), Some(ymdhms(2038, 1, 19, 3, 14, 7)));
+        assert_eq!(from_timestamp(i64::MIN), None);
+        assert_eq!(from_timestamp(i64::MAX), None);
+    }
+
+    #[test]
+    fn test_datetime_add() {
+        fn check((y,m,d,h,n,s): (i32,u32,u32,u32,u32,u32), rhs: Duration,
+                 result: Option<(i32,u32,u32,u32,u32,u32)>) {
+            let lhs = NaiveDate::from_ymd(y, m, d).and_hms(h, n, s);
+            let sum = result.map(|(y,m,d,h,n,s)| NaiveDate::from_ymd(y, m, d).and_hms(h, n, s));
+            assert_eq!(lhs.checked_add(rhs), sum);
+            assert_eq!(lhs.checked_sub(-rhs), sum);
+        };
+
+        check((2014,5,6, 7,8,9), Duration::seconds(3600 + 60 + 1), Some((2014,5,6, 8,9,10)));
+        check((2014,5,6, 7,8,9), Duration::seconds(-(3600 + 60 + 1)), Some((2014,5,6, 6,7,8)));
+        check((2014,5,6, 7,8,9), Duration::seconds(86399), Some((2014,5,7, 7,8,8)));
+        check((2014,5,6, 7,8,9), Duration::seconds(86400 * 10), Some((2014,5,16, 7,8,9)));
+        check((2014,5,6, 7,8,9), Duration::seconds(-86400 * 10), Some((2014,4,26, 7,8,9)));
+        check((2014,5,6, 7,8,9), Duration::seconds(86400 * 10), Some((2014,5,16, 7,8,9)));
+
+        // overflow check
+        // assumes that we have correct values for MAX/MIN_DAYS_FROM_YEAR_0 from `naive::date`.
+        // (they are private constants, but the equivalence is tested in that module.)
+        let max_days_from_year_0 = naive_date::MAX - NaiveDate::from_ymd(0,1,1);
+        check((0,1,1, 0,0,0), max_days_from_year_0, Some((naive_date::MAX.year(),12,31, 0,0,0)));
+        check((0,1,1, 0,0,0), max_days_from_year_0 + Duration::seconds(86399),
+              Some((naive_date::MAX.year(),12,31, 23,59,59)));
+        check((0,1,1, 0,0,0), max_days_from_year_0 + Duration::seconds(86400), None);
+        check((0,1,1, 0,0,0), Duration::max_value(), None);
+
+        let min_days_from_year_0 = naive_date::MIN - NaiveDate::from_ymd(0,1,1);
+        check((0,1,1, 0,0,0), min_days_from_year_0, Some((naive_date::MIN.year(),1,1, 0,0,0)));
+        check((0,1,1, 0,0,0), min_days_from_year_0 - Duration::seconds(1), None);
+        check((0,1,1, 0,0,0), Duration::min_value(), None);
+    }
+
+    #[test]
+    fn test_datetime_sub() {
+        let ymdhms = |y,m,d,h,n,s| NaiveDate::from_ymd(y,m,d).and_hms(h,n,s);
+        assert_eq!(ymdhms(2014, 5, 6, 7, 8, 9) - ymdhms(2014, 5, 6, 7, 8, 9), Duration::zero());
+        assert_eq!(ymdhms(2014, 5, 6, 7, 8, 10) - ymdhms(2014, 5, 6, 7, 8, 9),
+                   Duration::seconds(1));
+        assert_eq!(ymdhms(2014, 5, 6, 7, 8, 9) - ymdhms(2014, 5, 6, 7, 8, 10),
+                   Duration::seconds(-1));
+        assert_eq!(ymdhms(2014, 5, 7, 7, 8, 9) - ymdhms(2014, 5, 6, 7, 8, 10),
+                   Duration::seconds(86399));
+        assert_eq!(ymdhms(2001, 9, 9, 1, 46, 39) - ymdhms(1970, 1, 1, 0, 0, 0),
+                   Duration::seconds(999_999_999));
+    }
+
+    #[test]
+    fn test_datetime_timestamp() {
+        let to_timestamp = |y,m,d,h,n,s| NaiveDate::from_ymd(y,m,d).and_hms(h,n,s).timestamp();
+        assert_eq!(to_timestamp(1969, 12, 31, 23, 59, 59), -1);
+        assert_eq!(to_timestamp(1970, 1, 1, 0, 0, 0), 0);
+        assert_eq!(to_timestamp(1970, 1, 1, 0, 0, 1), 1);
+        assert_eq!(to_timestamp(2001, 9, 9, 1, 46, 40), 1_000_000_000);
+        assert_eq!(to_timestamp(2038, 1, 19, 3, 14, 7), 0x7fffffff);
+    }
+
+    #[test]
+    fn test_datetime_from_str() {
+        // valid cases
+        let valid = [
+            "2015-2-18T23:16:9.15",
+            "-77-02-18T23:16:09",
+            "  +82701  -  05  -  6  T  15  :  9  : 60.898989898989   ",
+        ];
+        for &s in &valid {
+            let d = match s.parse::<NaiveDateTime>() {
+                Ok(d) => d,
+                Err(e) => panic!("parsing `{}` has failed: {}", s, e)
+            };
+            let s_ = format!("{:?}", d);
+            // `s` and `s_` may differ, but `s.parse()` and `s_.parse()` must be same
+            let d_ = match s_.parse::<NaiveDateTime>() {
+                Ok(d) => d,
+                Err(e) => panic!("`{}` is parsed into `{:?}`, but reparsing that has failed: {}",
+                                 s, d, e)
+            };
+            assert!(d == d_, "`{}` is parsed into `{:?}`, but reparsed result \
+                              `{:?}` does not match", s, d, d_);
+        }
+
+        // some invalid cases
+        // since `ParseErrorKind` is private, all we can do is to check if there was an error
+        assert!("".parse::<NaiveDateTime>().is_err());
+        assert!("x".parse::<NaiveDateTime>().is_err());
+        assert!("15".parse::<NaiveDateTime>().is_err());
+        assert!("15:8:9".parse::<NaiveDateTime>().is_err());
+        assert!("15-8-9".parse::<NaiveDateTime>().is_err());
+        assert!("2015-15-15T15:15:15".parse::<NaiveDateTime>().is_err());
+        assert!("2012-12-12T12:12:12x".parse::<NaiveDateTime>().is_err());
+        assert!("2012-123-12T12:12:12".parse::<NaiveDateTime>().is_err());
+        assert!("+ 82701-123-12T12:12:12".parse::<NaiveDateTime>().is_err());
+        assert!("+802701-123-12T12:12:12".parse::<NaiveDateTime>().is_err()); // out-of-bound
+    }
+
+    #[test]
+    fn test_datetime_parse_from_str() {
+        let ymdhms = |y,m,d,h,n,s| NaiveDate::from_ymd(y,m,d).and_hms(h,n,s);
+        assert_eq!(NaiveDateTime::parse_from_str("2014-5-7T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
+                   Ok(ymdhms(2014, 5, 7, 12, 34, 56))); // ignore offset
+        assert_eq!(NaiveDateTime::parse_from_str("2015-W06-1 000000", "%G-W%V-%u%H%M%S"),
+                   Ok(ymdhms(2015, 2, 2, 0, 0, 0)));
+        assert_eq!(NaiveDateTime::parse_from_str("Fri, 09 Aug 2013 23:54:35 GMT",
+                                                 "%a, %d %b %Y %H:%M:%S GMT"),
+                   Ok(ymdhms(2013, 8, 9, 23, 54, 35)));
+        assert!(NaiveDateTime::parse_from_str("Sat, 09 Aug 2013 23:54:35 GMT",
+                                              "%a, %d %b %Y %H:%M:%S GMT").is_err());
+        assert!(NaiveDateTime::parse_from_str("2014-5-7 12:3456", "%Y-%m-%d %H:%M:%S").is_err());
+        assert!(NaiveDateTime::parse_from_str("12:34:56", "%H:%M:%S").is_err()); // insufficient
+    }
+
+    #[test]
+    fn test_datetime_format() {
+        let dt = NaiveDate::from_ymd(2010, 9, 8).and_hms_milli(7, 6, 54, 321);
+        assert_eq!(dt.format("%c").to_string(), "Wed Sep  8 07:06:54 2010");
+        assert_eq!(dt.format("%s").to_string(), "1283929614");
+        assert_eq!(dt.format("%t%n%%%n%t").to_string(), "\t\n%\n\t");
+
+        // a horror of leap second: coming near to you.
+        let dt = NaiveDate::from_ymd(2012, 6, 30).and_hms_milli(23, 59, 59, 1_000);
+        assert_eq!(dt.format("%c").to_string(), "Sat Jun 30 23:59:60 2012");
+        assert_eq!(dt.format("%s").to_string(), "1341100799"); // not 1341100800, it's intentional.
+    }
+
+    #[test]
+    fn test_datetime_add_sub_invariant() { // issue #37
+        let base = NaiveDate::from_ymd(2000, 1, 1).and_hms(0, 0, 0);
+        let t = -946684799990000;
+        let time = base + Duration::microseconds(t);
+        assert_eq!(t, (time - base).num_microseconds().unwrap());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/naive/time.rs
@@ -0,0 +1,1164 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+//! ISO 8601 time without timezone.
+//!
+//! # Leap Second Handling
+//!
+//! Since 1960s, the manmade atomic clock has been so accurate that
+//! it is much more accurate than Earth's own motion.
+//! It became desirable to define the civil time in terms of the atomic clock,
+//! but that risks the desynchronization of the civil time from Earth.
+//! To account for this, the designers of the Coordinated Universal Time (UTC)
+//! made that the UTC should be kept within 0.9 seconds of the observed Earth-bound time.
+//! When the mean solar day is longer than the ideal (86,400 seconds),
+//! the error slowly accumulates and it is necessary to add a **leap second**
+//! to slow the UTC down a bit.
+//! (We may also remove a second to speed the UTC up a bit, but it never happened.)
+//! The leap second, if any, follows 23:59:59 of June 30 or December 31 in the UTC.
+//!
+//! Fast forward to the 21st century,
+//! we have seen 26 leap seconds from January 1972 to December 2015.
+//! Yes, 26 seconds. Probably you can read this paragraph within 26 seconds.
+//! But those 26 seconds, and possibly more in the future, are never predictable,
+//! and whether to add a leap second or not is known only before 6 months.
+//! Internet-based clocks (via NTP) do account for known leap seconds,
+//! but the system API normally doesn't (and often can't, with no network connection)
+//! and there is no reliable way to retrieve leap second information.
+//!
+//! Chrono does not try to accurately implement leap seconds; it is impossible.
+//! Rather, **it allows for leap seconds but behaves as if there are *no other* leap seconds.**
+//! Various time arithmetics will ignore any possible leap second(s)
+//! except when the operand were actually a leap second.
+//! The leap second is indicated via fractional seconds more than 1 second,
+//! so values like `NaiveTime::from_hms_milli(23, 56, 4, 1_005)` are allowed;
+//! that value would mean 5ms after the beginning of a leap second following 23:56:04.
+//! Parsing and formatting will correctly handle times that look like leap seconds,
+//! and you can then conveniently ignore leap seconds if you are not prepared for them.
+//!
+//! If you cannot tolerate this behavior,
+//! you must use a separate `TimeZone` for the International Atomic Time (TAI).
+//! TAI is like UTC but has no leap seconds, and thus slightly differs from UTC.
+//! Chrono 0.2 does not provide such implementation, but it is planned for 0.3.
+
+use std::{str, fmt, hash};
+use std::ops::{Add, Sub};
+
+use Timelike;
+use div::div_mod_floor;
+use duration::Duration;
+use format::{Item, Numeric, Pad, Fixed};
+use format::{parse, Parsed, ParseError, ParseResult, DelayedFormat, StrftimeItems};
+
+/// ISO 8601 time without timezone.
+/// Allows for the nanosecond precision and optional leap second representation.
+///
+/// <a name="leap-second-what?"></a>
+/// Chrono has a notable policy on the [leap second handling](./index.html#leap-second-handling),
+/// designed to be maximally useful for typical users.
+#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]
+pub struct NaiveTime {
+    secs: u32,
+    frac: u32,
+}
+
+impl NaiveTime {
+    /// Makes a new `NaiveTime` from the serialized representation.
+    /// Used for serialization formats.
+    #[cfg(feature = "rustc-serialize")]
+    fn from_serialized(secs: u32, frac: u32) -> Option<NaiveTime> {
+        // check if the values are in the range
+        if secs >= 86400 { return None; }
+        if frac >= 2_000_000_000 { return None; }
+
+        let time = NaiveTime { secs: secs, frac: frac };
+        Some(time)
+    }
+
+    /// Returns a serialized representation of this `NaiveDate`.
+    #[cfg(feature = "rustc-serialize")]
+    fn to_serialized(&self) -> (u32, u32) {
+        (self.secs, self.frac)
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute and second.
+    ///
+    /// No [leap second](./index.html#leap-second-handling) is allowed here;
+    /// use `NaiveTime::from_hms_*` methods with a subsecond parameter instead.
+    ///
+    /// Panics on invalid hour, minute and/or second.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let t = NaiveTime::from_hms(23, 56, 4);
+    /// assert_eq!(t.hour(), 23);
+    /// assert_eq!(t.minute(), 56);
+    /// assert_eq!(t.second(), 4);
+    /// assert_eq!(t.nanosecond(), 0);
+    /// ~~~~
+    #[inline]
+    pub fn from_hms(hour: u32, min: u32, sec: u32) -> NaiveTime {
+        NaiveTime::from_hms_opt(hour, min, sec).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute and second.
+    ///
+    /// No [leap second](./index.html#leap-second-handling) is allowed here;
+    /// use `NaiveTime::from_hms_*_opt` methods with a subsecond parameter instead.
+    ///
+    /// Returns `None` on invalid hour, minute and/or second.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// let hms = |h,m,s| NaiveTime::from_hms_opt(h, m, s);
+    /// assert!(hms(0, 0, 0).is_some());
+    /// assert!(hms(23, 59, 59).is_some());
+    /// assert!(hms(24, 0, 0).is_none());
+    /// assert!(hms(23, 60, 0).is_none());
+    /// assert!(hms(23, 59, 60).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_opt(hour: u32, min: u32, sec: u32) -> Option<NaiveTime> {
+        NaiveTime::from_hms_nano_opt(hour, min, sec, 0)
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute, second and millisecond.
+    ///
+    /// The millisecond part can exceed 1,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Panics on invalid hour, minute, second and/or millisecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let t = NaiveTime::from_hms_milli(23, 56, 4, 12);
+    /// assert_eq!(t.hour(), 23);
+    /// assert_eq!(t.minute(), 56);
+    /// assert_eq!(t.second(), 4);
+    /// assert_eq!(t.nanosecond(), 12_000_000);
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_milli(hour: u32, min: u32, sec: u32, milli: u32) -> NaiveTime {
+        NaiveTime::from_hms_milli_opt(hour, min, sec, milli).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute, second and millisecond.
+    ///
+    /// The millisecond part can exceed 1,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or millisecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// let hmsm = |h,m,s,milli| NaiveTime::from_hms_milli_opt(h, m, s, milli);
+    /// assert!(hmsm(0, 0, 0, 0).is_some());
+    /// assert!(hmsm(23, 59, 59, 999).is_some());
+    /// assert!(hmsm(23, 59, 59, 1_999).is_some()); // a leap second following 23:59:59
+    /// assert!(hmsm(24, 0, 0, 0).is_none());
+    /// assert!(hmsm(23, 60, 0, 0).is_none());
+    /// assert!(hmsm(23, 59, 60, 0).is_none());
+    /// assert!(hmsm(23, 59, 59, 2_000).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_milli_opt(hour: u32, min: u32, sec: u32, milli: u32) -> Option<NaiveTime> {
+        milli.checked_mul(1_000_000)
+             .and_then(|nano| NaiveTime::from_hms_nano_opt(hour, min, sec, nano))
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute, second and microsecond.
+    ///
+    /// The microsecond part can exceed 1,000,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Panics on invalid hour, minute, second and/or microsecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let t = NaiveTime::from_hms_micro(23, 56, 4, 12_345);
+    /// assert_eq!(t.hour(), 23);
+    /// assert_eq!(t.minute(), 56);
+    /// assert_eq!(t.second(), 4);
+    /// assert_eq!(t.nanosecond(), 12_345_000);
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> NaiveTime {
+        NaiveTime::from_hms_micro_opt(hour, min, sec, micro).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute, second and microsecond.
+    ///
+    /// The microsecond part can exceed 1,000,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or microsecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// let hmsu = |h,m,s,micro| NaiveTime::from_hms_micro_opt(h, m, s, micro);
+    /// assert!(hmsu(0, 0, 0, 0).is_some());
+    /// assert!(hmsu(23, 59, 59, 999_999).is_some());
+    /// assert!(hmsu(23, 59, 59, 1_999_999).is_some()); // a leap second following 23:59:59
+    /// assert!(hmsu(24, 0, 0, 0).is_none());
+    /// assert!(hmsu(23, 60, 0, 0).is_none());
+    /// assert!(hmsu(23, 59, 60, 0).is_none());
+    /// assert!(hmsu(23, 59, 59, 2_000_000).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_micro_opt(hour: u32, min: u32, sec: u32, micro: u32) -> Option<NaiveTime> {
+        micro.checked_mul(1_000)
+             .and_then(|nano| NaiveTime::from_hms_nano_opt(hour, min, sec, nano))
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute, second and nanosecond.
+    ///
+    /// The nanosecond part can exceed 1,000,000,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Panics on invalid hour, minute, second and/or nanosecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let t = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(t.hour(), 23);
+    /// assert_eq!(t.minute(), 56);
+    /// assert_eq!(t.second(), 4);
+    /// assert_eq!(t.nanosecond(), 12_345_678);
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_nano(hour: u32, min: u32, sec: u32, nano: u32) -> NaiveTime {
+        NaiveTime::from_hms_nano_opt(hour, min, sec, nano).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveTime` from hour, minute, second and nanosecond.
+    ///
+    /// The nanosecond part can exceed 1,000,000,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid hour, minute, second and/or nanosecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// let hmsn = |h,m,s,nano| NaiveTime::from_hms_nano_opt(h, m, s, nano);
+    /// assert!(hmsn(0, 0, 0, 0).is_some());
+    /// assert!(hmsn(23, 59, 59, 999_999_999).is_some());
+    /// assert!(hmsn(23, 59, 59, 1_999_999_999).is_some()); // a leap second following 23:59:59
+    /// assert!(hmsn(24, 0, 0, 0).is_none());
+    /// assert!(hmsn(23, 60, 0, 0).is_none());
+    /// assert!(hmsn(23, 59, 60, 0).is_none());
+    /// assert!(hmsn(23, 59, 59, 2_000_000_000).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn from_hms_nano_opt(hour: u32, min: u32, sec: u32, nano: u32) -> Option<NaiveTime> {
+        if hour >= 24 || min >= 60 || sec >= 60 || nano >= 2_000_000_000 { return None; }
+        let secs = hour * 3600 + min * 60 + sec;
+        Some(NaiveTime { secs: secs, frac: nano })
+    }
+
+    /// Makes a new `NaiveTime` from the number of seconds since midnight and nanosecond.
+    ///
+    /// The nanosecond part can exceed 1,000,000,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Panics on invalid number of seconds and/or nanosecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let t = NaiveTime::from_num_seconds_from_midnight(86164, 12_345_678);
+    /// assert_eq!(t.hour(), 23);
+    /// assert_eq!(t.minute(), 56);
+    /// assert_eq!(t.second(), 4);
+    /// assert_eq!(t.nanosecond(), 12_345_678);
+    /// ~~~~
+    #[inline]
+    pub fn from_num_seconds_from_midnight(secs: u32, nano: u32) -> NaiveTime {
+        NaiveTime::from_num_seconds_from_midnight_opt(secs, nano).expect("invalid time")
+    }
+
+    /// Makes a new `NaiveTime` from the number of seconds since midnight and nanosecond.
+    ///
+    /// The nanosecond part can exceed 1,000,000,000
+    /// in order to represent the [leap second](./index.html#leap-second-handling).
+    ///
+    /// Returns `None` on invalid number of seconds and/or nanosecond.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// let secs = |secs,nano| NaiveTime::from_num_seconds_from_midnight_opt(secs, nano);
+    /// assert!(secs(0, 0).is_some());
+    /// assert!(secs(86399, 999_999_999).is_some());
+    /// assert!(secs(86399, 1_999_999_999).is_some()); // a leap second following 23:59:59
+    /// assert!(secs(86400, 0).is_none());
+    /// assert!(secs(86399, 2_000_000_000).is_none());
+    /// ~~~~
+    #[inline]
+    pub fn from_num_seconds_from_midnight_opt(secs: u32, nano: u32) -> Option<NaiveTime> {
+        if secs >= 86400 || nano >= 2_000_000_000 { return None; }
+        Some(NaiveTime { secs: secs, frac: nano })
+    }
+
+    /// Parses a string with the specified format string and returns a new `NaiveTime`.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// assert_eq!(NaiveTime::parse_from_str("23:56:04", "%H:%M:%S"),
+    ///            Ok(NaiveTime::from_hms(23, 56, 4)));
+    /// assert_eq!(NaiveTime::parse_from_str("pm012345.6789", "%p%I%M%S%.f"),
+    ///            Ok(NaiveTime::from_hms_micro(13, 23, 45, 678_900)));
+    /// ~~~~
+    ///
+    /// Date and offset is ignored for the purpose of parsing.
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveTime;
+    /// assert_eq!(NaiveTime::parse_from_str("2014-5-17T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
+    ///            Ok(NaiveTime::from_hms(12, 34, 56)));
+    /// ~~~~
+    ///
+    /// [Leap seconds](./index.html#leap-second-handling) are correctly handled by
+    /// treating any time of the form `hh:mm:60` as a leap second.
+    /// (This equally applies to the formatting, so the round trip is possible.)
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveTime;
+    /// assert_eq!(NaiveTime::parse_from_str("08:59:60.123", "%H:%M:%S%.f"),
+    ///            Ok(NaiveTime::from_hms_milli(8, 59, 59, 1_123)));
+    /// ~~~~
+    ///
+    /// Missing seconds are assumed to be zero,
+    /// but out-of-bound times or insufficient fields are errors otherwise.
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveTime;
+    /// assert_eq!(NaiveTime::parse_from_str("7:15", "%H:%M"),
+    ///            Ok(NaiveTime::from_hms(7, 15, 0)));
+    ///
+    /// assert!(NaiveTime::parse_from_str("04m33s", "%Mm%Ss").is_err());
+    /// assert!(NaiveTime::parse_from_str("12", "%H").is_err());
+    /// assert!(NaiveTime::parse_from_str("17:60", "%H:%M").is_err());
+    /// assert!(NaiveTime::parse_from_str("24:00:00", "%H:%M:%S").is_err());
+    /// ~~~~
+    ///
+    /// All parsed fields should be consistent to each other, otherwise it's an error.
+    /// Here `%H` is for 24-hour clocks, unlike `%I`,
+    /// and thus can be independently determined without AM/PM.
+    ///
+    /// ~~~~
+    /// # use chrono::NaiveTime;
+    /// assert!(NaiveTime::parse_from_str("13:07 AM", "%H:%M %p").is_err());
+    /// ~~~~
+    pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveTime> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, StrftimeItems::new(fmt)));
+        parsed.to_naive_time()
+    }
+
+    /// Formats the time with the specified formatting items.
+    /// Otherwise it is same to the ordinary [`format`](#method.format) method.
+    ///
+    /// The `Iterator` of items should be `Clone`able,
+    /// since the resulting `DelayedFormat` value may be formatted multiple times.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    /// use chrono::format::strftime::StrftimeItems;
+    ///
+    /// let fmt = StrftimeItems::new("%H:%M:%S");
+    /// let t = NaiveTime::from_hms(23, 56, 4);
+    /// assert_eq!(t.format_with_items(fmt.clone()).to_string(), "23:56:04");
+    /// assert_eq!(t.format("%H:%M:%S").to_string(), "23:56:04");
+    /// ~~~~
+    #[inline]
+    pub fn format_with_items<'a, I>(&self, items: I) -> DelayedFormat<I>
+            where I: Iterator<Item=Item<'a>> + Clone {
+        DelayedFormat::new(None, Some(self.clone()), items)
+    }
+
+    /// Formats the time with the specified format string.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    ///
+    /// This returns a `DelayedFormat`,
+    /// which gets converted to a string only when actual formatting happens.
+    /// You may use the `to_string` method to get a `String`,
+    /// or just feed it into `print!` and other formatting macros.
+    /// (In this way it avoids the redundant memory allocation.)
+    ///
+    /// A wrong format string does *not* issue an error immediately.
+    /// Rather, converting or formatting the `DelayedFormat` fails.
+    /// You are recommended to immediately use `DelayedFormat` for this reason.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::NaiveTime;
+    ///
+    /// let t = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(t.format("%H:%M:%S").to_string(), "23:56:04");
+    /// assert_eq!(t.format("%H:%M:%S%.6f").to_string(), "23:56:04.012345");
+    /// assert_eq!(t.format("%-I:%M %p").to_string(), "11:56 PM");
+    /// ~~~~
+    #[inline]
+    pub fn format<'a>(&self, fmt: &'a str) -> DelayedFormat<StrftimeItems<'a>> {
+        self.format_with_items(StrftimeItems::new(fmt))
+    }
+
+    /// Returns a triple of the hour, minute and second numbers.
+    fn hms(&self) -> (u32, u32, u32) {
+        let (mins, sec) = div_mod_floor(self.secs, 60);
+        let (hour, min) = div_mod_floor(mins, 60);
+        (hour, min, sec)
+    }
+}
+
+impl Timelike for NaiveTime {
+    /// Returns the hour number from 0 to 23.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// assert_eq!(NaiveTime::from_hms(0, 0, 0).hour(), 0);
+    /// assert_eq!(NaiveTime::from_hms_nano(23, 56, 4, 12_345_678).hour(), 23);
+    /// ~~~~
+    #[inline]
+    fn hour(&self) -> u32 {
+        self.hms().0
+    }
+
+    /// Returns the minute number from 0 to 59.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// assert_eq!(NaiveTime::from_hms(0, 0, 0).minute(), 0);
+    /// assert_eq!(NaiveTime::from_hms_nano(23, 56, 4, 12_345_678).minute(), 56);
+    /// ~~~~
+    #[inline]
+    fn minute(&self) -> u32 {
+        self.hms().1
+    }
+
+    /// Returns the second number from 0 to 59.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// assert_eq!(NaiveTime::from_hms(0, 0, 0).second(), 0);
+    /// assert_eq!(NaiveTime::from_hms_nano(23, 56, 4, 12_345_678).second(), 4);
+    /// ~~~~
+    ///
+    /// This method never returns 60 even when it is a leap second.
+    /// ([Why?](./index.html#leap-second-handling))
+    /// Use the proper [formatting method](#method.format) to get a human-readable representation.
+    ///
+    /// ~~~~
+    /// # use chrono::{NaiveTime, Timelike};
+    /// let leap = NaiveTime::from_hms_milli(23, 59, 59, 1_000);
+    /// assert_eq!(leap.second(), 59);
+    /// assert_eq!(leap.format("%H:%M:%S").to_string(), "23:59:60");
+    /// ~~~~
+    #[inline]
+    fn second(&self) -> u32 {
+        self.hms().2
+    }
+
+    /// Returns the number of nanoseconds since the whole non-leap second.
+    /// The range from 1,000,000,000 to 1,999,999,999 represents
+    /// the [leap second](./naive/time/index.html#leap-second-handling).
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// assert_eq!(NaiveTime::from_hms(0, 0, 0).nanosecond(), 0);
+    /// assert_eq!(NaiveTime::from_hms_nano(23, 56, 4, 12_345_678).nanosecond(), 12_345_678);
+    /// ~~~~
+    ///
+    /// Leap seconds may have seemingly out-of-range return values.
+    /// You can reduce the range with `time.nanosecond() % 1_000_000_000`, or
+    /// use the proper [formatting method](#method.format) to get a human-readable representation.
+    ///
+    /// ~~~~
+    /// # use chrono::{NaiveTime, Timelike};
+    /// let leap = NaiveTime::from_hms_milli(23, 59, 59, 1_000);
+    /// assert_eq!(leap.nanosecond(), 1_000_000_000);
+    /// assert_eq!(leap.format("%H:%M:%S%.9f").to_string(), "23:59:60.000000000");
+    /// ~~~~
+    #[inline]
+    fn nanosecond(&self) -> u32 {
+        self.frac
+    }
+
+    /// Makes a new `NaiveTime` with the hour number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveTime` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let dt = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(dt.with_hour(7), Some(NaiveTime::from_hms_nano(7, 56, 4, 12_345_678)));
+    /// assert_eq!(dt.with_hour(24), None);
+    /// ~~~~
+    #[inline]
+    fn with_hour(&self, hour: u32) -> Option<NaiveTime> {
+        if hour >= 24 { return None; }
+        let secs = hour * 3600 + self.secs % 3600;
+        Some(NaiveTime { secs: secs, ..*self })
+    }
+
+    /// Makes a new `NaiveTime` with the minute number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveTime` would be invalid.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let dt = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(dt.with_minute(45), Some(NaiveTime::from_hms_nano(23, 45, 4, 12_345_678)));
+    /// assert_eq!(dt.with_minute(60), None);
+    /// ~~~~
+    #[inline]
+    fn with_minute(&self, min: u32) -> Option<NaiveTime> {
+        if min >= 60 { return None; }
+        let secs = self.secs / 3600 * 3600 + min * 60 + self.secs % 60;
+        Some(NaiveTime { secs: secs, ..*self })
+    }
+
+    /// Makes a new `NaiveTime` with the second number changed.
+    ///
+    /// Returns `None` when the resulting `NaiveTime` would be invalid.
+    /// As with the [`second`](#method.second) method,
+    /// the input range is restricted to 0 through 59.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let dt = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(dt.with_second(17), Some(NaiveTime::from_hms_nano(23, 56, 17, 12_345_678)));
+    /// assert_eq!(dt.with_second(60), None);
+    /// ~~~~
+    #[inline]
+    fn with_second(&self, sec: u32) -> Option<NaiveTime> {
+        if sec >= 60 { return None; }
+        let secs = self.secs / 60 * 60 + sec;
+        Some(NaiveTime { secs: secs, ..*self })
+    }
+
+    /// Makes a new `NaiveTime` with nanoseconds since the whole non-leap second changed.
+    ///
+    /// Returns `None` when the resulting `NaiveTime` would be invalid.
+    /// As with the [`nanosecond`](#method.nanosecond) method,
+    /// the input range can exceed 1,000,000,000 for leap seconds.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// let dt = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(dt.with_nanosecond(333_333_333),
+    ///            Some(NaiveTime::from_hms_nano(23, 56, 4, 333_333_333)));
+    /// assert_eq!(dt.with_nanosecond(2_000_000_000), None);
+    /// ~~~~
+    ///
+    /// Leap seconds can theoretically follow *any* whole second.
+    /// The following would be a proper leap second at the time zone offset of UTC-00:03:57
+    /// (there are several historical examples comparable to this "non-sense" offset),
+    /// and therefore is allowed.
+    ///
+    /// ~~~~
+    /// # use chrono::{NaiveTime, Timelike};
+    /// # let dt = NaiveTime::from_hms_nano(23, 56, 4, 12_345_678);
+    /// assert_eq!(dt.with_nanosecond(1_333_333_333),
+    ///            Some(NaiveTime::from_hms_nano(23, 56, 4, 1_333_333_333)));
+    /// ~~~~
+    #[inline]
+    fn with_nanosecond(&self, nano: u32) -> Option<NaiveTime> {
+        if nano >= 2_000_000_000 { return None; }
+        Some(NaiveTime { frac: nano, ..*self })
+    }
+
+    /// Returns the number of non-leap seconds past the last midnight.
+    ///
+    /// # Example
+    ///
+    /// ~~~~
+    /// use chrono::{NaiveTime, Timelike};
+    ///
+    /// assert_eq!(NaiveTime::from_hms(1, 2, 3).num_seconds_from_midnight(),
+    ///            3723);
+    /// assert_eq!(NaiveTime::from_hms_nano(23, 56, 4, 12_345_678).num_seconds_from_midnight(),
+    ///            86164);
+    /// assert_eq!(NaiveTime::from_hms_milli(23, 59, 59, 1_000).num_seconds_from_midnight(),
+    ///            86399);
+    /// ~~~~
+    #[inline]
+    fn num_seconds_from_midnight(&self) -> u32 {
+        self.secs // do not repeat the calculation!
+    }
+}
+
+/// `NaiveTime` can be used as a key to the hash maps (in principle).
+///
+/// Practically this also takes account of fractional seconds, so it is not recommended.
+/// (For the obvious reason this also distinguishes leap seconds from non-leap seconds.)
+impl hash::Hash for NaiveTime {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) {
+        self.secs.hash(state);
+        self.frac.hash(state);
+    }
+}
+
+impl Add<Duration> for NaiveTime {
+    type Output = NaiveTime;
+
+    fn add(self, rhs: Duration) -> NaiveTime {
+        // there is no direct interface in `Duration` to get only the nanosecond part,
+        // so we need to do the additional calculation here.
+        let mut rhssecs = rhs.num_seconds();
+        let mut rhs2 = rhs - Duration::seconds(rhssecs);
+        if rhs2 < Duration::zero() { // possible when rhs < 0
+            rhssecs -= 1;
+            rhs2 = rhs2 + Duration::seconds(1);
+        }
+        debug_assert!(rhs2 >= Duration::zero());
+        let mut secs = self.secs + (rhssecs % 86400 + 86400) as u32;
+        let mut nanos = self.frac + rhs2.num_nanoseconds().unwrap() as u32;
+
+        // always ignore leap seconds after the current whole second
+        let maxnanos = if self.frac >= 1_000_000_000 {2_000_000_000} else {1_000_000_000};
+
+        if nanos >= maxnanos {
+            nanos -= maxnanos;
+            secs += 1;
+        }
+        NaiveTime { secs: secs % 86400, frac: nanos }
+    }
+}
+
+impl Sub<NaiveTime> for NaiveTime {
+    type Output = Duration;
+
+    fn sub(self, rhs: NaiveTime) -> Duration {
+        // the number of whole non-leap seconds
+        let secs = self.secs as i64 - rhs.secs as i64 - 1;
+
+        // the fractional second from the rhs to the next non-leap second
+        let maxnanos = if rhs.frac >= 1_000_000_000 {2_000_000_000} else {1_000_000_000};
+        let nanos1 = maxnanos - rhs.frac;
+
+        // the fractional second from the last leap or non-leap second to the lhs
+        let lastfrac = if self.frac >= 1_000_000_000 {1_000_000_000} else {0};
+        let nanos2 = self.frac - lastfrac;
+
+        Duration::seconds(secs) + Duration::nanoseconds(nanos1 as i64 + nanos2 as i64)
+    }
+}
+
+impl Sub<Duration> for NaiveTime {
+    type Output = NaiveTime;
+
+    #[inline]
+    fn sub(self, rhs: Duration) -> NaiveTime { self.add(-rhs) }
+}
+
+impl fmt::Debug for NaiveTime {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let (hour, min, sec) = self.hms();
+        let (sec, nano) = if self.frac >= 1_000_000_000 {
+            (sec + 1, self.frac - 1_000_000_000)
+        } else {
+            (sec, self.frac)
+        };
+
+        try!(write!(f, "{:02}:{:02}:{:02}", hour, min, sec));
+        if nano == 0 {
+            Ok(())
+        } else if nano % 1_000_000 == 0 {
+            write!(f, ".{:03}", nano / 1_000_000)
+        } else if nano % 1_000 == 0 {
+            write!(f, ".{:06}", nano / 1_000)
+        } else {
+            write!(f, ".{:09}", nano)
+        }
+    }
+}
+
+impl fmt::Display for NaiveTime {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Debug::fmt(self, f) }
+}
+
+impl str::FromStr for NaiveTime {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> ParseResult<NaiveTime> {
+        const ITEMS: &'static [Item<'static>] = &[
+            Item::Space(""), Item::Numeric(Numeric::Hour, Pad::Zero),
+            Item::Space(""), Item::Literal(":"),
+            Item::Space(""), Item::Numeric(Numeric::Minute, Pad::Zero),
+            Item::Space(""), Item::Literal(":"),
+            Item::Space(""), Item::Numeric(Numeric::Second, Pad::Zero),
+            Item::Fixed(Fixed::Nanosecond), Item::Space(""),
+        ];
+
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, ITEMS.iter().cloned()));
+        parsed.to_naive_time()
+    }
+}
+
+#[cfg(feature = "rustc-serialize")]
+mod rustc_serialize {
+    use super::NaiveTime;
+    use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
+
+    // TODO the current serialization format is NEVER intentionally defined.
+    // this basically follows the automatically generated implementation for those traits,
+    // plus manual verification steps for avoiding security problem.
+    // in the future it is likely to be redefined to more sane and reasonable format.
+
+    impl Encodable for NaiveTime {
+        fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+            let (secs, frac) = self.to_serialized();
+            s.emit_struct("NaiveTime", 2, |s| {
+                try!(s.emit_struct_field("secs", 0, |s| secs.encode(s)));
+                try!(s.emit_struct_field("frac", 1, |s| frac.encode(s)));
+                Ok(())
+            })
+        }
+    }
+
+    impl Decodable for NaiveTime {
+        fn decode<D: Decoder>(d: &mut D) -> Result<NaiveTime, D::Error> {
+            d.read_struct("NaiveTime", 2, |d| {
+                let secs = try!(d.read_struct_field("secs", 0, Decodable::decode));
+                let frac = try!(d.read_struct_field("frac", 1, Decodable::decode));
+                NaiveTime::from_serialized(secs, frac).ok_or_else(|| d.error("invalid time"))
+            })
+        }
+    }
+
+    #[test]
+    fn test_encodable() {
+        use rustc_serialize::json::encode;
+
+        assert_eq!(encode(&NaiveTime::from_hms(0, 0, 0)).ok(),
+                   Some(r#"{"secs":0,"frac":0}"#.into()));
+        assert_eq!(encode(&NaiveTime::from_hms_milli(0, 0, 0, 950)).ok(),
+                   Some(r#"{"secs":0,"frac":950000000}"#.into()));
+        assert_eq!(encode(&NaiveTime::from_hms_milli(0, 0, 59, 1_000)).ok(),
+                   Some(r#"{"secs":59,"frac":1000000000}"#.into()));
+        assert_eq!(encode(&NaiveTime::from_hms(0, 1, 2)).ok(),
+                   Some(r#"{"secs":62,"frac":0}"#.into()));
+        assert_eq!(encode(&NaiveTime::from_hms(7, 8, 9)).ok(),
+                   Some(r#"{"secs":25689,"frac":0}"#.into()));
+        assert_eq!(encode(&NaiveTime::from_hms_micro(12, 34, 56, 789)).ok(),
+                   Some(r#"{"secs":45296,"frac":789000}"#.into()));
+        assert_eq!(encode(&NaiveTime::from_hms_nano(23, 59, 59, 1_999_999_999)).ok(),
+                   Some(r#"{"secs":86399,"frac":1999999999}"#.into()));
+    }
+
+    #[test]
+    fn test_decodable() {
+        use rustc_serialize::json;
+
+        let decode = |s: &str| json::decode::<NaiveTime>(s);
+
+        assert_eq!(decode(r#"{"secs":0,"frac":0}"#).ok(),
+                   Some(NaiveTime::from_hms(0, 0, 0)));
+        assert_eq!(decode(r#"{"frac":950000000,"secs":0}"#).ok(),
+                   Some(NaiveTime::from_hms_milli(0, 0, 0, 950)));
+        assert_eq!(decode(r#"{"secs":59,"frac":1000000000}"#).ok(),
+                   Some(NaiveTime::from_hms_milli(0, 0, 59, 1_000)));
+        assert_eq!(decode(r#"{"frac": 0,
+                              "secs": 62}"#).ok(),
+                   Some(NaiveTime::from_hms(0, 1, 2)));
+        assert_eq!(decode(r#"{"secs":25689,"frac":0}"#).ok(),
+                   Some(NaiveTime::from_hms(7, 8, 9)));
+        assert_eq!(decode(r#"{"secs":45296,"frac":789000}"#).ok(),
+                   Some(NaiveTime::from_hms_micro(12, 34, 56, 789)));
+        assert_eq!(decode(r#"{"secs":86399,"frac":1999999999}"#).ok(),
+                   Some(NaiveTime::from_hms_nano(23, 59, 59, 1_999_999_999)));
+
+        // bad formats
+        assert!(decode(r#"{"secs":0,"frac":-1}"#).is_err());
+        assert!(decode(r#"{"secs":-1,"frac":0}"#).is_err());
+        assert!(decode(r#"{"secs":86400,"frac":0}"#).is_err());
+        assert!(decode(r#"{"secs":0,"frac":2000000000}"#).is_err());
+        assert!(decode(r#"{"secs":0}"#).is_err());
+        assert!(decode(r#"{"frac":0}"#).is_err());
+        assert!(decode(r#"{"secs":0.3,"frac":0}"#).is_err());
+        assert!(decode(r#"{"secs":0,"frac":0.4}"#).is_err());
+        assert!(decode(r#"{}"#).is_err());
+        assert!(decode(r#"0"#).is_err());
+        assert!(decode(r#"86399"#).is_err());
+        assert!(decode(r#""string""#).is_err());
+        assert!(decode(r#""12:34:56""#).is_err()); // :(
+        assert!(decode(r#""12:34:56.789""#).is_err()); // :(
+        assert!(decode(r#"null"#).is_err());
+    }
+}
+
+#[cfg(feature = "serde")]
+mod serde {
+    use super::NaiveTime;
+    use serde::{ser, de};
+
+    // TODO not very optimized for space (binary formats would want something better)
+    // TODO round-trip for general leap seconds (not just those with second = 60)
+
+    impl ser::Serialize for NaiveTime {
+        fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
+            where S: ser::Serializer
+        {
+            serializer.serialize_str(&format!("{:?}", self))
+        }
+    }
+
+    struct NaiveTimeVisitor;
+
+    impl de::Visitor for NaiveTimeVisitor {
+        type Value = NaiveTime;
+
+        fn visit_str<E>(&mut self, value: &str) -> Result<NaiveTime, E>
+            where E: de::Error
+        {
+            value.parse().map_err(|err| E::custom(format!("{}", err)))
+        }
+    }
+
+    impl de::Deserialize for NaiveTime {
+        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+            where D: de::Deserializer
+        {
+            deserializer.deserialize(NaiveTimeVisitor)
+        }
+    }
+
+    #[cfg(test)] extern crate serde_json;
+
+    #[test]
+    fn test_serde_serialize() {
+        use self::serde_json::to_string;
+
+        assert_eq!(to_string(&NaiveTime::from_hms(0, 0, 0)).ok(),
+                   Some(r#""00:00:00""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms_milli(0, 0, 0, 950)).ok(),
+                   Some(r#""00:00:00.950""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms_milli(0, 0, 59, 1_000)).ok(),
+                   Some(r#""00:00:60""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms(0, 1, 2)).ok(),
+                   Some(r#""00:01:02""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms_nano(3, 5, 7, 98765432)).ok(),
+                   Some(r#""03:05:07.098765432""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms(7, 8, 9)).ok(),
+                   Some(r#""07:08:09""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms_micro(12, 34, 56, 789)).ok(),
+                   Some(r#""12:34:56.000789""#.into()));
+        assert_eq!(to_string(&NaiveTime::from_hms_nano(23, 59, 59, 1_999_999_999)).ok(),
+                   Some(r#""23:59:60.999999999""#.into()));
+    }
+
+    #[test]
+    fn test_serde_deserialize() {
+        use self::serde_json::from_str;
+
+        let from_str = |s: &str| serde_json::from_str::<NaiveTime>(s);
+
+        assert_eq!(from_str(r#""00:00:00""#).ok(),
+                   Some(NaiveTime::from_hms(0, 0, 0)));
+        assert_eq!(from_str(r#""0:0:0""#).ok(),
+                   Some(NaiveTime::from_hms(0, 0, 0)));
+        assert_eq!(from_str(r#""00:00:00.950""#).ok(),
+                   Some(NaiveTime::from_hms_milli(0, 0, 0, 950)));
+        assert_eq!(from_str(r#""0:0:0.95""#).ok(),
+                   Some(NaiveTime::from_hms_milli(0, 0, 0, 950)));
+        assert_eq!(from_str(r#""00:00:60""#).ok(),
+                   Some(NaiveTime::from_hms_milli(0, 0, 59, 1_000)));
+        assert_eq!(from_str(r#""00:01:02""#).ok(),
+                   Some(NaiveTime::from_hms(0, 1, 2)));
+        assert_eq!(from_str(r#""03:05:07.098765432""#).ok(),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 98765432)));
+        assert_eq!(from_str(r#""07:08:09""#).ok(),
+                   Some(NaiveTime::from_hms(7, 8, 9)));
+        assert_eq!(from_str(r#""12:34:56.000789""#).ok(),
+                   Some(NaiveTime::from_hms_micro(12, 34, 56, 789)));
+        assert_eq!(from_str(r#""23:59:60.999999999""#).ok(),
+                   Some(NaiveTime::from_hms_nano(23, 59, 59, 1_999_999_999)));
+        assert_eq!(from_str(r#""23:59:60.9999999999997""#).ok(), // excess digits are ignored
+                   Some(NaiveTime::from_hms_nano(23, 59, 59, 1_999_999_999)));
+
+        // bad formats
+        assert!(from_str(r#""""#).is_err());
+        assert!(from_str(r#""000000""#).is_err());
+        assert!(from_str(r#""00:00:61""#).is_err());
+        assert!(from_str(r#""00:60:00""#).is_err());
+        assert!(from_str(r#""24:00:00""#).is_err());
+        assert!(from_str(r#""23:59:59,1""#).is_err());
+        assert!(from_str(r#""012:34:56""#).is_err());
+        assert!(from_str(r#""hh:mm:ss""#).is_err());
+        assert!(from_str(r#"0"#).is_err());
+        assert!(from_str(r#"86399"#).is_err());
+        assert!(from_str(r#"{}"#).is_err());
+        assert!(from_str(r#"{"secs":0,"frac":0}"#).is_err()); // :(
+        assert!(from_str(r#"null"#).is_err());
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::NaiveTime;
+    use Timelike;
+    use duration::Duration;
+    use std::u32;
+
+    #[test]
+    fn test_time_from_hms_milli() {
+        assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 0),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 0)));
+        assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 777),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 777_000_000)));
+        assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 1_999),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 1_999_000_000)));
+        assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 2_000), None);
+        assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 5_000), None); // overflow check
+        assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, u32::MAX), None);
+    }
+
+    #[test]
+    fn test_time_from_hms_micro() {
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 0),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 0)));
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 333),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 333_000)));
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 777_777),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 777_777_000)));
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 1_999_999),
+                   Some(NaiveTime::from_hms_nano(3, 5, 7, 1_999_999_000)));
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 2_000_000), None);
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 5_000_000), None); // overflow check
+        assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, u32::MAX), None);
+    }
+
+    #[test]
+    fn test_time_hms() {
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).hour(), 3);
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_hour(0),
+                   Some(NaiveTime::from_hms(0, 5, 7)));
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_hour(23),
+                   Some(NaiveTime::from_hms(23, 5, 7)));
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_hour(24), None);
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_hour(u32::MAX), None);
+
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).minute(), 5);
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_minute(0),
+                   Some(NaiveTime::from_hms(3, 0, 7)));
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_minute(59),
+                   Some(NaiveTime::from_hms(3, 59, 7)));
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_minute(60), None);
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_minute(u32::MAX), None);
+
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).second(), 7);
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_second(0),
+                   Some(NaiveTime::from_hms(3, 5, 0)));
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_second(59),
+                   Some(NaiveTime::from_hms(3, 5, 59)));
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_second(60), None);
+        assert_eq!(NaiveTime::from_hms(3, 5, 7).with_second(u32::MAX), None);
+    }
+
+    #[test]
+    fn test_time_add() {
+        fn check(lhs: NaiveTime, rhs: Duration, sum: NaiveTime) {
+            assert_eq!(lhs + rhs, sum);
+            //assert_eq!(rhs + lhs, sum);
+        }
+
+        let hmsm = |h,m,s,mi| NaiveTime::from_hms_milli(h, m, s, mi);
+
+        check(hmsm(3, 5, 7, 900), Duration::zero(), hmsm(3, 5, 7, 900));
+        check(hmsm(3, 5, 7, 900), Duration::milliseconds(100), hmsm(3, 5, 8, 0));
+        check(hmsm(3, 5, 7, 1_300), Duration::milliseconds(800), hmsm(3, 5, 8, 100));
+        check(hmsm(3, 5, 7, 900), Duration::seconds(86399), hmsm(3, 5, 6, 900)); // overwrap
+        check(hmsm(3, 5, 7, 900), Duration::seconds(-86399), hmsm(3, 5, 8, 900));
+        check(hmsm(3, 5, 7, 900), Duration::days(12345), hmsm(3, 5, 7, 900));
+
+        // regression tests for #37
+        check(hmsm(0, 0, 0, 0), Duration::milliseconds(-990), hmsm(23, 59, 59, 10));
+        check(hmsm(0, 0, 0, 0), Duration::milliseconds(-9990), hmsm(23, 59, 50, 10));
+    }
+
+    #[test]
+    fn test_time_sub() {
+        fn check(lhs: NaiveTime, rhs: NaiveTime, diff: Duration) {
+            // `time1 - time2 = duration` is equivalent to `time2 - time1 = -duration`
+            assert_eq!(lhs - rhs, diff);
+            assert_eq!(rhs - lhs, -diff);
+        }
+
+        let hmsm = |h,m,s,mi| NaiveTime::from_hms_milli(h, m, s, mi);
+
+        check(hmsm(3, 5, 7, 900), hmsm(3, 5, 7, 900), Duration::zero());
+        check(hmsm(3, 5, 7, 900), hmsm(3, 5, 7, 600), Duration::milliseconds(300));
+        check(hmsm(3, 5, 7, 200), hmsm(2, 4, 6, 200), Duration::seconds(3600 + 60 + 1));
+        check(hmsm(3, 5, 7, 200), hmsm(2, 4, 6, 300),
+                   Duration::seconds(3600 + 60) + Duration::milliseconds(900));
+
+        // treats the leap second as if it coincides with the prior non-leap second,
+        // as required by `time1 - time2 = duration` and `time2 - time1 = -duration` equivalence.
+        check(hmsm(3, 5, 7, 200), hmsm(3, 5, 6, 1_800), Duration::milliseconds(400));
+        check(hmsm(3, 5, 7, 1_200), hmsm(3, 5, 6, 1_800), Duration::milliseconds(400));
+        check(hmsm(3, 5, 7, 1_200), hmsm(3, 5, 6, 800), Duration::milliseconds(400));
+
+        // additional equality: `time1 + duration = time2` is equivalent to
+        // `time2 - time1 = duration` IF AND ONLY IF `time2` represents a non-leap second.
+        assert_eq!(hmsm(3, 5, 6, 800) + Duration::milliseconds(400), hmsm(3, 5, 7, 200));
+        assert_eq!(hmsm(3, 5, 6, 1_800) + Duration::milliseconds(400), hmsm(3, 5, 7, 200));
+    }
+
+    #[test]
+    fn test_time_fmt() {
+        assert_eq!(format!("{}", NaiveTime::from_hms_milli(23, 59, 59, 999)), "23:59:59.999");
+        assert_eq!(format!("{}", NaiveTime::from_hms_milli(23, 59, 59, 1_000)), "23:59:60");
+        assert_eq!(format!("{}", NaiveTime::from_hms_milli(23, 59, 59, 1_001)), "23:59:60.001");
+        assert_eq!(format!("{}", NaiveTime::from_hms_micro(0, 0, 0, 43210)), "00:00:00.043210");
+        assert_eq!(format!("{}", NaiveTime::from_hms_nano(0, 0, 0, 6543210)), "00:00:00.006543210");
+
+        // the format specifier should have no effect on `NaiveTime`
+        assert_eq!(format!("{:30}", NaiveTime::from_hms_milli(3, 5, 7, 9)), "03:05:07.009");
+    }
+
+    #[test]
+    fn test_date_from_str() {
+        // valid cases
+        let valid = [
+            "0:0:0",
+            "0:0:0.0000000",
+            "0:0:0.0000003",
+            " 4 : 3 : 2.1 ",
+            " 09:08:07 ",
+            " 9:8:07 ",
+            "23:59:60.373929310237",
+        ];
+        for &s in &valid {
+            let d = match s.parse::<NaiveTime>() {
+                Ok(d) => d,
+                Err(e) => panic!("parsing `{}` has failed: {}", s, e)
+            };
+            let s_ = format!("{:?}", d);
+            // `s` and `s_` may differ, but `s.parse()` and `s_.parse()` must be same
+            let d_ = match s_.parse::<NaiveTime>() {
+                Ok(d) => d,
+                Err(e) => panic!("`{}` is parsed into `{:?}`, but reparsing that has failed: {}",
+                                 s, d, e)
+            };
+            assert!(d == d_, "`{}` is parsed into `{:?}`, but reparsed result \
+                              `{:?}` does not match", s, d, d_);
+        }
+
+        // some invalid cases
+        // since `ParseErrorKind` is private, all we can do is to check if there was an error
+        assert!("".parse::<NaiveTime>().is_err());
+        assert!("x".parse::<NaiveTime>().is_err());
+        assert!("15".parse::<NaiveTime>().is_err());
+        assert!("15:8".parse::<NaiveTime>().is_err());
+        assert!("15:8:x".parse::<NaiveTime>().is_err());
+        assert!("15:8:9x".parse::<NaiveTime>().is_err());
+        assert!("23:59:61".parse::<NaiveTime>().is_err());
+        assert!("12:34:56.x".parse::<NaiveTime>().is_err());
+        assert!("12:34:56. 0".parse::<NaiveTime>().is_err());
+    }
+
+    #[test]
+    fn test_time_parse_from_str() {
+        let hms = |h,m,s| NaiveTime::from_hms(h,m,s);
+        assert_eq!(NaiveTime::parse_from_str("2014-5-7T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
+                   Ok(hms(12, 34, 56))); // ignore date and offset
+        assert_eq!(NaiveTime::parse_from_str("PM 12:59", "%P %H:%M"),
+                   Ok(hms(12, 59, 0)));
+        assert!(NaiveTime::parse_from_str("12:3456", "%H:%M:%S").is_err());
+    }
+
+    #[test]
+    fn test_time_format() {
+        let t = NaiveTime::from_hms_nano(3, 5, 7, 98765432);
+        assert_eq!(t.format("%H,%k,%I,%l,%P,%p").to_string(), "03, 3,03, 3,am,AM");
+        assert_eq!(t.format("%M").to_string(), "05");
+        assert_eq!(t.format("%S,%f,%.f").to_string(), "07,098765432,.098765432");
+        assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".098,.098765,.098765432");
+        assert_eq!(t.format("%R").to_string(), "03:05");
+        assert_eq!(t.format("%T,%X").to_string(), "03:05:07,03:05:07");
+        assert_eq!(t.format("%r").to_string(), "03:05:07 AM");
+        assert_eq!(t.format("%t%n%%%n%t").to_string(), "\t\n%\n\t");
+
+        let t = NaiveTime::from_hms_micro(3, 5, 7, 432100);
+        assert_eq!(t.format("%S,%f,%.f").to_string(), "07,432100000,.432100");
+        assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".432,.432100,.432100000");
+
+        let t = NaiveTime::from_hms_milli(3, 5, 7, 210);
+        assert_eq!(t.format("%S,%f,%.f").to_string(), "07,210000000,.210");
+        assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".210,.210000,.210000000");
+
+        let t = NaiveTime::from_hms(3, 5, 7);
+        assert_eq!(t.format("%S,%f,%.f").to_string(), "07,000000000,");
+        assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".000,.000000,.000000000");
+
+        // corner cases
+        assert_eq!(NaiveTime::from_hms(13, 57, 9).format("%r").to_string(), "01:57:09 PM");
+        assert_eq!(NaiveTime::from_hms_milli(23, 59, 59, 1_000).format("%X").to_string(),
+                   "23:59:60");
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/offset/fixed.rs
@@ -0,0 +1,188 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * The time zone which has a fixed offset from UTC.
+ */
+
+use std::fmt;
+
+use div::div_mod_floor;
+use duration::Duration;
+use naive::date::NaiveDate;
+use naive::datetime::NaiveDateTime;
+use super::{TimeZone, Offset, LocalResult};
+
+/// The time zone with fixed offset, from UTC-23:59:59 to UTC+23:59:59.
+#[derive(Copy, Clone, PartialEq, Eq)]
+pub struct FixedOffset {
+    local_minus_utc: i32,
+}
+
+impl FixedOffset {
+    /// Makes a new `FixedOffset` from the serialized representation.
+    /// Used for serialization formats.
+    #[cfg(feature = "rustc-serialize")]
+    fn from_serialized(secs: i32) -> Option<FixedOffset> {
+        // check if the values are in the range
+        if secs <= -86400 || 86400 <= secs { return None; }
+
+        let offset = FixedOffset { local_minus_utc: secs };
+        Some(offset)
+    }
+
+    /// Returns a serialized representation of this `FixedOffset`.
+    #[cfg(feature = "rustc-serialize")]
+    fn to_serialized(&self) -> i32 {
+        self.local_minus_utc
+    }
+
+    /// Makes a new `FixedOffset` for the Eastern Hemisphere with given timezone difference.
+    /// The negative `secs` means the Western Hemisphere.
+    ///
+    /// Panics on the out-of-bound `secs`.
+    pub fn east(secs: i32) -> FixedOffset {
+        FixedOffset::east_opt(secs).expect("FixedOffset::east out of bounds")
+    }
+
+    /// Makes a new `FixedOffset` for the Eastern Hemisphere with given timezone difference.
+    /// The negative `secs` means the Western Hemisphere.
+    ///
+    /// Returns `None` on the out-of-bound `secs`.
+    pub fn east_opt(secs: i32) -> Option<FixedOffset> {
+        if -86400 < secs && secs < 86400 {
+            Some(FixedOffset { local_minus_utc: secs })
+        } else {
+            None
+        }
+    }
+
+    /// Makes a new `FixedOffset` for the Western Hemisphere with given timezone difference.
+    /// The negative `secs` means the Eastern Hemisphere.
+    ///
+    /// Panics on the out-of-bound `secs`.
+    pub fn west(secs: i32) -> FixedOffset {
+        FixedOffset::west_opt(secs).expect("FixedOffset::west out of bounds")
+    }
+
+    /// Makes a new `FixedOffset` for the Western Hemisphere with given timezone difference.
+    /// The negative `secs` means the Eastern Hemisphere.
+    ///
+    /// Returns `None` on the out-of-bound `secs`.
+    pub fn west_opt(secs: i32) -> Option<FixedOffset> {
+        if -86400 < secs && secs < 86400 {
+            Some(FixedOffset { local_minus_utc: -secs })
+        } else {
+            None
+        }
+    }
+}
+
+impl TimeZone for FixedOffset {
+    type Offset = FixedOffset;
+
+    fn from_offset(offset: &FixedOffset) -> FixedOffset { offset.clone() }
+
+    fn offset_from_local_date(&self, _local: &NaiveDate) -> LocalResult<FixedOffset> {
+        LocalResult::Single(self.clone())
+    }
+    fn offset_from_local_datetime(&self, _local: &NaiveDateTime) -> LocalResult<FixedOffset> {
+        LocalResult::Single(self.clone())
+    }
+
+    fn offset_from_utc_date(&self, _utc: &NaiveDate) -> FixedOffset { self.clone() }
+    fn offset_from_utc_datetime(&self, _utc: &NaiveDateTime) -> FixedOffset { self.clone() }
+}
+
+impl Offset for FixedOffset {
+    fn local_minus_utc(&self) -> Duration { Duration::seconds(self.local_minus_utc as i64) }
+}
+
+impl fmt::Debug for FixedOffset {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let offset = self.local_minus_utc;
+        let (sign, offset) = if offset < 0 {('-', -offset)} else {('+', offset)};
+        let (mins, sec) = div_mod_floor(offset, 60);
+        let (hour, min) = div_mod_floor(mins, 60);
+        if sec == 0 {
+            write!(f, "{}{:02}:{:02}", sign, hour, min)
+        } else {
+            write!(f, "{}{:02}:{:02}:{:02}", sign, hour, min, sec)
+        }
+    }
+}
+
+impl fmt::Display for FixedOffset {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Debug::fmt(self, f) }
+}
+
+#[cfg(feature = "rustc-serialize")]
+mod rustc_serialize {
+    use super::FixedOffset;
+    use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
+
+    // TODO the current serialization format is NEVER intentionally defined.
+    // this basically follows the automatically generated implementation for those traits,
+    // plus manual verification steps for avoiding security problem.
+    // in the future it is likely to be redefined to more sane and reasonable format.
+
+    impl Encodable for FixedOffset {
+        fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+            let secs = self.to_serialized();
+            s.emit_struct("FixedOffset", 1, |s| {
+                try!(s.emit_struct_field("local_minus_utc", 0, |s| secs.encode(s)));
+                Ok(())
+            })
+        }
+    }
+
+    impl Decodable for FixedOffset {
+        fn decode<D: Decoder>(d: &mut D) -> Result<FixedOffset, D::Error> {
+            d.read_struct("FixedOffset", 1, |d| {
+                let secs = try!(d.read_struct_field("local_minus_utc", 0, Decodable::decode));
+                FixedOffset::from_serialized(secs).ok_or_else(|| d.error("invalid offset"))
+            })
+        }
+    }
+
+    #[test]
+    fn test_encodable() {
+        use rustc_serialize::json::encode;
+
+        assert_eq!(encode(&FixedOffset::east(0)).ok(),
+                   Some(r#"{"local_minus_utc":0}"#.into()));
+        assert_eq!(encode(&FixedOffset::east(1234)).ok(),
+                   Some(r#"{"local_minus_utc":1234}"#.into()));
+        assert_eq!(encode(&FixedOffset::east(86399)).ok(),
+                   Some(r#"{"local_minus_utc":86399}"#.into()));
+        assert_eq!(encode(&FixedOffset::west(1234)).ok(),
+                   Some(r#"{"local_minus_utc":-1234}"#.into()));
+        assert_eq!(encode(&FixedOffset::west(86399)).ok(),
+                   Some(r#"{"local_minus_utc":-86399}"#.into()));
+    }
+
+    #[test]
+    fn test_decodable() {
+        use rustc_serialize::json;
+
+        let decode = |s: &str| json::decode::<FixedOffset>(s);
+
+        assert_eq!(decode(r#"{"local_minus_utc":0}"#).ok(), Some(FixedOffset::east(0)));
+        assert_eq!(decode(r#"{"local_minus_utc": 1234}"#).ok(), Some(FixedOffset::east(1234)));
+        assert_eq!(decode(r#"{"local_minus_utc":86399}"#).ok(), Some(FixedOffset::east(86399)));
+        assert_eq!(decode(r#"{"local_minus_utc":-1234}"#).ok(), Some(FixedOffset::west(1234)));
+        assert_eq!(decode(r#"{"local_minus_utc":-86399}"#).ok(), Some(FixedOffset::west(86399)));
+
+        assert!(decode(r#"{"local_minus_utc":86400}"#).is_err());
+        assert!(decode(r#"{"local_minus_utc":-86400}"#).is_err());
+        assert!(decode(r#"{"local_minus_utc":0.1}"#).is_err());
+        assert!(decode(r#"{"local_minus_utc":null}"#).is_err());
+        assert!(decode(r#"{}"#).is_err());
+        assert!(decode(r#"0"#).is_err());
+        assert!(decode(r#"1234"#).is_err());
+        assert!(decode(r#""string""#).is_err());
+        assert!(decode(r#"null"#).is_err());
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/offset/local.rs
@@ -0,0 +1,130 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * The local (system) time zone.
+ */
+
+use stdtime;
+
+use {Datelike, Timelike};
+use duration::Duration;
+use naive::date::NaiveDate;
+use naive::time::NaiveTime;
+use naive::datetime::NaiveDateTime;
+use date::Date;
+use datetime::DateTime;
+use super::{TimeZone, LocalResult};
+use super::fixed::FixedOffset;
+
+/// Converts a `time::Tm` struct into the timezone-aware `DateTime`.
+/// This assumes that `time` is working correctly, i.e. any error is fatal.
+fn tm_to_datetime(mut tm: stdtime::Tm) -> DateTime<Local> {
+    if tm.tm_sec >= 60 {
+        tm.tm_nsec += (tm.tm_sec - 59) * 1_000_000_000;
+        tm.tm_sec = 59;
+    }
+
+    #[cfg(not(windows))]
+    fn tm_to_naive_date(tm: &stdtime::Tm) -> NaiveDate {
+        // from_yo is more efficient than from_ymd (since it's the internal representation).
+        NaiveDate::from_yo(tm.tm_year + 1900, tm.tm_yday as u32 + 1)
+    }
+
+    #[cfg(windows)]
+    fn tm_to_naive_date(tm: &stdtime::Tm) -> NaiveDate {
+        // ...but tm_yday is broken in Windows (issue #85)
+        NaiveDate::from_ymd(tm.tm_year + 1900, tm.tm_mon as u32 + 1, tm.tm_mday as u32)
+    }
+
+    let date = tm_to_naive_date(&tm);
+    let time = NaiveTime::from_hms_nano(tm.tm_hour as u32, tm.tm_min as u32,
+                                        tm.tm_sec as u32, tm.tm_nsec as u32);
+    let offset = FixedOffset::east(tm.tm_utcoff);
+    DateTime::from_utc(date.and_time(time) + Duration::seconds(-tm.tm_utcoff as i64), offset)
+}
+
+/// Converts a local `NaiveDateTime` to the `time::Timespec`.
+fn datetime_to_timespec(d: &NaiveDateTime, local: bool) -> stdtime::Timespec {
+    // well, this exploits an undocumented `Tm::to_timespec` behavior
+    // to get the exact function we want (either `timegm` or `mktime`).
+    // the number 1 is arbitrary but should be non-zero to trigger `mktime`.
+    let tm_utcoff = if local {1} else {0};
+
+    let tm = stdtime::Tm {
+        tm_sec: d.second() as i32,
+        tm_min: d.minute() as i32,
+        tm_hour: d.hour() as i32,
+        tm_mday: d.day() as i32,
+        tm_mon: d.month0() as i32, // yes, C is that strange...
+        tm_year: d.year() - 1900, // this doesn't underflow, we know that d is `NaiveDateTime`.
+        tm_wday: 0, // to_local ignores this
+        tm_yday: 0, // and this
+        tm_isdst: -1,
+        tm_utcoff: tm_utcoff,
+        tm_nsec: d.nanosecond() as i32,
+    };
+    tm.to_timespec()
+}
+
+/// The local timescale. This is implemented via the standard `time` crate.
+#[derive(Copy, Clone)]
+#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
+pub struct Local;
+
+impl Local {
+    /// Returns a `Date` which corresponds to the current date.
+    pub fn today() -> Date<Local> {
+        Local::now().date()
+    }
+
+    /// Returns a `DateTime` which corresponds to the current date.
+    pub fn now() -> DateTime<Local> {
+        tm_to_datetime(stdtime::now())
+    }
+}
+
+impl TimeZone for Local {
+    type Offset = FixedOffset;
+
+    fn from_offset(_offset: &FixedOffset) -> Local { Local }
+
+    // they are easier to define in terms of the finished date and time unlike other offsets
+    fn offset_from_local_date(&self, local: &NaiveDate) -> LocalResult<FixedOffset> {
+        self.from_local_date(local).map(|date| *date.offset())
+    }
+    fn offset_from_local_datetime(&self, local: &NaiveDateTime) -> LocalResult<FixedOffset> {
+        self.from_local_datetime(local).map(|datetime| *datetime.offset())
+    }
+
+    fn offset_from_utc_date(&self, utc: &NaiveDate) -> FixedOffset {
+        *self.from_utc_date(utc).offset()
+    }
+    fn offset_from_utc_datetime(&self, utc: &NaiveDateTime) -> FixedOffset {
+        *self.from_utc_datetime(utc).offset()
+    }
+
+    // override them for avoiding redundant works
+    fn from_local_date(&self, local: &NaiveDate) -> LocalResult<Date<Local>> {
+        // this sounds very strange, but required for keeping `TimeZone::ymd` sane.
+        // in the other words, we use the offset at the local midnight
+        // but keep the actual date unaltered (much like `FixedOffset`).
+        let midnight = self.from_local_datetime(&local.and_hms(0, 0, 0));
+        midnight.map(|datetime| Date::from_utc(*local, datetime.offset().clone()))
+    }
+    fn from_local_datetime(&self, local: &NaiveDateTime) -> LocalResult<DateTime<Local>> {
+        let timespec = datetime_to_timespec(local, true);
+        LocalResult::Single(tm_to_datetime(stdtime::at(timespec)))
+    }
+
+    fn from_utc_date(&self, utc: &NaiveDate) -> Date<Local> {
+        let midnight = self.from_utc_datetime(&utc.and_hms(0, 0, 0));
+        Date::from_utc(*utc, midnight.offset().clone())
+    }
+    fn from_utc_datetime(&self, utc: &NaiveDateTime) -> DateTime<Local> {
+        let timespec = datetime_to_timespec(utc, false);
+        tm_to_datetime(stdtime::at(timespec))
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/offset/mod.rs
@@ -0,0 +1,334 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2014-2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * The time zone, which calculates offsets from the local time to UTC.
+ *
+ * There are three operations provided by the `TimeZone` trait:
+ *
+ * 1. Converting the local `NaiveDateTime` to `DateTime<Tz>`
+ * 2. Converting the UTC `NaiveDateTime` to `DateTime<Tz>`
+ * 3. Converting `DateTime<Tz>` to the local `NaiveDateTime`
+ *
+ * 1 is used for constructors. 2 is used for the `with_timezone` method of date and time types.
+ * 3 is used for other methods, e.g. `year()` or `format()`, and provided by an associated type
+ * which implements `Offset` (which then passed to `TimeZone` for actual implementations).
+ * Technically speaking `TimeZone` has a total knowledge about given timescale,
+ * but `Offset` is used as a cache to avoid the repeated conversion
+ * and provides implementations for 1 and 3.
+ * An `TimeZone` instance can be reconstructed from the corresponding `Offset` instance.
+ */
+
+use std::fmt;
+
+use Weekday;
+use duration::Duration;
+use naive::date::NaiveDate;
+use naive::time::NaiveTime;
+use naive::datetime::NaiveDateTime;
+use date::Date;
+use datetime::DateTime;
+use format::{parse, Parsed, ParseResult, StrftimeItems};
+
+/// The conversion result from the local time to the timezone-aware datetime types.
+#[derive(Clone, PartialEq, Debug)]
+pub enum LocalResult<T> {
+    /// Given local time representation is invalid.
+    /// This can occur when, for example, the positive timezone transition.
+    None,
+    /// Given local time representation has a single unique result.
+    Single(T),
+    /// Given local time representation has multiple results and thus ambiguous.
+    /// This can occur when, for example, the negative timezone transition.
+    Ambiguous(T /*min*/, T /*max*/),
+}
+
+impl<T> LocalResult<T> {
+    /// Returns `Some` only when the conversion result is unique, or `None` otherwise.
+    pub fn single(self) -> Option<T> {
+        match self { LocalResult::Single(t) => Some(t), _ => None }
+    }
+
+    /// Returns `Some` for the earliest possible conversion result, or `None` if none.
+    pub fn earliest(self) -> Option<T> {
+        match self { LocalResult::Single(t) | LocalResult::Ambiguous(t,_) => Some(t), _ => None }
+    }
+
+    /// Returns `Some` for the latest possible conversion result, or `None` if none.
+    pub fn latest(self) -> Option<T> {
+        match self { LocalResult::Single(t) | LocalResult::Ambiguous(_,t) => Some(t), _ => None }
+    }
+
+    /// Maps a `LocalResult<T>` into `LocalResult<U>` with given function.
+    pub fn map<U, F: FnMut(T) -> U>(self, mut f: F) -> LocalResult<U> {
+        match self {
+            LocalResult::None => LocalResult::None,
+            LocalResult::Single(v) => LocalResult::Single(f(v)),
+            LocalResult::Ambiguous(min, max) => LocalResult::Ambiguous(f(min), f(max)),
+        }
+    }
+}
+
+impl<Tz: TimeZone> LocalResult<Date<Tz>> {
+    /// Makes a new `DateTime` from the current date and given `NaiveTime`.
+    /// The offset in the current date is preserved.
+    ///
+    /// Propagates any error. Ambiguous result would be discarded.
+    #[inline]
+    pub fn and_time(self, time: NaiveTime) -> LocalResult<DateTime<Tz>> {
+        match self {
+            LocalResult::Single(d) => d.and_time(time)
+                                       .map_or(LocalResult::None, LocalResult::Single),
+            _ => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute and second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Propagates any error. Ambiguous result would be discarded.
+    #[inline]
+    pub fn and_hms_opt(self, hour: u32, min: u32, sec: u32) -> LocalResult<DateTime<Tz>> {
+        match self {
+            LocalResult::Single(d) => d.and_hms_opt(hour, min, sec)
+                                       .map_or(LocalResult::None, LocalResult::Single),
+            _ => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and millisecond.
+    /// The millisecond part can exceed 1,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Propagates any error. Ambiguous result would be discarded.
+    #[inline]
+    pub fn and_hms_milli_opt(self, hour: u32, min: u32, sec: u32,
+                             milli: u32) -> LocalResult<DateTime<Tz>> {
+        match self {
+            LocalResult::Single(d) => d.and_hms_milli_opt(hour, min, sec, milli)
+                                       .map_or(LocalResult::None, LocalResult::Single),
+            _ => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and microsecond.
+    /// The microsecond part can exceed 1,000,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Propagates any error. Ambiguous result would be discarded.
+    #[inline]
+    pub fn and_hms_micro_opt(self, hour: u32, min: u32, sec: u32,
+                             micro: u32) -> LocalResult<DateTime<Tz>> {
+        match self {
+            LocalResult::Single(d) => d.and_hms_micro_opt(hour, min, sec, micro)
+                                       .map_or(LocalResult::None, LocalResult::Single),
+            _ => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `DateTime` from the current date, hour, minute, second and nanosecond.
+    /// The nanosecond part can exceed 1,000,000,000 in order to represent the leap second.
+    /// The offset in the current date is preserved.
+    ///
+    /// Propagates any error. Ambiguous result would be discarded.
+    #[inline]
+    pub fn and_hms_nano_opt(self, hour: u32, min: u32, sec: u32,
+                            nano: u32) -> LocalResult<DateTime<Tz>> {
+        match self {
+            LocalResult::Single(d) => d.and_hms_nano_opt(hour, min, sec, nano)
+                                       .map_or(LocalResult::None, LocalResult::Single),
+            _ => LocalResult::None,
+        }
+    }
+
+}
+
+impl<T: fmt::Debug> LocalResult<T> {
+    /// Returns the single unique conversion result, or panics accordingly.
+    pub fn unwrap(self) -> T {
+        match self {
+            LocalResult::None => panic!("No such local time"),
+            LocalResult::Single(t) => t,
+            LocalResult::Ambiguous(t1,t2) => {
+                panic!("Ambiguous local time, ranging from {:?} to {:?}", t1, t2)
+            }
+        }
+    }
+}
+
+/// The offset from the local time to UTC.
+pub trait Offset: Sized + Clone + fmt::Debug {
+    /// Returns the offset from UTC to the local time stored.
+    fn local_minus_utc(&self) -> Duration;
+}
+
+/// The time zone.
+pub trait TimeZone: Sized + Clone {
+    /// An associated offset type.
+    /// This type is used to store the actual offset in date and time types.
+    /// The original `TimeZone` value can be recovered via `TimeZone::from_offset`.
+    type Offset: Offset;
+
+    /// Makes a new `Date` from year, month, day and the current time zone.
+    /// This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
+    ///
+    /// The time zone normally does not affect the date (unless it is between UTC-24 and UTC+24),
+    /// but it will propagate to the `DateTime` values constructed via this date.
+    ///
+    /// Panics on the out-of-range date, invalid month and/or day.
+    fn ymd(&self, year: i32, month: u32, day: u32) -> Date<Self> {
+        self.ymd_opt(year, month, day).unwrap()
+    }
+
+    /// Makes a new `Date` from year, month, day and the current time zone.
+    /// This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
+    ///
+    /// The time zone normally does not affect the date (unless it is between UTC-24 and UTC+24),
+    /// but it will propagate to the `DateTime` values constructed via this date.
+    ///
+    /// Returns `None` on the out-of-range date, invalid month and/or day.
+    fn ymd_opt(&self, year: i32, month: u32, day: u32) -> LocalResult<Date<Self>> {
+        match NaiveDate::from_ymd_opt(year, month, day) {
+            Some(d) => self.from_local_date(&d),
+            None => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `Date` from year, day of year (DOY or "ordinal") and the current time zone.
+    /// This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
+    ///
+    /// The time zone normally does not affect the date (unless it is between UTC-24 and UTC+24),
+    /// but it will propagate to the `DateTime` values constructed via this date.
+    ///
+    /// Panics on the out-of-range date and/or invalid DOY.
+    fn yo(&self, year: i32, ordinal: u32) -> Date<Self> {
+        self.yo_opt(year, ordinal).unwrap()
+    }
+
+    /// Makes a new `Date` from year, day of year (DOY or "ordinal") and the current time zone.
+    /// This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
+    ///
+    /// The time zone normally does not affect the date (unless it is between UTC-24 and UTC+24),
+    /// but it will propagate to the `DateTime` values constructed via this date.
+    ///
+    /// Returns `None` on the out-of-range date and/or invalid DOY.
+    fn yo_opt(&self, year: i32, ordinal: u32) -> LocalResult<Date<Self>> {
+        match NaiveDate::from_yo_opt(year, ordinal) {
+            Some(d) => self.from_local_date(&d),
+            None => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `Date` from ISO week date (year and week number), day of the week (DOW) and
+    /// the current time zone.
+    /// This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
+    /// The resulting `Date` may have a different year from the input year.
+    ///
+    /// The time zone normally does not affect the date (unless it is between UTC-24 and UTC+24),
+    /// but it will propagate to the `DateTime` values constructed via this date.
+    ///
+    /// Panics on the out-of-range date and/or invalid week number.
+    fn isoywd(&self, year: i32, week: u32, weekday: Weekday) -> Date<Self> {
+        self.isoywd_opt(year, week, weekday).unwrap()
+    }
+
+    /// Makes a new `Date` from ISO week date (year and week number), day of the week (DOW) and
+    /// the current time zone.
+    /// This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
+    /// The resulting `Date` may have a different year from the input year.
+    ///
+    /// The time zone normally does not affect the date (unless it is between UTC-24 and UTC+24),
+    /// but it will propagate to the `DateTime` values constructed via this date.
+    ///
+    /// Returns `None` on the out-of-range date and/or invalid week number.
+    fn isoywd_opt(&self, year: i32, week: u32, weekday: Weekday) -> LocalResult<Date<Self>> {
+        match NaiveDate::from_isoywd_opt(year, week, weekday) {
+            Some(d) => self.from_local_date(&d),
+            None => LocalResult::None,
+        }
+    }
+
+    /// Makes a new `DateTime` from the number of non-leap seconds
+    /// since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp")
+    /// and the number of nanoseconds since the last whole non-leap second.
+    ///
+    /// Panics on the out-of-range number of seconds and/or invalid nanosecond.
+    fn timestamp(&self, secs: i64, nsecs: u32) -> DateTime<Self> {
+        self.timestamp_opt(secs, nsecs).unwrap()
+    }
+
+    /// Makes a new `DateTime` from the number of non-leap seconds
+    /// since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp")
+    /// and the number of nanoseconds since the last whole non-leap second.
+    ///
+    /// Returns `None` on the out-of-range number of seconds and/or invalid nanosecond.
+    fn timestamp_opt(&self, secs: i64, nsecs: u32) -> LocalResult<DateTime<Self>> {
+        match NaiveDateTime::from_timestamp_opt(secs, nsecs) {
+            Some(dt) => LocalResult::Single(self.from_utc_datetime(&dt)),
+            None => LocalResult::None,
+        }
+    }
+
+    /// Parses a string with the specified format string and
+    /// returns a `DateTime` with the current offset.
+    /// See the [`format::strftime` module](../../format/strftime/index.html)
+    /// on the supported escape sequences.
+    ///
+    /// If the format does not include offsets, the current offset is assumed;
+    /// otherwise the input should have a matching UTC offset.
+    ///
+    /// See also `DateTime::parse_from_str` which gives a local `DateTime`
+    /// with parsed `FixedOffset`.
+    fn datetime_from_str(&self, s: &str, fmt: &str) -> ParseResult<DateTime<Self>> {
+        let mut parsed = Parsed::new();
+        try!(parse(&mut parsed, s, StrftimeItems::new(fmt)));
+        parsed.to_datetime_with_timezone(self)
+    }
+
+    /// Reconstructs the time zone from the offset.
+    fn from_offset(offset: &Self::Offset) -> Self;
+
+    /// Creates the offset(s) for given local `NaiveDate` if possible.
+    fn offset_from_local_date(&self, local: &NaiveDate) -> LocalResult<Self::Offset>;
+
+    /// Creates the offset(s) for given local `NaiveDateTime` if possible.
+    fn offset_from_local_datetime(&self, local: &NaiveDateTime) -> LocalResult<Self::Offset>;
+
+    /// Converts the local `NaiveDate` to the timezone-aware `Date` if possible.
+    fn from_local_date(&self, local: &NaiveDate) -> LocalResult<Date<Self>> {
+        self.offset_from_local_date(local).map(|offset| {
+            Date::from_utc(*local - offset.local_minus_utc(), offset)
+        })
+    }
+
+    /// Converts the local `NaiveDateTime` to the timezone-aware `DateTime` if possible.
+    fn from_local_datetime(&self, local: &NaiveDateTime) -> LocalResult<DateTime<Self>> {
+        self.offset_from_local_datetime(local).map(|offset| {
+            DateTime::from_utc(*local - offset.local_minus_utc(), offset)
+        })
+    }
+
+    /// Creates the offset for given UTC `NaiveDate`. This cannot fail.
+    fn offset_from_utc_date(&self, utc: &NaiveDate) -> Self::Offset;
+
+    /// Creates the offset for given UTC `NaiveDateTime`. This cannot fail.
+    fn offset_from_utc_datetime(&self, utc: &NaiveDateTime) -> Self::Offset;
+
+    /// Converts the UTC `NaiveDate` to the local time.
+    /// The UTC is continuous and thus this cannot fail (but can give the duplicate local time).
+    fn from_utc_date(&self, utc: &NaiveDate) -> Date<Self> {
+        Date::from_utc(utc.clone(), self.offset_from_utc_date(utc))
+    }
+
+    /// Converts the UTC `NaiveDateTime` to the local time.
+    /// The UTC is continuous and thus this cannot fail (but can give the duplicate local time).
+    fn from_utc_datetime(&self, utc: &NaiveDateTime) -> DateTime<Self> {
+        DateTime::from_utc(utc.clone(), self.offset_from_utc_datetime(utc))
+    }
+}
+
+pub mod utc;
+pub mod fixed;
+pub mod local;
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/chrono/src/offset/utc.rs
@@ -0,0 +1,64 @@
+// This is a part of rust-chrono.
+// Copyright (c) 2015, Kang Seonghoon.
+// See README.md and LICENSE.txt for details.
+
+/*!
+ * The UTC (Coordinated Universal Time) time zone.
+ */
+
+use std::fmt;
+use stdtime;
+
+use duration::Duration;
+use naive::date::NaiveDate;
+use naive::datetime::NaiveDateTime;
+use date::Date;
+use datetime::DateTime;
+use super::{TimeZone, Offset, LocalResult};
+
+/// The UTC time zone. This is the most efficient time zone when you don't need the local time.
+/// It is also used as an offset (which is also a dummy type).
+#[derive(Copy, Clone, PartialEq, Eq)]
+#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
+pub struct UTC;
+
+impl UTC {
+    /// Returns a `Date` which corresponds to the current date.
+    pub fn today() -> Date<UTC> { UTC::now().date() }
+
+    /// Returns a `DateTime` which corresponds to the current date.
+    pub fn now() -> DateTime<UTC> {
+        let spec = stdtime::get_time();
+        let naive = NaiveDateTime::from_timestamp(spec.sec, spec.nsec as u32);
+        DateTime::from_utc(naive, UTC)
+    }
+}
+
+impl TimeZone for UTC {
+    type Offset = UTC;
+
+    fn from_offset(_state: &UTC) -> UTC { UTC }
+
+    fn offset_from_local_date(&self, _local: &NaiveDate) -> LocalResult<UTC> {
+        LocalResult::Single(UTC)
+    }
+    fn offset_from_local_datetime(&self, _local: &NaiveDateTime) -> LocalResult<UTC> {
+        LocalResult::Single(UTC)
+    }
+
+    fn offset_from_utc_date(&self, _utc: &NaiveDate) -> UTC { UTC }
+    fn offset_from_utc_datetime(&self, _utc: &NaiveDateTime) -> UTC { UTC}
+}
+
+impl Offset for UTC {
+    fn local_minus_utc(&self) -> Duration { Duration::zero() }
+}
+
+impl fmt::Debug for UTC {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "Z") }
+}
+
+impl fmt::Display for UTC {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "UTC") }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"d2a9bb7c029e8ed0acfb8dc8e786014cfa4f053b6f4c525303d69fd7e28704e9","Cargo.toml":"aa5f58e2a4ebafbfb9f46c6b5e725b5203272e28e6cc350fb67f3454d4aef7b1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"e480abd7b525f43f10248c0cb7740daac6832ef6614ccc5c76bc39d0f2b5cd9d","src/builder.rs":"0cb65ced41732bcb282c164309e15ef670fdf6a940614d58c1681db9844f4791","src/jar.rs":"6a1f8cb3600290f19711507185806ba17d13d956ef5b196afa8ee8108d276766","src/lib.rs":"95f3d945fac20870c4d894e4dcc7ec836c27bd7e269d9428d5713ba04979becb","src/parse.rs":"3a11cbd4ae2ba22d057910ce020c7e4db6ac9b2605f072ed7ab1d0c4ac46d803"},"package":"30b3493e12a550c2f96be785088d1da8d93189e7237c8a8d0d871bc9070334c3"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/.travis.yml
@@ -0,0 +1,26 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+before_script:
+  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
+script:
+  - cargo build --verbose
+  - cargo test --verbose --no-default-features
+  - cargo test --verbose
+  - cargo test --verbose --features percent-encode
+  - cargo test --verbose --features secure
+  - cargo test --verbose --all-features
+  - rustdoc --test README.md -L target
+  - cargo doc --no-deps
+after_success:
+  - travis-cargo --only nightly doc-upload
+env:
+  global:
+    secure: "TyMGH+sbPmKs9lKCziKShxWr3G6im0owEchVrbUChWnQIQv1WydXftFoEoUsVl6qZspjehWK1b1AsnIgCXK0HtEi4DnqLsxs0s36bOjfg5yHBT/pETTr6kcq7KAL4Be4GmI331k6gT1Oi0TPFp7Sg9xpiWsQqKIHA5Szk2wpFQ8="
+
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+
+name = "cookie"
+authors = ["Alex Crichton <alex@alexcrichton.com>", "Sergio Benitez <sb@sergio.bz>"]
+version = "0.6.2"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/alexcrichton/cookie-rs"
+documentation = "https://docs.rs/cookie"
+description = """
+Crate for parsing HTTP cookie headers and managing a cookie jar. Supports
+encrypted, signed, and permanent cookie chars composed together in a manner
+similar to Rails' cookie jar.
+"""
+
+[features]
+secure = ["openssl", "rustc-serialize"]
+percent-encode = ["url"]
+
+[dependencies]
+time = "0.1"
+url = { version = "1.0", optional = true }
+openssl = { version = "0.9.0", optional = true }
+rustc-serialize = { version = "0.3", optional = true }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/README.md
@@ -0,0 +1,21 @@
+# cookie-rs
+
+[![Build Status](https://travis-ci.org/alexcrichton/cookie-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/cookie-rs)
+
+[Documentation](http://docs.rs/cookie)
+
+A library for parsing HTTP cookies and managing cookie jars
+
+```toml
+# Cargo.toml
+[dependencies]
+cookie = "0.6"
+```
+
+# License
+
+`cookie-rs` is primarily distributed under the terms of both the MIT license and
+the Apache License (Version 2.0), with portions covered by various BSD-like
+licenses.
+
+See LICENSE-APACHE, and LICENSE-MIT for details.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/src/builder.rs
@@ -0,0 +1,205 @@
+use std::borrow::Cow;
+
+use time::{Tm, Duration};
+
+use ::Cookie;
+
+/// Structure that follows the builder pattern for building `Cookie` structs.
+///
+/// To construct a cookie:
+///
+///   1. Call [Cookie::build](struct.Cookie.html#method.build) to start building.
+///   2. Use any of the builder methods to set fields in the cookie.
+///   3. Call [finish](#method.finish) to retrieve the built cookie.
+///
+/// # Example
+///
+/// ```rust
+/// # extern crate cookie;
+/// extern crate time;
+///
+/// use cookie::Cookie;
+/// use time::Duration;
+///
+/// # fn main() {
+/// let cookie: Cookie = Cookie::build("name", "value")
+///     .domain("www.rust-lang.org")
+///     .path("/")
+///     .secure(true)
+///     .http_only(true)
+///     .max_age(Duration::days(1))
+///     .finish();
+/// # }
+/// ```
+///
+#[derive(Debug, Clone)]
+pub struct CookieBuilder {
+    /// The cookie being built.
+    cookie: Cookie<'static>,
+}
+
+impl CookieBuilder {
+    /// Creates a new `CookieBuilder` instance from the given name and value.
+    ///
+    /// This method is typically called indirectly via
+    /// [Cookie::build](struct.Cookie.html#method.build).
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar").finish();
+    /// assert_eq!(c.name_value(), ("foo", "bar"));
+    /// ```
+    pub fn new<N, V>(name: N, value: V) -> CookieBuilder
+        where N: Into<Cow<'static, str>>,
+              V: Into<Cow<'static, str>>
+    {
+        CookieBuilder { cookie: Cookie::new(name, value) }
+    }
+
+    /// Sets the `expires` field in the cookie being built.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # extern crate cookie;
+    /// extern crate time;
+    ///
+    /// use cookie::Cookie;
+    ///
+    /// # fn main() {
+    /// let c = Cookie::build("foo", "bar")
+    ///     .expires(time::now())
+    ///     .finish();
+    ///
+    /// assert!(c.expires().is_some());
+    /// # }
+    /// ```
+    #[inline]
+    pub fn expires(mut self, when: Tm) -> CookieBuilder {
+        self.cookie.set_expires(when);
+        self
+    }
+
+    /// Sets the `max_age` field in the cookie being built.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # extern crate cookie;
+    /// extern crate time;
+    /// use time::Duration;
+    ///
+    /// use cookie::Cookie;
+    ///
+    /// # fn main() {
+    /// let c = Cookie::build("foo", "bar")
+    ///     .max_age(Duration::minutes(30))
+    ///     .finish();
+    ///
+    /// assert_eq!(c.max_age(), Some(Duration::seconds(30 * 60)));
+    /// # }
+    /// ```
+    #[inline]
+    pub fn max_age(mut self, value: Duration) -> CookieBuilder {
+        self.cookie.set_max_age(value);
+        self
+    }
+
+    /// Sets the `domain` field in the cookie being built.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar")
+    ///     .domain("www.rust-lang.org")
+    ///     .finish();
+    ///
+    /// assert_eq!(c.domain(), Some("www.rust-lang.org"));
+    /// ```
+    pub fn domain<D: Into<Cow<'static, str>>>(mut self, value: D) -> CookieBuilder {
+        self.cookie.set_domain(value);
+        self
+    }
+
+    /// Sets the `path` field in the cookie being built.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar")
+    ///     .path("/")
+    ///     .finish();
+    ///
+    /// assert_eq!(c.path(), Some("/"));
+    /// ```
+    pub fn path<P: Into<Cow<'static, str>>>(mut self, path: P) -> CookieBuilder {
+        self.cookie.set_path(path);
+        self
+    }
+
+    /// Sets the `secure` field in the cookie being built.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar")
+    ///     .secure(true)
+    ///     .finish();
+    ///
+    /// assert_eq!(c.secure(), true);
+    /// ```
+    #[inline]
+    pub fn secure(mut self, value: bool) -> CookieBuilder {
+        self.cookie.set_secure(value);
+        self
+    }
+
+    /// Sets the `http_only` field in the cookie being built.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar")
+    ///     .http_only(true)
+    ///     .finish();
+    ///
+    /// assert_eq!(c.http_only(), true);
+    /// ```
+    #[inline]
+    pub fn http_only(mut self, value: bool) -> CookieBuilder {
+        self.cookie.set_http_only(value);
+        self
+    }
+
+    /// Finishes building and returns the built `Cookie`.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar")
+    ///     .domain("crates.io")
+    ///     .path("/")
+    ///     .finish();
+    ///
+    /// assert_eq!(c.name_value(), ("foo", "bar"));
+    /// assert_eq!(c.domain(), Some("crates.io"));
+    /// assert_eq!(c.path(), Some("/"));
+    /// ```
+    #[inline]
+    pub fn finish(self) -> Cookie<'static> {
+        self.cookie
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/src/jar.rs
@@ -0,0 +1,637 @@
+//! A cookie jar implementation for storing a set of cookies.
+//!
+//! This CookieJar type can be used to manage a session of cookies by keeping
+//! track of cookies that are added and deleted over time. It provides a method,
+//! `delta`, which will calculate the number of `Set-Cookie` headers that need
+//! to be sent back to a client which tracks the changes in the lifetime of the
+//! jar itself.
+//!
+//! A cookie jar can also be borrowed to a child cookie jar with new
+//! functionality such as automatically signing cookies, storing permanent
+//! cookies, etc. This functionality can also be chained together.
+
+use std::collections::{HashMap, HashSet};
+use std::cell::RefCell;
+use std::fmt;
+use std::borrow::Cow;
+
+use time::{self, Duration};
+
+use ::Cookie;
+
+/// A jar of cookies for managing a session.
+///
+/// # Example
+///
+/// ```
+/// use cookie::{Cookie, CookieJar};
+///
+/// let c = CookieJar::new(b"f8f9eaf1ecdedff5e5b749c58115441e");
+///
+/// // Add a cookie to this jar
+/// c.add(Cookie::new("key".to_string(), "value".to_string()));
+///
+/// // Remove the added cookie
+/// c.remove("key");
+/// ```
+pub struct CookieJar<'a> {
+    flavor: Flavor<'a>,
+}
+
+enum Flavor<'a> {
+    Child(Child<'a>),
+    Root(Root),
+}
+
+struct Child<'a> {
+    parent: &'a CookieJar<'a>,
+    read: Read,
+    write: Write,
+}
+
+type Read = fn(&Root, Cookie<'static>) -> Option<Cookie<'static>>;
+type Write = fn(&Root, Cookie<'static>) -> Cookie<'static>;
+
+struct Root {
+    map: RefCell<HashMap<Cow<'static, str>, Cookie<'static>>>,
+    new_cookies: RefCell<HashSet<Cow<'static, str>>>,
+    removed_cookies: RefCell<HashSet<Cow<'static, str>>>,
+    _key: secure::SigningKey,
+}
+
+/// Iterator over the cookies in a cookie jar
+pub struct Iter<'a> {
+    jar: &'a CookieJar<'a>,
+    keys: Vec<Cow<'static, str>>,
+}
+
+impl<'a> CookieJar<'a> {
+    /// Creates a new empty cookie jar with the given signing key.
+    ///
+    /// The given key is used to sign cookies in the signed cookie jar. If
+    /// signed cookies aren't used then you can pass an empty array.
+    pub fn new(key: &[u8]) -> CookieJar<'static> {
+        CookieJar {
+            flavor: Flavor::Root(Root {
+                map: RefCell::new(HashMap::new()),
+                new_cookies: RefCell::new(HashSet::new()),
+                removed_cookies: RefCell::new(HashSet::new()),
+                _key: secure::prepare_key(key),
+            }),
+        }
+    }
+
+    fn root<'b>(&'b self) -> &'b Root {
+        let mut cur = self;
+        loop {
+            match cur.flavor {
+                Flavor::Child(ref child) => cur = child.parent,
+                Flavor::Root(ref me) => return me,
+            }
+        }
+    }
+
+    /// Adds an original cookie from a request.
+    ///
+    /// This method only works on the root cookie jar and is not intended for
+    /// use during the lifetime of a request, it is intended to initialize a
+    /// cookie jar from an incoming request.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `self` is not the root cookie jar.
+    pub fn add_original(&mut self, cookie: Cookie<'static>) {
+        match self.flavor {
+            Flavor::Child(..) => panic!("can't add an original cookie to a child jar!"),
+            Flavor::Root(ref mut root) => {
+                let name = cookie.name().to_string();
+                root.map.borrow_mut().insert(name.into(), cookie);
+            }
+        }
+    }
+
+    /// Adds a new cookie to this cookie jar.
+    ///
+    /// If this jar is a child cookie jar, this will walk up the chain of
+    /// borrowed jars, modifying the cookie as it goes along.
+    pub fn add(&self, mut cookie: Cookie<'static>) {
+        let mut cur = self;
+        let root = self.root();
+        loop {
+            match cur.flavor {
+                Flavor::Child(ref child) => {
+                    cookie = (child.write)(root, cookie);
+                    cur = child.parent;
+                }
+                Flavor::Root(..) => break,
+            }
+        }
+        let name = cookie.name().to_string();
+        root.map.borrow_mut().insert(name.clone().into(), cookie);
+        root.removed_cookies.borrow_mut().remove(&*name);
+        root.new_cookies.borrow_mut().insert(name.into());
+    }
+
+    /// Removes a cookie from this cookie jar.
+    pub fn remove<N: Into<Cow<'static, str>>>(&self, cookie_name: N) {
+        let root = self.root();
+        let name = cookie_name.into();
+        root.map.borrow_mut().remove(&name);
+        root.new_cookies.borrow_mut().remove(&name);
+        root.removed_cookies.borrow_mut().insert(name);
+    }
+
+    /// Clears all cookies from this cookie jar.
+    pub fn clear(&self) {
+        let root = self.root();
+        let all_cookies: Vec<_> = root.map
+            .borrow()
+            .keys()
+            .map(|n| n.to_owned())
+            .collect();
+
+        root.map.borrow_mut().clear();
+        root.new_cookies.borrow_mut().clear();
+        root.removed_cookies.borrow_mut().extend(all_cookies);
+    }
+
+    /// Finds a cookie inside of this cookie jar.
+    ///
+    /// The cookie is subject to modification by any of the child cookie jars
+    /// that are currently borrowed. A copy of the cookie is returned.
+    pub fn find(&self, name: &str) -> Option<Cookie<'static>> {
+        let root = self.root();
+        if root.removed_cookies.borrow().contains(name) {
+            return None;
+        }
+        root.map.borrow().get(name).and_then(|c| self.try_read(root, c.clone()))
+    }
+
+    /// Creates a child signed cookie jar.
+    ///
+    /// All cookies read from the child jar will require a valid signature and
+    /// all cookies written will be signed automatically.
+    ///
+    /// This API is only available when the `secure` feature is enabled on this
+    /// crate.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # use cookie::{Cookie, CookieJar};
+    /// let c = CookieJar::new(b"f8f9eaf1ecdedff5e5b749c58115441e");
+    ///
+    /// // Add a signed cookie to the jar
+    /// c.signed().add(Cookie::new("key".to_string(), "value".to_string()));
+    ///
+    /// // Add a permanently signed cookie to the jar
+    /// c.permanent().signed()
+    ///  .add(Cookie::new("key".to_string(), "value".to_string()));
+    /// ```
+    #[cfg(feature = "secure")]
+    pub fn signed<'b>(&'b self) -> CookieJar<'b> {
+        return CookieJar {
+            flavor: Flavor::Child(Child {
+                parent: self,
+                read: verify,
+                write: sign,
+            }),
+        };
+
+        fn verify(root: &Root, cookie: Cookie<'static>) -> Option<Cookie<'static>> {
+            secure::verify(&root._key, cookie)
+        }
+
+        fn sign(root: &Root, cookie: Cookie<'static>) -> Cookie<'static> {
+            secure::sign(&root._key, cookie)
+        }
+    }
+
+    /// Creates a child encrypted cookie jar.
+    ///
+    /// All cookies read from the child jar must be encrypted and signed by a
+    /// valid key and all cookies written will be encrypted and signed
+    /// automatically.
+    ///
+    /// This API is only available when the `secure` feature is enabled on this
+    /// crate.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # use cookie::{Cookie, CookieJar};
+    /// let c = CookieJar::new(b"f8f9eaf1ecdedff5e5b749c58115441e");
+    ///
+    /// // Add a signed and encrypted cookie to the jar
+    /// c.encrypted().add(Cookie::new("key".to_string(), "value".to_string()));
+    ///
+    /// // Add a permanently signed and encrypted cookie to the jar
+    /// c.permanent().encrypted()
+    ///  .add(Cookie::new("key".to_string(), "value".to_string()));
+    /// ```
+    #[cfg(feature = "secure")]
+    pub fn encrypted<'b>(&'b self) -> CookieJar<'b> {
+        return CookieJar {
+            flavor: Flavor::Child(Child {
+                parent: self,
+                read: read,
+                write: write,
+            }),
+        };
+
+        fn read(root: &Root, cookie: Cookie<'static>) -> Option<Cookie<'static>> {
+            secure::verify_and_decrypt(&root._key, cookie)
+        }
+
+        fn write(root: &Root, cookie: Cookie<'static>) -> Cookie<'static> {
+            secure::encrypt_and_sign(&root._key, cookie)
+        }
+    }
+
+    /// Creates a child jar for permanent cookie storage.
+    ///
+    /// All cookies written to the child jar will have an expiration date 20
+    /// years into the future to ensure they stick around for a long time.
+    pub fn permanent<'b>(&'b self) -> CookieJar<'b> {
+        return CookieJar {
+            flavor: Flavor::Child(Child {
+                parent: self,
+                read: read,
+                write: write,
+            }),
+        };
+
+        fn read(_root: &Root, cookie: Cookie<'static>) -> Option<Cookie<'static>> {
+            Some(cookie)
+        }
+
+        fn write(_root: &Root, mut cookie: Cookie<'static>) -> Cookie<'static> {
+            // Expire 20 years in the future
+            cookie.set_max_age(Duration::days(365 * 20));
+            let mut now = time::now();
+            now.tm_year += 20;
+            cookie.set_expires(now);
+            cookie
+        }
+    }
+
+    /// Calculates the changes that have occurred to this cookie jar over time,
+    /// returning a vector of `Set-Cookie` headers.
+    pub fn delta(&self) -> Vec<Cookie<'static>> {
+        let mut ret = Vec::new();
+        let root = self.root();
+        for cookie in root.removed_cookies.borrow().iter() {
+            let mut c = Cookie::new(cookie.clone(), String::new());
+            c.set_max_age(Duration::zero());
+            let mut now = time::now();
+            now.tm_year -= 1;
+            c.set_expires(now);
+            ret.push(c);
+        }
+
+        let map = root.map.borrow();
+        for cookie in root.new_cookies.borrow().iter() {
+            ret.push(map.get(cookie).unwrap().clone());
+        }
+
+        return ret;
+    }
+
+    fn try_read(&self, root: &Root, mut cookie: Cookie<'static>) -> Option<Cookie<'static>> {
+        let mut jar = self;
+        loop {
+            match jar.flavor {
+                Flavor::Child(Child { read, parent, .. }) => {
+                    cookie = match read(root, cookie) {
+                        Some(c) => c,
+                        None => return None,
+                    };
+                    jar = parent;
+                }
+                Flavor::Root(..) => return Some(cookie),
+            }
+        }
+    }
+
+    /// Return an iterator over the cookies in this jar.
+    ///
+    /// This iterator will only yield valid cookies for this jar. For example if
+    /// this is an encrypted child jar then only valid encrypted cookies will be
+    /// yielded. If the root cookie jar is iterated over then all cookies will
+    /// be yielded.
+    pub fn iter(&self) -> Iter {
+        let map = self.root().map.borrow();
+        Iter {
+            jar: self,
+            keys: map.keys().cloned().collect(),
+        }
+    }
+}
+
+impl<'a> fmt::Debug for CookieJar<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let root = self.root();
+        try!(write!(f, "CookieJar {{"));
+        let mut first = true;
+        for (name, cookie) in &*root.map.borrow() {
+            if !first {
+                try!(write!(f, ", "));
+            }
+            first = false;
+            try!(write!(f, "{:?}: {:?}", name, cookie));
+        }
+        try!(write!(f, " }}"));
+        Ok(())
+    }
+}
+
+impl<'a> Iterator for Iter<'a> {
+    type Item = Cookie<'static>;
+
+    fn next(&mut self) -> Option<Cookie<'static>> {
+        loop {
+            let key = match self.keys.pop() {
+                Some(v) => v,
+                None => return None,
+            };
+            let root = self.jar.root();
+            let map = root.map.borrow();
+            let cookie = match map.get(&key) {
+                Some(cookie) => cookie.clone(),
+                None => continue,
+            };
+            match self.jar.try_read(root, cookie) {
+                Some(cookie) => return Some(cookie),
+                None => {}
+            }
+        }
+    }
+}
+
+
+#[cfg(not(feature = "secure"))]
+mod secure {
+    pub type SigningKey = ();
+
+    pub fn prepare_key(_key: &[u8]) -> () {
+        ()
+    }
+}
+
+#[cfg(feature = "secure")]
+mod secure {
+    extern crate openssl;
+    extern crate rustc_serialize;
+
+    use ::Cookie;
+    use self::openssl::{hash, memcmp, symm};
+    use self::openssl::pkey::PKey;
+    use self::openssl::sign::Signer;
+    use self::openssl::hash::MessageDigest;
+    use self::rustc_serialize::base64::{ToBase64, FromBase64, STANDARD};
+
+    pub type SigningKey = Vec<u8>;
+    pub const MIN_KEY_LEN: usize = 32;
+
+    pub fn prepare_key(key: &[u8]) -> Vec<u8> {
+        if key.len() >= MIN_KEY_LEN {
+            key.to_vec()
+        } else {
+            // Using a SHA-256 hash to normalize key as Rails suggests.
+            hash::hash(MessageDigest::sha256(), key).unwrap()
+        }
+    }
+
+    // If a SHA1 HMAC is good enough for rails, it's probably good enough
+    // for us as well:
+    //
+    // https://github.com/rails/rails/blob/master/activesupport/lib
+    //                   /active_support/message_verifier.rb#L70
+    pub fn sign(key: &[u8], mut cookie: Cookie<'static>) -> Cookie<'static> {
+        let signature = dosign(key, cookie.value()).to_base64(STANDARD);
+        let new_cookie_val = format!("{}--{}", cookie.value(), signature);
+        cookie.set_value(new_cookie_val);
+        cookie
+    }
+
+    fn split_value(val: &str) -> Option<(&str, Vec<u8>)> {
+        let parts = val.split("--");
+        let ext = match parts.last() {
+            Some(ext) => ext,
+            _ => return None,
+        };
+        let val_len = val.len();
+        if ext.len() == val_len {
+            return None;
+        }
+        let text = &val[..val_len - ext.len() - 2];
+        let ext = match ext.from_base64() {
+            Ok(sig) => sig,
+            Err(..) => return None,
+        };
+
+        Some((text, ext))
+    }
+
+    pub fn verify(key: &[u8], mut cookie: Cookie<'static>) -> Option<Cookie<'static>> {
+        let (text, signature) = match split_value(cookie.value()) {
+            Some((text, sig)) => (text.to_string(), sig),
+            None => return None,
+        };
+
+
+        let expected = dosign(key, &text);
+        if expected.len() != signature.len() || !memcmp::eq(&expected, &signature) {
+            return None;
+        }
+
+        cookie.set_value(text);
+        Some(cookie)
+    }
+
+    fn dosign(key: &[u8], val: &str) -> Vec<u8> {
+        let pkey = PKey::hmac(key).unwrap();
+        let mut signer = Signer::new(MessageDigest::sha1(), &pkey).unwrap();
+        signer.update(val.as_bytes()).unwrap();
+        signer.finish().unwrap()
+    }
+
+    // Implementation details were taken from Rails. See
+    // https://github.com/rails/rails/blob/master/activesupport/lib/active_support/message_encryptor.rb#L57
+    pub fn encrypt_and_sign(key: &[u8], mut cookie: Cookie<'static>) -> Cookie<'static> {
+        let encrypted_data = encrypt_data(key, cookie.value());
+        cookie.set_value(encrypted_data);
+        sign(key, cookie)
+    }
+
+    fn encrypt_data(key: &[u8], val: &str) -> String {
+        let iv = random_iv();
+        let iv_str = iv.to_base64(STANDARD);
+
+        let cipher = symm::Cipher::aes_256_cbc();
+        let encrypted = symm::encrypt(cipher, &key[..MIN_KEY_LEN], Some(&iv), val.as_bytes());
+        let mut encrypted_data = encrypted.unwrap().to_base64(STANDARD);
+
+        encrypted_data.push_str("--");
+        encrypted_data.push_str(&iv_str);
+        encrypted_data
+    }
+
+    pub fn verify_and_decrypt(key: &[u8], cookie: Cookie<'static>) -> Option<Cookie<'static>> {
+        let mut cookie = match verify(key, cookie) {
+            Some(cookie) => cookie,
+            None => return None,
+        };
+
+        decrypt_data(key, cookie.value())
+            .and_then(|data| String::from_utf8(data).ok())
+            .map(move |val| {
+                cookie.set_value(val);
+                cookie
+            })
+    }
+
+    fn decrypt_data(key: &[u8], val: &str) -> Option<Vec<u8>> {
+        let (val, iv) = match split_value(val) {
+            Some(pair) => pair,
+            None => return None,
+        };
+
+        let actual = match val.from_base64() {
+            Ok(actual) => actual,
+            Err(_) => return None,
+        };
+
+        Some(symm::decrypt(symm::Cipher::aes_256_cbc(),
+                           &key[..MIN_KEY_LEN],
+                           Some(&iv),
+                           &actual)
+            .unwrap())
+    }
+
+    fn random_iv() -> Vec<u8> {
+        let mut ret = vec![0; 16];
+        openssl::rand::rand_bytes(&mut ret).unwrap();
+        return ret;
+    }
+
+}
+
+#[cfg(test)]
+mod test {
+    use {Cookie, CookieJar};
+
+    const KEY: &'static [u8] = b"f8f9eaf1ecdedff5e5b749c58115441e";
+
+    #[test]
+    fn short_key() {
+        CookieJar::new(b"foo");
+    }
+
+    #[test]
+    fn simple() {
+        let c = CookieJar::new(KEY);
+
+        c.add(Cookie::new("test", ""));
+        c.add(Cookie::new("test2", ""));
+        c.remove("test");
+
+        assert!(c.find("test").is_none());
+        assert!(c.find("test2").is_some());
+
+        c.add(Cookie::new("test3", ""));
+        c.clear();
+
+        assert!(c.find("test").is_none());
+        assert!(c.find("test2").is_none());
+        assert!(c.find("test3").is_none());
+    }
+
+    macro_rules! secure_behaviour {
+        ($c:ident, $secure:ident) => ({
+            $c.$secure().add(Cookie::new("test", "test"));
+            assert!($c.find("test").unwrap().value() != "test");
+            assert!($c.$secure().find("test").unwrap().value() == "test");
+
+            let mut cookie = $c.find("test").unwrap();
+            let new_val = format!("{}l", cookie.value());
+            cookie.set_value(new_val);
+            $c.add(cookie);
+            assert!($c.$secure().find("test").is_none());
+
+            let mut cookie = $c.find("test").unwrap();
+            cookie.set_value("foobar");
+            $c.add(cookie);
+            assert!($c.$secure().find("test").is_none());
+        })
+    }
+
+    #[cfg(feature = "secure")]
+    #[test]
+    fn signed() {
+        let c = CookieJar::new(KEY);
+        secure_behaviour!(c, signed)
+    }
+
+    #[cfg(feature = "secure")]
+    #[test]
+    fn encrypted() {
+        let c = CookieJar::new(KEY);
+        secure_behaviour!(c, encrypted)
+    }
+
+    #[test]
+    fn permanent() {
+        let c = CookieJar::new(KEY);
+
+        c.permanent().add(Cookie::new("test", "test"));
+
+        let cookie = c.find("test").unwrap();
+        assert_eq!(cookie.value(), "test");
+        assert_eq!(c.permanent().find("test").unwrap().value(), "test");
+        assert!(cookie.expires().is_some());
+        assert!(cookie.max_age().is_some());
+    }
+
+    #[cfg(feature = "secure")]
+    #[test]
+    fn chained() {
+        let c = CookieJar::new(KEY);
+        c.permanent().signed().add(Cookie::new("test", "test"));
+
+        let cookie = c.signed().find("test").unwrap();
+        assert_eq!(cookie.value(), "test");
+        assert!(cookie.expires().is_some());
+        assert!(cookie.max_age().is_some());
+    }
+
+    #[cfg(features = "secure")]
+    #[test]
+    fn iter() {
+        let mut c = CookieJar::new(KEY);
+
+        c.add_original(Cookie::new("original", "original"));
+
+        c.add(Cookie::new("test", "test"));
+        c.add(Cookie::new("test2", "test2"));
+        c.add(Cookie::new("test3", "test3"));
+        c.add(Cookie::new("test4", "test4"));
+
+        c.signed().add(Cookie::new("signed", "signed"));
+
+        c.encrypted().add(Cookie::new("encrypted", "encrypted"));
+
+        c.remove("test");
+
+        let cookies = c.iter().collect::<Vec<_>>();
+        assert_eq!(cookies.len(), 6);
+
+        let encrypted_cookies = c.encrypted().iter().collect::<Vec<_>>();
+        assert_eq!(encrypted_cookies.len(), 1);
+        assert_eq!(encrypted_cookies[0].name, "encrypted");
+
+        let signed_cookies = c.signed().iter().collect::<Vec<_>>();
+        assert_eq!(signed_cookies.len(), 2);
+        assert!(signed_cookies[0].name == "signed" || signed_cookies[1].name == "signed");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/src/lib.rs
@@ -0,0 +1,772 @@
+//! HTTP Cookie parsing and Cookie Jar management.
+//!
+//! This crates provides the [Cookie](struct.Cookie.html) type, which directly
+//! maps to an HTTP cookie, and the [CookieJar](struct.CookieJar.html) type,
+//! which allows for simple management of many cookies as well as encryption and
+//! signing of cookies for session management.
+//!
+//! # Usage
+//!
+//! Add the following to the `[dependencies]` section of your `Cargo.toml`:
+//!
+//! ```ignore
+//! cookie = "0.6"
+//! ```
+//!
+//! Then add the following line to your crate root:
+//!
+//! ```ignore
+//! extern crate cookie;
+//! ```
+//!
+//! # Features
+//!
+//! This crates can be configured at compile-time through the following Cargo
+//! features:
+//!
+//!
+//! * **secure** (enabled by default)
+//!
+//!   Enables signing and encryption of cookies.
+//!
+//!   When this feature is enabled, signed and encrypted cookies jars will
+//!   encrypt and/or sign any cookies added to them. When this feature is
+//!   disabled, those cookies will be added in plaintext.
+//!
+//! * **percent-encode** (disabled by default)
+//!
+//!   Enables percent encoding and decoding of names and values in cookies.
+//!
+//!   When this feature is enabled, the
+//!   [encoded](struct.Cookie.html#method.encoded) and
+//!   [parse_encoded](struct.Cookie.html#method.parse_encoded) methods of
+//!   `Cookie` become available. The `encoded` method returns a wrapper around a
+//!   `Cookie` whose `Display` implementation percent-encodes the name and value
+//!   of the cookie. The `parse_encoded` method percent-decodes the name and
+//!   value of a `Cookie` during parsing. When this feature is disabled, the
+//!   `encoded` and `parse_encoded` methods are not available.
+//!
+//! You can enable features via the `Cargo.toml` file:
+//!
+//! ```ignore
+//! [dependencies.cookie]
+//! features = ["secure", "percent-encode"]
+//! ```
+
+#![doc(html_root_url = "https://docs.rs/cookie/0.6")]
+#![allow(deprecated)]
+#![deny(missing_docs)]
+#![cfg_attr(test, deny(warnings))]
+
+#[cfg(feature = "percent-encode")]
+extern crate url;
+extern crate time;
+
+mod builder;
+mod jar;
+mod parse;
+
+use std::borrow::Cow;
+use std::ascii::AsciiExt;
+use std::fmt;
+use std::str::FromStr;
+
+#[cfg(feature = "percent-encode")]
+use url::percent_encoding::{USERINFO_ENCODE_SET, percent_encode};
+use time::{Tm, Duration};
+
+use parse::parse_cookie;
+pub use parse::ParseError;
+
+pub use builder::CookieBuilder;
+pub use jar::CookieJar;
+
+#[derive(Debug, Clone)]
+enum CookieStr {
+    /// An string derived from indexes (start, end).
+    Indexed(usize, usize),
+    /// A string derived from a concrete string.
+    Concrete(Cow<'static, str>),
+}
+
+impl CookieStr {
+    /// Whether this string is derived from indexes or not.
+    fn is_indexed(&self) -> bool {
+        match *self {
+            CookieStr::Indexed(..) => true,
+            CookieStr::Concrete(..) => false,
+        }
+    }
+
+    /// Retrieves the string `self` corresponds to. If `self` is derived from
+    /// indexes, the corresponding subslice of `string` is returned. Otherwise,
+    /// the concrete string is returned.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `self` is an indexed string and `string` is None.
+    fn to_str<'s>(&'s self, string: Option<&'s Cow<str>>) -> &'s str {
+        if self.is_indexed() && string.is_none() {
+            panic!("Cannot convert indexed str to str without base string!")
+        }
+
+        match *self {
+            CookieStr::Indexed(i, j) => &string.unwrap()[i..j],
+            CookieStr::Concrete(ref cstr) => &*cstr,
+        }
+    }
+}
+
+/// Representation of an HTTP cookie.
+///
+/// # Constructing a `Cookie`
+///
+/// To construct a cookie with only a name/value, use the [new](#method.new)
+/// method:
+///
+/// ```rust
+/// use cookie::Cookie;
+///
+/// let cookie = Cookie::new("name", "value");
+/// assert_eq!(&cookie.to_string(), "name=value");
+/// ```
+///
+/// To construct more elaborate cookies, use the [build](#method.build) method
+/// and [CookieBuilder](struct.CookieBuilder.html) methods:
+///
+/// ```rust
+/// use cookie::Cookie;
+///
+/// let cookie = Cookie::build("name", "value")
+///     .domain("www.rust-lang.org")
+///     .path("/")
+///     .secure(true)
+///     .http_only(true)
+///     .finish();
+/// ```
+#[derive(Debug, Clone)]
+pub struct Cookie<'c> {
+    /// Storage for the cookie string. Only used if this structure was derived
+    /// from a string that was subsequently parsed.
+    cookie_string: Option<Cow<'c, str>>,
+    /// The cookie's name.
+    name: CookieStr,
+    /// The cookie's value.
+    value: CookieStr,
+    /// The cookie's experiation, if any.
+    expires: Option<Tm>,
+    /// The cookie's maximum age, if any.
+    max_age: Option<Duration>,
+    /// The cookie's domain, if any.
+    domain: Option<CookieStr>,
+    /// The cookie's path domain, if any.
+    path: Option<CookieStr>,
+    /// Whether this cookie was marked secure.
+    secure: bool,
+    /// Whether this cookie was marked httponly.
+    http_only: bool,
+}
+
+impl Cookie<'static> {
+    /// Creates a new `Cookie` with the given name and value.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let cookie = Cookie::new("name", "value");
+    /// assert_eq!(cookie.name_value(), ("name", "value"));
+    /// ```
+    pub fn new<N, V>(name: N, value: V) -> Cookie<'static>
+        where N: Into<Cow<'static, str>>,
+              V: Into<Cow<'static, str>>
+    {
+        Cookie {
+            cookie_string: None,
+            name: CookieStr::Concrete(name.into()),
+            value: CookieStr::Concrete(value.into()),
+            expires: None,
+            max_age: None,
+            domain: None,
+            path: None,
+            secure: false,
+            http_only: false,
+        }
+    }
+
+    /// Creates a new `CookieBuilder` instance from the given key and value
+    /// strings.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::build("foo", "bar").finish();
+    /// assert_eq!(c.name_value(), ("foo", "bar"));
+    /// ```
+    pub fn build<N, V>(name: N, value: V) -> CookieBuilder
+        where N: Into<Cow<'static, str>>,
+              V: Into<Cow<'static, str>>
+    {
+        CookieBuilder::new(name, value)
+    }
+}
+
+impl<'c> Cookie<'c> {
+    /// Parses a `Cookie` from the given HTTP cookie header value string. Does
+    /// not perform any percent-decoding.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("foo=bar%20baz; HttpOnly").unwrap();
+    /// assert_eq!(c.name_value(), ("foo", "bar%20baz"));
+    /// assert_eq!(c.http_only(), true);
+    /// ```
+    pub fn parse<S>(s: S) -> Result<Cookie<'c>, ParseError>
+        where S: Into<Cow<'c, str>>
+    {
+        parse_cookie(s, false)
+    }
+
+    /// Parses a `Cookie` from the given HTTP cookie header value string where
+    /// the name and value fields are percent-encoded. Percent-decodes the
+    /// name/value fields.
+    ///
+    /// This API requires the `percent-encode` feature to be enabled on this
+    /// crate.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse_encoded("foo=bar%20baz; HttpOnly").unwrap();
+    /// assert_eq!(c.name_value(), ("foo", "bar baz"));
+    /// assert_eq!(c.http_only(), true);
+    /// ```
+    #[cfg(feature = "percent-encode")]
+    pub fn parse_encoded<S>(s: S) -> Result<Cookie<'c>, ParseError>
+        where S: Into<Cow<'c, str>>
+    {
+        parse_cookie(s, true)
+    }
+
+    /// Wraps `self` in an `EncodedCookie`: a cost-free wrapper around `Cookie`
+    /// whose `Display` implementation percent-encodes the name and value of the
+    /// wrapped `Cookie`.
+    ///
+    /// This method is only available when the `percent-encode` feature is
+    /// enabled.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("my name", "this; value?");
+    /// assert_eq!(&c.encoded().to_string(), "my%20name=this%3B%20value%3F");
+    /// ```
+    #[cfg(feature = "percent-encode")]
+    pub fn encoded<'a>(&'a self) -> EncodedCookie<'a, 'c> {
+        EncodedCookie(self)
+    }
+
+    /// Converts `self` into a `Cookie` with a static lifetime. This method
+    /// results in at most one allocation.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::new("a", "b");
+    /// let owned_cookie = c.into_owned();
+    /// assert_eq!(owned_cookie.name_value(), ("a", "b"));
+    /// ```
+    pub fn into_owned(self) -> Cookie<'static> {
+        Cookie {
+            cookie_string: self.cookie_string.map(|s| s.into_owned().into()),
+            name: self.name,
+            value: self.value,
+            expires: self.expires,
+            max_age: self.max_age,
+            domain: self.domain,
+            path: self.path,
+            secure: self.secure,
+            http_only: self.http_only,
+        }
+    }
+
+    /// Returns the name of `self`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::new("name", "value");
+    /// assert_eq!(c.name(), "name");
+    /// ```
+    #[inline]
+    pub fn name(&self) -> &str {
+        self.name.to_str(self.cookie_string.as_ref())
+    }
+
+    /// Returns the value of `self`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::new("name", "value");
+    /// assert_eq!(c.value(), "value");
+    /// ```
+    #[inline]
+    pub fn value(&self) -> &str {
+        self.value.to_str(self.cookie_string.as_ref())
+    }
+
+    /// Returns the name and value of `self` as a tuple of `(name, value)`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::new("name", "value");
+    /// assert_eq!(c.name_value(), ("name", "value"));
+    /// ```
+    #[inline]
+    pub fn name_value(&self) -> (&str, &str) {
+        (self.name(), self.value())
+    }
+
+    /// Returns whether this cookie was marked `HttpOnly` or not.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("name=value; httponly").unwrap();
+    /// assert_eq!(c.http_only(), true);
+    /// ```
+    #[inline]
+    pub fn http_only(&self) -> bool {
+        self.http_only
+    }
+
+    /// Returns whether this cookie was marked `Secure` or not.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("name=value; Secure").unwrap();
+    /// assert_eq!(c.secure(), true);
+    /// ```
+    #[inline]
+    pub fn secure(&self) -> bool {
+        self.secure
+    }
+
+    /// Returns the specified max-age of the cookie if one was specified.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("name=value").unwrap();
+    /// assert_eq!(c.max_age(), None);
+    ///
+    /// let c = Cookie::parse("name=value; Max-Age=3600").unwrap();
+    /// assert_eq!(c.max_age().map(|age| age.num_hours()), Some(1));
+    /// ```
+    #[inline]
+    pub fn max_age(&self) -> Option<Duration> {
+        self.max_age
+    }
+
+    /// Returns the `Path` of the cookie if one was specified.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("name=value").unwrap();
+    /// assert_eq!(c.path(), None);
+    ///
+    /// let c = Cookie::parse("name=value; Path=/").unwrap();
+    /// assert_eq!(c.path(), Some("/"));
+    ///
+    /// let c = Cookie::parse("name=value; path=/sub").unwrap();
+    /// assert_eq!(c.path(), Some("/sub"));
+    /// ```
+    #[inline]
+    pub fn path(&self) -> Option<&str> {
+        match self.path {
+            Some(ref c) => Some(c.to_str(self.cookie_string.as_ref())),
+            None => None,
+        }
+    }
+
+    /// Returns the `Domain` of the cookie if one was specified.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("name=value").unwrap();
+    /// assert_eq!(c.domain(), None);
+    ///
+    /// let c = Cookie::parse("name=value; Domain=crates.io").unwrap();
+    /// assert_eq!(c.domain(), Some("crates.io"));
+    /// ```
+    #[inline]
+    pub fn domain(&self) -> Option<&str> {
+        match self.domain {
+            Some(ref c) => Some(c.to_str(self.cookie_string.as_ref())),
+            None => None,
+        }
+    }
+
+    /// Returns the `Expires` time of the cookie if one was specified.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let c = Cookie::parse("name=value").unwrap();
+    /// assert_eq!(c.expires(), None);
+    ///
+    /// let expire_time = "Wed, 21 Oct 2017 07:28:00 GMT";
+    /// let cookie_str = format!("name=value; Expires={}", expire_time);
+    /// let c = Cookie::parse(cookie_str).unwrap();
+    /// assert_eq!(c.expires().map(|t| t.tm_year), Some(117));
+    /// ```
+    #[inline]
+    pub fn expires(&self) -> Option<Tm> {
+        self.expires
+    }
+
+    /// Sets the name of `self` to `name`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.name(), "name");
+    ///
+    /// c.set_name("foo");
+    /// assert_eq!(c.name(), "foo");
+    /// ```
+    pub fn set_name<N: Into<Cow<'static, str>>>(&mut self, name: N) {
+        self.name = CookieStr::Concrete(name.into())
+    }
+
+    /// Sets the value of `self` to `value`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.value(), "value");
+    ///
+    /// c.set_value("bar");
+    /// assert_eq!(c.value(), "bar");
+    /// ```
+    pub fn set_value<V: Into<Cow<'static, str>>>(&mut self, value: V) {
+        self.value = CookieStr::Concrete(value.into())
+    }
+
+    /// Sets the value of `http_only` in `self` to `value`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.http_only(), false);
+    ///
+    /// c.set_http_only(true);
+    /// assert_eq!(c.http_only(), true);
+    /// ```
+    #[inline]
+    pub fn set_http_only(&mut self, value: bool) {
+        self.http_only = value;
+    }
+
+    /// Sets the value of `secure` in `self` to `value`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.secure(), false);
+    ///
+    /// c.set_secure(true);
+    /// assert_eq!(c.secure(), true);
+    /// ```
+    #[inline]
+    pub fn set_secure(&mut self, value: bool) {
+        self.secure = value;
+    }
+
+    /// Sets the value of `max_age` in `self` to `value`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # extern crate cookie;
+    /// extern crate time;
+    ///
+    /// use cookie::Cookie;
+    /// use time::Duration;
+    ///
+    /// # fn main() {
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.max_age(), None);
+    ///
+    /// c.set_max_age(Duration::hours(10));
+    /// assert_eq!(c.max_age(), Some(Duration::hours(10)));
+    /// # }
+    /// ```
+    #[inline]
+    pub fn set_max_age(&mut self, value: Duration) {
+        self.max_age = Some(value);
+    }
+
+    /// Sets the `path` of `self` to `path`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.path(), None);
+    ///
+    /// c.set_path("/");
+    /// assert_eq!(c.path(), Some("/"));
+    /// ```
+    pub fn set_path<P: Into<Cow<'static, str>>>(&mut self, path: P) {
+        self.path = Some(CookieStr::Concrete(path.into()));
+    }
+
+    /// Sets the `domain` of `self` to `domain`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use cookie::Cookie;
+    ///
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.domain(), None);
+    ///
+    /// c.set_domain("rust-lang.org");
+    /// assert_eq!(c.domain(), Some("rust-lang.org"));
+    /// ```
+    pub fn set_domain<D: Into<Cow<'static, str>>>(&mut self, domain: D) {
+        self.domain = Some(CookieStr::Concrete(domain.into()));
+    }
+
+    /// Sets the expires field of `self` to `time`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # extern crate cookie;
+    /// extern crate time;
+    ///
+    /// use cookie::Cookie;
+    ///
+    /// # fn main() {
+    /// let mut c = Cookie::new("name", "value");
+    /// assert_eq!(c.expires(), None);
+    ///
+    /// let mut now = time::now();
+    /// now.tm_year += 1;
+    ///
+    /// c.set_expires(now);
+    /// assert!(c.expires().is_some())
+    /// # }
+    /// ```
+    #[inline]
+    pub fn set_expires(&mut self, time: Tm) {
+        self.expires = Some(time);
+    }
+
+    fn fmt_parameters(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.http_only() {
+            write!(f, "; HttpOnly")?;
+        }
+
+        if self.secure() {
+            write!(f, "; Secure")?;
+        }
+
+        if let Some(path) = self.path() {
+            write!(f, "; Path={}", path)?;
+        }
+
+        if let Some(domain) = self.domain() {
+            write!(f, "; Domain={}", domain)?;
+        }
+
+        if let Some(max_age) = self.max_age() {
+            write!(f, "; Max-Age={}", max_age.num_seconds())?;
+        }
+
+        if let Some(time) = self.expires() {
+            write!(f, "; Expires={}", time.rfc822())?;
+        }
+
+        Ok(())
+    }
+}
+
+/// Wrapper around `Cookie` whose `Display` implementation percent-encodes the
+/// cookie's name and value.
+///
+/// A value of this type can be obtained via the
+/// [encoded](struct.Cookie.html#method.encoded) method on
+/// [Cookie](struct.Cookie.html). This type should only be used for its
+/// `Display` implementation.
+///
+/// This type is only available when the `percent-encode` feature is enabled.
+///
+/// # Example
+///
+/// ```rust
+/// use cookie::Cookie;
+///
+/// let mut c = Cookie::new("my name", "this; value?");
+/// assert_eq!(&c.encoded().to_string(), "my%20name=this%3B%20value%3F");
+/// ```
+#[cfg(feature = "percent-encode")]
+pub struct EncodedCookie<'a, 'c: 'a>(&'a Cookie<'c>);
+
+#[cfg(feature = "percent-encode")]
+impl<'a, 'c: 'a> fmt::Display for EncodedCookie<'a, 'c> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        // Percent-encode the name and value.
+        let name = percent_encode(self.0.name().as_bytes(), USERINFO_ENCODE_SET);
+        let value = percent_encode(self.0.value().as_bytes(), USERINFO_ENCODE_SET);
+
+        // Write out the name/value pair and the cookie's parameters.
+        write!(f, "{}={}", name, value)?;
+        self.0.fmt_parameters(f)
+    }
+}
+
+impl<'c> fmt::Display for Cookie<'c> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}={}", self.name(), self.value())?;
+        self.fmt_parameters(f)
+    }
+}
+
+impl FromStr for Cookie<'static> {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> Result<Cookie<'static>, ParseError> {
+        Cookie::parse(s).map(|c| c.into_owned())
+    }
+}
+
+impl<'a, 'b> PartialEq<Cookie<'b>> for Cookie<'a> {
+    fn eq(&self, other: &Cookie<'b>) -> bool {
+        let so_far_so_good = self.name() == other.name()
+            && self.value() == other.value()
+            && self.http_only() == other.http_only()
+            && self.secure() == other.secure()
+            && self.max_age() == other.max_age()
+            && self.expires() == other.expires();
+
+        if !so_far_so_good {
+            return false;
+        }
+
+        match (self.path(), other.path()) {
+            (Some(a), Some(b)) if a.eq_ignore_ascii_case(b) => {}
+            (None, None) => {}
+            _ => return false,
+        };
+
+        match (self.domain(), other.domain()) {
+            (Some(a), Some(b)) if a.eq_ignore_ascii_case(b) => {}
+            (None, None) => {}
+            _ => return false,
+        };
+
+        true
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use ::Cookie;
+    use ::time::{strptime, Duration};
+
+    #[test]
+    fn format() {
+        let cookie = Cookie::new("foo", "bar");
+        assert_eq!(&cookie.to_string(), "foo=bar");
+
+        let cookie = Cookie::build("foo", "bar")
+            .http_only(true).finish();
+        assert_eq!(&cookie.to_string(), "foo=bar; HttpOnly");
+
+        let cookie = Cookie::build("foo", "bar")
+            .max_age(Duration::seconds(10)).finish();
+        assert_eq!(&cookie.to_string(), "foo=bar; Max-Age=10");
+
+        let cookie = Cookie::build("foo", "bar")
+            .secure(true).finish();
+        assert_eq!(&cookie.to_string(), "foo=bar; Secure");
+
+        let cookie = Cookie::build("foo", "bar")
+            .path("/").finish();
+        assert_eq!(&cookie.to_string(), "foo=bar; Path=/");
+
+        let cookie = Cookie::build("foo", "bar")
+            .domain("www.rust-lang.org").finish();
+        assert_eq!(&cookie.to_string(), "foo=bar; Domain=www.rust-lang.org");
+
+        let time_str = "Wed, 21 Oct 2015 07:28:00 GMT";
+        let expires = strptime(time_str, "%a, %d %b %Y %H:%M:%S %Z").unwrap();
+        let cookie = Cookie::build("foo", "bar")
+            .expires(expires).finish();
+        assert_eq!(&cookie.to_string(),
+                   "foo=bar; Expires=Wed, 21 Oct 2015 07:28:00 GMT");
+    }
+
+    #[test]
+    #[cfg(feature = "percent-encode")]
+    fn format_encoded() {
+        let cookie = Cookie::build("foo !?=", "bar;; a").finish();
+        let cookie_str = cookie.encoded().to_string();
+        assert_eq!(&cookie_str, "foo%20!%3F%3D=bar%3B%3B%20a");
+
+        let cookie = Cookie::parse_encoded(cookie_str).unwrap();
+        assert_eq!(cookie.name_value(), ("foo !?=", "bar;; a"));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/cookie/src/parse.rs
@@ -0,0 +1,374 @@
+use std::borrow::Cow;
+use std::cmp;
+use std::error::Error;
+use std::ascii::AsciiExt;
+use std::str::Utf8Error;
+use std::fmt;
+use std::convert::From;
+
+#[cfg(feature = "percent-encode")]
+use url::percent_encoding::percent_decode;
+use time::{self, Duration};
+
+use ::{Cookie, CookieStr};
+
+/// Enum corresponding to a parsing error.
+#[derive(Debug, PartialEq, Eq, Clone, Copy)]
+pub enum ParseError {
+    /// The cookie did not contain a name/value pair.
+    MissingPair,
+    /// The cookie's name was empty.
+    EmptyName,
+    /// Decoding the cookie's name or value resulted in invalid UTF-8.
+    Utf8Error(Utf8Error),
+    /// It is discouraged to exhaustively match on this enum as its variants may
+    /// grow without a breaking-change bump in version numbers.
+    #[doc(hidden)]
+    __Nonexhasutive,
+}
+
+impl ParseError {
+    /// Returns a description of this error as a string
+    pub fn as_str(&self) -> &'static str {
+        match *self {
+            ParseError::MissingPair => "the cookie is missing a name/value pair",
+            ParseError::EmptyName => "the cookie's name is empty",
+            ParseError::Utf8Error(_) => {
+                "decoding the cookie's name or value resulted in invalid UTF-8"
+            }
+            ParseError::__Nonexhasutive => unreachable!("__Nonexhasutive ParseError"),
+        }
+    }
+}
+
+impl fmt::Display for ParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.as_str())
+    }
+}
+
+impl From<Utf8Error> for ParseError {
+    fn from(error: Utf8Error) -> ParseError {
+        ParseError::Utf8Error(error)
+    }
+}
+
+impl Error for ParseError {
+    fn description(&self) -> &str {
+        self.as_str()
+    }
+}
+
+fn indexes_of(needle: &str, haystack: &str) -> Option<(usize, usize)> {
+    let haystack_start = haystack.as_ptr() as usize;
+    let needle_start = needle.as_ptr() as usize;
+
+    if needle_start < haystack_start {
+        return None;
+    }
+
+    if (needle_start + needle.len()) > (haystack_start + haystack.len()) {
+        return None;
+    }
+
+    let start = needle_start - haystack_start;
+    let end = start + needle.len();
+    Some((start, end))
+}
+
+#[cfg(feature = "percent-encode")]
+fn name_val_decoded(name: &str, val: &str) -> Result<(CookieStr, CookieStr), ParseError> {
+    let decoded_name = percent_decode(name.as_bytes()).decode_utf8()?;
+    let decoded_value = percent_decode(val.as_bytes()).decode_utf8()?;
+    let name = CookieStr::Concrete(Cow::Owned(decoded_name.into_owned()));
+    let val = CookieStr::Concrete(Cow::Owned(decoded_value.into_owned()));
+
+    Ok((name, val))
+}
+
+#[cfg(not(feature = "percent-encode"))]
+fn name_val_decoded(_: &str, _: &str) -> Result<(CookieStr, CookieStr), ParseError> {
+    unreachable!("This function should never be called when the feature is disabled!")
+}
+
+// This function does the real parsing but _does not_ set the `cookie_string` in
+// the returned cookie object. This only exists so that the borrow to `s` is
+// returned at the end of the call, allowing the `cookie_string` field to be
+// set in the outer `parse` function.
+fn parse_inner<'c>(s: &str, decode: bool) -> Result<Cookie<'c>, ParseError> {
+    let mut attributes = s.split(';');
+    let key_value = match attributes.next() {
+        Some(s) => s,
+        _ => panic!(),
+    };
+
+    // Determine the name = val.
+    let (name, value) = match key_value.find('=') {
+        Some(i) => (key_value[..i].trim(), key_value[(i + 1)..].trim()),
+        None => return Err(ParseError::MissingPair)
+    };
+
+    if name.is_empty() {
+        return Err(ParseError::EmptyName);
+    }
+
+    // Create a cookie with all of the defaults. We'll fill things in while we
+    // iterate through the parameters below.
+    let (name, value) = if decode {
+        name_val_decoded(name, value)?
+    } else {
+        let name_indexes = indexes_of(name, &s).expect("name sub");
+        let value_indexes = indexes_of(value, &s).expect("value sub");
+        let name = CookieStr::Indexed(name_indexes.0, name_indexes.1);
+        let value = CookieStr::Indexed(value_indexes.0, value_indexes.1);
+
+        (name, value)
+    };
+
+    let mut cookie = Cookie {
+        cookie_string: None,
+        name: name,
+        value: value,
+        expires: None,
+        max_age: None,
+        domain: None,
+        path: None,
+        secure: false,
+        http_only: false,
+    };
+
+    for attr in attributes {
+        let (key, value) = match attr.find('=') {
+            Some(i) => (attr[..i].trim(), Some(attr[(i + 1)..].trim())),
+            None => (attr.trim(), None),
+        };
+
+        match (&*key.to_ascii_lowercase(), value) {
+            ("secure", _) => cookie.secure = true,
+            ("httponly", _) => cookie.http_only = true,
+            ("max-age", Some(v)) => {
+                // See RFC 6265 Section 5.2.2, negative values indicate that the
+                // earliest possible expiration time should be used, so set the
+                // max age as 0 seconds.
+                cookie.max_age = match v.parse() {
+                    Ok(val) if val <= 0 => Some(Duration::zero()),
+                    Ok(val) => {
+                        // Don't panic if the max age seconds is greater than what's supported by
+                        // `Duration`.
+                        let val = cmp::min(val, Duration::max_value().num_seconds());
+                        Some(Duration::seconds(val))
+                    }
+                    Err(_) => continue,
+                };
+            }
+            ("domain", Some(v)) if !v.is_empty() => {
+                let domain = match v.starts_with('.') {
+                    true => &v[1..],
+                    false => v,
+                };
+
+                let (i, j) = indexes_of(domain, &s).expect("domain sub");
+                cookie.domain = Some(CookieStr::Indexed(i, j));
+            }
+            ("path", Some(v)) => {
+                let (i, j) = indexes_of(v, &s).expect("path sub");
+                cookie.path = Some(CookieStr::Indexed(i, j));
+            }
+            ("expires", Some(v)) => {
+                // Try strptime with three date formats according to
+                // http://tools.ietf.org/html/rfc2616#section-3.3.1. Try
+                // additional ones as encountered in the real world.
+                let tm = time::strptime(v, "%a, %d %b %Y %H:%M:%S %Z")
+                    .or_else(|_| time::strptime(v, "%A, %d-%b-%y %H:%M:%S %Z"))
+                    .or_else(|_| time::strptime(v, "%a, %d-%b-%Y %H:%M:%S %Z"))
+                    .or_else(|_| time::strptime(v, "%a %b %d %H:%M:%S %Y"));
+
+                if let Some(time) = tm.ok() {
+                    cookie.expires = Some(time)
+                }
+            }
+            _ => {
+                // We're going to be permissive here. If we have no idea what
+                // this is, then it's something nonstandard. We're not going to
+                // store it (because it's not compliant), but we're also not
+                // going to emit an error.
+            }
+        }
+    }
+
+    Ok(cookie)
+}
+
+pub fn parse_cookie<'c, S>(cow: S, decode: bool) -> Result<Cookie<'c>, ParseError>
+    where S: Into<Cow<'c, str>>
+{
+    let s = cow.into();
+    let mut cookie = parse_inner(&s, decode)?;
+    cookie.cookie_string = Some(s);
+    Ok(cookie)
+}
+
+#[cfg(test)]
+mod tests {
+    use ::Cookie;
+    use ::time::{strptime, Duration};
+
+    macro_rules! assert_eq_parse {
+        ($string:expr, $expected:expr) => (
+            let cookie = match Cookie::parse($string) {
+                Ok(cookie) => cookie,
+                Err(e) => panic!("Failed to parse {:?}: {:?}", $string, e)
+            };
+
+            assert_eq!(cookie, $expected);
+        )
+    }
+
+    macro_rules! assert_ne_parse {
+        ($string:expr, $expected:expr) => (
+            let cookie = match Cookie::parse($string) {
+                Ok(cookie) => cookie,
+                Err(e) => panic!("Failed to parse {:?}: {:?}", $string, e)
+            };
+
+            assert_ne!(cookie, $expected);
+        )
+    }
+
+    #[test]
+    fn parse() {
+        assert!(Cookie::parse("bar").is_err());
+        assert!(Cookie::parse("=bar").is_err());
+        assert!(Cookie::parse(" =bar").is_err());
+        assert!(Cookie::parse("foo=").is_ok());
+
+        let expected = Cookie::build("foo", "bar=baz").finish();
+        assert_eq_parse!("foo=bar=baz", expected);
+
+        let mut expected = Cookie::build("foo", "bar").finish();
+        assert_eq_parse!("foo=bar", expected);
+        assert_eq_parse!("foo = bar", expected);
+        assert_eq_parse!(" foo=bar ", expected);
+        assert_eq_parse!(" foo=bar ;Domain=", expected);
+        assert_eq_parse!(" foo=bar ;Domain= ", expected);
+        assert_eq_parse!(" foo=bar ;Ignored", expected);
+
+        let mut unexpected = Cookie::build("foo", "bar").http_only(false).finish();
+        assert_ne_parse!(" foo=bar ;HttpOnly", unexpected);
+        assert_ne_parse!(" foo=bar; httponly", unexpected);
+
+        expected.set_http_only(true);
+        assert_eq_parse!(" foo=bar ;HttpOnly", expected);
+        assert_eq_parse!(" foo=bar ;httponly", expected);
+        assert_eq_parse!(" foo=bar ;HTTPONLY=whatever", expected);
+        assert_eq_parse!(" foo=bar ; sekure; HTTPONLY", expected);
+
+        expected.set_secure(true);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure=aaaa", expected);
+
+        unexpected.set_http_only(true);
+        unexpected.set_secure(true);
+        assert_ne_parse!(" foo=bar ;HttpOnly; skeure", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; =secure", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly;", unexpected);
+
+        unexpected.set_secure(false);
+        assert_ne_parse!(" foo=bar ;HttpOnly; secure", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; secure", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; secure", unexpected);
+
+        expected.set_max_age(Duration::zero());
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=0", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age = 0 ", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=-1", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age = -1 ", expected);
+
+        expected.set_max_age(Duration::minutes(1));
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=60", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age =   60 ", expected);
+
+        expected.set_max_age(Duration::seconds(4));
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age = 4 ", expected);
+
+        unexpected.set_secure(true);
+        unexpected.set_max_age(Duration::minutes(1));
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=122", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age = 38 ", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=51", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age = -1 ", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age = 0", unexpected);
+
+        expected.set_path("/");
+        assert_eq_parse!("foo=bar;HttpOnly; Secure; Max-Age=4; Path=/", expected);
+        assert_eq_parse!("foo=bar;HttpOnly; Secure; Max-Age=4;Path=/", expected);
+
+        expected.set_path("/foo");
+        assert_eq_parse!("foo=bar;HttpOnly; Secure; Max-Age=4; Path=/foo", expected);
+        assert_eq_parse!("foo=bar;HttpOnly; Secure; Max-Age=4;Path=/foo", expected);
+        assert_eq_parse!("foo=bar;HttpOnly; Secure; Max-Age=4;path=/foo", expected);
+        assert_eq_parse!("foo=bar;HttpOnly; Secure; Max-Age=4;path = /foo", expected);
+
+        unexpected.set_max_age(Duration::seconds(4));
+        unexpected.set_path("/bar");
+        assert_ne_parse!("foo=bar;HttpOnly; Secure; Max-Age=4; Path=/foo", unexpected);
+        assert_ne_parse!("foo=bar;HttpOnly; Secure; Max-Age=4;Path=/baz", unexpected);
+
+        expected.set_domain("www.foo.com");
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=www.foo.com", expected);
+
+        expected.set_domain("foo.com");
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=foo.com", expected);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=FOO.COM", expected);
+
+        unexpected.set_path("/foo");
+        unexpected.set_domain("bar.com");
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=foo.com", unexpected);
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=FOO.COM", unexpected);
+
+        let time_str = "Wed, 21 Oct 2015 07:28:00 GMT";
+        let expires = strptime(time_str, "%a, %d %b %Y %H:%M:%S %Z").unwrap();
+        expected.set_expires(expires);
+        assert_eq_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=foo.com; Expires=Wed, 21 Oct 2015 07:28:00 GMT", expected);
+
+        unexpected.set_domain("foo.com");
+        let bad_expires = strptime(time_str, "%a, %d %b %Y %H:%S:%M %Z").unwrap();
+        expected.set_expires(bad_expires);
+        assert_ne_parse!(" foo=bar ;HttpOnly; Secure; Max-Age=4; Path=/foo; \
+            Domain=foo.com; Expires=Wed, 21 Oct 2015 07:28:00 GMT", unexpected);
+    }
+
+    #[test]
+    fn odd_characters() {
+        let expected = Cookie::new("foo", "b%2Fr");
+        assert_eq_parse!("foo=b%2Fr", expected);
+    }
+
+    #[test]
+    #[cfg(feature = "percent-encode")]
+    fn odd_characters_encoded() {
+        let expected = Cookie::new("foo", "b/r");
+        let cookie = match Cookie::parse_encoded("foo=b%2Fr") {
+            Ok(cookie) => cookie,
+            Err(e) => panic!("Failed to parse: {:?}", e)
+        };
+
+        assert_eq!(cookie, expected);
+    }
+
+    #[test]
+    fn do_not_panic_on_large_max_ages() {
+        let max_seconds = Duration::max_value().num_seconds();
+        let expected = Cookie::build("foo", "bar")
+            .max_age(Duration::seconds(max_seconds))
+            .finish();
+        assert_eq_parse!(format!(" foo=bar; Max-Age={:?}", max_seconds + 1), expected);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"b65a8d0e5eb4bb7a0b8dca8be9102ece8810a5e4591dd289da70f28b8e829dfb",".travis.yml":"5c1a66c2f3f70d7a6fd7ee40b87863d95b78294244cc037453220d64fc431362","CHANGELOG.md":"729d4632f518b0c699d1b947e5d8ddd3fc6a8878bd7796d7b96b2f58772f0478","Cargo.toml":"778cf5a227b5f6a0200d9385d2a8adc59a559a6822ab4d1941348f3eee92d791","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"ea4153526db8a7b7c33fba324fd87f9e43ecac4c973ec1af242c325768c1a4b3","scala-bench/bench.scala":"8f203f98f2c938115247a8ed5ef9d0848fe0f8dca49fc43e2dba88bdd61029e3","src/bin/bench.rs":"7826ed26fcce96f0e2fe3d0b46c36bbfde70168546124018394b1aae8fbf1ec3","src/bin/extra_impls/mod.rs":"b72e67187cbfc1672faacd7d906604f3adc0c7540c781db88c6f4f1726229db9","src/bin/extra_impls/mpsc_queue.rs":"94551cbe0075c40472bae74cb500070c5c621e3690e15c1374b56c5cb7dd6639","src/bin/stress-msq.rs":"f49ba9adb0308013dbd7ed748572659c8b25d045e20609a21ed29ce35784f8f7","src/lib.rs":"b84c7a07bcae8342ce791e42566d103bfc7ac072994a2fe4d6f0b14c8d905f2d","src/mem/cache_padded.rs":"710de7fc76c04bda2e9eafa9f2e9a038fd381330f0e2ac657b56552a9bd9223c","src/mem/epoch/atomic.rs":"ec73c5e271b6b16bc489d3a6b47a48c5ef21cd1d8320d5ed01a6cac271afb42a","src/mem/epoch/garbage.rs":"dd3a3270481da756cf2e8aece5518642059d72492ffbdb107ad9c92d608ed3d3","src/mem/epoch/global.rs":"901df28fdb255cf2466962fa1fcfe3f3006325b94d80a5edb71e3251cecd592e","src/mem/epoch/guard.rs":"75c2a771d88e859f1f53a79a9466ed1e62a6854a1ddca99c6dcaa3d4ca3520e1","src/mem/epoch/local.rs":"d451c2c05fe50e80bdc92313d074b7db13f54d6caa3cf6df6ba5b717566932ae","src/mem/epoch/mod.rs":"a57570492cc2b23b5d6164e0738af5b8d7d65c4b2de08fdfaa2283a47481fce0","src/mem/epoch/participant.rs":"d16e9a81d34f8368340126e9e420bdeec9e661c94aec7a26057be26cad0982df","src/mem/epoch/participants.rs":"c7f4edd7e632130cd149afad8abbeb21888df55b7e4db4206a8840a218bf764d","src/mem/mod.rs":"c60aaeee01ce6abe2418f6f2a3cdd38564a6a46d3c47285d9730a358f52fa6bf","src/scoped.rs":"9ef97832dea5dbdebc88f6c1c8dee5ac5e801f302b70ba17b667214fc3fe57ed","src/sync/arc_cell.rs":"d12dcaca3d59cb0a7c34470dff60c11cb8e25ecde87baf3940bd0747bb107672","src/sync/atomic_option.rs":"dcdfd1080c35d782f041edc7d6c52c1c8fc05f4fe75a9dad261a8982f954ae97","src/sync/chase_lev.rs":"9679cb37bf777466c714e3b8aca7c583638e4534cbb298449130cfa7a07c1d78","src/sync/mod.rs":"35e5f793530e198e891e6ef619da161bbcd31a1de1419dc5b9e9a954d3542c02","src/sync/ms_queue.rs":"cf735b32c12d3227364b2a2abf75a99e5f36f2980b58f34821462cdaf1aac209","src/sync/seg_queue.rs":"e9178f259a0fec71aeb4fb9d5c2bd668eb3dc5f3a3808f167eaae263d76f6646","src/sync/treiber_stack.rs":"60e7f82a42379fbcc2b418b9d50cef98ebc743d9747bf646eb1f3d723189bea4"},"package":"0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/.gitignore
@@ -0,0 +1,13 @@
+# Compiled files
+*.o
+*.so
+*.rlib
+*.dll
+*.class
+
+# Executables
+*.exe
+
+# Generated by Cargo
+/target/
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/.travis.yml
@@ -0,0 +1,36 @@
+language: rust
+# necessary for `travis-cargo coveralls --no-sudo`
+addons:
+  apt:
+    packages:
+      - libcurl4-openssl-dev
+      - libelf-dev
+      - libdw-dev
+
+# run builds for all the trains (and more)
+rust:
+  - nightly
+  - beta
+  - stable
+
+# load travis-cargo
+before_script:
+  - |
+      pip install 'travis-cargo<0.2' --user &&
+      export PATH=$HOME/.local/bin:$PATH
+
+# the main build
+script:
+  - |
+      travis-cargo build &&
+      travis-cargo test &&
+      travis-cargo test -- --release &&
+      travis-cargo run -- --bin bench --release &&
+      travis-cargo --only stable doc
+env:
+  global:
+    # override the default `--features unstable` used for the nightly branch (optional)
+    - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Version 0.2
+
+- Changed existing non-blocking `pop` methods to `try_pop`
+- Added blocking `pop` support to Michael-Scott queue
+- Added Chase-Lev work-stealing deque
+
+# Version 0.1
+
+- Added [epoch-based memory management](http://aturon.github.io/blog/2015/08/27/epoch/)
+- Added Michael-Scott queue
+- Added Segmented array queue
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "crossbeam"
+version = "0.2.10"
+authors = ["Aaron Turon <aturon@mozilla.com>"]
+description = "Support for lock-free data structures, synchronizers, and parallel programming"
+repository = "https://github.com/aturon/crossbeam"
+documentation = "http://aturon.github.io/crossbeam-doc/crossbeam/"
+readme = "README.md"
+license = "Apache-2.0/MIT"
+
+[features]
+nightly = []
+
+[dev-dependencies]
+rand = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/README.md
@@ -0,0 +1,38 @@
+# Crossbeam: support for concurrent and parallel programming
+
+[![Build Status](https://travis-ci.org/aturon/crossbeam.svg?branch=master)](https://travis-ci.org/aturon/crossbeam)
+
+This crate is an early work in progress. The focus for the moment is
+concurrency:
+
+- **Non-blocking data structures**. These data structures allow for high
+performance, highly-concurrent access, much superior to wrapping with a
+`Mutex`. Ultimately the goal is to include stacks, queues, deques, bags, sets
+and maps.
+
+- **Memory management**. Because non-blocking data structures avoid global
+synchronization, it is not easy to tell when internal data can be safely
+freed. The `mem` module provides generic, easy to use, and high-performance APIs
+for managing memory in these cases.
+
+- **Synchronization**. The standard library provides a few synchronization
+primitives (locks, semaphores, barriers, etc) but this crate seeks to expand
+that set to include more advanced/niche primitives, as well as userspace
+alternatives.
+
+- **Scoped thread API**. Finally, the crate provides a "scoped" thread API,
+making it possible to spawn threads that share stack data with their parents.
+
+# Usage
+
+To use Crossbeam, add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+crossbeam = "0.2"
+```
+
+For examples of what Crossbeam is capable of, see the
+[documentation][docs].
+
+[docs]: http://aturon.github.io/crossbeam-doc/crossbeam/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/scala-bench/bench.scala
@@ -0,0 +1,195 @@
+import scala.concurrent.ExecutionContext.Implicits.global
+import scala.concurrent._
+import scala.concurrent.duration._
+import java.util.concurrent.ConcurrentLinkedQueue
+import java.util.concurrent.atomic._
+import java.util.Stack
+
+import scala.annotation.tailrec
+
+final class MSQueue[A](a: A) {
+  private abstract class Q
+  private final case class Node(data: A, next: AtomicReference[Q] = new AtomicReference(Emp)) extends Q
+  private final case object Emp extends Q
+  private val head = new AtomicReference(Node(a))
+  private val tail = new AtomicReference(head.get())
+
+  def enq(a: A) {
+    val newNode = new Node(a)
+    while (true) {
+      val curTail = tail.get()
+      curTail.next.get()match {
+        case n@Node(_,_) => tail.compareAndSet(curTail, n)
+        case Emp => {
+          if (curTail.next.compareAndSet(Emp, newNode)) {
+            tail.compareAndSet(curTail, newNode)
+            return
+          }
+        }
+      }
+    }
+  }
+
+  def deq(): Option[A] = {
+    while (true) {
+      val cur_head = head.get()
+      cur_head.next.get() match {
+        case Emp => return None
+        case n@Node(data, _) => {
+          if (head.compareAndSet(cur_head, n)) {
+            return Some(data)
+          }
+        }
+      }
+    }
+    None
+  }
+}
+
+abstract class MyBool
+final case class MyTrue() extends MyBool
+final case class MyFalse() extends MyBool
+
+object Bench {
+  def time(block: => Unit): Long = {
+    val t0 = System.nanoTime()
+    val result = block    // call-by-name
+    val t1 = System.nanoTime()
+    t1 - t0
+  }
+
+  def do_linked(threads: Int, count: Int) {
+    val q: ConcurrentLinkedQueue[MyBool] = new ConcurrentLinkedQueue();
+
+    val t = time {
+      var s = new Stack[Future[Unit]]
+      for (i <- 1 to threads) {
+        s.push(Future {
+          for (i <- 1 to count+1) {
+            //if (i % 100000 == 0) { println(q.size()) }
+            q.offer(MyTrue())
+          }
+        })
+      }
+
+      var rn = 0
+      while (rn < count) {
+        if (q.poll() != null) {
+          rn += 1
+        }
+      }
+
+      while (!s.empty()) {
+        Await.ready(s.pop(), Duration.Inf)
+      }
+    }
+
+    println("Linked: " + t / (count * threads))
+  }
+
+  def do_linked_mpmc(threads: Int, count: Int) {
+    val q = new ConcurrentLinkedQueue[MyBool];
+    val prod = new AtomicInteger();
+
+    val t = time {
+      var s = new Stack[Future[Unit]]
+      for (i <- 1 to threads) {
+        s.push(Future {
+          for (i <- 1 to count+1) {
+            q.offer(MyTrue())
+            //if (i % 100000 == 0) { println(q.size()) }
+          }
+          if (prod.incrementAndGet() == threads) {
+            for (i <- 0 to threads) { q.offer(MyFalse()) }
+          }
+        })
+        s.push(Future {
+          var done = false;
+          while (!done) {
+            q.poll() match {
+              case MyFalse() => done = true
+              case _ => {}
+            }
+          }
+        })
+      }
+
+      while (!s.empty()) {
+        Await.ready(s.pop(), Duration.Inf)
+      }
+    }
+
+    println("Linked mpmc: " + t / (count * threads) + " (" + t / 1000000000 + ")")
+  }
+
+
+  def do_msq(threads: Int, count: Int) {
+    val q = new MSQueue[Int](0);
+
+    val t = time {
+      var s = new Stack[Future[Unit]]
+      for (i <- 1 to threads) {
+        s.push(Future { for (i <- 1 to count+1) { q.enq(i) } })
+      }
+
+      var rn = 0
+      while (rn < count) {
+        if (q.deq() != None) {
+          rn += 1
+        }
+      }
+
+      while (!s.empty()) {
+        Await.ready(s.pop(), Duration.Inf)
+      }
+    }
+
+    println("MSQ: " + t / (count * threads) + " (" + t / 1000000000 + ")")
+  }
+
+  def do_msq_mpmc(threads: Int, count: Int) {
+    val q = new MSQueue[Boolean](true);
+    val prod = new AtomicInteger();
+
+    val t = time {
+      var s = new Stack[Future[Unit]]
+      for (i <- 1 to threads) {
+        s.push(Future {
+          for (i <- 1 to count+1) { q.enq(true) }
+          if (prod.incrementAndGet() == threads) {
+            for (i <- 1 to threads) { q.enq(false) }
+          }
+        })
+        s.push(Future {
+          var done = false;
+          while (!done) {
+            q.deq() match {
+              case Some(false) => done = true
+              case _ => {}
+            }
+          }
+        })
+      }
+
+      while (!s.empty()) {
+        Await.ready(s.pop(), Duration.Inf)
+      }
+    }
+
+    println("MSQ mpmc: " + t / (count * threads) + " (" + t / 1000000000 + ")")
+  }
+
+  def main(args: Array[String]) {
+    do_linked(2, 1000000)
+    do_linked(2, 10000000)
+
+    do_msq(2, 1000000)
+    do_msq(2, 10000000)
+
+    do_linked_mpmc(2, 1000000)
+    do_linked_mpmc(2, 10000000)
+
+    do_msq_mpmc(2, 1000000)
+    do_msq_mpmc(2, 10000000)
+  }
+}
new file mode 100755
--- /dev/null
+++ b/third_party/rust/crossbeam/src/bin/bench.rs
@@ -0,0 +1,165 @@
+extern crate crossbeam;
+
+use std::collections::VecDeque;
+use std::sync::Mutex;
+use std::sync::mpsc::channel;
+use std::time::Duration;
+
+use crossbeam::scope;
+use crossbeam::sync::MsQueue;
+use crossbeam::sync::SegQueue;
+
+use extra_impls::mpsc_queue::Queue as MpscQueue;
+
+mod extra_impls;
+
+const COUNT: u64 = 10000000;
+const THREADS: u64 = 2;
+
+#[cfg(feature = "nightly")]
+fn time<F: FnOnce()>(f: F) -> Duration {
+    let start = ::std::time::Instant::now();
+    f();
+    start.elapsed()
+}
+
+#[cfg(not(feature = "nightly"))]
+fn time<F: FnOnce()>(_f: F) -> Duration {
+    Duration::new(0, 0)
+}
+
+fn nanos(d: Duration) -> f64 {
+    d.as_secs() as f64 * 1000000000f64 + (d.subsec_nanos() as f64)
+}
+
+trait Queue<T> {
+    fn push(&self, T);
+    fn try_pop(&self) -> Option<T>;
+}
+
+impl<T> Queue<T> for MsQueue<T> {
+    fn push(&self, t: T) { self.push(t) }
+    fn try_pop(&self) -> Option<T> { self.try_pop() }
+}
+
+impl<T> Queue<T> for SegQueue<T> {
+    fn push(&self, t: T) { self.push(t) }
+    fn try_pop(&self) -> Option<T> { self.try_pop() }
+}
+
+impl<T> Queue<T> for MpscQueue<T> {
+    fn push(&self, t: T) { self.push(t) }
+    fn try_pop(&self) -> Option<T> {
+        use extra_impls::mpsc_queue::*;
+
+        loop {
+            match self.pop() {
+                Data(t) => return Some(t),
+                Empty => return None,
+                Inconsistent => (),
+            }
+        }
+    }
+}
+
+impl<T> Queue<T> for Mutex<VecDeque<T>> {
+    fn push(&self, t: T) { self.lock().unwrap().push_back(t) }
+    fn try_pop(&self) -> Option<T> { self.lock().unwrap().pop_front() }
+}
+
+fn bench_queue_mpsc<Q: Queue<u64> + Sync>(q: Q) -> f64 {
+    let d = time(|| {
+        scope(|scope| {
+            for _i in 0..THREADS {
+                let qr = &q;
+                scope.spawn(move || {
+                    for x in 0..COUNT {
+                        let _ = qr.push(x);
+                    }
+                });
+            }
+
+            let mut count = 0;
+            while count < COUNT*THREADS {
+                if q.try_pop().is_some() {
+                    count += 1;
+                }
+            }
+        });
+    });
+
+    nanos(d) / ((COUNT * THREADS) as f64)
+}
+
+fn bench_queue_mpmc<Q: Queue<bool> + Sync>(q: Q) -> f64 {
+    use std::sync::atomic::AtomicUsize;
+    use std::sync::atomic::Ordering::Relaxed;
+
+    let prod_count = AtomicUsize::new(0);
+
+    let d = time(|| {
+        scope(|scope| {
+            for _i in 0..THREADS {
+                let qr = &q;
+                let pcr = &prod_count;
+                scope.spawn(move || {
+                    for _x in 0..COUNT {
+                        qr.push(true);
+                    }
+                    if pcr.fetch_add(1, Relaxed) == (THREADS as usize) - 1 {
+                        for _x in 0..THREADS {
+                            qr.push(false)
+                        }
+                    }
+                });
+                scope.spawn(move || {
+                    loop {
+                        if let Some(false) = qr.try_pop() { break }
+                    }
+                });
+            }
+
+
+        });
+    });
+
+    nanos(d) / ((COUNT * THREADS) as f64)
+}
+
+fn bench_chan_mpsc() -> f64 {
+    let (tx, rx) = channel();
+
+    let d = time(|| {
+        scope(|scope| {
+            for _i in 0..THREADS {
+                let my_tx = tx.clone();
+
+                scope.spawn(move || {
+                    for x in 0..COUNT {
+                        let _ = my_tx.send(x);
+                    }
+                });
+            }
+
+            for _i in 0..COUNT*THREADS {
+                let _ = rx.recv().unwrap();
+            }
+        });
+    });
+
+    nanos(d) / ((COUNT * THREADS) as f64)
+}
+
+fn main() {
+    println!("MSQ mpsc: {}", bench_queue_mpsc(MsQueue::new()));
+    println!("chan mpsc: {}", bench_chan_mpsc());
+    println!("mpsc mpsc: {}", bench_queue_mpsc(MpscQueue::new()));
+    println!("Seg mpsc: {}", bench_queue_mpsc(SegQueue::new()));
+
+    println!("MSQ mpmc: {}", bench_queue_mpmc(MsQueue::new()));
+    println!("Seg mpmc: {}", bench_queue_mpmc(SegQueue::new()));
+
+//    println!("queue_mpsc: {}", bench_queue_mpsc());
+//    println!("queue_mpmc: {}", bench_queue_mpmc());
+//   println!("mutex_mpmc: {}", bench_mutex_mpmc());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/bin/extra_impls/mod.rs
@@ -0,0 +1,1 @@
+pub mod mpsc_queue;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/bin/extra_impls/mpsc_queue.rs
@@ -0,0 +1,155 @@
+/* Copyright (c) 2010-2011 Dmitry Vyukov. 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 DMITRY VYUKOV "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 DMITRY VYUKOV 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.
+ *
+ * The views and conclusions contained in the software and documentation are
+ * those of the authors and should not be interpreted as representing official
+ * policies, either expressed or implied, of Dmitry Vyukov.
+ */
+
+//! A mostly lock-free multi-producer, single consumer queue.
+//!
+//! This module contains an implementation of a concurrent MPSC queue. This
+//! queue can be used to share data between threads, and is also used as the
+//! building block of channels in rust.
+//!
+//! Note that the current implementation of this queue has a caveat of the `pop`
+//! method, and see the method for more information about it. Due to this
+//! caveat, this queue may not be appropriate for all use-cases.
+
+// http://www.1024cores.net/home/lock-free-algorithms
+//                         /queues/non-intrusive-mpsc-node-based-queue
+
+pub use self::PopResult::*;
+
+use std::fmt;
+use std::ptr;
+use std::cell::UnsafeCell;
+
+use std::sync::atomic::{AtomicPtr, Ordering};
+
+/// A result of the `pop` function.
+#[derive(Debug)]
+pub enum PopResult<T> {
+    /// Some data has been popped
+    Data(T),
+    /// The queue is empty
+    Empty,
+    /// The queue is in an inconsistent state. Popping data should succeed, but
+    /// some pushers have yet to make enough progress in order allow a pop to
+    /// succeed. It is recommended that a pop() occur "in the near future" in
+    /// order to see if the sender has made progress or not
+    Inconsistent,
+}
+
+#[derive(Debug)]
+struct Node<T> {
+    next: AtomicPtr<Node<T>>,
+    value: Option<T>,
+}
+
+/// The multi-producer single-consumer structure. This is not cloneable, but it
+/// may be safely shared so long as it is guaranteed that there is only one
+/// popper at a time (many pushers are allowed).
+pub struct Queue<T> {
+    head: AtomicPtr<Node<T>>,
+    tail: UnsafeCell<*mut Node<T>>,
+}
+
+impl<T> fmt::Debug for Queue<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Queue {{ ... }}")
+    }
+}
+
+unsafe impl<T: Send> Send for Queue<T> { }
+unsafe impl<T: Send> Sync for Queue<T> { }
+
+impl<T> Node<T> {
+    unsafe fn new(v: Option<T>) -> *mut Node<T> {
+        Box::into_raw(Box::new(Node {
+            next: AtomicPtr::new(ptr::null_mut()),
+            value: v,
+        }))
+    }
+}
+
+impl<T> Queue<T> {
+    /// Creates a new queue that is safe to share among multiple producers and
+    /// one consumer.
+    pub fn new() -> Queue<T> {
+        let stub = unsafe { Node::new(None) };
+        Queue {
+            head: AtomicPtr::new(stub),
+            tail: UnsafeCell::new(stub),
+        }
+    }
+
+    /// Pushes a new value onto this queue.
+    pub fn push(&self, t: T) {
+        unsafe {
+            let n = Node::new(Some(t));
+            let prev = self.head.swap(n, Ordering::AcqRel);
+            (*prev).next.store(n, Ordering::Release);
+        }
+    }
+
+    /// Pops some data from this queue.
+    ///
+    /// Note that the current implementation means that this function cannot
+    /// return `Option<T>`. It is possible for this queue to be in an
+    /// inconsistent state where many pushes have succeeded and completely
+    /// finished, but pops cannot return `Some(t)`. This inconsistent state
+    /// happens when a pusher is pre-empted at an inopportune moment.
+    ///
+    /// This inconsistent state means that this queue does indeed have data, but
+    /// it does not currently have access to it at this time.
+    pub fn pop(&self) -> PopResult<T> {
+        unsafe {
+            let tail = *self.tail.get();
+            let next = (*tail).next.load(Ordering::Acquire);
+
+            if !next.is_null() {
+                *self.tail.get() = next;
+                assert!((*tail).value.is_none());
+                assert!((*next).value.is_some());
+                let ret = (*next).value.take().unwrap();
+                let _ = Box::from_raw(tail);
+                return Data(ret);
+            }
+
+            if self.head.load(Ordering::Acquire) == tail {Empty} else {Inconsistent}
+        }
+    }
+}
+
+impl<T> Drop for Queue<T> {
+    fn drop(&mut self) {
+        unsafe {
+            let mut cur = *self.tail.get();
+            while !cur.is_null() {
+                let next = (*cur).next.load(Ordering::Relaxed);
+                let _ = Box::from_raw(cur);
+                cur = next;
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/bin/stress-msq.rs
@@ -0,0 +1,36 @@
+extern crate crossbeam;
+
+use crossbeam::sync::MsQueue;
+use crossbeam::scope;
+
+use std::sync::Arc;
+
+const DUP: usize = 4;
+const THREADS: u32 = 2;
+const COUNT: u64 = 100000;
+
+fn main() {
+    scope(|s| {
+        for _i in 0..DUP {
+            let q = Arc::new(MsQueue::new());
+            let qs = q.clone();
+
+            s.spawn(move || {
+                for i in 1..COUNT { qs.push(i) }
+            });
+
+            for _i in 0..THREADS {
+                let qr = q.clone();
+                s.spawn(move || {
+                    let mut cur: u64 = 0;
+                    for _j in 0..COUNT {
+                        if let Some(new) = qr.try_pop() {
+                            assert!(new > cur);
+                            cur = new;
+                        }
+                    }
+                });
+            }
+        }
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/lib.rs
@@ -0,0 +1,54 @@
+//! Support for concurrent and parallel programming.
+//!
+//! This crate is an early work in progress. The focus for the moment is
+//! concurrency:
+//!
+//! - **Non-blocking data structures**. These data structures allow for high
+//! performance, highly-concurrent access, much superior to wrapping with a
+//! `Mutex`. Ultimately the goal is to include stacks, queues, deques, bags,
+//! sets and maps. These live in the `sync` module.
+//!
+//! - **Memory management**. Because non-blocking data structures avoid global
+//! synchronization, it is not easy to tell when internal data can be safely
+//! freed. The `mem` module provides generic, easy to use, and high-performance
+//! APIs for managing memory in these cases. These live in the `mem` module.
+//!
+//! - **Synchronization**. The standard library provides a few synchronization
+//! primitives (locks, semaphores, barriers, etc) but this crate seeks to expand
+//! that set to include more advanced/niche primitives, as well as userspace
+//! alternatives. These live in the `sync` module.
+//!
+//! - **Scoped thread API**. Finally, the crate provides a "scoped" thread API,
+//! making it possible to spawn threads that share stack data with their
+//! parents. This functionality is exported at the top-level.
+
+//#![deny(missing_docs)]
+
+#![cfg_attr(feature = "nightly",
+            feature(const_fn, repr_simd, optin_builtin_traits))]
+
+use std::thread;
+
+pub use scoped::{scope, Scope, ScopedJoinHandle};
+
+pub mod mem;
+pub mod sync;
+mod scoped;
+
+#[doc(hidden)]
+trait FnBox {
+    fn call_box(self: Box<Self>);
+}
+
+impl<F: FnOnce()> FnBox for F {
+    fn call_box(self: Box<Self>) { (*self)() }
+}
+
+/// Like `std::thread::spawn`, but without the closure bounds.
+pub unsafe fn spawn_unsafe<'a, F>(f: F) -> thread::JoinHandle<()> where F: FnOnce() + Send + 'a {
+    use std::mem;
+
+    let closure: Box<FnBox + 'a> = Box::new(f);
+    let closure: Box<FnBox + Send> = mem::transmute(closure);
+    thread::spawn(move || closure.call_box())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/cache_padded.rs
@@ -0,0 +1,149 @@
+use std::marker;
+use std::cell::UnsafeCell;
+use std::fmt;
+use std::mem;
+use std::ptr;
+use std::ops::{Deref, DerefMut};
+
+// For now, treat this as an arch-independent constant.
+const CACHE_LINE: usize = 32;
+
+#[cfg_attr(feature = "nightly",
+           repr(simd))]
+#[derive(Debug)]
+struct Padding(u64, u64, u64, u64);
+
+/// Pad `T` to the length of a cacheline.
+///
+/// Sometimes concurrent programming requires a piece of data to be padded out
+/// to the size of a cacheline to avoid "false sharing": cachelines being
+/// invalidated due to unrelated concurrent activity. Use the `CachePadded` type
+/// when you want to *avoid* cache locality.
+///
+/// At the moment, cache lines are assumed to be 32 * sizeof(usize) on all
+/// architectures.
+///
+/// **Warning**: the wrapped data is never dropped; move out using `ptr::read`
+/// if you need to run dtors.
+pub struct CachePadded<T> {
+    data: UnsafeCell<[usize; CACHE_LINE]>,
+    _marker: ([Padding; 0], marker::PhantomData<T>),
+}
+
+impl<T> fmt::Debug for CachePadded<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "CachePadded {{ ... }}")
+    }
+}
+
+unsafe impl<T: Send> Send for CachePadded<T> {}
+unsafe impl<T: Sync> Sync for CachePadded<T> {}
+
+/// Types for which mem::zeroed() is safe.
+///
+/// If a type `T: ZerosValid`, then a sequence of zeros the size of `T` must be
+/// a valid member of the type `T`.
+pub unsafe trait ZerosValid {}
+
+#[cfg(feature = "nightly")]
+unsafe impl ZerosValid for .. {}
+
+macro_rules! zeros_valid { ($( $T:ty )*) => ($(
+    unsafe impl ZerosValid for $T {}
+)*)}
+
+zeros_valid!(u8 u16 u32 u64 usize);
+zeros_valid!(i8 i16 i32 i64 isize);
+
+unsafe impl ZerosValid for ::std::sync::atomic::AtomicUsize {}
+unsafe impl<T> ZerosValid for ::std::sync::atomic::AtomicPtr<T> {}
+
+impl<T: ZerosValid> CachePadded<T> {
+    /// A const fn equivalent to mem::zeroed().
+    #[cfg(not(feature = "nightly"))]
+    pub fn zeroed() -> CachePadded<T> {
+        CachePadded {
+            data: UnsafeCell::new(([0; CACHE_LINE])),
+            _marker: ([], marker::PhantomData),
+        }
+    }
+
+    /// A const fn equivalent to mem::zeroed().
+    #[cfg(feature = "nightly")]
+    pub const fn zeroed() -> CachePadded<T> {
+        CachePadded {
+            data: UnsafeCell::new(([0; CACHE_LINE])),
+            _marker: ([], marker::PhantomData),
+        }
+    }
+}
+
+#[inline]
+/// Assert that the size and alignment of `T` are consistent with `CachePadded<T>`.
+fn assert_valid<T>() {
+    assert!(mem::size_of::<T>() <= mem::size_of::<CachePadded<T>>());
+    assert!(mem::align_of::<T>() <= mem::align_of::<CachePadded<T>>());
+}
+
+impl<T> CachePadded<T> {
+    /// Wrap `t` with cacheline padding.
+    ///
+    /// **Warning**: the wrapped data is never dropped; move out using
+    /// `ptr:read` if you need to run dtors.
+    pub fn new(t: T) -> CachePadded<T> {
+        assert_valid::<T>();
+        let ret = CachePadded {
+            data: UnsafeCell::new(([0; CACHE_LINE])),
+            _marker: ([], marker::PhantomData),
+        };
+        unsafe {
+            let p: *mut T = mem::transmute(&ret.data);
+            ptr::write(p, t);
+        }
+        ret
+    }
+}
+
+impl<T> Deref for CachePadded<T> {
+    type Target = T;
+    fn deref(&self) -> &T {
+        assert_valid::<T>();
+        unsafe { mem::transmute(&self.data) }
+    }
+}
+
+impl<T> DerefMut for CachePadded<T> {
+    fn deref_mut(&mut self) -> &mut T {
+        assert_valid::<T>();
+        unsafe { mem::transmute(&mut self.data) }
+    }
+}
+
+// FIXME: support Drop by pulling out a version usable for statics
+/*
+impl<T> Drop for CachePadded<T> {
+    fn drop(&mut self) {
+        assert_valid::<T>();
+        let p: *mut T = mem::transmute(&self.data);
+        mem::drop(ptr::read(p));
+    }
+}
+*/
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn cache_padded_store_u64() {
+        let x: CachePadded<u64> = CachePadded::new(17);
+        assert_eq!(*x, 17);
+    }
+
+    #[test]
+    fn cache_padded_store_pair() {
+        let x: CachePadded<(u64, u64)> = CachePadded::new((17, 37));
+        assert_eq!(x.0, 17);
+        assert_eq!(x.1, 37);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/atomic.rs
@@ -0,0 +1,181 @@
+use std::marker::PhantomData;
+use std::mem;
+use std::ptr;
+use std::sync::atomic::{self, Ordering};
+
+use super::{Owned, Shared, Guard};
+
+/// Like `std::sync::atomic::AtomicPtr`.
+///
+/// Provides atomic access to a (nullable) pointer of type `T`, interfacing with
+/// the `Owned` and `Shared` types.
+#[derive(Debug)]
+pub struct Atomic<T> {
+    ptr: atomic::AtomicPtr<T>,
+    _marker: PhantomData<*const ()>,
+}
+
+unsafe impl<T: Sync> Send for Atomic<T> {}
+unsafe impl<T: Sync> Sync for Atomic<T> {}
+
+fn opt_shared_into_raw<T>(val: Option<Shared<T>>) -> *mut T {
+    val.map(|p| p.as_raw()).unwrap_or(ptr::null_mut())
+}
+
+fn opt_owned_as_raw<T>(val: &Option<Owned<T>>) -> *mut T {
+    val.as_ref().map(Owned::as_raw).unwrap_or(ptr::null_mut())
+}
+
+fn opt_owned_into_raw<T>(val: Option<Owned<T>>) -> *mut T {
+    let ptr = val.as_ref().map(Owned::as_raw).unwrap_or(ptr::null_mut());
+    mem::forget(val);
+    ptr
+}
+
+impl<T> Atomic<T> {
+    /// Create a new, null atomic pointer.
+    #[cfg(feature = "nightly")]
+    pub const fn null() -> Atomic<T> {
+        Atomic {
+            ptr: atomic::AtomicPtr::new(0 as *mut _),
+            _marker: PhantomData
+        }
+    }
+
+    #[cfg(not(feature = "nightly"))]
+    pub fn null() -> Atomic<T> {
+        Atomic {
+            ptr: atomic::AtomicPtr::new(0 as *mut _),
+            _marker: PhantomData
+        }
+    }
+
+    /// Create a new atomic pointer
+    pub fn new(data: T) -> Atomic<T> {
+        Atomic {
+            ptr: atomic::AtomicPtr::new(Box::into_raw(Box::new(data))),
+            _marker: PhantomData
+        }
+    }
+
+    /// Do an atomic load with the given memory ordering.
+    ///
+    /// In order to perform the load, we must pass in a borrow of a
+    /// `Guard`. This is a way of guaranteeing that the thread has pinned the
+    /// epoch for the entire lifetime `'a`. In return, you get an optional
+    /// `Shared` pointer back (`None` if the `Atomic` is currently null), with
+    /// lifetime tied to the guard.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `ord` is `Release` or `AcqRel`.
+    pub fn load<'a>(&self, ord: Ordering, _: &'a Guard) -> Option<Shared<'a, T>> {
+        unsafe { Shared::from_raw(self.ptr.load(ord)) }
+    }
+
+    /// Do an atomic store with the given memory ordering.
+    ///
+    /// Transfers ownership of the given `Owned` pointer, if any. Since no
+    /// lifetime information is acquired, no `Guard` value is needed.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `ord` is `Acquire` or `AcqRel`.
+    pub fn store(&self, val: Option<Owned<T>>, ord: Ordering) {
+        self.ptr.store(opt_owned_into_raw(val), ord)
+    }
+
+    /// Do an atomic store with the given memory ordering, immediately yielding
+    /// a shared reference to the pointer that was stored.
+    ///
+    /// Transfers ownership of the given `Owned` pointer, yielding a `Shared`
+    /// reference to it. Since the reference is valid only for the curent epoch,
+    /// it's lifetime is tied to a `Guard` value.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `ord` is `Acquire` or `AcqRel`.
+    pub fn store_and_ref<'a>(&self, val: Owned<T>, ord: Ordering, _: &'a Guard)
+                             -> Shared<'a, T>
+    {
+        unsafe {
+            let shared = Shared::from_owned(val);
+            self.store_shared(Some(shared), ord);
+            shared
+        }
+    }
+
+    /// Do an atomic store of a `Shared` pointer with the given memory ordering.
+    ///
+    /// This operation does not require a guard, because it does not yield any
+    /// new information about the lifetime of a pointer.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `ord` is `Acquire` or `AcqRel`.
+    pub fn store_shared(&self, val: Option<Shared<T>>, ord: Ordering) {
+        self.ptr.store(opt_shared_into_raw(val), ord)
+    }
+
+    /// Do a compare-and-set from a `Shared` to an `Owned` pointer with the
+    /// given memory ordering.
+    ///
+    /// As with `store`, this operation does not require a guard; it produces no new
+    /// lifetime information. The `Result` indicates whether the CAS succeeded; if
+    /// not, ownership of the `new` pointer is returned to the caller.
+    pub fn cas(&self, old: Option<Shared<T>>, new: Option<Owned<T>>, ord: Ordering)
+               -> Result<(), Option<Owned<T>>>
+    {
+        if self.ptr.compare_and_swap(opt_shared_into_raw(old),
+                                     opt_owned_as_raw(&new),
+                                     ord) == opt_shared_into_raw(old)
+        {
+            mem::forget(new);
+            Ok(())
+        } else {
+            Err(new)
+        }
+    }
+
+    /// Do a compare-and-set from a `Shared` to an `Owned` pointer with the
+    /// given memory ordering, immediatley acquiring a new `Shared` reference to
+    /// the previously-owned pointer if successful.
+    ///
+    /// This operation is analogous to `store_and_ref`.
+    pub fn cas_and_ref<'a>(&self, old: Option<Shared<T>>, new: Owned<T>,
+                           ord: Ordering, _: &'a Guard)
+                           -> Result<Shared<'a, T>, Owned<T>>
+    {
+        if self.ptr.compare_and_swap(opt_shared_into_raw(old), new.as_raw(), ord)
+            == opt_shared_into_raw(old)
+        {
+            Ok(unsafe { Shared::from_owned(new) })
+        } else {
+            Err(new)
+        }
+    }
+
+    /// Do a compare-and-set from a `Shared` to another `Shared` pointer with
+    /// the given memory ordering.
+    ///
+    /// The boolean return value is `true` when the CAS is successful.
+    pub fn cas_shared(&self, old: Option<Shared<T>>, new: Option<Shared<T>>, ord: Ordering)
+                      -> bool
+    {
+        self.ptr.compare_and_swap(opt_shared_into_raw(old),
+                                  opt_shared_into_raw(new),
+                                  ord) == opt_shared_into_raw(old)
+    }
+
+    /// Do an atomic swap with an `Owned` pointer with the given memory ordering.
+    pub fn swap<'a>(&self, new: Option<Owned<T>>, ord: Ordering, _: &'a Guard)
+                    -> Option<Shared<'a, T>> {
+        unsafe { Shared::from_raw(self.ptr.swap(opt_owned_into_raw(new), ord)) }
+    }
+
+    /// Do an atomic swap with a `Shared` pointer with the given memory ordering.
+    pub fn swap_shared<'a>(&self, new: Option<Shared<T>>, ord: Ordering, _: &'a Guard)
+                           -> Option<Shared<'a, T>> {
+        unsafe { Shared::from_raw(self.ptr.swap(opt_shared_into_raw(new), ord)) }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/garbage.rs
@@ -0,0 +1,144 @@
+// Data structures for storing garbage to be freed later (once the
+// epochs have sufficiently advanced).
+//
+// In general, we try to manage the garbage thread locally whenever
+// possible. Each thread keep track of three bags of garbage. But if a
+// thread is exiting, these bags must be moved into the global garbage
+// bags.
+
+use std::ptr;
+use std::mem;
+use std::sync::atomic::AtomicPtr;
+use std::sync::atomic::Ordering::{Relaxed, Release, Acquire};
+
+use mem::ZerosValid;
+
+/// One item of garbage.
+///
+/// Stores enough information to do a deallocation.
+#[derive(Debug)]
+struct Item {
+    ptr: *mut u8,
+    free: unsafe fn(*mut u8),
+}
+
+/// A single, thread-local bag of garbage.
+#[derive(Debug)]
+pub struct Bag(Vec<Item>);
+
+impl Bag {
+    fn new() -> Bag {
+        Bag(vec![])
+    }
+
+    fn insert<T>(&mut self, elem: *mut T) {
+        let size = mem::size_of::<T>();
+        if size > 0 {
+            self.0.push(Item {
+                ptr: elem as *mut u8,
+                free: free::<T>,
+            })
+        }
+        unsafe fn free<T>(t: *mut u8) {
+            drop(Vec::from_raw_parts(t as *mut T, 0, 1));
+        }
+    }
+
+    fn len(&self) -> usize {
+        self.0.len()
+    }
+
+    /// Deallocate all garbage in the bag
+    pub unsafe fn collect(&mut self) {
+        let mut data = mem::replace(&mut self.0, Vec::new());
+        for item in data.iter() {
+            (item.free)(item.ptr);
+        }
+        data.truncate(0);
+        self.0 = data;
+    }
+}
+
+// needed because the bags store raw pointers.
+unsafe impl Send for Bag {}
+unsafe impl Sync for Bag {}
+
+/// A thread-local set of garbage bags.
+#[derive(Debug)]
+pub struct Local {
+    /// Garbage added at least one epoch behind the current local epoch
+    pub old: Bag,
+    /// Garbage added in the current local epoch or earlier
+    pub cur: Bag,
+    /// Garbage added in the current *global* epoch
+    pub new: Bag,
+}
+
+impl Local {
+    pub fn new() -> Local {
+        Local {
+            old: Bag::new(),
+            cur: Bag::new(),
+            new: Bag::new(),
+        }
+    }
+
+    pub fn insert<T>(&mut self, elem: *mut T) {
+        self.new.insert(elem)
+    }
+
+    /// Collect one epoch of garbage, rotating the local garbage bags.
+    pub unsafe fn collect(&mut self) {
+        let ret = self.old.collect();
+        mem::swap(&mut self.old, &mut self.cur);
+        mem::swap(&mut self.cur, &mut self.new);
+        ret
+    }
+
+    pub fn size(&self) -> usize {
+        self.old.len() + self.cur.len() + self.new.len()
+    }
+}
+
+/// A concurrent garbage bag, currently based on Treiber's stack.
+///
+/// The elements are themselves owned `Bag`s.
+#[derive(Debug)]
+pub struct ConcBag {
+    head: AtomicPtr<Node>,
+}
+
+unsafe impl ZerosValid for ConcBag {}
+
+#[derive(Debug)]
+struct Node {
+    data: Bag,
+    next: AtomicPtr<Node>,
+}
+
+impl ConcBag {
+    pub fn insert(&self, t: Bag){
+        let n = Box::into_raw(Box::new(
+            Node { data: t, next: AtomicPtr::new(ptr::null_mut()) }));
+        loop {
+            let head = self.head.load(Acquire);
+            unsafe { (*n).next.store(head, Relaxed) };
+            if self.head.compare_and_swap(head, n, Release) == head { break }
+        }
+    }
+
+    pub unsafe fn collect(&self) {
+        // check to avoid xchg instruction
+        // when no garbage exists
+        let mut head = self.head.load(Relaxed);
+        if head != ptr::null_mut() {
+            head = self.head.swap(ptr::null_mut(), Acquire);
+
+            while head != ptr::null_mut() {
+                let mut n = Box::from_raw(head);
+                n.data.collect();
+                head = n.next.load(Relaxed);
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/global.rs
@@ -0,0 +1,95 @@
+// Definition of global epoch state. The `get` function is the way to
+// access this data externally (until const fn is stabilized...).
+
+use std::sync::atomic::AtomicUsize;
+
+use mem::CachePadded;
+use mem::epoch::garbage;
+use mem::epoch::participants::Participants;
+
+/// Global epoch state
+#[derive(Debug)]
+pub struct EpochState {
+    /// Current global epoch
+    pub epoch: CachePadded<AtomicUsize>,
+
+    // FIXME: move this into the `garbage` module, rationalize API
+    /// Global garbage bags
+    pub garbage: [CachePadded<garbage::ConcBag>; 3],
+
+    /// Participant list
+    pub participants: Participants,
+}
+
+unsafe impl Send for EpochState {}
+unsafe impl Sync for EpochState {}
+
+pub use self::imp::get;
+
+#[cfg(not(feature = "nightly"))]
+mod imp {
+    use std::mem;
+    use std::sync::atomic::{self, AtomicUsize};
+    use std::sync::atomic::Ordering::Relaxed;
+
+    use super::EpochState;
+    use mem::CachePadded;
+    use mem::epoch::participants::Participants;
+
+    impl EpochState {
+        fn new() -> EpochState {
+            EpochState {
+                epoch: CachePadded::zeroed(),
+                garbage: [CachePadded::zeroed(),
+                          CachePadded::zeroed(),
+                          CachePadded::zeroed()],
+                participants: Participants::new(),
+            }
+        }
+    }
+
+    static EPOCH: AtomicUsize = atomic::ATOMIC_USIZE_INIT;
+
+    pub fn get() -> &'static EpochState {
+        let mut addr = EPOCH.load(Relaxed);
+
+        if addr == 0 {
+            let boxed = Box::new(EpochState::new());
+            let raw = Box::into_raw(boxed);
+
+            addr = EPOCH.compare_and_swap(0, raw as usize, Relaxed);
+            if addr != 0 {
+                let boxed = unsafe { Box::from_raw(raw) };
+                mem::drop(boxed);
+            } else {
+                addr = raw as usize;
+            }
+        }
+
+        unsafe {
+            &*(addr as *mut EpochState)
+        }
+    }
+}
+
+#[cfg(feature = "nightly")]
+mod imp {
+    use super::EpochState;
+    use mem::CachePadded;
+    use mem::epoch::participants::Participants;
+
+    impl EpochState {
+        const fn new() -> EpochState {
+            EpochState {
+                epoch: CachePadded::zeroed(),
+                garbage: [CachePadded::zeroed(),
+                          CachePadded::zeroed(),
+                          CachePadded::zeroed()],
+                participants: Participants::new(),
+            }
+        }
+    }
+
+    static EPOCH: EpochState = EpochState::new();
+    pub fn get() -> &'static EpochState { &EPOCH }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/guard.rs
@@ -0,0 +1,56 @@
+use std::marker;
+
+use super::{local, Shared};
+
+/// An RAII-style guard for pinning the current epoch.
+///
+/// A guard must be acquired before most operations on an `Atomic` pointer. On
+/// destruction, it unpins the epoch.
+#[must_use]
+#[derive(Debug)]
+pub struct Guard {
+    _marker: marker::PhantomData<*mut ()>, // !Send and !Sync
+}
+
+/// Pin the current epoch.
+///
+/// Threads generally pin before interacting with a lock-free data
+/// structure. Pinning requires a full memory barrier, so is somewhat
+/// expensive. It is rentrant -- you can safely acquire nested guards, and only
+/// the first guard requires a barrier. Thus, in cases where you expect to
+/// perform several lock-free operations in quick succession, you may consider
+/// pinning around the entire set of operations.
+pub fn pin() -> Guard {
+    local::with_participant(|p| {
+        p.enter();
+
+        let g = Guard {
+            _marker: marker::PhantomData,
+        };
+
+        if p.should_gc() {
+            p.try_collect(&g);
+        }
+
+        g
+    })
+}
+
+impl Guard {
+    /// Assert that the value is no longer reachable from a lock-free data
+    /// structure and should be collected when sufficient epochs have passed.
+    pub unsafe fn unlinked<T>(&self, val: Shared<T>) {
+        local::with_participant(|p| p.reclaim(val.as_raw()))
+    }
+
+    /// Move the thread-local garbage into the global set of garbage.
+    pub fn migrate_garbage(&self) {
+        local::with_participant(|p| p.migrate_garbage())
+    }
+}
+
+impl Drop for Guard {
+    fn drop(&mut self) {
+        local::with_participant(|p| p.exit());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/local.rs
@@ -0,0 +1,38 @@
+// Manage the thread-local state, providing access to a `Participant` record.
+
+use std::sync::atomic::Ordering::Relaxed;
+
+use mem::epoch::participant::Participant;
+use mem::epoch::global;
+
+#[derive(Debug)]
+struct LocalEpoch {
+    participant: *const Participant,
+}
+
+impl LocalEpoch {
+    fn new() -> LocalEpoch {
+        LocalEpoch { participant: global::get().participants.enroll() }
+    }
+
+    fn get(&self) -> &Participant {
+        unsafe { &*self.participant }
+    }
+}
+
+// FIXME: avoid leaking when all threads have exited
+impl Drop for LocalEpoch {
+    fn drop(&mut self) {
+        let p = self.get();
+        p.enter();
+        p.migrate_garbage();
+        p.exit();
+        p.active.store(false, Relaxed);
+    }
+}
+
+thread_local!(static LOCAL_EPOCH: LocalEpoch = LocalEpoch::new() );
+
+pub fn with_participant<F, T>(f: F) -> T where F: FnOnce(&Participant) -> T {
+    LOCAL_EPOCH.with(|e| f(e.get()))
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/mod.rs
@@ -0,0 +1,265 @@
+//! Epoch-based memory management
+//!
+//! This module provides fast, easy to use memory management for lock free data
+//! structures. It's inspired by [Keir Fraser's *epoch-based
+//! reclamation*](https://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-579.pdf).
+//!
+//! The basic problem this is solving is the fact that when one thread has
+//! removed a node from a data structure, other threads may still have pointers
+//! to that node (in the form of snapshots that will be validated through things
+//! like compare-and-swap), so the memory cannot be immediately freed. Put differently:
+//!
+//! 1. There are two sources of reachability at play -- the data structure, and
+//! the snapshots in threads accessing it. Before we delete a node, we need to know
+//! that it cannot be reached in either of these ways.
+//!
+//! 2. Once a node has been unliked from the data structure, no *new* snapshots
+//! reaching it will be created.
+//!
+//! Using the epoch scheme is fairly straightforward, and does not require
+//! understanding any of the implementation details:
+//!
+//! - When operating on a shared data structure, a thread must "pin the current
+//! epoch", which is done by calling `pin()`. This function returns a `Guard`
+//! which unpins the epoch when destroyed.
+//!
+//! - When the thread subsequently reads from a lock-free data structure, the
+//! pointers it extracts act like references with lifetime tied to the
+//! `Guard`. This allows threads to safely read from snapshotted data, being
+//! guaranteed that the data will remain allocated until they exit the epoch.
+//!
+//! To put the `Guard` to use, Crossbeam provides a set of three pointer types meant to work together:
+//!
+//! - `Owned<T>`, akin to `Box<T>`, which points to uniquely-owned data that has
+//!   not yet been published in a concurrent data structure.
+//!
+//! - `Shared<'a, T>`, akin to `&'a T`, which points to shared data that may or may
+//!   not be reachable from a data structure, but it guaranteed not to be freed
+//!   during lifetime `'a`.
+//!
+//! - `Atomic<T>`, akin to `std::sync::atomic::AtomicPtr`, which provides atomic
+//!   updates to a pointer using the `Owned` and `Shared` types, and connects them
+//!   to a `Guard`.
+//!
+//! Each of these types provides further documentation on usage.
+//!
+//! # Example
+//!
+//! ```
+//! use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
+//! use std::ptr;
+//!
+//! use crossbeam::mem::epoch::{self, Atomic, Owned};
+//!
+//! struct TreiberStack<T> {
+//!     head: Atomic<Node<T>>,
+//! }
+//!
+//! struct Node<T> {
+//!     data: T,
+//!     next: Atomic<Node<T>>,
+//! }
+//!
+//! impl<T> TreiberStack<T> {
+//!     fn new() -> TreiberStack<T> {
+//!         TreiberStack {
+//!             head: Atomic::null()
+//!         }
+//!     }
+//!
+//!     fn push(&self, t: T) {
+//!         // allocate the node via Owned
+//!         let mut n = Owned::new(Node {
+//!             data: t,
+//!             next: Atomic::null(),
+//!         });
+//!
+//!         // become active
+//!         let guard = epoch::pin();
+//!
+//!         loop {
+//!             // snapshot current head
+//!             let head = self.head.load(Relaxed, &guard);
+//!
+//!             // update `next` pointer with snapshot
+//!             n.next.store_shared(head, Relaxed);
+//!
+//!             // if snapshot is still good, link in the new node
+//!             match self.head.cas_and_ref(head, n, Release, &guard) {
+//!                 Ok(_) => return,
+//!                 Err(owned) => n = owned,
+//!             }
+//!         }
+//!     }
+//!
+//!     fn pop(&self) -> Option<T> {
+//!         // become active
+//!         let guard = epoch::pin();
+//!
+//!         loop {
+//!             // take a snapshot
+//!             match self.head.load(Acquire, &guard) {
+//!                 // the stack is non-empty
+//!                 Some(head) => {
+//!                     // read through the snapshot, *safely*!
+//!                     let next = head.next.load(Relaxed, &guard);
+//!
+//!                     // if snapshot is still good, update from `head` to `next`
+//!                     if self.head.cas_shared(Some(head), next, Release) {
+//!                         unsafe {
+//!                             // mark the node as unlinked
+//!                             guard.unlinked(head);
+//!
+//!                             // extract out the data from the now-unlinked node
+//!                             return Some(ptr::read(&(*head).data))
+//!                         }
+//!                     }
+//!                 }
+//!
+//!                 // we observed the stack empty
+//!                 None => return None
+//!             }
+//!         }
+//!     }
+//! }
+//! ```
+
+// FIXME: document implementation details
+
+mod atomic;
+mod garbage;
+mod global;
+mod guard;
+mod local;
+mod participant;
+mod participants;
+
+pub use self::atomic::Atomic;
+pub use self::guard::{pin, Guard};
+
+use std::ops::{Deref, DerefMut};
+use std::ptr;
+use std::mem;
+
+/// Like `Box<T>`: an owned, heap-allocated data value of type `T`.
+#[derive(Debug)]
+pub struct Owned<T> {
+    data: Box<T>,
+}
+
+impl<T> Owned<T> {
+    /// Move `t` to a new heap allocation.
+    pub fn new(t: T) -> Owned<T> {
+        Owned { data: Box::new(t) }
+    }
+
+    fn as_raw(&self) -> *mut T {
+        self.deref() as *const _ as *mut _
+    }
+
+    /// Move data out of the owned box, deallocating the box.
+    pub fn into_inner(self) -> T {
+        *self.data
+    }
+}
+
+impl<T> Deref for Owned<T> {
+    type Target = T;
+    fn deref(&self) -> &T {
+        &self.data
+    }
+}
+
+impl<T> DerefMut for Owned<T> {
+    fn deref_mut(&mut self) -> &mut T {
+        &mut self.data
+    }
+}
+
+#[derive(PartialEq, Eq)]
+/// Like `&'a T`: a shared reference valid for lifetime `'a`.
+#[derive(Debug)]
+pub struct Shared<'a, T: 'a> {
+    data: &'a T,
+}
+
+impl<'a, T> Copy for Shared<'a, T> {}
+impl<'a, T> Clone for Shared<'a, T> {
+    fn clone(&self) -> Shared<'a, T> {
+        Shared { data: self.data }
+    }
+}
+
+impl<'a, T> Deref for Shared<'a, T> {
+    type Target = &'a T;
+    fn deref(&self) -> &&'a T {
+        &self.data
+    }
+}
+
+impl<'a, T> Shared<'a, T> {
+    unsafe fn from_raw(raw: *mut T) -> Option<Shared<'a, T>> {
+        if raw == ptr::null_mut() { None }
+        else {
+            Some(Shared {
+                data: mem::transmute::<*mut T, &T>(raw)
+            })
+        }
+    }
+
+    unsafe fn from_ref(r: &T) -> Shared<'a, T> {
+        Shared { data: mem::transmute(r) }
+    }
+
+    unsafe fn from_owned(owned: Owned<T>) -> Shared<'a, T> {
+        let ret = Shared::from_ref(owned.deref());
+        mem::forget(owned);
+        ret
+    }
+
+    pub fn as_raw(&self) -> *mut T {
+        self.data as *const _ as *mut _
+    }
+}
+
+
+#[cfg(test)]
+mod test {
+    use std::sync::atomic::Ordering;
+    use super::*;
+    use mem::epoch;
+
+    #[test]
+    fn test_no_drop() {
+        static mut DROPS: i32 = 0;
+        struct Test;
+        impl Drop for Test {
+            fn drop(&mut self) {
+                unsafe {
+                    DROPS += 1;
+                }
+            }
+        }
+        let g = pin();
+
+        let x = Atomic::null();
+        x.store(Some(Owned::new(Test)), Ordering::Relaxed);
+        x.store_and_ref(Owned::new(Test), Ordering::Relaxed, &g);
+        let y = x.load(Ordering::Relaxed, &g);
+        let z = x.cas_and_ref(y, Owned::new(Test), Ordering::Relaxed, &g).ok();
+        let _ = x.cas(z, Some(Owned::new(Test)), Ordering::Relaxed);
+        x.swap(Some(Owned::new(Test)), Ordering::Relaxed, &g);
+
+        unsafe {
+            assert_eq!(DROPS, 0);
+        }
+    }
+
+    #[test]
+    fn test_new() {
+        let guard = epoch::pin();
+        let my_atomic = Atomic::new(42);
+
+        assert_eq!(**my_atomic.load(Ordering::Relaxed, &guard).unwrap(), 42);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/participant.rs
@@ -0,0 +1,133 @@
+// Manages a single participant in the epoch scheme. This is where all
+// of the actual epoch management logic happens!
+
+use std::mem;
+use std::cell::UnsafeCell;
+use std::fmt;
+use std::sync::atomic::{self, AtomicUsize, AtomicBool};
+use std::sync::atomic::Ordering::{Relaxed, Acquire, Release, SeqCst};
+
+use mem::epoch::{Atomic, Guard, garbage, global};
+use mem::epoch::participants::ParticipantNode;
+
+/// Thread-local data for epoch participation.
+pub struct Participant {
+    /// The local epoch.
+    epoch: AtomicUsize,
+
+    /// Number of pending uses of `epoch::pin()`; keeping a count allows for
+    /// reentrant use of epoch management.
+    in_critical: AtomicUsize,
+
+    /// Thread-local garbage tracking
+    garbage: UnsafeCell<garbage::Local>,
+
+    /// Is the thread still active? Becomes `false` when the thread exits. This
+    /// is ultimately used to free `Participant` records.
+    pub active: AtomicBool,
+
+    /// The participant list is coded intrusively; here's the `next` pointer.
+    pub next: Atomic<ParticipantNode>,
+}
+
+impl fmt::Debug for Participant {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Participant {{ ... }}")
+    }
+}
+
+unsafe impl Sync for Participant {}
+
+const GC_THRESH: usize = 32;
+
+impl Participant {
+    pub fn new() -> Participant {
+        Participant {
+            epoch: AtomicUsize::new(0),
+            in_critical: AtomicUsize::new(0),
+            active: AtomicBool::new(true),
+            garbage: UnsafeCell::new(garbage::Local::new()),
+            next: Atomic::null(),
+        }
+    }
+
+    /// Enter a critical section.
+    ///
+    /// This method is reentrant, allowing for nested critical sections.
+    ///
+    /// Returns `true` is this is the first entry on the stack (as opposed to a
+    /// re-entrant call).
+    pub fn enter(&self) -> bool {
+        let new_count = self.in_critical.load(Relaxed) + 1;
+        self.in_critical.store(new_count, Relaxed);
+        if new_count > 1 { return false }
+
+        atomic::fence(SeqCst);
+
+        let global_epoch = global::get().epoch.load(Relaxed);
+        if global_epoch != self.epoch.load(Relaxed) {
+            self.epoch.store(global_epoch, Relaxed);
+            unsafe { (*self.garbage.get()).collect(); }
+        }
+
+        true
+    }
+
+    /// Exit the current (nested) critical section.
+    pub fn exit(&self) {
+        let new_count = self.in_critical.load(Relaxed) - 1;
+        self.in_critical.store(
+            new_count,
+            if new_count > 0 { Relaxed } else { Release });
+    }
+
+    /// Begin the reclamation process for a piece of data.
+    pub unsafe fn reclaim<T>(&self, data: *mut T) {
+        (*self.garbage.get()).insert(data);
+    }
+
+    /// Attempt to collect garbage by moving the global epoch forward.
+    ///
+    /// Returns `true` on success.
+    pub fn try_collect(&self, guard: &Guard) -> bool {
+        let cur_epoch = global::get().epoch.load(SeqCst);
+
+        for p in global::get().participants.iter(guard) {
+            if p.in_critical.load(Relaxed) > 0 && p.epoch.load(Relaxed) != cur_epoch {
+                return false
+            }
+        }
+
+        let new_epoch = cur_epoch.wrapping_add(1);
+        atomic::fence(Acquire);
+        if global::get().epoch.compare_and_swap(cur_epoch, new_epoch, SeqCst) != cur_epoch {
+            return false
+        }
+
+        unsafe {
+            (*self.garbage.get()).collect();
+            global::get().garbage[new_epoch.wrapping_add(1) % 3].collect();
+        }
+        self.epoch.store(new_epoch, Release);
+
+        true
+    }
+
+    /// Move the current thread-local garbage into the global garbage bags.
+    pub fn migrate_garbage(&self) {
+        let cur_epoch = self.epoch.load(Relaxed);
+        let local = unsafe { mem::replace(&mut *self.garbage.get(), garbage::Local::new()) };
+        global::get().garbage[cur_epoch.wrapping_sub(1) % 3].insert(local.old);
+        global::get().garbage[cur_epoch % 3].insert(local.cur);
+        global::get().garbage[global::get().epoch.load(Relaxed) % 3].insert(local.new);
+    }
+
+    /// How much garbage is this participant currently storing?
+    pub fn garbage_size(&self) -> usize {
+        unsafe { (*self.garbage.get()).size() }
+    }
+    /// Is this participant past its local GC threshhold?
+    pub fn should_gc(&self) -> bool {
+        self.garbage_size() >= GC_THRESH
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/epoch/participants.rs
@@ -0,0 +1,120 @@
+// Manages the global participant list, which is an intrustive list in
+// which items are lazily removed on traversal (after being
+// "logically" deleted by becoming inactive.)
+
+use std::mem;
+use std::ops::{Deref, DerefMut};
+use std::sync::atomic::Ordering::{Relaxed, Acquire, Release};
+
+use mem::epoch::{Atomic, Owned, Guard};
+use mem::epoch::participant::Participant;
+use mem::CachePadded;
+
+/// Global, threadsafe list of threads participating in epoch management.
+#[derive(Debug)]
+pub struct Participants {
+    head: Atomic<ParticipantNode>
+}
+
+#[derive(Debug)]
+pub struct ParticipantNode(CachePadded<Participant>);
+
+impl ParticipantNode {
+    pub fn new() -> ParticipantNode {
+        ParticipantNode(CachePadded::new(Participant::new()))
+    }
+}
+
+impl Deref for ParticipantNode {
+    type Target = Participant;
+    fn deref(&self) -> &Participant {
+        &self.0
+    }
+}
+
+impl DerefMut for ParticipantNode {
+    fn deref_mut(&mut self) -> &mut Participant {
+        &mut self.0
+    }
+}
+
+impl Participants {
+    #[cfg(not(feature = "nightly"))]
+    pub fn new() -> Participants {
+        Participants { head: Atomic::null() }
+    }
+
+    #[cfg(feature = "nightly")]
+    pub const fn new() -> Participants {
+        Participants { head: Atomic::null() }
+    }
+
+    /// Enroll a new thread in epoch management by adding a new `Particpant`
+    /// record to the global list.
+    pub fn enroll(&self) -> *const Participant {
+        let mut participant = Owned::new(ParticipantNode::new());
+
+        // we ultimately use epoch tracking to free Participant nodes, but we
+        // can't actually enter an epoch here, so fake it; we know the node
+        // can't be removed until marked inactive anyway.
+        let fake_guard = ();
+        let g: &'static Guard = unsafe { mem::transmute(&fake_guard) };
+        loop {
+            let head = self.head.load(Relaxed, g);
+            participant.next.store_shared(head, Relaxed);
+            match self.head.cas_and_ref(head, participant, Release, g) {
+                Ok(shared) => {
+                    let shared: &Participant = &shared;
+                    return shared;
+                }
+                Err(owned) => {
+                    participant = owned;
+                }
+            }
+        }
+    }
+
+    pub fn iter<'a>(&'a self, g: &'a Guard) -> Iter<'a> {
+        Iter {
+            guard: g,
+            next: &self.head,
+            needs_acq: true,
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct Iter<'a> {
+    // pin to an epoch so that we can free inactive nodes
+    guard: &'a Guard,
+    next: &'a Atomic<ParticipantNode>,
+
+    // an Acquire read is needed only for the first read, due to release
+    // sequences
+    needs_acq: bool,
+}
+
+impl<'a> Iterator for Iter<'a> {
+    type Item = &'a Participant;
+    fn next(&mut self) -> Option<&'a Participant> {
+        let mut cur = if self.needs_acq {
+            self.needs_acq = false;
+            self.next.load(Acquire, self.guard)
+        } else {
+            self.next.load(Relaxed, self.guard)
+        };
+
+        while let Some(n) = cur {
+            // attempt to clean up inactive nodes
+            if !n.active.load(Relaxed) {
+                cur = n.next.load(Relaxed, self.guard);
+                // TODO: actually reclaim inactive participants!
+            } else {
+                self.next = &n.next;
+                return Some(&n)
+            }
+        }
+
+        None
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/mem/mod.rs
@@ -0,0 +1,9 @@
+//! Memory management for concurrent data structures
+//!
+//! At the moment, the only memory management scheme is epoch-based reclamation,
+//! found in the `epoch` submodule.
+
+pub use self::cache_padded::{CachePadded, ZerosValid};
+
+pub mod epoch;
+mod cache_padded;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/scoped.rs
@@ -0,0 +1,275 @@
+use std::cell::RefCell;
+use std::fmt;
+use std::mem;
+use std::rc::Rc;
+use std::sync::atomic::Ordering;
+use std::sync::Arc;
+use std::thread;
+
+use {spawn_unsafe, FnBox};
+use sync::AtomicOption;
+
+pub struct Scope<'a> {
+    dtors: RefCell<Option<DtorChain<'a>>>
+}
+
+struct DtorChain<'a> {
+    dtor: Box<FnBox + 'a>,
+    next: Option<Box<DtorChain<'a>>>
+}
+
+enum JoinState {
+    Running(thread::JoinHandle<()>),
+    Joined,
+}
+
+impl JoinState {
+    fn join(&mut self) {
+        let mut state = JoinState::Joined;
+        mem::swap(self, &mut state);
+        if let JoinState::Running(handle) = state {
+            let res = handle.join();
+
+            if !thread::panicking() { res.unwrap(); }
+        }
+    }
+}
+
+/// A handle to a scoped thread
+pub struct ScopedJoinHandle<T> {
+    inner: Rc<RefCell<JoinState>>,
+    packet: Arc<AtomicOption<T>>,
+    thread: thread::Thread,
+}
+
+/// Create a new `scope`, for deferred destructors.
+///
+/// Scopes, in particular, support [*scoped thread spawning*](struct.Scope.html#method.spawn).
+///
+/// # Examples
+///
+/// Creating and using a scope:
+///
+/// ```
+/// crossbeam::scope(|scope| {
+///     scope.defer(|| println!("Exiting scope"));
+///     scope.spawn(|| println!("Running child thread in scope"))
+/// });
+/// // Prints messages in the reverse order written
+/// ```
+pub fn scope<'a, F, R>(f: F) -> R where F: FnOnce(&Scope<'a>) -> R {
+    let mut scope = Scope { dtors: RefCell::new(None) };
+    let ret = f(&scope);
+    scope.drop_all();
+    ret
+}
+
+impl<'a> fmt::Debug for Scope<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Scope {{ ... }}")
+    }
+}
+
+impl<T> fmt::Debug for ScopedJoinHandle<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "ScopedJoinHandle {{ ... }}")
+    }
+}
+
+impl<'a> Scope<'a> {
+    // This method is carefully written in a transactional style, so
+    // that it can be called directly and, if any dtor panics, can be
+    // resumed in the unwinding this causes. By initially running the
+    // method outside of any destructor, we avoid any leakage problems
+    // due to @rust-lang/rust#14875.
+    fn drop_all(&mut self) {
+        loop {
+            // use a separate scope to ensure that the RefCell borrow
+            // is relinquishe before running `dtor`
+            let dtor = {
+                let mut dtors = self.dtors.borrow_mut();
+                if let Some(mut node) = dtors.take() {
+                    *dtors = node.next.take().map(|b| *b);
+                    node.dtor
+                } else {
+                    return
+                }
+            };
+            dtor.call_box()
+        }
+    }
+
+    /// Schedule code to be executed when exiting the scope.
+    ///
+    /// This is akin to having a destructor on the stack, except that it is
+    /// *guaranteed* to be run.
+    pub fn defer<F>(&self, f: F) where F: FnOnce() + 'a {
+        let mut dtors = self.dtors.borrow_mut();
+        *dtors = Some(DtorChain {
+            dtor: Box::new(f),
+            next: dtors.take().map(Box::new)
+        });
+    }
+
+    /// Create a scoped thread.
+    ///
+    /// `spawn` is similar to the [`spawn`][spawn] function in Rust's standard library. The
+    /// difference is that this thread is scoped, meaning that it's guaranteed to terminate
+    /// before the current stack frame goes away, allowing you to reference the parent stack frame
+    /// directly. This is ensured by having the parent thread join on the child thread before the
+    /// scope exits.
+    ///
+    /// [spawn]: http://doc.rust-lang.org/std/thread/fn.spawn.html
+    ///
+    /// # Examples
+    ///
+    /// A basic scoped thread:
+    ///
+    /// ```
+    /// crossbeam::scope(|scope| {
+    ///     scope.spawn(|| {
+    ///         println!("Hello from a scoped thread!");
+    ///     });
+    /// });
+    /// ```
+    ///
+    /// When writing concurrent Rust programs, you'll sometimes see a pattern like this, using
+    /// [`std::thread::spawn`][spawn]:
+    ///
+    /// ```ignore
+    /// let array = [1, 2, 3];
+    /// let mut guards = vec![];
+    ///
+    /// for i in &array {
+    ///     let guard = std::thread::spawn(move || {
+    ///         println!("element: {}", i);
+    ///     });
+    ///
+    ///     guards.push(guard);
+    /// }
+    ///
+    /// for guard in guards {
+    ///     guard.join().unwrap();
+    /// }
+    /// ```
+    ///
+    /// The basic pattern is:
+    ///
+    /// 1. Iterate over some collection.
+    /// 2. Spin up a thread to operate on each part of the collection.
+    /// 3. Join all the threads.
+    ///
+    /// However, this code actually gives an error:
+    ///
+    /// ```text
+    /// error: `array` does not live long enough
+    /// for i in &array {
+    ///           ^~~~~
+    /// in expansion of for loop expansion
+    /// note: expansion site
+    /// note: reference must be valid for the static lifetime...
+    /// note: ...but borrowed value is only valid for the block suffix following statement 0 at ...
+    ///     let array = [1, 2, 3];
+    ///     let mut guards = vec![];
+    ///
+    ///     for i in &array {
+    ///         let guard = std::thread::spawn(move || {
+    ///             println!("element: {}", i);
+    /// ...
+    /// error: aborting due to previous error
+    /// ```
+    ///
+    /// Because [`std::thread::spawn`][spawn] doesn't know about this scope, it requires a
+    /// `'static` lifetime. One way of giving it a proper lifetime is to use an [`Arc`][arc]:
+    ///
+    /// [arc]: http://doc.rust-lang.org/stable/std/sync/struct.Arc.html
+    ///
+    /// ```
+    /// use std::sync::Arc;
+    ///
+    /// let array = Arc::new([1, 2, 3]);
+    /// let mut guards = vec![];
+    ///
+    /// for i in (0..array.len()) {
+    ///     let a = array.clone();
+    ///
+    ///     let guard = std::thread::spawn(move || {
+    ///         println!("element: {}", a[i]);
+    ///     });
+    ///
+    ///     guards.push(guard);
+    /// }
+    ///
+    /// for guard in guards {
+    ///     guard.join().unwrap();
+    /// }
+    /// ```
+    ///
+    /// But this introduces unnecessary allocation, as `Arc<T>` puts its data on the heap, and we
+    /// also end up dealing with reference counts. We know that we're joining the threads before
+    /// our function returns, so just taking a reference _should_ be safe. Rust can't know that,
+    /// though.
+    ///
+    /// Enter scoped threads. Here's our original example, using `spawn` from crossbeam rather
+    /// than from `std::thread`:
+    ///
+    /// ```
+    /// let array = [1, 2, 3];
+    ///
+    /// crossbeam::scope(|scope| {
+    ///     for i in &array {
+    ///         scope.spawn(move || {
+    ///             println!("element: {}", i);
+    ///         });
+    ///     }
+    /// });
+    /// ```
+    ///
+    /// Much more straightforward.
+    pub fn spawn<F, T>(&self, f: F) -> ScopedJoinHandle<T> where
+        F: FnOnce() -> T + Send + 'a, T: Send + 'a
+    {
+        let their_packet = Arc::new(AtomicOption::new());
+        let my_packet = their_packet.clone();
+
+        let join_handle = unsafe {
+            spawn_unsafe(move || {
+                their_packet.swap(f(), Ordering::Relaxed);
+            })
+        };
+
+        let thread = join_handle.thread().clone();
+        let deferred_handle = Rc::new(RefCell::new(JoinState::Running(join_handle)));
+        let my_handle = deferred_handle.clone();
+
+        self.defer(move || {
+            let mut state = deferred_handle.borrow_mut();
+            state.join();
+        });
+
+        ScopedJoinHandle {
+            inner: my_handle,
+            packet: my_packet,
+            thread: thread,
+        }
+    }
+}
+
+impl<T> ScopedJoinHandle<T> {
+    /// Join the scoped thread, returning the result it produced.
+    pub fn join(self) -> T {
+        self.inner.borrow_mut().join();
+        self.packet.take(Ordering::Relaxed).unwrap()
+    }
+
+    /// Get the underlying thread handle.
+    pub fn thread(&self) -> &thread::Thread {
+        &self.thread
+    }
+}
+
+impl<'a> Drop for Scope<'a> {
+    fn drop(&mut self) {
+        self.drop_all()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/arc_cell.rs
@@ -0,0 +1,90 @@
+use std::marker::PhantomData;
+use std::mem;
+use std::sync::Arc;
+use std::sync::atomic::{AtomicUsize, Ordering};
+
+/// A type providing atomic storage and retrieval of an `Arc<T>`.
+#[derive(Debug)]
+pub struct ArcCell<T>(AtomicUsize, PhantomData<Arc<T>>);
+
+impl<T> Drop for ArcCell<T> {
+    fn drop(&mut self) {
+        self.take();
+    }
+}
+
+impl<T> ArcCell<T> {
+    /// Creates a new `ArcCell`.
+    pub fn new(t: Arc<T>) -> ArcCell<T> {
+        ArcCell(AtomicUsize::new(unsafe { mem::transmute(t) }), PhantomData)
+    }
+
+    fn take(&self) -> Arc<T> {
+        loop {
+            match self.0.swap(0, Ordering::Acquire) {
+                0 => {}
+                n => return unsafe { mem::transmute(n) }
+            }
+        }
+    }
+
+    fn put(&self, t: Arc<T>) {
+        debug_assert_eq!(self.0.load(Ordering::SeqCst), 0);
+        self.0.store(unsafe { mem::transmute(t) }, Ordering::Release);
+    }
+
+    /// Stores a new value in the `ArcCell`, returning the previous
+    /// value.
+    pub fn set(&self, t: Arc<T>) -> Arc<T> {
+        let old = self.take();
+        self.put(t);
+        old
+    }
+
+    /// Returns a copy of the value stored by the `ArcCell`.
+    pub fn get(&self) -> Arc<T> {
+        let t = self.take();
+        // NB: correctness here depends on Arc's clone impl not panicking
+        let out = t.clone();
+        self.put(t);
+        out
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::sync::Arc;
+    use std::sync::atomic::{ATOMIC_USIZE_INIT, AtomicUsize, Ordering};
+
+    use super::*;
+
+    #[test]
+    fn basic() {
+        let r = ArcCell::new(Arc::new(0));
+        assert_eq!(*r.get(), 0);
+        assert_eq!(*r.set(Arc::new(1)), 0);
+        assert_eq!(*r.get(), 1);
+    }
+
+    #[test]
+    fn drop_runs() {
+        static DROPS: AtomicUsize = ATOMIC_USIZE_INIT;
+
+        struct Foo;
+
+        impl Drop for Foo {
+            fn drop(&mut self) {
+                DROPS.fetch_add(1, Ordering::SeqCst);
+            }
+        }
+
+        let r = ArcCell::new(Arc::new(Foo));
+        let _f = r.get();
+        r.get();
+        r.set(Arc::new(Foo));
+        drop(_f);
+        assert_eq!(DROPS.load(Ordering::SeqCst), 1);
+        drop(r);
+        assert_eq!(DROPS.load(Ordering::SeqCst), 2);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/atomic_option.rs
@@ -0,0 +1,38 @@
+use std::sync::atomic::{AtomicPtr, Ordering};
+use std::ptr;
+
+unsafe impl<T: Send> Send for AtomicOption<T> {}
+unsafe impl<T: Send> Sync for AtomicOption<T> {}
+
+#[derive(Debug)]
+pub struct AtomicOption<T> {
+    inner: AtomicPtr<T>,
+}
+
+impl<T> AtomicOption<T> {
+    pub fn new() -> AtomicOption<T> {
+        AtomicOption { inner: AtomicPtr::new(ptr::null_mut()) }
+    }
+
+    fn swap_inner(&self, ptr: *mut T, order: Ordering) -> Option<Box<T>> {
+        let old = self.inner.swap(ptr, order);
+        if old.is_null() {
+            None
+        } else {
+            Some(unsafe { Box::from_raw(old) })
+        }
+    }
+
+    // allows re-use of allocation
+    pub fn swap_box(&self, t: Box<T>, order: Ordering) -> Option<Box<T>> {
+        self.swap_inner(Box::into_raw(t), order)
+    }
+
+    pub fn swap(&self, t: T, order: Ordering) -> Option<T> {
+        self.swap_box(Box::new(t), order).map(|old| *old)
+    }
+
+    pub fn take(&self, order: Ordering) -> Option<T> {
+        self.swap_inner(ptr::null_mut(), order).map(|old| *old)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/chase_lev.rs
@@ -0,0 +1,602 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A lock-free concurrent work-stealing deque
+//!
+//! This module contains a hybrid implementation of the Chase-Lev work stealing deque
+//! described in ["Dynamic Circular Work-Stealing Deque"][chase_lev] and the improved version
+//! described in ["Correct and Efficient Work-Stealing for Weak Memory Models"][weak_chase_lev].
+//! The implementation is heavily based on the pseudocode found in the papers.
+//!
+//! # Example
+//!
+//! ```
+//! use crossbeam::sync::chase_lev;
+//! let (mut worker, stealer) = chase_lev::deque();
+//!
+//! // Only the worker may push/try_pop
+//! worker.push(1);
+//! worker.try_pop();
+//!
+//! // Stealers take data from the other end of the deque
+//! worker.push(1);
+//! stealer.steal();
+//!
+//! // Stealers can be cloned to have many stealers stealing in parallel
+//! worker.push(1);
+//! let stealer2 = stealer.clone();
+//! stealer2.steal();
+//! ```
+//!
+//! [chase_lev]: http://neteril.org/~jeremie/Dynamic_Circular_Work_Queue.pdf
+//! [weak_chase_lev]: http://www.di.ens.fr/~zappa/readings/ppopp13.pdf
+
+use std::cell::UnsafeCell;
+use std::fmt;
+use std::mem;
+use std::ptr;
+use std::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst};
+use std::sync::atomic::{AtomicIsize, fence};
+use std::sync::Arc;
+
+use mem::epoch::{self, Atomic, Shared, Owned};
+
+// Once the queue is less than 1/K full, then it will be downsized. Note that
+// the deque requires that this number be less than 2.
+const K: isize = 4;
+
+// Minimum number of bits that a buffer size should be. No buffer will resize to
+// under this value, and all deques will initially contain a buffer of this
+// size.
+//
+// The size in question is 1 << MIN_BITS
+const MIN_BITS: u32 = 7;
+
+#[derive(Debug)]
+struct Deque<T> {
+    bottom: AtomicIsize,
+    top: AtomicIsize,
+    array: Atomic<Buffer<T>>,
+}
+
+// FIXME: can these constraints be relaxed?
+unsafe impl<T: Send> Send for Deque<T> {}
+unsafe impl<T: Send> Sync for Deque<T> {}
+
+/// Worker half of the work-stealing deque. This worker has exclusive access to
+/// one side of the deque, and uses `push` and `try_pop` method to manipulate it.
+///
+/// There may only be one worker per deque, and operations on the worker
+/// require mutable access to the worker itself.
+#[derive(Debug)]
+pub struct Worker<T> {
+    deque: Arc<Deque<T>>,
+}
+
+/// The stealing half of the work-stealing deque. Stealers have access to the
+/// opposite end of the deque from the worker, and they only have access to the
+/// `steal` method.
+///
+/// Stealers can be cloned to have more than one handle active at a time.
+#[derive(Debug)]
+pub struct Stealer<T> {
+    deque: Arc<Deque<T>>,
+}
+
+/// When stealing some data, this is an enumeration of the possible outcomes.
+#[derive(PartialEq, Eq, Debug)]
+pub enum Steal<T> {
+    /// The deque was empty at the time of stealing
+    Empty,
+    /// The stealer lost the race for stealing data, and a retry may return more
+    /// data.
+    Abort,
+    /// The stealer has successfully stolen some data.
+    Data(T),
+}
+
+// An internal buffer used by the chase-lev deque. This structure is actually
+// implemented as a circular buffer, and is used as the intermediate storage of
+// the data in the deque.
+//
+// This Vec<T> always has a length of 0, the backing buffer is just used by the
+// code below.
+struct Buffer<T> {
+    storage: UnsafeCell<Vec<T>>,
+    log_size: u32,
+}
+
+impl<T> fmt::Debug for Buffer<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Buffer {{ ... }}")
+    }
+}
+
+impl<T> Worker<T> {
+    /// Pushes data onto the front of this work queue.
+    pub fn push(&mut self, t: T) {
+        unsafe { self.deque.push(t) }
+    }
+
+    /// Pops data off the front of the work queue, returning `None` on an empty
+    /// queue.
+    pub fn try_pop(&mut self) -> Option<T> {
+        unsafe { self.deque.try_pop() }
+    }
+}
+
+impl<T> Stealer<T> {
+    /// Steals work off the end of the queue (opposite of the worker's end)
+    pub fn steal(&self) -> Steal<T> {
+        self.deque.steal()
+    }
+}
+
+impl<T> Clone for Stealer<T> {
+    fn clone(&self) -> Stealer<T> {
+        Stealer { deque: self.deque.clone() }
+    }
+}
+
+/// Creates a new empty deque
+pub fn deque<T>() -> (Worker<T>, Stealer<T>) {
+    let a = Arc::new(Deque::new());
+    let b = a.clone();
+    (Worker { deque: a }, Stealer { deque: b })
+}
+
+// Almost all of this code can be found directly in the paper so I'm not
+// personally going to heavily comment what's going on here.
+
+impl<T> Deque<T> {
+    fn new() -> Deque<T> {
+        let array = Atomic::null();
+        array.store(Some(Owned::new(Buffer::new(MIN_BITS))), SeqCst);
+        Deque {
+            bottom: AtomicIsize::new(0),
+            top: AtomicIsize::new(0),
+            array: array,
+        }
+    }
+
+    unsafe fn push(&self, data: T) {
+        let guard = epoch::pin();
+
+        let mut b = self.bottom.load(Relaxed);
+        let t = self.top.load(Acquire);
+        let mut a = self.array.load(Relaxed, &guard).unwrap();
+
+        let size = b - t;
+        if size >= (a.size() as isize) - 1 {
+            // You won't find this code in the chase-lev deque paper. This is
+            // alluded to in a small footnote, however. We always free a buffer
+            // when growing in order to prevent leaks.
+            a = self.swap_buffer(a, a.resize(b, t, 1), &guard);
+
+            // reload the bottom counter, since swap_buffer modifies it.
+            b = self.bottom.load(Relaxed);
+        }
+        a.put(b, data);
+        fence(Release);
+        self.bottom.store(b + 1, Relaxed);
+    }
+
+    unsafe fn try_pop(&self) -> Option<T> {
+        let guard = epoch::pin();
+
+        let b = self.bottom.load(Relaxed) - 1;
+        let a = self.array.load(Relaxed, &guard).unwrap();
+        self.bottom.store(b, Relaxed);
+        fence(SeqCst); // the store to bottom must occur before loading top.
+        let t = self.top.load(Relaxed);
+
+        let size = b - t;
+        if size >= 0 {
+            // non-empty case
+            let mut data = Some(a.get(b));
+            if size == 0 {
+                // last element in queue, check for races.
+                if self.top.compare_and_swap(t, t + 1, SeqCst) != t {
+                    // lost the race.
+                    mem::forget(data.take());
+                }
+
+                // set the queue to a canonically empty state.
+                self.bottom.store(b + 1, Relaxed);
+            } else {
+                self.maybe_shrink(b, t, &guard);
+            }
+            data
+        } else {
+            // empty queue. revert the decrement of "b" and try to shrink.
+            //
+            // the original chase_lev paper uses "t" here, but the new one uses "b + 1".
+            // don't worry, they're the same thing: pop and steal operations will never leave
+            // the top counter greater than the bottom counter. After we decrement "b" at
+            // the beginning of this function, the lowest possible value it could hold here is "t - 1".
+            // That's also the only value that could cause this branch to be taken.
+            self.bottom.store(b + 1, Relaxed);
+            None
+        }
+    }
+
+    fn steal(&self) -> Steal<T> {
+        let guard = epoch::pin();
+
+        let t = self.top.load(Acquire);
+        fence(SeqCst); // top must be loaded before bottom.
+        let b = self.bottom.load(Acquire);
+
+        let size = b - t;
+        if size <= 0 {
+            return Steal::Empty
+        }
+
+        unsafe {
+            // while the paper uses a "consume" ordering here, the closest thing we have
+            // available is Acquire, which is strictly stronger.
+            let a = self.array.load(Acquire, &guard).unwrap();
+            let data = a.get(t);
+            // we may be racing against other steals and a pop.
+            if self.top.compare_and_swap(t, t + 1, SeqCst) == t {
+                Steal::Data(data)
+            } else {
+                mem::forget(data); // someone else stole this value
+                Steal::Abort
+            }
+        }
+    }
+
+    // potentially shrink the array. This can be called only from the worker.
+    unsafe fn maybe_shrink(&self, b: isize, t: isize, guard: &epoch::Guard) {
+        let a = self.array.load(SeqCst, guard).unwrap();
+        let size = b - t;
+        if size < (a.size() as isize) / K && size > (1 << MIN_BITS) {
+            self.swap_buffer(a, a.resize(b, t, -1), guard);
+        }
+    }
+
+    // Helper routine not mentioned in the paper which is used in growing and
+    // shrinking buffers to swap in a new buffer into place.
+    //
+    // As a bit of a recap, stealers can continue using buffers after this
+    // method has called 'unlinked' on it. The continued usage is simply a read
+    // followed by a forget, but we must make sure that the memory can continue
+    // to be read after we flag this buffer for reclamation. All stealers,
+    // however, have their own epoch pinned during this time so the buffer will
+    // just naturally be free'd once all concurrent stealers have exited.
+    //
+    // This method may only be called safely from the workers due to the way it modifies
+    // the array pointer.
+    unsafe fn swap_buffer<'a>(&self,
+                              old: Shared<'a, Buffer<T>>,
+                              buf: Buffer<T>,
+                              guard: &'a epoch::Guard)
+                              -> Shared<'a, Buffer<T>> {
+        let newbuf = Owned::new(buf);
+        let newbuf = self.array.store_and_ref(newbuf, Release, &guard);
+        guard.unlinked(old);
+
+        newbuf
+    }
+}
+
+
+impl<T> Drop for Deque<T> {
+    fn drop(&mut self) {
+        let guard = epoch::pin();
+
+        // Arc enforces that we have truly exclusive access here.
+
+        let t = self.top.load(Relaxed);
+        let b = self.bottom.load(Relaxed);
+        let a = self.array.swap(None, Relaxed, &guard).unwrap();
+        // Free whatever is leftover in the dequeue, then free the backing
+        // memory itself
+        unsafe {
+            for i in t..b {
+                drop(a.get(i));
+            }
+            guard.unlinked(a);
+        }
+    }
+}
+
+impl<T> Buffer<T> {
+    fn new(log_size: u32) -> Buffer<T> {
+        Buffer {
+            storage: UnsafeCell::new(Vec::with_capacity(1 << log_size)),
+            log_size: log_size,
+        }
+    }
+
+    fn size(&self) -> usize {
+        unsafe { (*self.storage.get()).capacity() }
+    }
+
+    fn mask(&self) -> isize {
+        unsafe {
+            ((*self.storage.get()).capacity() - 1) as isize
+        }
+    }
+
+    unsafe fn elem(&self, i: isize) -> *mut T {
+        (*self.storage.get()).as_mut_ptr().offset(i & self.mask())
+    }
+
+    // This does not protect against loading duplicate values of the same cell,
+    // nor does this clear out the contents contained within. Hence, this is a
+    // very unsafe method which the caller needs to treat specially in case a
+    // race is lost.
+    unsafe fn get(&self, i: isize) -> T {
+        ptr::read(self.elem(i))
+    }
+
+    // Unsafe because this unsafely overwrites possibly uninitialized or
+    // initialized data.
+    unsafe fn put(&self, i: isize, t: T) {
+        ptr::write(self.elem(i), t);
+    }
+
+    // Again, unsafe because this has incredibly dubious ownership violations.
+    // It is assumed that this buffer is immediately dropped.
+    unsafe fn resize(&self, b: isize, t: isize, delta: i32) -> Buffer<T> {
+        let buf = Buffer::new(((self.log_size as i32) + delta) as u32);
+        for i in t..b {
+            buf.put(i, self.get(i));
+        }
+        return buf;
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    extern crate rand;
+
+    use super::{deque, Worker, Stealer, Steal};
+
+    use std::thread;
+    use std::sync::Arc;
+    use std::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT,
+                            AtomicUsize, ATOMIC_USIZE_INIT};
+    use std::sync::atomic::Ordering::SeqCst;
+
+    use self::rand::Rng;
+
+    #[test]
+    fn smoke() {
+        let (mut w, s) = deque();
+        assert_eq!(w.try_pop(), None);
+        assert_eq!(s.steal(), Steal::Empty);
+        w.push(1);
+        assert_eq!(w.try_pop(), Some(1));
+        w.push(1);
+        assert_eq!(s.steal(), Steal::Data(1));
+        w.push(1);
+        assert_eq!(s.clone().steal(), Steal::Data(1));
+    }
+
+    #[test]
+    fn stealpush() {
+        static AMT: isize = 100000;
+        let (mut w, s) = deque();
+        let t = thread::spawn(move || {
+            let mut left = AMT;
+            while left > 0 {
+                match s.steal() {
+                    Steal::Data(i) => {
+                        assert_eq!(i, 1);
+                        left -= 1;
+                    }
+                    Steal::Abort | Steal::Empty => {}
+                }
+            }
+        });
+
+        for _ in 0..AMT {
+            w.push(1);
+        }
+
+        t.join().unwrap();
+    }
+
+    #[test]
+    fn stealpush_large() {
+        static AMT: isize = 100000;
+        let (mut w, s) = deque();
+        let t = thread::spawn(move || {
+            let mut left = AMT;
+            while left > 0 {
+                match s.steal() {
+                    Steal::Data((1, 10)) => { left -= 1; }
+                    Steal::Data(..) => panic!(),
+                    Steal::Abort | Steal::Empty => {}
+                }
+            }
+        });
+
+        for _ in 0..AMT {
+            w.push((1, 10));
+        }
+
+        t.join().unwrap();
+    }
+
+    fn stampede(mut w: Worker<Box<isize>>,
+                s: Stealer<Box<isize>>,
+                nthreads: isize,
+                amt: usize) {
+        for _ in 0..amt {
+            w.push(Box::new(20));
+        }
+        let remaining = Arc::new(AtomicUsize::new(amt));
+
+        let threads = (0..nthreads).map(|_| {
+            let remaining = remaining.clone();
+            let s = s.clone();
+            thread::spawn(move || {
+                while remaining.load(SeqCst) > 0 {
+                    match s.steal() {
+                        Steal::Data(val) => {
+                            if *val == 20 {
+                                remaining.fetch_sub(1, SeqCst);
+                            } else {
+                                panic!()
+                            }
+                        }
+                        Steal::Abort | Steal::Empty => {}
+                    }
+                }
+            })
+        }).collect::<Vec<_>>();
+
+        while remaining.load(SeqCst) > 0 {
+            if let Some(val) = w.try_pop() {
+                if *val == 20 {
+                    remaining.fetch_sub(1, SeqCst);
+                } else {
+                    panic!()
+                }
+            }
+        }
+
+        for thread in threads.into_iter() {
+            thread.join().unwrap();
+        }
+    }
+
+    #[test]
+    fn run_stampede() {
+        let (w, s) = deque();
+        stampede(w, s, 8, 10000);
+    }
+
+    #[test]
+    fn many_stampede() {
+        static AMT: usize = 4;
+        let threads = (0..AMT).map(|_| {
+            let (w, s) = deque();
+            thread::spawn(|| {
+                stampede(w, s, 4, 10000);
+            })
+        }).collect::<Vec<_>>();
+
+        for thread in threads.into_iter() {
+            thread.join().unwrap();
+        }
+    }
+
+    #[test]
+    fn stress() {
+        static AMT: isize = 100000;
+        static NTHREADS: isize = 8;
+        static DONE: AtomicBool = ATOMIC_BOOL_INIT;
+        static HITS: AtomicUsize = ATOMIC_USIZE_INIT;
+        let (mut w, s) = deque();
+
+        let threads = (0..NTHREADS).map(|_| {
+            let s = s.clone();
+            thread::spawn(move || {
+                loop {
+                    match s.steal() {
+                        Steal::Data(2) => { HITS.fetch_add(1, SeqCst); }
+                        Steal::Data(..) => panic!(),
+                        _ if DONE.load(SeqCst) => break,
+                        _ => {}
+                    }
+                }
+            })
+        }).collect::<Vec<_>>();
+
+        let mut rng = rand::thread_rng();
+        let mut expected = 0;
+        while expected < AMT {
+            if rng.gen_range(0, 3) == 2 {
+                match w.try_pop() {
+                    None => {}
+                    Some(2) => { HITS.fetch_add(1, SeqCst); },
+                    Some(_) => panic!(),
+                }
+            } else {
+                expected += 1;
+                w.push(2);
+            }
+        }
+
+        while HITS.load(SeqCst) < AMT as usize {
+            match w.try_pop() {
+                None => {}
+                Some(2) => { HITS.fetch_add(1, SeqCst); },
+                Some(_) => panic!(),
+            }
+        }
+        DONE.store(true, SeqCst);
+
+        for thread in threads.into_iter() {
+            thread.join().unwrap();
+        }
+
+        assert_eq!(HITS.load(SeqCst), expected as usize);
+    }
+
+    #[test]
+    fn no_starvation() {
+        static AMT: isize = 10000;
+        static NTHREADS: isize = 4;
+        static DONE: AtomicBool = ATOMIC_BOOL_INIT;
+        let (mut w, s) = deque();
+
+        let (threads, hits): (Vec<_>, Vec<_>) = (0..NTHREADS).map(|_| {
+            let s = s.clone();
+            let ctr = Arc::new(AtomicUsize::new(0));
+            let ctr2 = ctr.clone();
+            (thread::spawn(move || {
+                loop {
+                    match s.steal() {
+                        Steal::Data((1, 2)) => { ctr.fetch_add(1, SeqCst); }
+                        Steal::Data(..) => panic!(),
+                        _ if DONE.load(SeqCst) => break,
+                        _ => {}
+                    }
+                }
+            }), ctr2)
+        }).unzip();
+
+        let mut rng = rand::thread_rng();
+        let mut myhit = false;
+        'outer: loop {
+            for _ in 0..rng.gen_range(0, AMT) {
+                if !myhit && rng.gen_range(0, 3) == 2 {
+                    match w.try_pop() {
+                        None => {}
+                        Some((1, 2)) => myhit = true,
+                        Some(_) => panic!(),
+                    }
+                } else {
+                    w.push((1, 2));
+                }
+            }
+
+            for slot in hits.iter() {
+                let amt = slot.load(SeqCst);
+                if amt == 0 { continue 'outer; }
+            }
+            if myhit {
+                break
+            }
+        }
+
+        DONE.store(true, SeqCst);
+
+        for thread in threads.into_iter() {
+            thread.join().unwrap();
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/mod.rs
@@ -0,0 +1,14 @@
+//! Synchronization primitives.
+
+pub use self::ms_queue::MsQueue;
+pub use self::atomic_option::AtomicOption;
+pub use self::treiber_stack::TreiberStack;
+pub use self::seg_queue::SegQueue;
+pub use self::arc_cell::ArcCell;
+
+mod atomic_option;
+mod ms_queue;
+mod treiber_stack;
+mod seg_queue;
+pub mod chase_lev;
+mod arc_cell;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/ms_queue.rs
@@ -0,0 +1,511 @@
+use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
+use std::sync::atomic::AtomicBool;
+use std::{ptr, mem};
+use std::thread::{self, Thread};
+
+use mem::epoch::{self, Atomic, Owned, Shared};
+use mem::CachePadded;
+
+/// A Michael-Scott lock-free queue, with support for blocking `pop`s.
+///
+/// Usable with any number of producers and consumers.
+// The representation here is a singly-linked list, with a sentinel
+// node at the front. In general the `tail` pointer may lag behind the
+// actual tail. Non-sentinal nodes are either all `Data` or all
+// `Blocked` (requests for data from blocked threads).
+#[derive(Debug)]
+pub struct MsQueue<T> {
+    head: CachePadded<Atomic<Node<T>>>,
+    tail: CachePadded<Atomic<Node<T>>>,
+}
+
+#[derive(Debug)]
+struct Node<T> {
+    payload: Payload<T>,
+    next: Atomic<Node<T>>,
+}
+
+#[derive(Debug)]
+enum Payload<T> {
+    /// A node with actual data that can be popped.
+    Data(T),
+    /// A node representing a blocked request for data.
+    Blocked(*mut Signal<T>),
+}
+
+/// A blocked request for data, which includes a slot to write the data.
+#[derive(Debug)]
+struct Signal<T> {
+    /// Thread to unpark when data is ready.
+    thread: Thread,
+    /// The actual data, when available.
+    data: Option<T>,
+    /// Is the data ready? Needed to cope with spurious wakeups.
+    ready: AtomicBool,
+}
+
+impl<T> Node<T> {
+    fn is_data(&self) -> bool {
+        if let Payload::Data(_) = self.payload { true } else { false }
+    }
+}
+
+// Any particular `T` should never accessed concurrently, so no need
+// for Sync.
+unsafe impl<T: Send> Sync for MsQueue<T> {}
+unsafe impl<T: Send> Send for MsQueue<T> {}
+
+impl<T> MsQueue<T> {
+    /// Create a new, empty queue.
+    pub fn new() -> MsQueue<T> {
+        let q = MsQueue {
+            head: CachePadded::new(Atomic::null()),
+            tail: CachePadded::new(Atomic::null()),
+        };
+        let sentinel = Owned::new(Node {
+            payload: Payload::Data(unsafe { mem::uninitialized() }),
+            next: Atomic::null(),
+        });
+        let guard = epoch::pin();
+        let sentinel = q.head.store_and_ref(sentinel, Relaxed, &guard);
+        q.tail.store_shared(Some(sentinel), Relaxed);
+        q
+    }
+
+    #[inline(always)]
+    /// Attempt to atomically place `n` into the `next` pointer of `onto`.
+    ///
+    /// If unsuccessful, returns ownership of `n`, possibly updating
+    /// the queue's `tail` pointer.
+    fn push_internal(&self,
+                     guard: &epoch::Guard,
+                     onto: Shared<Node<T>>,
+                     n: Owned<Node<T>>)
+                     -> Result<(), Owned<Node<T>>>
+    {
+        // is `onto` the actual tail?
+        if let Some(next) = onto.next.load(Acquire, guard) {
+            // if not, try to "help" by moving the tail pointer forward
+            self.tail.cas_shared(Some(onto), Some(next), Release);
+            Err(n)
+        } else {
+            // looks like the actual tail; attempt to link in `n`
+            onto.next.cas_and_ref(None, n, Release, guard).map(|shared| {
+                // try to move the tail pointer forward
+                self.tail.cas_shared(Some(onto), Some(shared), Release);
+            })
+        }
+    }
+
+    /// Add `t` to the back of the queue, possibly waking up threads
+    /// blocked on `pop`.
+    pub fn push(&self, t: T) {
+        /// We may or may not need to allocate a node; once we do,
+        /// we cache that allocation.
+        enum Cache<T> {
+            Data(T),
+            Node(Owned<Node<T>>),
+        }
+
+        impl<T> Cache<T> {
+            /// Extract the node if cached, or allocate if not.
+            fn into_node(self) -> Owned<Node<T>> {
+                match self {
+                    Cache::Data(t) => {
+                        Owned::new(Node {
+                            payload: Payload::Data(t),
+                            next: Atomic::null()
+                        })
+                    }
+                    Cache::Node(n) => n
+                }
+            }
+
+            /// Extract the data from the cache, deallocating any cached node.
+            fn into_data(self) -> T {
+                match self {
+                    Cache::Data(t) => t,
+                    Cache::Node(node) => {
+                        match node.into_inner().payload {
+                            Payload::Data(t) => t,
+                            _ => unreachable!(),
+                        }
+                    }
+                }
+            }
+        }
+
+        let mut cache = Cache::Data(t); // don't allocate up front
+        let guard = epoch::pin();
+
+        loop {
+            // We push onto the tail, so we'll start optimistically by looking
+            // there first.
+            let tail = self.tail.load(Acquire, &guard).unwrap();
+
+            // Is the queue in Data mode (empty queues can be viewed as either mode)?
+            if tail.is_data() ||
+                self.head.load(Relaxed, &guard).unwrap().as_raw() == tail.as_raw()
+            {
+                // Attempt to push onto the `tail` snapshot; fails if
+                // `tail.next` has changed, which will always be the case if the
+                // queue has transitioned to blocking mode.
+                match self.push_internal(&guard, tail, cache.into_node()) {
+                    Ok(_) => return,
+                    Err(n) => {
+                        // replace the cache, retry whole thing
+                        cache = Cache::Node(n)
+                    }
+                }
+            } else {
+                // Queue is in blocking mode. Attempt to unblock a thread.
+                let head = self.head.load(Acquire, &guard).unwrap();
+                // Get a handle on the first blocked node. Racy, so queue might
+                // be empty or in data mode by the time we see it.
+                let request = head.next.load(Acquire, &guard).and_then(|next| {
+                    match next.payload {
+                        Payload::Blocked(signal) => Some((next, signal)),
+                        Payload::Data(_) => None,
+                    }
+                });
+                if let Some((blocked_node, signal)) = request {
+                    // race to dequeue the node
+                    if self.head.cas_shared(Some(head), Some(blocked_node), Release) {
+                        unsafe {
+                            // signal the thread
+                            (*signal).data = Some(cache.into_data());
+                            (*signal).ready.store(true, Relaxed);
+                            (*signal).thread.unpark();
+                            guard.unlinked(head);
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    #[inline(always)]
+    // Attempt to pop a data node. `Ok(None)` if queue is empty or in blocking
+    // mode; `Err(())` if lost race to pop.
+    fn pop_internal(&self, guard: &epoch::Guard) -> Result<Option<T>, ()> {
+        let head = self.head.load(Acquire, guard).unwrap();
+        if let Some(next) = head.next.load(Acquire, guard) {
+            if let Payload::Data(ref t) = next.payload {
+                unsafe {
+                    if self.head.cas_shared(Some(head), Some(next), Release) {
+                        guard.unlinked(head);
+                        Ok(Some(ptr::read(t)))
+                    } else {
+                        Err(())
+                    }
+                }
+            } else {
+                Ok(None)
+            }
+        } else {
+            Ok(None)
+        }
+    }
+
+    /// Check if this queue is empty.
+    pub fn is_empty(&self) -> bool {
+        let guard = epoch::pin();
+        let head = self.head.load(Acquire, &guard).unwrap();
+
+        if let Some(next) = head.next.load(Acquire, &guard) {
+            if let Payload::Data(_) = next.payload {
+                false
+            } else {
+                true
+            }
+        } else {
+            true
+        }
+    }
+
+    /// Attempt to dequeue from the front.
+    ///
+    /// Returns `None` if the queue is observed to be empty.
+    pub fn try_pop(&self) -> Option<T> {
+        let guard = epoch::pin();
+        loop {
+            if let Ok(r) = self.pop_internal(&guard) {
+                return r;
+            }
+        }
+    }
+
+    /// Dequeue an element from the front of the queue, blocking if the queue is
+    /// empty.
+    pub fn pop(&self) -> T {
+        let guard = epoch::pin();
+
+        // Fast path: keep retrying until we observe that the queue has no data,
+        // avoiding the allocation of a blocked node.
+        loop {
+            match self.pop_internal(&guard) {
+                Ok(Some(r)) => {
+                    return r;
+                }
+                Ok(None) => {
+                    break;
+                }
+                Err(()) => {}
+            }
+        }
+
+        // The signal gets to live on the stack, since this stack frame will be
+        // blocked until receiving the signal.
+        let mut signal = Signal {
+            thread: thread::current(),
+            data: None,
+            ready: AtomicBool::new(false),
+        };
+
+        // Go ahead and allocate the blocked node; chances are, we'll need it.
+        let mut node = Owned::new(Node {
+            payload: Payload::Blocked(&mut signal),
+            next: Atomic::null(),
+        });
+
+        loop {
+            // try a normal pop
+            if let Ok(Some(r)) = self.pop_internal(&guard) {
+                return r;
+            }
+
+            // At this point, we believe the queue is empty/blocked.
+            // Snapshot the tail, onto which we want to push a blocked node.
+            let tail = self.tail.load(Relaxed, &guard).unwrap();
+
+            // Double-check that we're in blocking mode
+            if tail.is_data() {
+                // The current tail is in data mode, so we probably need to abort.
+                // BUT, it might be the sentinel, so check for that first.
+                let head = self.head.load(Relaxed, &guard).unwrap();
+                if tail.is_data() && tail.as_raw() != head.as_raw() { continue; }
+            }
+
+            // At this point, the tail snapshot is either a blocked node deep in
+            // the queue, the sentinel, or no longer accessible from the queue.
+            // In *ALL* of these cases, if we succeed in pushing onto the
+            // snapshot, we know we are maintaining the core invariant: all
+            // reachable, non-sentinel nodes have the same payload mode, in this
+            // case, blocked.
+            match self.push_internal(&guard, tail, node) {
+                Ok(()) => {
+                    while !signal.ready.load(Relaxed) {
+                        thread::park();
+                    }
+                    return signal.data.unwrap();
+                }
+                Err(n) => {
+                    node = n;
+                }
+            }
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    const CONC_COUNT: i64 = 1000000;
+
+    use scope;
+    use super::*;
+
+    #[test]
+    fn push_try_pop_1() {
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+        q.push(37);
+        assert!(!q.is_empty());
+        assert_eq!(q.try_pop(), Some(37));
+        assert!(q.is_empty());
+    }
+
+    #[test]
+    fn push_try_pop_2() {
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+        q.push(37);
+        q.push(48);
+        assert_eq!(q.try_pop(), Some(37));
+        assert!(!q.is_empty());
+        assert_eq!(q.try_pop(), Some(48));
+        assert!(q.is_empty());
+    }
+
+    #[test]
+    fn push_try_pop_many_seq() {
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+        for i in 0..200 {
+            q.push(i)
+        }
+        assert!(!q.is_empty());
+        for i in 0..200 {
+            assert_eq!(q.try_pop(), Some(i));
+        }
+        assert!(q.is_empty());
+    }
+
+    #[test]
+    fn push_pop_1() {
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+        q.push(37);
+        assert!(!q.is_empty());
+        assert_eq!(q.pop(), 37);
+        assert!(q.is_empty());
+    }
+
+    #[test]
+    fn push_pop_2() {
+        let q: MsQueue<i64> = MsQueue::new();
+        q.push(37);
+        q.push(48);
+        assert_eq!(q.pop(), 37);
+        assert_eq!(q.pop(), 48);
+    }
+
+    #[test]
+    fn push_pop_many_seq() {
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+        for i in 0..200 {
+            q.push(i)
+        }
+        assert!(!q.is_empty());
+        for i in 0..200 {
+            assert_eq!(q.pop(), i);
+        }
+        assert!(q.is_empty());
+    }
+
+    #[test]
+    fn push_try_pop_many_spsc() {
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+
+        scope(|scope| {
+            scope.spawn(|| {
+                let mut next = 0;
+
+                while next < CONC_COUNT {
+                    if let Some(elem) = q.try_pop() {
+                        assert_eq!(elem, next);
+                        next += 1;
+                    }
+                }
+            });
+
+            for i in 0..CONC_COUNT {
+                q.push(i)
+            }
+        });
+    }
+
+    #[test]
+    fn push_try_pop_many_spmc() {
+        fn recv(_t: i32, q: &MsQueue<i64>) {
+            let mut cur = -1;
+            for _i in 0..CONC_COUNT {
+                if let Some(elem) = q.try_pop() {
+                    assert!(elem > cur);
+                    cur = elem;
+
+                    if cur == CONC_COUNT - 1 { break }
+                }
+            }
+        }
+
+        let q: MsQueue<i64> = MsQueue::new();
+        assert!(q.is_empty());
+        let qr = &q;
+        scope(|scope| {
+            for i in 0..3 {
+                scope.spawn(move || recv(i, qr));
+            }
+
+            scope.spawn(|| {
+                for i in 0..CONC_COUNT {
+                    q.push(i);
+                }
+            })
+        });
+    }
+
+    #[test]
+    fn push_try_pop_many_mpmc() {
+        enum LR { Left(i64), Right(i64) }
+
+        let q: MsQueue<LR> = MsQueue::new();
+        assert!(q.is_empty());
+
+        scope(|scope| {
+            for _t in 0..2 {
+                scope.spawn(|| {
+                    for i in CONC_COUNT-1..CONC_COUNT {
+                        q.push(LR::Left(i))
+                    }
+                });
+                scope.spawn(|| {
+                    for i in CONC_COUNT-1..CONC_COUNT {
+                        q.push(LR::Right(i))
+                    }
+                });
+                scope.spawn(|| {
+                    let mut vl = vec![];
+                    let mut vr = vec![];
+                    for _i in 0..CONC_COUNT {
+                        match q.try_pop() {
+                            Some(LR::Left(x)) => vl.push(x),
+                            Some(LR::Right(x)) => vr.push(x),
+                            _ => {}
+                        }
+                    }
+
+                    let mut vl2 = vl.clone();
+                    let mut vr2 = vr.clone();
+                    vl2.sort();
+                    vr2.sort();
+
+                    assert_eq!(vl, vl2);
+                    assert_eq!(vr, vr2);
+                });
+            }
+        });
+    }
+
+    #[test]
+    fn push_pop_many_spsc() {
+        let q: MsQueue<i64> = MsQueue::new();
+
+        scope(|scope| {
+            scope.spawn(|| {
+                let mut next = 0;
+                while next < CONC_COUNT {
+                    assert_eq!(q.pop(), next);
+                    next += 1;
+                }
+            });
+
+            for i in 0..CONC_COUNT {
+                q.push(i)
+            }
+        });
+        assert!(q.is_empty());
+    }
+
+    #[test]
+    fn is_empty_dont_pop() {
+        let q: MsQueue<i64> = MsQueue::new();
+        q.push(20);
+        q.push(20);
+        assert!(!q.is_empty());
+        assert!(!q.is_empty());
+        assert!(q.try_pop().is_some());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/seg_queue.rs
@@ -0,0 +1,251 @@
+use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
+use std::sync::atomic::{AtomicBool, AtomicUsize};
+use std::fmt;
+use std::{ptr, mem};
+use std::cmp;
+use std::cell::UnsafeCell;
+
+use mem::epoch::{self, Atomic, Owned};
+
+const SEG_SIZE: usize = 32;
+
+/// A Michael-Scott queue that allocates "segments" (arrays of nodes)
+/// for efficiency.
+///
+/// Usable with any number of producers and consumers.
+#[derive(Debug)]
+pub struct SegQueue<T> {
+    head: Atomic<Segment<T>>,
+    tail: Atomic<Segment<T>>,
+}
+
+struct Segment<T> {
+    low: AtomicUsize,
+    data: [UnsafeCell<(T, AtomicBool)>; SEG_SIZE],
+    high: AtomicUsize,
+    next: Atomic<Segment<T>>,
+}
+
+impl<T> fmt::Debug for Segment<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Segment {{ ... }}")
+    }
+}
+
+unsafe impl<T: Send> Sync for Segment<T> {}
+
+impl<T> Segment<T> {
+    fn new() -> Segment<T> {
+        let rqueue = Segment {
+            data: unsafe { mem::uninitialized() },
+            low: AtomicUsize::new(0),
+            high: AtomicUsize::new(0),
+            next: Atomic::null(),
+        };
+        for val in rqueue.data.iter() {
+            unsafe {
+                (*val.get()).1 = AtomicBool::new(false);
+            }
+        }
+        rqueue
+    }
+}
+
+impl<T> SegQueue<T> {
+    /// Create a new, empty queue.
+    pub fn new() -> SegQueue<T> {
+        let q = SegQueue {
+            head: Atomic::null(),
+            tail: Atomic::null(),
+        };
+        let sentinel = Owned::new(Segment::new());
+        let guard = epoch::pin();
+        let sentinel = q.head.store_and_ref(sentinel, Relaxed, &guard);
+        q.tail.store_shared(Some(sentinel), Relaxed);
+        q
+    }
+
+    /// Add `t` to the back of the queue.
+    pub fn push(&self, t: T) {
+        let guard = epoch::pin();
+        loop {
+            let tail = self.tail.load(Acquire, &guard).unwrap();
+            if tail.high.load(Relaxed) >= SEG_SIZE { continue }
+            let i = tail.high.fetch_add(1, Relaxed);
+            unsafe {
+                if i < SEG_SIZE {
+                    let cell = (*tail).data.get_unchecked(i).get();
+                    ptr::write(&mut (*cell).0, t);
+                    (*cell).1.store(true, Release);
+
+                    if i + 1 == SEG_SIZE {
+                        let tail = tail.next.store_and_ref(Owned::new(Segment::new()), Release, &guard);
+                        self.tail.store_shared(Some(tail), Release);
+                    }
+
+                    return
+                }
+            }
+        }
+    }
+
+    /// Attempt to dequeue from the front.
+    ///
+    /// Returns `None` if the queue is observed to be empty.
+    pub fn try_pop(&self) -> Option<T> {
+        let guard = epoch::pin();
+        loop {
+            let head = self.head.load(Acquire, &guard).unwrap();
+            loop {
+                let low = head.low.load(Relaxed);
+                if low >= cmp::min(head.high.load(Relaxed), SEG_SIZE) { break }
+                if head.low.compare_and_swap(low, low+1, Relaxed) == low {
+                    unsafe {
+                        let cell = (*head).data.get_unchecked(low).get();
+                        loop {
+                            if (*cell).1.load(Acquire) { break }
+                        }
+                        if low + 1 == SEG_SIZE {
+                            loop {
+                                if let Some(next) = head.next.load(Acquire, &guard) {
+                                    self.head.store_shared(Some(next), Release);
+                                    guard.unlinked(head);
+                                    break
+                                }
+                            }
+                        }
+                        return Some(ptr::read(&(*cell).0))
+                    }
+                }
+            }
+            if head.next.load(Relaxed, &guard).is_none() { return None }
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    const CONC_COUNT: i64 = 1000000;
+
+    use scope;
+    use super::*;
+
+    #[test]
+    fn push_pop_1() {
+        let q: SegQueue<i64> = SegQueue::new();
+        q.push(37);
+        assert_eq!(q.try_pop(), Some(37));
+    }
+
+    #[test]
+    fn push_pop_2() {
+        let q: SegQueue<i64> = SegQueue::new();
+        q.push(37);
+        q.push(48);
+        assert_eq!(q.try_pop(), Some(37));
+        assert_eq!(q.try_pop(), Some(48));
+    }
+
+    #[test]
+    fn push_pop_many_seq() {
+        let q: SegQueue<i64> = SegQueue::new();
+        for i in 0..200 {
+            q.push(i)
+        }
+        for i in 0..200 {
+            assert_eq!(q.try_pop(), Some(i));
+        }
+    }
+
+    #[test]
+    fn push_pop_many_spsc() {
+        let q: SegQueue<i64> = SegQueue::new();
+
+        scope(|scope| {
+            scope.spawn(|| {
+                let mut next = 0;
+
+                while next < CONC_COUNT {
+                    if let Some(elem) = q.try_pop() {
+                        assert_eq!(elem, next);
+                        next += 1;
+                    }
+                }
+            });
+
+            for i in 0..CONC_COUNT {
+                q.push(i)
+            }
+        });
+    }
+
+    #[test]
+    fn push_pop_many_spmc() {
+        fn recv(_t: i32, q: &SegQueue<i64>) {
+            let mut cur = -1;
+            for _i in 0..CONC_COUNT {
+                if let Some(elem) = q.try_pop() {
+                    assert!(elem > cur);
+                    cur = elem;
+
+                    if cur == CONC_COUNT - 1 { break }
+                }
+            }
+        }
+
+        let q: SegQueue<i64> = SegQueue::new();
+        let qr = &q;
+        scope(|scope| {
+            for i in 0..3 {
+                scope.spawn(move || recv(i, qr));
+            }
+
+            scope.spawn(|| {
+                for i in 0..CONC_COUNT {
+                    q.push(i);
+                }
+            })
+        });
+    }
+
+    #[test]
+    fn push_pop_many_mpmc() {
+        enum LR { Left(i64), Right(i64) }
+
+        let q: SegQueue<LR> = SegQueue::new();
+
+        scope(|scope| {
+            for _t in 0..2 {
+                scope.spawn(|| {
+                    for i in CONC_COUNT-1..CONC_COUNT {
+                        q.push(LR::Left(i))
+                    }
+                });
+                scope.spawn(|| {
+                    for i in CONC_COUNT-1..CONC_COUNT {
+                        q.push(LR::Right(i))
+                    }
+                });
+                scope.spawn(|| {
+                    let mut vl = vec![];
+                    let mut vr = vec![];
+                    for _i in 0..CONC_COUNT {
+                        match q.try_pop() {
+                            Some(LR::Left(x)) => vl.push(x),
+                            Some(LR::Right(x)) => vr.push(x),
+                            _ => {}
+                        }
+                    }
+
+                    let mut vl2 = vl.clone();
+                    let mut vr2 = vr.clone();
+                    vl2.sort();
+                    vr2.sort();
+
+                    assert_eq!(vl, vl2);
+                    assert_eq!(vr, vr2);
+                });
+            }
+        });
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/crossbeam/src/sync/treiber_stack.rs
@@ -0,0 +1,98 @@
+use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
+use std::ptr;
+
+use mem::epoch::{self, Atomic, Owned};
+
+/// Treiber's lock-free stack.
+///
+/// Usable with any number of producers and consumers.
+#[derive(Debug)]
+pub struct TreiberStack<T> {
+    head: Atomic<Node<T>>,
+}
+
+#[derive(Debug)]
+struct Node<T> {
+    data: T,
+    next: Atomic<Node<T>>,
+}
+
+impl<T> TreiberStack<T> {
+    /// Create a new, empty stack.
+    pub fn new() -> TreiberStack<T> {
+        TreiberStack { head: Atomic::null() }
+    }
+
+    /// Push `t` on top of the stack.
+    pub fn push(&self, t: T) {
+        let mut n = Owned::new(Node {
+            data: t,
+            next: Atomic::null(),
+        });
+        let guard = epoch::pin();
+        loop {
+            let head = self.head.load(Relaxed, &guard);
+            n.next.store_shared(head, Relaxed);
+            match self.head.cas_and_ref(head, n, Release, &guard) {
+                Ok(_) => break,
+                Err(owned) => n = owned,
+            }
+        }
+    }
+
+    /// Attempt to pop the top element of the stack.
+    /// **Deprecated method**, use try_pop
+    ///
+    /// Returns `None` if the stack is observed to be empty.
+    #[cfg_attr(any(feature="beta", feature="nightly"), deprecated(note="The pop method has been renamed to try_pop for consistency with other collections."))]
+    pub fn pop(&self) -> Option<T> {
+        self.try_pop()
+    }
+
+    /// Attempt to pop the top element of the stack.
+    ///
+    /// Returns `None` if the stack is observed to be empty.
+    pub fn try_pop(&self) -> Option<T> {
+        let guard = epoch::pin();
+        loop {
+            match self.head.load(Acquire, &guard) {
+                Some(head) => {
+                    let next = head.next.load(Relaxed, &guard);
+                    if self.head.cas_shared(Some(head), next, Release) {
+                        unsafe {
+                            guard.unlinked(head);
+                            return Some(ptr::read(&(*head).data));
+                        }
+                    }
+                }
+                None => return None,
+            }
+        }
+    }
+
+    /// Check if this queue is empty.
+    pub fn is_empty(&self) -> bool {
+        let guard = epoch::pin();
+        self.head.load(Acquire, &guard).is_none()
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn is_empty() {
+        let q: TreiberStack<i64> = TreiberStack::new();
+        assert!(q.is_empty());
+        q.push(20);
+        q.push(20);
+        assert!(!q.is_empty());
+        assert!(!q.is_empty());
+        assert!(q.try_pop().is_some());
+        assert!(q.try_pop().is_some());
+        assert!(q.is_empty());
+        q.push(25);
+        assert!(!q.is_empty());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/dbghelp-sys/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"1f8c2a0d9c67203873c258054f7e3f52d18771e538abf3c183920a8a74b126e5","README.md":"add8bbc7d13eccbb5930f36c8daa8137dfb24cac790eddc0e73385aef6daca0e","build.rs":"c5cc71a0c004d0f0fb7d004d5db0767d72d0b4ecbdc1c9a741a4194c38900668","i686/libdbghelp.a":"fefcc21fbaecbaaae846d5480b72c484cc676509cf5a7d6a5dd08ed8973ffe3c","src/lib.rs":"b039dbc1447e3c68f76f7755d90be97715b433b4eda26e24b035436b823326ac","x86_64/libdbghelp.a":"6805c38acd6f47a7707290bb0838d3722d93d0da0763436647056e125bcbb089"},"package":"97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/dbghelp-sys/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "dbghelp-sys"
+version = "0.2.0"
+authors = ["Peter Atashian <retep998@gmail.com>"]
+description = "Contains function definitions for the Windows API library dbghelp. See winapi for types and constants."
+documentation = "https://retep998.github.io/doc/dbghelp/"
+repository = "https://github.com/retep998/winapi-rs"
+readme = "README.md"
+keywords = ["windows", "ffi", "win32"]
+license = "MIT"
+build = "build.rs"
+links = "dbghelp"
+[lib]
+name = "dbghelp"
+[dependencies]
+winapi = { version = "0.2.4", path = "../.." }
+[build-dependencies]
+winapi-build = { version = "0.1.1", path = "../../build" }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/dbghelp-sys/README.md
@@ -0,0 +1,13 @@
+# dbghelp #
+Contains function definitions for the Windows API library dbghelp. See winapi for types and constants.
+
+```toml
+[dependencies]
+dbghelp-sys = "0.1.0"
+```
+
+```rust
+extern crate dbghelp;
+```
+
+[Documentation](https://retep998.github.io/doc/dbghelp/)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/dbghelp-sys/build.rs
@@ -0,0 +1,6 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+extern crate build;
+fn main() {
+    build::link("dbghelp", true)
+}
new file mode 100644
index 0000000000000000000000000000000000000000..2e2212f7e98d0b92bccb20abf93fe29950c21b20
GIT binary patch
literal 156688
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
new file mode 100644
--- /dev/null
+++ b/third_party/rust/dbghelp-sys/src/lib.rs
@@ -0,0 +1,316 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+//! FFI bindings to dbghelp.
+#![cfg(windows)]
+extern crate winapi;
+use winapi::*;
+extern "system" {
+    // pub fn DbgHelpCreateUserDump();
+    // pub fn DbgHelpCreateUserDumpW();
+    pub fn EnumDirTree(
+        hProcess: HANDLE, RootPath: PCSTR, InputPathName: PCSTR, OutputPathBuffer: PSTR,
+        cb: PENUMDIRTREE_CALLBACK, data: PVOID,
+    ) -> BOOL;
+    pub fn EnumDirTreeW(
+        hProcess: HANDLE, RootPath: PCWSTR, InputPathName: PCWSTR, OutputPathBuffer: PWSTR,
+        cb: PENUMDIRTREE_CALLBACKW, data: PVOID,
+    ) -> BOOL;
+    // pub fn EnumerateLoadedModules();
+    // pub fn EnumerateLoadedModules64();
+    // pub fn EnumerateLoadedModulesEx();
+    // pub fn EnumerateLoadedModulesExW();
+    // pub fn EnumerateLoadedModulesW64();
+    // pub fn ExtensionApiVersion();
+    pub fn FindDebugInfoFile(FileName: PCSTR, SymbolPath: PCSTR, DebugFilePath: PSTR) -> HANDLE;
+    pub fn FindDebugInfoFileEx(
+        FileName: PCSTR, SymbolPath: PCSTR, DebugFilePath: PSTR,
+        Callback: PFIND_DEBUG_FILE_CALLBACK, CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn FindDebugInfoFileExW(
+        FileName: PCWSTR, SymbolPath: PCWSTR, DebugFilePath: PWSTR,
+        Callback: PFIND_DEBUG_FILE_CALLBACKW, CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn FindExecutableImage(FileName: PCSTR, SymbolPath: PCSTR, ImageFilePath: PSTR) -> HANDLE;
+    pub fn FindExecutableImageEx(
+        FileName: PCSTR, SymbolPath: PCSTR, ImageFilePath: PSTR, Callback: PFIND_EXE_FILE_CALLBACK,
+        CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn FindExecutableImageExW(
+        FileName: PCWSTR, SymbolPath: PCWSTR, ImageFilePath: PWSTR,
+        Callback: PFIND_EXE_FILE_CALLBACKW, CallerData: PVOID,
+    ) -> HANDLE;
+    // pub fn FindFileInPath();
+    // pub fn FindFileInSearchPath();
+    // pub fn GetSymLoadError();
+    pub fn GetTimestampForLoadedLibrary(Module: HMODULE) -> DWORD;
+    pub fn ImageDirectoryEntryToData(
+        Base: PVOID, MappedAsImage: BOOLEAN, DirectoryEntry: USHORT, Size: PULONG,
+    ) -> PVOID;
+    pub fn ImageDirectoryEntryToDataEx(
+        Base: PVOID, MappedAsImage: BOOLEAN, DirectoryEntry: USHORT, Size: PULONG,
+        FoundHeader: *mut PIMAGE_SECTION_HEADER,
+    ) -> PVOID;
+    pub fn ImageNtHeader(Base: PVOID) -> PIMAGE_NT_HEADERS;
+    // pub fn ImageRvaToSection();
+    // pub fn ImageRvaToVa();
+    pub fn ImagehlpApiVersion() -> LPAPI_VERSION;
+    pub fn ImagehlpApiVersionEx(AppVersion: LPAPI_VERSION) -> LPAPI_VERSION;
+    pub fn MakeSureDirectoryPathExists(DirPath: PCSTR) -> BOOL;
+    #[cfg(any(target_arch = "x86", target_arch = "arm"))]
+    pub fn MapDebugInformation(
+        FileHandle: HANDLE, FileName: PCSTR, SymbolPath: PCSTR, ImageBase: ULONG,
+    ) -> PIMAGE_DEBUG_INFORMATION;
+    // pub fn MiniDumpReadDumpStream();
+    // pub fn MiniDumpWriteDump();
+    // pub fn RangeMapAddPeImageSections();
+    // pub fn RangeMapCreate();
+    // pub fn RangeMapFree();
+    // pub fn RangeMapRead();
+    // pub fn RangeMapRemove();
+    // pub fn RangeMapWrite();
+    // pub fn RemoveInvalidModuleList();
+    // pub fn ReportSymbolLoadSummary();
+    pub fn SearchTreeForFile(
+        RootPath: PCSTR, InputPathName: PCSTR, OutputPathBuffer: PSTR,
+    ) -> BOOL;
+    pub fn SearchTreeForFileW(
+        RootPath: PCWSTR, InputPathName: PCWSTR, OutputPathBuffer: PWSTR,
+    ) -> BOOL;
+    // pub fn SetCheckUserInterruptShared();
+    // pub fn SetSymLoadError();
+    pub fn StackWalk(
+        MachineType: DWORD, hProcess: HANDLE, hThread: HANDLE, StackFrame: LPSTACKFRAME,
+        ContextRecord: PVOID, ReadMemoryRoutine: PREAD_PROCESS_MEMORY_ROUTINE,
+        FunctionTableAccessRoutine: PFUNCTION_TABLE_ACCESS_ROUTINE,
+        GetModuleBaseRoutine: PGET_MODULE_BASE_ROUTINE,
+        TranslateAddress: PTRANSLATE_ADDRESS_ROUTINE,
+    ) -> BOOL;
+    pub fn StackWalk64(
+        MachineType: DWORD, hProcess: HANDLE, hThread: HANDLE, StackFrame: LPSTACKFRAME64,
+        ContextRecord: PVOID, ReadMemoryRoutine: PREAD_PROCESS_MEMORY_ROUTINE64,
+        FunctionTableAccessRoutine: PFUNCTION_TABLE_ACCESS_ROUTINE64,
+        GetModuleBaseRoutine: PGET_MODULE_BASE_ROUTINE64,
+        TranslateAddress: PTRANSLATE_ADDRESS_ROUTINE64,
+    ) -> BOOL;
+    pub fn StackWalkEx(
+        MachineType: DWORD, hProcess: HANDLE, hThread: HANDLE, StackFrame: LPSTACKFRAME64,
+        ContextRecord: PVOID, ReadMemoryRoutine: PREAD_PROCESS_MEMORY_ROUTINE64,
+        FunctionTableAccessRoutine: PFUNCTION_TABLE_ACCESS_ROUTINE64,
+        GetModuleBaseRoutine: PGET_MODULE_BASE_ROUTINE64,
+        TranslateAddress: PTRANSLATE_ADDRESS_ROUTINE64, Flags: DWORD,
+    ) -> BOOL;
+    // pub fn SymAddSourceStream();
+    // pub fn SymAddSourceStreamA();
+    // pub fn SymAddSourceStreamW();
+    // pub fn SymAddSymbol();
+    // pub fn SymAddSymbolW();
+    // pub fn SymAddrIncludeInlineTrace();
+    pub fn SymCleanup(hProcess: HANDLE) -> BOOL;
+    // pub fn SymCompareInlineTrace();
+    // pub fn SymDeleteSymbol();
+    // pub fn SymDeleteSymbolW();
+    // pub fn SymEnumLines();
+    // pub fn SymEnumLinesW();
+    // pub fn SymEnumProcesses();
+    // pub fn SymEnumSourceFileTokens();
+    // pub fn SymEnumSourceFiles();
+    // pub fn SymEnumSourceFilesW();
+    // pub fn SymEnumSourceLines();
+    // pub fn SymEnumSourceLinesW();
+    // pub fn SymEnumSym();
+    // pub fn SymEnumSymbols();
+    // pub fn SymEnumSymbolsEx();
+    // pub fn SymEnumSymbolsExW();
+    // pub fn SymEnumSymbolsForAddr();
+    // pub fn SymEnumSymbolsForAddrW();
+    // pub fn SymEnumSymbolsW();
+    // pub fn SymEnumTypes();
+    // pub fn SymEnumTypesByName();
+    // pub fn SymEnumTypesByNameW();
+    // pub fn SymEnumTypesW();
+    // pub fn SymEnumerateModules();
+    // pub fn SymEnumerateModules64();
+    // pub fn SymEnumerateModulesW64();
+    // pub fn SymEnumerateSymbols();
+    // pub fn SymEnumerateSymbols64();
+    // pub fn SymEnumerateSymbolsW();
+    // pub fn SymEnumerateSymbolsW64();
+    pub fn SymFindDebugInfoFile(
+        hProcess: HANDLE, FileName: PCSTR, DebugFilePath: PSTR,
+        Callback: PFIND_DEBUG_FILE_CALLBACK, CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn SymFindDebugInfoFileW(
+        hProcess: HANDLE, FileName: PCWSTR, DebugFilePath: PWSTR,
+        Callback: PFIND_DEBUG_FILE_CALLBACKW, CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn SymFindExecutableImage(
+        hProcess: HANDLE, FileName: PCSTR, ImageFilePath: PSTR, Callback: PFIND_EXE_FILE_CALLBACK,
+        CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn SymFindExecutableImageW(
+        hProcess: HANDLE, FileName: PCWSTR, ImageFilePath: PWSTR,
+        Callback: PFIND_EXE_FILE_CALLBACKW, CallerData: PVOID,
+    ) -> HANDLE;
+    pub fn SymFindFileInPath(
+        hprocess: HANDLE, SearchPath: PCSTR, FileName: PCSTR, id: PVOID, two: DWORD, three: DWORD,
+        flags: DWORD, FoundFile: PSTR, callback: PFINDFILEINPATHCALLBACK, context: PVOID,
+    ) -> BOOL;
+    pub fn SymFindFileInPathW(
+        hprocess: HANDLE, SearchPath: PCWSTR, FileName: PCWSTR, id: PVOID, two: DWORD,
+        three: DWORD, flags: DWORD, FoundFile: PWSTR, callback: PFINDFILEINPATHCALLBACKW,
+        context: PVOID,
+    ) -> BOOL;
+    // pub fn SymFromAddr();
+    pub fn SymFromAddrW(
+        hProcess: HANDLE, Address: DWORD64, Displacement: PDWORD64, Symbol: PSYMBOL_INFOW,
+    ) -> BOOL;
+    // pub fn SymFromIndex();
+    // pub fn SymFromIndexW();
+    // pub fn SymFromInlineContext();
+    // pub fn SymFromInlineContextW();
+    // pub fn SymFromName();
+    // pub fn SymFromNameW();
+    // pub fn SymFromToken();
+    // pub fn SymFromTokenW();
+    // pub fn SymFunctionTableAccess();
+    pub fn SymFunctionTableAccess64(hProcess: HANDLE, AddrBase: DWORD64) -> PVOID;
+    // pub fn SymFunctionTableAccess64AccessRoutines();
+    // pub fn SymGetFileLineOffsets64();
+    // pub fn SymGetHomeDirectory();
+    // pub fn SymGetHomeDirectoryW();
+    // pub fn SymGetLineFromAddr();
+    // pub fn SymGetLineFromAddr64();
+    pub fn SymGetLineFromAddrW64(
+        hProcess: HANDLE, dwAddr: DWORD64, pdwDisplacement: PDWORD, Line: PIMAGEHLP_LINEW64,
+    ) -> BOOL;
+    // pub fn SymGetLineFromInlineContext();
+    // pub fn SymGetLineFromInlineContextW();
+    // pub fn SymGetLineFromName();
+    // pub fn SymGetLineFromName64();
+    // pub fn SymGetLineFromNameW64();
+    // pub fn SymGetLineNext();
+    // pub fn SymGetLineNext64();
+    // pub fn SymGetLineNextW64();
+    // pub fn SymGetLinePrev();
+    // pub fn SymGetLinePrev64();
+    // pub fn SymGetLinePrevW64();
+    // pub fn SymGetModuleBase();
+    pub fn SymGetModuleBase64(hProcess: HANDLE, AddrBase: DWORD64) -> DWORD64;
+    // pub fn SymGetModuleInfo();
+    // pub fn SymGetModuleInfo64();
+    // pub fn SymGetModuleInfoW();
+    // pub fn SymGetModuleInfoW64();
+    // pub fn SymGetOmaps();
+    // pub fn SymGetOptions();
+    // pub fn SymGetScope();
+    // pub fn SymGetScopeW();
+    // pub fn SymGetSearchPath();
+    // pub fn SymGetSearchPathW();
+    // pub fn SymGetSourceFile();
+    // pub fn SymGetSourceFileFromToken();
+    // pub fn SymGetSourceFileFromTokenW();
+    // pub fn SymGetSourceFileToken();
+    // pub fn SymGetSourceFileTokenW();
+    // pub fn SymGetSourceFileW();
+    // pub fn SymGetSourceVarFromToken();
+    // pub fn SymGetSourceVarFromTokenW();
+    // pub fn SymGetSymFromAddr();
+    pub fn SymGetSymFromAddr64(
+        hProcess: HANDLE, Address: DWORD64, Displacement: PDWORD64, Symbol: PIMAGEHLP_SYMBOL64,
+    ) -> BOOL;
+    // pub fn SymGetSymFromName();
+    // pub fn SymGetSymFromName64();
+    // pub fn SymGetSymNext();
+    // pub fn SymGetSymNext64();
+    // pub fn SymGetSymPrev();
+    // pub fn SymGetSymPrev64();
+    // pub fn SymGetSymbolFile();
+    // pub fn SymGetSymbolFileW();
+    // pub fn SymGetTypeFromName();
+    // pub fn SymGetTypeFromNameW();
+    // pub fn SymGetTypeInfo();
+    // pub fn SymGetTypeInfoEx();
+    // pub fn SymGetUnwindInfo();
+    // pub fn SymInitialize();
+    pub fn SymInitializeW(hProcess: HANDLE, UserSearchPath: PCWSTR, fInvadeProcess: BOOL) -> BOOL;
+    // pub fn SymLoadModule();
+    // pub fn SymLoadModule64();
+    // pub fn SymLoadModuleEx();
+    // pub fn SymLoadModuleExW();
+    // pub fn SymMatchFileName();
+    // pub fn SymMatchFileNameW();
+    // pub fn SymMatchString();
+    // pub fn SymMatchStringA();
+    // pub fn SymMatchStringW();
+    // pub fn SymNext();
+    // pub fn SymNextW();
+    // pub fn SymPrev();
+    // pub fn SymPrevW();
+    // pub fn SymQueryInlineTrace();
+    // pub fn SymRefreshModuleList();
+    // pub fn SymRegisterCallback();
+    // pub fn SymRegisterCallback64();
+    // pub fn SymRegisterCallbackW64();
+    // pub fn SymRegisterFunctionEntryCallback();
+    // pub fn SymRegisterFunctionEntryCallback64();
+    // pub fn SymSearch();
+    // pub fn SymSearchW();
+    // pub fn SymSetContext();
+    // pub fn SymSetHomeDirectory();
+    // pub fn SymSetHomeDirectoryW();
+    // pub fn SymSetOptions();
+    // pub fn SymSetParentWindow();
+    // pub fn SymSetScopeFromAddr();
+    // pub fn SymSetScopeFromIndex();
+    // pub fn SymSetScopeFromInlineContext();
+    // pub fn SymSetSearchPath();
+    // pub fn SymSetSearchPathW();
+    // pub fn SymSrvDeltaName();
+    // pub fn SymSrvDeltaNameW();
+    // pub fn SymSrvGetFileIndexInfo();
+    // pub fn SymSrvGetFileIndexInfoW();
+    // pub fn SymSrvGetFileIndexString();
+    // pub fn SymSrvGetFileIndexStringW();
+    // pub fn SymSrvGetFileIndexes();
+    // pub fn SymSrvGetFileIndexesW();
+    // pub fn SymSrvGetSupplement();
+    // pub fn SymSrvGetSupplementW();
+    // pub fn SymSrvIsStore();
+    // pub fn SymSrvIsStoreW();
+    // pub fn SymSrvStoreFile();
+    // pub fn SymSrvStoreFileW();
+    // pub fn SymSrvStoreSupplement();
+    // pub fn SymSrvStoreSupplementW();
+    // pub fn SymUnDName();
+    // pub fn SymUnDName64();
+    // pub fn SymUnloadModule();
+    // pub fn SymUnloadModule64();
+    pub fn UnDecorateSymbolName(
+        name: PCSTR, outputString: PSTR, maxStringLength: DWORD, flags: DWORD,
+    ) -> DWORD;
+    pub fn UnDecorateSymbolNameW(
+        name: PCWSTR, outputString: PWSTR, maxStringLength: DWORD, flags: DWORD,
+    ) -> DWORD;
+    #[cfg(any(target_arch = "x86", target_arch = "arm"))]
+    pub fn UnmapDebugInformation(DebugInfo: PIMAGE_DEBUG_INFORMATION) -> BOOL;
+    // pub fn WinDbgExtensionDllInit();
+    // pub fn block();
+    // pub fn chksym();
+    // pub fn dbghelp();
+    // pub fn dh();
+    // pub fn fptr();
+    // pub fn homedir();
+    // pub fn inlinedbg();
+    // pub fn itoldyouso();
+    // pub fn lmi();
+    // pub fn lminfo();
+    // pub fn omap();
+    // pub fn optdbgdump();
+    // pub fn optdbgdumpaddr();
+    // pub fn srcfiles();
+    // pub fn stack_force_ebp();
+    // pub fn stackdbg();
+    // pub fn sym();
+    // pub fn symsrv();
+    // pub fn vc7fpo();
+}
new file mode 100644
index 0000000000000000000000000000000000000000..7d9c1beccdc0a27b6ef7d03ea35b77cca89b91e2
GIT binary patch
literal 153564
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
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"e33073c310c4bc45c4017b793e710c689fbf4fcbd618b3dee92a6343364ece0f","Cargo.toml":"7cccd970edc30578b4fa9fb27762ec77fbd31df0281d0c1d0a69ea16896216eb","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"b875d1d0ca491813f3a2469ea69d37dd667ad0c70f895e6bbda540c99e291154","appveyor.yml":"a39fd7664bf538147bfb494b9f9c96d6f898d9896a5d5e1806019f399cc44bff","src/bufreader.rs":"0a1213858056c8154066f45df7b261c052c6a2c55ec88bc21f56ad3f2748d8c4","src/crc.rs":"869b4cc79a61b6dda02253430c4ca09fd1efee51509a7552bdc0c8dc5bd2b6bb","src/deflate.rs":"4783d36a1a323c0004f2ebd3af7f6ac9c949cd1e7dc5fc54eacdc5d944098271","src/ffi.rs":"7bd962e85dc05b18c878dc3d5abb054f2c41f7b20a793d2ddbba755b7661fcfa","src/gz.rs":"d4fae4fbcf17b7ad7b233eee2027cfbeb7ed138b1efdf64068fdbcc7e1ade26e","src/lib.rs":"572a609457d29bc93340d65f561454c07d3638b4fb741906d1949232d410dc73","src/mem.rs":"51fa61421f1b235ace54596b3a0e4dcd2a67324dcd16d6552d7d6a7368935e50","src/zio.rs":"1d1fc161e40939b1f84da98a433d3b0adbf9e29baee578042c2919b123d0b66d","src/zlib.rs":"ecc52ab6b8034f0fdb89d3a01b75cc181160e44225160800448d183fed4ef2ee","tests/corrupt-file.gz":"083dd284aa1621916a2d0f66ea048c8d3ba7a722b22d0d618722633f51e7d39c","tests/good-file.gz":"87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6","tests/good-file.txt":"bc4e03658a441fe2ad2df7cd2197144b87e41696f01e327b380e869cd9b485a0","tests/gunzip.rs":"3d2e0a80756474dc2b08f20071685117083765c4f1763456c676f1feeaff35e9","tests/multi.gz":"efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6","tests/multi.txt":"dbea9325179efe46ea2add94f7b6b745ca983fabb208dc6d34aa064623d7ee23","tests/tokio.rs":"d19defd6c369877f406ed8bd74683a257fde7de51f4161004cea4260faf4464d"},"package":"36df0166e856739905cd3d7e0b210fe818592211a008862599845e012d8d304c"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/.travis.yml
@@ -0,0 +1,32 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+before_script:
+  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
+script:
+  - export CARGO_TARGET_DIR=`pwd`/target
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo test --verbose --features zlib
+  - cargo test --verbose --features tokio
+  - cargo test --verbose --features 'tokio zlib'
+  - cargo test --verbose --features zlib --no-default-features
+  - cargo clean && cargo build
+  - rustdoc --test README.md -L target/debug -L target/debug/deps
+  - cargo doc --no-deps
+  - cargo doc --no-deps --manifest-path=miniz-sys/Cargo.toml
+after_success:
+  - travis-cargo --only nightly doc-upload
+env:
+  global:
+    secure: "PHVT7IaeP5nQQVwGHKwqCYBDp0QyetSlER7se2j2Xgfx+lw3Bu6VWH6VF04B636Gb0tHPN/sUCXSgGRcvDuy6XFOev4LfynoYxNKgHJYg2E34EP2QLwsFfnvE4iujaG3GJk3o935Y7OYGv2OP1HeG4Mv6JhQK0GLnNDBZQ65kWI="
+
+notifications:
+  email:
+    on_success: never
+os:
+  - linux
+  - osx
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+
+name = "flate2"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+version = "0.2.19"
+license = "MIT/Apache-2.0"
+readme = "README.md"
+keywords = ["gzip", "flate", "zlib", "encoding"]
+categories = ["compression", "api-bindings"]
+repository = "https://github.com/alexcrichton/flate2-rs"
+homepage = "https://github.com/alexcrichton/flate2-rs"
+documentation = "https://docs.rs/flate2"
+description = """
+Bindings to miniz.c for DEFLATE compression and decompression exposed as
+Reader/Writer streams. Contains bindings for zlib, deflate, and gzip-based
+streams.
+"""
+
+[workspace]
+
+[dependencies]
+libc = "0.2"
+miniz-sys = { path = "miniz-sys", version = "0.1.7", optional = true }
+libz-sys = { version = "1.0", optional = true }
+tokio-io = { version = "0.1", optional = true }
+futures = { version = "0.1", optional = true }
+
+[dev-dependencies]
+rand = "0.3"
+quickcheck = { version = "0.4", default-features = false }
+tokio-core = "0.1"
+
+[features]
+default = ["miniz-sys"]
+zlib = ["libz-sys"]
+tokio = ["tokio-io", "futures"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/README.md
@@ -0,0 +1,70 @@
+# flate2
+
+[![Build Status](https://travis-ci.org/alexcrichton/flate2-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/flate2-rs)
+[![Build status](https://ci.appveyor.com/api/projects/status/9tatexq47i3ee13k?svg=true)](https://ci.appveyor.com/project/alexcrichton/flate2-rs)
+
+[Documentation](https://docs.rs/flate2)
+
+A streaming compression/decompression library for Rust. The underlying
+implementation by default uses [`miniz`](https://code.google.com/p/miniz/) but
+can optionally be configured to use the system zlib, if available.
+
+Supported formats:
+
+* deflate
+* zlib
+* gzip
+
+```toml
+# Cargo.toml
+[dependencies]
+flate2 = "0.2"
+```
+
+Using zlib instead of miniz:
+
+```toml
+[dependencies]
+flate2 = { version = "0.2", features = ["zlib"], default-features = false }
+```
+
+## Compression
+
+```rust
+extern crate flate2;
+
+use std::io::prelude::*;
+use flate2::Compression;
+use flate2::write::ZlibEncoder;
+
+fn main() {
+    let mut e = ZlibEncoder::new(Vec::new(), Compression::Default);
+    e.write(b"foo");
+    e.write(b"bar");
+    let compressed_bytes = e.finish();
+}
+```
+
+## Decompression
+
+```rust,no_run
+extern crate flate2;
+
+use std::io::prelude::*;
+use flate2::read::GzDecoder;
+
+fn main() {
+    let mut d = GzDecoder::new("...".as_bytes()).unwrap();
+    let mut s = String::new();
+    d.read_to_string(&mut s).unwrap();
+    println!("{}", s);
+}
+```
+
+# License
+
+`flate2-rs` is primarily distributed under the terms of both the MIT license and
+the Apache License (Version 2.0), with portions covered by various BSD-like
+licenses.
+
+See LICENSE-APACHE, and LICENSE-MIT for details.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/appveyor.yml
@@ -0,0 +1,18 @@
+environment:
+  matrix:
+  - TARGET: x86_64-pc-windows-msvc
+  - TARGET: i686-pc-windows-msvc
+  - TARGET: i686-pc-windows-gnu
+install:
+  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
+  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
+  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
+  - SET PATH=%PATH%;C:\MinGW\bin
+  - rustc -V
+  - cargo -V
+
+build: false
+
+test_script:
+  - cargo test --verbose --target %TARGET%
+  - cargo test --verbose --target %TARGET% --features tokio
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/bufreader.rs
@@ -0,0 +1,87 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::cmp;
+use std::io;
+use std::io::prelude::*;
+use std::mem;
+
+pub struct BufReader<R> {
+    inner: R,
+    buf: Box<[u8]>,
+    pos: usize,
+    cap: usize,
+}
+
+impl<R: Read> BufReader<R> {
+    pub fn new(inner: R) -> BufReader<R> {
+        BufReader::with_buf(vec![0; 32 * 1024], inner)
+    }
+
+    pub fn with_buf(buf: Vec<u8>, inner: R) -> BufReader<R> {
+        BufReader {
+            inner: inner,
+            buf: buf.into_boxed_slice(),
+            pos: 0,
+            cap: 0,
+        }
+    }
+
+    pub fn get_ref(&self) -> &R {
+        &self.inner
+    }
+
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.inner
+    }
+
+    pub fn into_inner(self) -> R {
+        self.inner
+    }
+
+    pub fn reset(&mut self, inner: R) -> R {
+        self.pos = 0;
+        self.cap = 0;
+        mem::replace(&mut self.inner, inner)
+    }
+}
+
+impl<R: Read> Read for BufReader<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        // If we don't have any buffered data and we're doing a massive read
+        // (larger than our internal buffer), bypass our internal buffer
+        // entirely.
+        if self.pos == self.cap && buf.len() >= self.buf.len() {
+            return self.inner.read(buf);
+        }
+        let nread = {
+            let mut rem = try!(self.fill_buf());
+            try!(rem.read(buf))
+        };
+        self.consume(nread);
+        Ok(nread)
+    }
+}
+
+impl<R: Read> BufRead for BufReader<R> {
+    fn fill_buf(&mut self) -> io::Result<&[u8]> {
+        // If we've reached the end of our internal buffer then we need to fetch
+        // some more data from the underlying reader.
+        if self.pos == self.cap {
+            self.cap = try!(self.inner.read(&mut self.buf));
+            self.pos = 0;
+        }
+        Ok(&self.buf[self.pos..self.cap])
+    }
+
+    fn consume(&mut self, amt: usize) {
+        self.pos = cmp::min(self.pos + amt, self.cap);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/crc.rs
@@ -0,0 +1,116 @@
+//! Simple CRC bindings backed by miniz.c
+
+use std::io::prelude::*;
+use std::io;
+use libc;
+
+use ffi;
+
+/// The CRC calculated by a CrcReader.
+pub struct Crc {
+    crc: libc::c_ulong,
+    amt: u32,
+}
+
+/// A wrapper around a `std::io::Read` that calculates the CRC.
+pub struct CrcReader<R> {
+    inner: R,
+    crc: Crc,
+}
+
+impl Crc {
+    /// Create a new CRC.
+    pub fn new() -> Crc {
+        Crc { crc: 0, amt: 0 }
+    }
+
+    /// bla
+    pub fn sum(&self) -> u32 {
+        self.crc as u32
+    }
+
+    /// The number of bytes that have been used to calculate the CRC.
+    /// This value is only accurate if the amount is lower than 2^32.
+    pub fn amount(&self) -> u32 {
+        self.amt
+    }
+
+    /// Update the CRC with the bytes in `data`.
+    pub fn update(&mut self, data: &[u8]) {
+        self.amt = self.amt.wrapping_add(data.len() as u32);
+        self.crc = unsafe {
+            ffi::mz_crc32(self.crc, data.as_ptr(), data.len() as libc::size_t)
+        };
+    }
+
+    /// Reset the CRC.
+    pub fn reset(&mut self) {
+        self.crc = 0;
+        self.amt = 0;
+    }
+
+    /// Combine the CRC with the CRC for the subsequent block of bytes.
+    pub fn combine(&mut self, additional_crc: &Crc) {
+        self.crc = unsafe {
+            ffi::mz_crc32_combine(self.crc as ::libc::c_ulong,
+                                  additional_crc.crc as ::libc::c_ulong,
+                                  additional_crc.amt as ::libc::off_t)
+        };
+        self.amt += additional_crc.amt;
+    }
+}
+
+impl<R: Read> CrcReader<R> {
+    /// Create a new CrcReader.
+    pub fn new(r: R) -> CrcReader<R> {
+        CrcReader {
+            inner: r,
+            crc: Crc::new(),
+        }
+    }
+
+    /// Get the Crc for this CrcReader.
+    pub fn crc(&self) -> &Crc {
+        &self.crc
+    }
+
+    /// Get the reader that is wrapped by this CrcReader.
+    pub fn into_inner(self) -> R {
+        self.inner
+    }
+
+    /// Get the reader that is wrapped by this CrcReader by reference.
+    pub fn get_ref(&self) -> &R {
+        &self.inner
+    }
+
+    /// Get a mutable reference to the reader that is wrapped by this CrcReader.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.inner
+    }
+
+    /// Reset the Crc in this CrcReader.
+    pub fn reset(&mut self) {
+        self.crc.reset();
+    }
+}
+
+impl<R: Read> Read for CrcReader<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        let amt = try!(self.inner.read(into));
+        self.crc.update(&into[..amt]);
+        Ok(amt)
+    }
+}
+
+impl<R: BufRead> BufRead for CrcReader<R> {
+    fn fill_buf(&mut self) -> io::Result<&[u8]> {
+        self.inner.fill_buf()
+    }
+    fn consume(&mut self, amt: usize) {
+        if let Ok(data) = self.inner.fill_buf() {
+            self.crc.update(&data[..amt]);
+        }
+        self.inner.consume(amt);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/deflate.rs
@@ -0,0 +1,857 @@
+//! DEFLATE compression and decompression of streams
+
+use std::io::prelude::*;
+use std::io;
+use std::mem;
+
+#[cfg(feature = "tokio")]
+use futures::Poll;
+#[cfg(feature = "tokio")]
+use tokio_io::{AsyncRead, AsyncWrite};
+
+use bufreader::BufReader;
+use zio;
+use {Compress, Decompress};
+
+/// A DEFLATE encoder, or compressor.
+///
+/// This structure implements a `Write` interface and takes a stream of
+/// uncompressed data, writing the compressed data to the wrapped writer.
+pub struct EncoderWriter<W: Write> {
+    inner: zio::Writer<W, Compress>,
+}
+
+/// A DEFLATE encoder, or compressor.
+///
+/// This structure implements a `Read` interface and will read uncompressed
+/// data from an underlying stream and emit a stream of compressed data.
+pub struct EncoderReader<R: Read> {
+    inner: EncoderReaderBuf<BufReader<R>>,
+}
+
+/// A DEFLATE encoder, or compressor.
+///
+/// This structure implements a `BufRead` interface and will read uncompressed
+/// data from an underlying stream and emit a stream of compressed data.
+pub struct EncoderReaderBuf<R: BufRead> {
+    obj: R,
+    data: Compress,
+}
+
+/// A DEFLATE decoder, or decompressor.
+///
+/// This structure implements a `Read` interface and takes a stream of
+/// compressed data as input, providing the decompressed data when read from.
+pub struct DecoderReader<R: Read> {
+    inner: DecoderReaderBuf<BufReader<R>>,
+}
+
+/// A DEFLATE decoder, or decompressor.
+///
+/// This structure implements a `BufRead` interface and takes a stream of
+/// compressed data as input, providing the decompressed data when read from.
+pub struct DecoderReaderBuf<R: BufRead> {
+    obj: R,
+    data: Decompress,
+}
+
+/// A DEFLATE decoder, or decompressor.
+///
+/// This structure implements a `Write` and will emit a stream of decompressed
+/// data when fed a stream of compressed data.
+pub struct DecoderWriter<W: Write> {
+    inner: zio::Writer<W, Decompress>,
+}
+
+impl<W: Write> EncoderWriter<W> {
+    /// Creates a new encoder which will write compressed data to the stream
+    /// given at the given compression level.
+    ///
+    /// When this encoder is dropped or unwrapped the final pieces of data will
+    /// be flushed.
+    pub fn new(w: W, level: ::Compression) -> EncoderWriter<W> {
+        EncoderWriter {
+            inner: zio::Writer::new(w, Compress::new(level, false)),
+        }
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.inner.get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutating the output/input state of the stream may corrupt this
+    /// object, so care must be taken when using this method.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.inner.get_mut()
+    }
+
+    /// Resets the state of this encoder entirely, swapping out the output
+    /// stream for another.
+    ///
+    /// This function will finish encoding the current stream into the current
+    /// output stream before swapping out the two output streams. If the stream
+    /// cannot be finished an error is returned.
+    ///
+    /// After the current stream has been finished, this will reset the internal
+    /// state of this encoder and replace the output stream with the one
+    /// provided, returning the previous output stream. Future data written to
+    /// this encoder will be the compressed into the stream `w` provided.
+    pub fn reset(&mut self, w: W) -> io::Result<W> {
+        try!(self.inner.finish());
+        self.inner.data.reset();
+        Ok(self.inner.replace(w))
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        self.inner.finish()
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream, close off the compressed
+    /// stream and, if successful, return the contained writer.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(mut self) -> io::Result<W> {
+        try!(self.inner.finish());
+        Ok(self.inner.take_inner())
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream and then return the contained
+    /// writer if the flush succeeded.
+    /// The compressed stream will not closed but only flushed. This
+    /// means that obtained byte array can by extended by another deflated
+    /// stream. To close the stream add the two bytes 0x3 and 0x0.
+    pub fn flush_finish(mut self) -> io::Result<W> {
+        try!(self.inner.flush());
+        Ok(self.inner.take_inner())
+    }
+
+    /// Returns the number of bytes that have been written to this compresor.
+    ///
+    /// Note that not all bytes written to this object may be accounted for,
+    /// there may still be some active buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.data.total_in()
+    }
+
+    /// Returns the number of bytes that the compressor has produced.
+    ///
+    /// Note that not all bytes may have been written yet, some may still be
+    /// buffered.
+    pub fn total_out(&self) -> u64 {
+        self.inner.data.total_out()
+    }
+}
+
+impl<W: Write> Write for EncoderWriter<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.inner.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.inner.flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for EncoderWriter<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.inner.finish());
+        self.inner.get_mut().shutdown()
+    }
+}
+
+impl<W: Read + Write> Read for EncoderWriter<W> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.inner.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncRead + AsyncWrite> AsyncRead for EncoderWriter<W> {
+}
+
+impl<R: Read> EncoderReader<R> {
+    /// Creates a new encoder which will read uncompressed data from the given
+    /// stream and emit the compressed stream.
+    pub fn new(r: R, level: ::Compression) -> EncoderReader<R> {
+        EncoderReader {
+            inner: EncoderReaderBuf::new(BufReader::new(r), level),
+        }
+    }
+
+    /// Resets the state of this encoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This function will reset the internal state of this encoder and replace
+    /// the input stream with the one provided, returning the previous input
+    /// stream. Future data read from this encoder will be the compressed
+    /// version of `r`'s data.
+    ///
+    /// Note that there may be currently buffered data when this function is
+    /// called, and in that case the buffered data is discarded.
+    pub fn reset(&mut self, r: R) -> R {
+        self.inner.data.reset();
+        self.inner.obj.reset(r)
+    }
+
+    /// Acquires a reference to the underlying reader
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this encoder, returning the underlying reader.
+    ///
+    /// Note that there may be buffered bytes which are not re-acquired as part
+    /// of this transition. It's recommended to only call this function after
+    /// EOF has been reached.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    /// Returns the number of bytes that have been read into this compressor.
+    ///
+    /// Note that not all bytes read from the underlying object may be accounted
+    /// for, there may still be some active buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.data.total_in()
+    }
+
+    /// Returns the number of bytes that the compressor has produced.
+    ///
+    /// Note that not all bytes may have been read yet, some may still be
+    /// buffered.
+    pub fn total_out(&self) -> u64 {
+        self.inner.data.total_out()
+    }
+}
+
+impl<R: Read> Read for EncoderReader<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead> AsyncRead for EncoderReader<R> {
+}
+
+impl<W: Read + Write> Write for EncoderReader<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + AsyncWrite> AsyncWrite for EncoderReader<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: BufRead> EncoderReaderBuf<R> {
+    /// Creates a new encoder which will read uncompressed data from the given
+    /// stream and emit the compressed stream.
+    pub fn new(r: R, level: ::Compression) -> EncoderReaderBuf<R> {
+        EncoderReaderBuf {
+            obj: r,
+            data: Compress::new(level, false),
+        }
+    }
+
+    /// Resets the state of this encoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This function will reset the internal state of this encoder and replace
+    /// the input stream with the one provided, returning the previous input
+    /// stream. Future data read from this encoder will be the compressed
+    /// version of `r`'s data.
+    pub fn reset(&mut self, r: R) -> R {
+        self.data.reset();
+        mem::replace(&mut self.obj, r)
+    }
+
+    /// Acquires a reference to the underlying reader
+    pub fn get_ref(&self) -> &R {
+        &self.obj
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.obj
+    }
+
+    /// Consumes this encoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.obj
+    }
+
+    /// Returns the number of bytes that have been read into this compressor.
+    ///
+    /// Note that not all bytes read from the underlying object may be accounted
+    /// for, there may still be some active buffering.
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+
+    /// Returns the number of bytes that the compressor has produced.
+    ///
+    /// Note that not all bytes may have been read yet, some may still be
+    /// buffered.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+}
+
+impl<R: BufRead> Read for EncoderReaderBuf<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        zio::read(&mut self.obj, &mut self.data, buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + BufRead> AsyncRead for EncoderReaderBuf<R> {
+}
+
+impl<W: BufRead + Write> Write for EncoderReaderBuf<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + BufRead> AsyncWrite for EncoderReaderBuf<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: Read> DecoderReader<R> {
+    /// Creates a new decoder which will decompress data read from the given
+    /// stream.
+    pub fn new(r: R) -> DecoderReader<R> {
+        DecoderReader::new_with_buf(r, vec![0; 32 * 1024])
+    }
+
+    /// Same as `new`, but the intermediate buffer for data is specified.
+    ///
+    /// Note that the capacity of the intermediate buffer is never increased,
+    /// and it is recommended for it to be large.
+    pub fn new_with_buf(r: R, buf: Vec<u8>) -> DecoderReader<R> {
+        DecoderReader {
+            inner: DecoderReaderBuf::new(BufReader::with_buf(buf, r))
+        }
+    }
+
+    /// Resets the state of this decoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This will reset the internal state of this decoder and replace the
+    /// input stream with the one provided, returning the previous input
+    /// stream. Future data read from this decoder will be the decompressed
+    /// version of `r`'s data.
+    ///
+    /// Note that there may be currently buffered data when this function is
+    /// called, and in that case the buffered data is discarded.
+    pub fn reset(&mut self, r: R) -> R {
+        self.inner.data = Decompress::new(false);
+        self.inner.obj.reset(r)
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    ///
+    /// Note that there may be buffered bytes which are not re-acquired as part
+    /// of this transition. It's recommended to only call this function after
+    /// EOF has been reached.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed.
+    ///
+    /// Note that this will likely be smaller than what the decompressor
+    /// actually read from the underlying stream due to buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has produced.
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out()
+    }
+}
+
+impl<R: Read> Read for DecoderReader<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(into)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead> AsyncRead for DecoderReader<R> {
+}
+
+impl<W: Read + Write> Write for DecoderReader<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + AsyncRead> AsyncWrite for DecoderReader<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: BufRead> DecoderReaderBuf<R> {
+    /// Creates a new decoder which will decompress data read from the given
+    /// stream.
+    pub fn new(r: R) -> DecoderReaderBuf<R> {
+        DecoderReaderBuf {
+            obj: r,
+            data: Decompress::new(false),
+        }
+    }
+
+    /// Resets the state of this decoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This will reset the internal state of this decoder and replace the
+    /// input stream with the one provided, returning the previous input
+    /// stream. Future data read from this decoder will be the decompressed
+    /// version of `r`'s data.
+    pub fn reset(&mut self, r: R) -> R {
+        self.data = Decompress::new(false);
+        mem::replace(&mut self.obj, r)
+    }
+
+    /// Resets the state of this decoder's data
+    ///
+    /// This will reset the internal state of this decoder. It will continue
+    /// reading from the same stream.
+    pub fn reset_data(&mut self) {
+        self.data = Decompress::new(false);
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        &self.obj
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.obj
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.obj
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed.
+    ///
+    /// Note that this will likely be smaller than what the decompressor
+    /// actually read from the underlying stream due to buffering.
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has produced.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+}
+
+impl<R: BufRead> Read for DecoderReaderBuf<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        zio::read(&mut self.obj, &mut self.data, into)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + BufRead> AsyncRead for DecoderReaderBuf<R> {
+}
+
+impl<W: BufRead + Write> Write for DecoderReaderBuf<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + BufRead> AsyncWrite for DecoderReaderBuf<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<W: Write> DecoderWriter<W> {
+    /// Creates a new decoder which will write uncompressed data to the stream.
+    ///
+    /// When this encoder is dropped or unwrapped the final pieces of data will
+    /// be flushed.
+    pub fn new(w: W) -> DecoderWriter<W> {
+        DecoderWriter {
+            inner: zio::Writer::new(w, Decompress::new(false)),
+        }
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.inner.get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutating the output/input state of the stream may corrupt this
+    /// object, so care must be taken when using this method.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.inner.get_mut()
+    }
+
+    /// Resets the state of this decoder entirely, swapping out the output
+    /// stream for another.
+    ///
+    /// This function will finish encoding the current stream into the current
+    /// output stream before swapping out the two output streams. If the stream
+    /// cannot be finished an error is returned.
+    ///
+    /// This will then reset the internal state of this decoder and replace the
+    /// output stream with the one provided, returning the previous output
+    /// stream. Future data written to this decoder will be decompressed into
+    /// the output stream `w`.
+    pub fn reset(&mut self, w: W) -> io::Result<W> {
+        try!(self.inner.finish());
+        self.inner.data = Decompress::new(false);
+        Ok(self.inner.replace(w))
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        self.inner.finish()
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream and then return the contained
+    /// writer if the flush succeeded.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(mut self) -> io::Result<W> {
+        try!(self.inner.finish());
+        Ok(self.inner.take_inner())
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed for
+    /// decompression.
+    ///
+    /// Note that this will likely be smaller than the number of bytes
+    /// successfully written to this stream due to internal buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.data.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has written to its
+    /// output stream.
+    pub fn total_out(&self) -> u64 {
+        self.inner.data.total_out()
+    }
+}
+
+impl<W: Write> Write for DecoderWriter<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.inner.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.inner.flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for DecoderWriter<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.inner.finish());
+        self.inner.get_mut().shutdown()
+    }
+}
+
+impl<W: Read + Write> Read for DecoderWriter<W> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.inner.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncRead + AsyncWrite> AsyncRead for DecoderWriter<W> {
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::prelude::*;
+
+    use rand::{thread_rng, Rng};
+
+    use deflate::{EncoderWriter, EncoderReader, DecoderReader, DecoderWriter};
+    use Compression::Default;
+
+    #[test]
+    fn roundtrip() {
+        let mut real = Vec::new();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        let v = thread_rng().gen_iter::<u8>().take(1024).collect::<Vec<_>>();
+        for _ in 0..200 {
+            let to_write = &v[..thread_rng().gen_range(0, v.len())];
+            real.extend(to_write.iter().map(|x| *x));
+            w.write_all(to_write).unwrap();
+        }
+        let result = w.finish().unwrap();
+        let mut r = DecoderReader::new(&result[..]);
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert!(ret == real);
+    }
+
+    #[test]
+    fn drop_writes() {
+        let mut data = Vec::new();
+        EncoderWriter::new(&mut data, Default).write_all(b"foo").unwrap();
+        let mut r = DecoderReader::new(&data[..]);
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert!(ret == b"foo");
+    }
+
+    #[test]
+    fn total_in() {
+        let mut real = Vec::new();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        let v = thread_rng().gen_iter::<u8>().take(1024).collect::<Vec<_>>();
+        for _ in 0..200 {
+            let to_write = &v[..thread_rng().gen_range(0, v.len())];
+            real.extend(to_write.iter().map(|x| *x));
+            w.write_all(to_write).unwrap();
+        }
+        let mut result = w.finish().unwrap();
+
+        let result_len = result.len();
+
+        for _ in 0..200 {
+            result.extend(v.iter().map(|x| *x));
+        }
+
+        let mut r = DecoderReader::new(&result[..]);
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert!(ret == real);
+        assert_eq!(r.total_in(), result_len as u64);
+    }
+
+    #[test]
+    fn roundtrip2() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut r = DecoderReader::new(EncoderReader::new(&v[..], Default));
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert_eq!(ret, v);
+    }
+
+    #[test]
+    fn roundtrip3() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut w = EncoderWriter::new(DecoderWriter::new(Vec::new()), Default);
+        w.write_all(&v).unwrap();
+        let w = w.finish().unwrap().finish().unwrap();
+        assert!(w == v);
+    }
+
+    #[test]
+    fn reset_writer() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        w.write_all(&v).unwrap();
+        let a = w.reset(Vec::new()).unwrap();
+        w.write_all(&v).unwrap();
+        let b = w.finish().unwrap();
+
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        w.write_all(&v).unwrap();
+        let c = w.finish().unwrap();
+        assert!(a == b && b == c);
+    }
+
+    #[test]
+    fn reset_reader() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let (mut a, mut b, mut c) = (Vec::new(), Vec::new(), Vec::new());
+        let mut r = EncoderReader::new(&v[..], Default);
+        r.read_to_end(&mut a).unwrap();
+        r.reset(&v[..]);
+        r.read_to_end(&mut b).unwrap();
+
+        let mut r = EncoderReader::new(&v[..], Default);
+        r.read_to_end(&mut c).unwrap();
+        assert!(a == b && b == c);
+    }
+
+    #[test]
+    fn reset_decoder() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        w.write_all(&v).unwrap();
+        let data = w.finish().unwrap();
+
+        {
+            let (mut a, mut b, mut c) = (Vec::new(), Vec::new(), Vec::new());
+            let mut r = DecoderReader::new(&data[..]);
+            r.read_to_end(&mut a).unwrap();
+            r.reset(&data);
+            r.read_to_end(&mut b).unwrap();
+
+            let mut r = DecoderReader::new(&data[..]);
+            r.read_to_end(&mut c).unwrap();
+            assert!(a == b && b == c && c == v);
+        }
+
+        {
+            let mut w = DecoderWriter::new(Vec::new());
+            w.write_all(&data).unwrap();
+            let a = w.reset(Vec::new()).unwrap();
+            w.write_all(&data).unwrap();
+            let b = w.finish().unwrap();
+
+            let mut w = DecoderWriter::new(Vec::new());
+            w.write_all(&data).unwrap();
+            let c = w.finish().unwrap();
+            assert!(a == b && b == c && c == v);
+        }
+    }
+
+    #[test]
+    fn zero_length_read_with_data() {
+        let m = vec![3u8; 128 * 1024 + 1];
+        let mut c = EncoderReader::new(&m[..], ::Compression::Default);
+
+        let mut result = Vec::new();
+        c.read_to_end(&mut result).unwrap();
+
+        let mut d = DecoderReader::new(&result[..]);
+        let mut data = Vec::new();
+        assert!(d.read(&mut data).unwrap() == 0);
+    }
+
+    #[test]
+    fn qc_reader() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let mut r = DecoderReader::new(EncoderReader::new(&v[..], Default));
+            let mut v2 = Vec::new();
+            r.read_to_end(&mut v2).unwrap();
+            v == v2
+        }
+    }
+
+    #[test]
+    fn qc_writer() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let mut w = EncoderWriter::new(DecoderWriter::new(Vec::new()), Default);
+            w.write_all(&v).unwrap();
+            v == w.finish().unwrap().finish().unwrap()
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/ffi.rs
@@ -0,0 +1,223 @@
+pub use self::imp::*;
+
+#[cfg(feature = "zlib")]
+#[allow(bad_style)]
+mod imp {
+    extern crate libz_sys as z;
+    use std::mem;
+    use std::ops::{Deref, DerefMut};
+    use libc::{c_int, size_t, c_ulong, c_uint, c_char};
+
+    pub use self::z::*;
+    pub use self::z::deflateEnd as mz_deflateEnd;
+    pub use self::z::inflateEnd as mz_inflateEnd;
+    pub use self::z::deflateReset as mz_deflateReset;
+    pub use self::z::deflate as mz_deflate;
+    pub use self::z::inflate as mz_inflate;
+    pub use self::z::z_stream as mz_stream;
+
+    pub use self::z::Z_BLOCK as MZ_BLOCK;
+    pub use self::z::Z_BUF_ERROR as MZ_BUF_ERROR;
+    pub use self::z::Z_DATA_ERROR as MZ_DATA_ERROR;
+    pub use self::z::Z_DEFAULT_STRATEGY as MZ_DEFAULT_STRATEGY;
+    pub use self::z::Z_DEFLATED as MZ_DEFLATED;
+    pub use self::z::Z_FINISH as MZ_FINISH;
+    pub use self::z::Z_FULL_FLUSH as MZ_FULL_FLUSH;
+    pub use self::z::Z_NO_FLUSH as MZ_NO_FLUSH;
+    pub use self::z::Z_OK as MZ_OK;
+    pub use self::z::Z_PARTIAL_FLUSH as MZ_PARTIAL_FLUSH;
+    pub use self::z::Z_STREAM_END as MZ_STREAM_END;
+    pub use self::z::Z_SYNC_FLUSH as MZ_SYNC_FLUSH;
+    pub use self::z::Z_STREAM_ERROR as MZ_STREAM_ERROR;
+
+    pub const MZ_DEFAULT_WINDOW_BITS: c_int = 15;
+
+    pub unsafe extern fn mz_crc32(crc: c_ulong,
+                                  ptr: *const u8,
+                                  len: size_t) -> c_ulong {
+        z::crc32(crc, ptr, len as c_uint)
+    }
+
+    pub unsafe extern fn mz_crc32_combine(crc1: c_ulong,
+                                          crc2: c_ulong,
+                                          len2: z_off_t) -> c_ulong {
+          z::crc32_combine(crc1, crc2, len2)
+    }
+
+    const ZLIB_VERSION: &'static str = "1.2.8\0";
+
+    pub unsafe extern fn mz_deflateInit2(stream: *mut mz_stream,
+                                         level: c_int,
+                                         method: c_int,
+                                         window_bits: c_int,
+                                         mem_level: c_int,
+                                         strategy: c_int) -> c_int {
+        z::deflateInit2_(stream, level, method, window_bits, mem_level,
+                         strategy,
+                         ZLIB_VERSION.as_ptr() as *const c_char,
+                         mem::size_of::<mz_stream>() as c_int)
+    }
+    pub unsafe extern fn mz_inflateInit2(stream: *mut mz_stream,
+                                         window_bits: c_int)
+                                         -> c_int {
+        z::inflateInit2_(stream, window_bits,
+                         ZLIB_VERSION.as_ptr() as *const c_char,
+                         mem::size_of::<mz_stream>() as c_int)
+    }
+
+    pub struct StreamWrapper{
+        inner: Box<mz_stream>,
+    }
+
+    impl Default for StreamWrapper {
+        fn default() -> StreamWrapper {
+            StreamWrapper {
+                inner: Box::new(unsafe{ mem::zeroed() })
+            }
+        }
+    }
+
+    impl Deref for StreamWrapper {
+        type Target = mz_stream;
+
+        fn deref(&self) -> &Self::Target {
+            & *self.inner
+        }
+    }
+
+    impl DerefMut for StreamWrapper {
+        fn deref_mut(&mut self) -> &mut Self::Target {
+            &mut *self.inner
+        }
+    }
+}
+
+#[cfg(not(feature = "zlib"))]
+mod imp {
+    extern crate miniz_sys;
+    use std::mem;
+    use std::ops::{Deref, DerefMut};
+
+    use libc::{c_ulong, off_t};
+    pub use self::miniz_sys::*;
+
+    pub struct StreamWrapper {
+        inner: mz_stream,
+    }
+
+    impl Default for StreamWrapper {
+        fn default() -> StreamWrapper {
+            StreamWrapper {
+                inner : unsafe{ mem::zeroed() }
+            }
+        }
+    }
+
+    impl Deref for StreamWrapper {
+        type Target = mz_stream;
+
+        fn deref(&self) -> &Self::Target {
+            &self.inner
+        }
+    }
+
+    impl DerefMut for StreamWrapper {
+        fn deref_mut(&mut self) -> &mut Self::Target {
+            &mut self.inner
+        }
+    }
+
+    pub unsafe extern fn mz_crc32_combine(crc1: c_ulong,
+                                          crc2: c_ulong,
+                                          len2: off_t) -> c_ulong {
+          crc32_combine_(crc1, crc2, len2)
+    }
+
+    // gf2_matrix_times, gf2_matrix_square and crc32_combine_ are ported from
+    // zlib.
+
+    fn gf2_matrix_times(mat: &[c_ulong; 32], mut vec: c_ulong) -> c_ulong {
+        let mut sum = 0;
+        let mut mat_pos = 0;
+        while vec != 0 {
+            if vec & 1 == 1 {
+                sum ^= mat[mat_pos];
+            }
+            vec >>= 1;
+            mat_pos += 1;
+        }
+        sum
+    }
+
+    fn gf2_matrix_square(square: &mut [c_ulong; 32], mat: &[c_ulong; 32]) {
+        for n in 0..32 {
+            square[n] = gf2_matrix_times(mat, mat[n]);
+        }
+    }
+
+    fn crc32_combine_(mut crc1: c_ulong, crc2: c_ulong, mut len2: off_t) -> c_ulong {
+        let mut row;
+
+        let mut even = [0; 32]; /* even-power-of-two zeros operator */
+        let mut odd = [0; 32]; /* odd-power-of-two zeros operator */
+
+        /* degenerate case (also disallow negative lengths) */
+        if len2 <= 0 {
+            return crc1;
+        }
+
+        /* put operator for one zero bit in odd */
+        odd[0] = 0xedb88320;          /* CRC-32 polynomial */
+        row = 1;
+        for n in 1..32 {
+            odd[n] = row;
+            row <<= 1;
+        }
+
+        /* put operator for two zero bits in even */
+        gf2_matrix_square(&mut even, &odd);
+
+        /* put operator for four zero bits in odd */
+        gf2_matrix_square(&mut odd, &even);
+
+        /* apply len2 zeros to crc1 (first square will put the operator for one
+           zero byte, eight zero bits, in even) */
+        loop {
+            /* apply zeros operator for this bit of len2 */
+            gf2_matrix_square(&mut even, &odd);
+            if len2 & 1 == 1 {
+                crc1 = gf2_matrix_times(&even, crc1);
+            }
+            len2 >>= 1;
+
+            /* if no more bits set, then done */
+            if len2 == 0 {
+                break;
+            }
+
+            /* another iteration of the loop with odd and even swapped */
+            gf2_matrix_square(&mut odd, &even);
+            if len2 & 1 == 1 {
+                crc1 = gf2_matrix_times(&odd, crc1);
+            }
+            len2 >>= 1;
+
+            /* if no more bits set, then done */
+            if len2 == 0 {
+                break;
+            }
+        }
+
+        /* return combined crc */
+        crc1 ^= crc2;
+        crc1
+    }
+}
+
+#[test]
+fn crc32_combine() {
+    let crc32 = unsafe {
+        imp::mz_crc32_combine(1, 2, 3)
+    };
+    assert_eq!(crc32, 29518389);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/gz.rs
@@ -0,0 +1,1049 @@
+//! gzip compression/decompression
+//!
+//! [1]: http://www.gzip.org/zlib/rfc-gzip.html
+
+use std::cmp;
+use std::env;
+use std::ffi::CString;
+use std::io::prelude::*;
+use std::io;
+use std::mem;
+
+#[cfg(feature = "tokio")]
+use futures::Poll;
+#[cfg(feature = "tokio")]
+use tokio_io::{AsyncRead, AsyncWrite};
+
+use {Compression, Compress};
+use bufreader::BufReader;
+use crc::{CrcReader, Crc};
+use deflate;
+use zio;
+
+static FHCRC: u8 = 1 << 1;
+static FEXTRA: u8 = 1 << 2;
+static FNAME: u8 = 1 << 3;
+static FCOMMENT: u8 = 1 << 4;
+
+/// A gzip streaming encoder
+///
+/// This structure exposes a `Write` interface that will emit compressed data
+/// to the underlying writer `W`.
+pub struct EncoderWriter<W: Write> {
+    inner: zio::Writer<W, Compress>,
+    crc: Crc,
+    crc_bytes_written: usize,
+    header: Vec<u8>,
+}
+
+/// A gzip streaming encoder
+///
+/// This structure exposes a `Read` interface that will read uncompressed data
+/// from the underlying reader and expose the compressed version as a `Read`
+/// interface.
+pub struct EncoderReader<R: Read> {
+    inner: EncoderReaderBuf<BufReader<R>>,
+}
+
+/// A gzip streaming encoder
+///
+/// This structure exposes a `Read` interface that will read uncompressed data
+/// from the underlying reader and expose the compressed version as a `Read`
+/// interface.
+pub struct EncoderReaderBuf<R: BufRead> {
+    inner: deflate::EncoderReaderBuf<CrcReader<R>>,
+    header: Vec<u8>,
+    pos: usize,
+    eof: bool,
+}
+
+/// A builder structure to create a new gzip Encoder.
+///
+/// This structure controls header configuration options such as the filename.
+pub struct Builder {
+    extra: Option<Vec<u8>>,
+    filename: Option<CString>,
+    comment: Option<CString>,
+    mtime: u32,
+}
+
+/// A gzip streaming decoder
+///
+/// This structure exposes a `Read` interface that will consume compressed
+/// data from the underlying reader and emit uncompressed data.
+pub struct DecoderReader<R: Read> {
+    inner: DecoderReaderBuf<BufReader<R>>,
+}
+
+/// A gzip streaming decoder that decodes all members of a multistream
+///
+/// A gzip member consists of a header, compressed data and a trailer. The [gzip
+/// specification](https://tools.ietf.org/html/rfc1952), however, allows multiple
+/// gzip members to be joined in a single stream.  `MultiDecoderReader` will
+/// decode all consecutive members while `DecoderReader` will only decompress the
+/// first gzip member. The multistream format is commonly used in bioinformatics,
+/// for example when using the BGZF compressed data.
+///
+/// This structure exposes a `Read` interface that will consume all gzip members
+/// from the underlying reader and emit uncompressed data.
+pub struct MultiDecoderReader<R: Read> {
+    inner: MultiDecoderReaderBuf<BufReader<R>>,
+}
+
+/// A gzip streaming decoder
+///
+/// This structure exposes a `Read` interface that will consume compressed
+/// data from the underlying reader and emit uncompressed data.
+pub struct DecoderReaderBuf<R: BufRead> {
+    inner: CrcReader<deflate::DecoderReaderBuf<R>>,
+    header: Header,
+    finished: bool,
+}
+
+/// A gzip streaming decoder that decodes all members of a multistream
+///
+/// A gzip member consists of a header, compressed data and a trailer. The [gzip
+/// specification](https://tools.ietf.org/html/rfc1952), however, allows multiple
+/// gzip members to be joined in a single stream. `MultiDecoderReaderBuf` will
+/// decode all consecutive members while `DecoderReaderBuf` will only decompress
+/// the first gzip member. The multistream format is commonly used in
+/// bioinformatics, for example when using the BGZF compressed data.
+///
+/// This structure exposes a `Read` interface that will consume all gzip members
+/// from the underlying reader and emit uncompressed data.
+pub struct MultiDecoderReaderBuf<R: BufRead> {
+    inner: CrcReader<deflate::DecoderReaderBuf<R>>,
+    header: Header,
+    finished: bool,
+}
+
+/// A structure representing the header of a gzip stream.
+///
+/// The header can contain metadata about the file that was compressed, if
+/// present.
+pub struct Header {
+    extra: Option<Vec<u8>>,
+    filename: Option<Vec<u8>>,
+    comment: Option<Vec<u8>>,
+    mtime: u32,
+}
+
+impl Builder {
+    /// Create a new blank builder with no header by default.
+    pub fn new() -> Builder {
+        Builder {
+            extra: None,
+            filename: None,
+            comment: None,
+            mtime: 0,
+        }
+    }
+
+    /// Configure the `mtime` field in the gzip header.
+    pub fn mtime(mut self, mtime: u32) -> Builder {
+        self.mtime = mtime;
+        self
+    }
+
+    /// Configure the `extra` field in the gzip header.
+    pub fn extra(mut self, extra: Vec<u8>) -> Builder {
+        self.extra = Some(extra);
+        self
+    }
+
+    /// Configure the `filename` field in the gzip header.
+    pub fn filename(mut self, filename: &[u8]) -> Builder {
+        self.filename = Some(CString::new(filename).unwrap());
+        self
+    }
+
+    /// Configure the `comment` field in the gzip header.
+    pub fn comment(mut self, comment: &[u8]) -> Builder {
+        self.comment = Some(CString::new(comment).unwrap());
+        self
+    }
+
+    /// Consume this builder, creating a writer encoder in the process.
+    ///
+    /// The data written to the returned encoder will be compressed and then
+    /// written out to the supplied parameter `w`.
+    pub fn write<W: Write>(self, w: W, lvl: Compression) -> EncoderWriter<W> {
+        EncoderWriter {
+            inner: zio::Writer::new(w, Compress::new(lvl, false)),
+            crc: Crc::new(),
+            header: self.into_header(lvl),
+            crc_bytes_written: 0,
+        }
+    }
+
+    /// Consume this builder, creating a reader encoder in the process.
+    ///
+    /// Data read from the returned encoder will be the compressed version of
+    /// the data read from the given reader.
+    pub fn read<R: Read>(self, r: R, lvl: Compression) -> EncoderReader<R> {
+        EncoderReader {
+            inner: self.buf_read(BufReader::new(r), lvl),
+        }
+    }
+
+    /// Consume this builder, creating a reader encoder in the process.
+    ///
+    /// Data read from the returned encoder will be the compressed version of
+    /// the data read from the given reader.
+    pub fn buf_read<R>(self, r: R, lvl: Compression) -> EncoderReaderBuf<R>
+        where R: BufRead
+    {
+        let crc = CrcReader::new(r);
+        EncoderReaderBuf {
+            inner: deflate::EncoderReaderBuf::new(crc, lvl),
+            header: self.into_header(lvl),
+            pos: 0,
+            eof: false,
+        }
+    }
+
+    fn into_header(self, lvl: Compression) -> Vec<u8> {
+        let Builder { extra, filename, comment, mtime } = self;
+        let mut flg = 0;
+        let mut header = vec![0u8; 10];
+        match extra {
+            Some(v) => {
+                flg |= FEXTRA;
+                header.push((v.len() >> 0) as u8);
+                header.push((v.len() >> 8) as u8);
+                header.extend(v);
+            }
+            None => {}
+        }
+        match filename {
+            Some(filename) => {
+                flg |= FNAME;
+                header.extend(filename.as_bytes_with_nul().iter().map(|x| *x));
+            }
+            None => {}
+        }
+        match comment {
+            Some(comment) => {
+                flg |= FCOMMENT;
+                header.extend(comment.as_bytes_with_nul().iter().map(|x| *x));
+            }
+            None => {}
+        }
+        header[0] = 0x1f;
+        header[1] = 0x8b;
+        header[2] = 8;
+        header[3] = flg;
+        header[4] = (mtime >> 0) as u8;
+        header[5] = (mtime >> 8) as u8;
+        header[6] = (mtime >> 16) as u8;
+        header[7] = (mtime >> 24) as u8;
+        header[8] = match lvl {
+            Compression::Best => 2,
+            Compression::Fast => 4,
+            _ => 0,
+        };
+        header[9] = match env::consts::OS {
+            "linux" => 3,
+            "macos" => 7,
+            "win32" => 0,
+            _ => 255,
+        };
+        return header;
+    }
+}
+
+impl<W: Write> EncoderWriter<W> {
+    /// Creates a new encoder which will use the given compression level.
+    ///
+    /// The encoder is not configured specially for the emitted header. For
+    /// header configuration, see the `Builder` type.
+    ///
+    /// The data written to the returned encoder will be compressed and then
+    /// written to the stream `w`.
+    pub fn new(w: W, level: Compression) -> EncoderWriter<W> {
+        Builder::new().write(w, level)
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.inner.get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutation of the writer may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.inner.get_mut()
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        try!(self.write_header());
+        try!(self.inner.finish());
+
+        while self.crc_bytes_written < 8 {
+            let (sum, amt) = (self.crc.sum() as u32, self.crc.amount());
+            let buf = [(sum >> 0) as u8,
+                       (sum >> 8) as u8,
+                       (sum >> 16) as u8,
+                       (sum >> 24) as u8,
+                       (amt >> 0) as u8,
+                       (amt >> 8) as u8,
+                       (amt >> 16) as u8,
+                       (amt >> 24) as u8];
+            let mut inner = self.inner.get_mut();
+            let n = try!(inner.write(&buf[self.crc_bytes_written..]));
+            self.crc_bytes_written += n;
+        }
+        Ok(())
+    }
+
+    /// Finish encoding this stream, returning the underlying writer once the
+    /// encoding is done.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(mut self) -> io::Result<W> {
+        try!(self.try_finish());
+        Ok(self.inner.take_inner())
+    }
+
+    fn write_header(&mut self) -> io::Result<()> {
+        while self.header.len() > 0 {
+            let n = try!(self.inner.get_mut().write(&self.header));
+            self.header.drain(..n);
+        }
+        Ok(())
+    }
+}
+
+impl<W: Write> Write for EncoderWriter<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        assert_eq!(self.crc_bytes_written, 0);
+        try!(self.write_header());
+        let n = try!(self.inner.write(buf));
+        self.crc.update(&buf[..n]);
+        Ok(n)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        assert_eq!(self.crc_bytes_written, 0);
+        self.inner.flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for EncoderWriter<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.try_finish());
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: Read + Write> Read for EncoderWriter<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + AsyncWrite> AsyncRead for EncoderWriter<R> {
+}
+
+impl<W: Write> Drop for EncoderWriter<W> {
+    fn drop(&mut self) {
+        if self.inner.is_present() {
+            let _ = self.try_finish();
+        }
+    }
+}
+
+impl<R: Read> EncoderReader<R> {
+    /// Creates a new encoder which will use the given compression level.
+    ///
+    /// The encoder is not configured specially for the emitted header. For
+    /// header configuration, see the `Builder` type.
+    ///
+    /// The data read from the stream `r` will be compressed and available
+    /// through the returned reader.
+    pub fn new(r: R, level: Compression) -> EncoderReader<R> {
+        Builder::new().read(r, level)
+    }
+
+    /// Acquires a reference to the underlying reader.
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying reader.
+    ///
+    /// Note that mutation of the reader may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Returns the underlying stream, consuming this encoder
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+}
+
+fn copy(into: &mut [u8], from: &[u8], pos: &mut usize) -> usize {
+    let min = cmp::min(into.len(), from.len() - *pos);
+    for (slot, val) in into.iter_mut().zip(from[*pos..*pos + min].iter()) {
+        *slot = *val;
+    }
+    *pos += min;
+    return min;
+}
+
+impl<R: Read> Read for EncoderReader<R> {
+    fn read(&mut self, mut into: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(into)
+    }
+}
+
+impl<R: Read + Write> Write for EncoderReader<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+impl<R: BufRead> EncoderReaderBuf<R> {
+    /// Creates a new encoder which will use the given compression level.
+    ///
+    /// The encoder is not configured specially for the emitted header. For
+    /// header configuration, see the `Builder` type.
+    ///
+    /// The data read from the stream `r` will be compressed and available
+    /// through the returned reader.
+    pub fn new(r: R, level: Compression) -> EncoderReaderBuf<R> {
+        Builder::new().buf_read(r, level)
+    }
+
+    /// Acquires a reference to the underlying reader.
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying reader.
+    ///
+    /// Note that mutation of the reader may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Returns the underlying stream, consuming this encoder
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    fn read_footer(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        if self.pos == 8 {
+            return Ok(0);
+        }
+        let crc = self.inner.get_ref().crc();
+        let ref arr = [(crc.sum() >> 0) as u8,
+                       (crc.sum() >> 8) as u8,
+                       (crc.sum() >> 16) as u8,
+                       (crc.sum() >> 24) as u8,
+                       (crc.amount() >> 0) as u8,
+                       (crc.amount() >> 8) as u8,
+                       (crc.amount() >> 16) as u8,
+                       (crc.amount() >> 24) as u8];
+        Ok(copy(into, arr, &mut self.pos))
+    }
+}
+
+impl<R: BufRead> Read for EncoderReaderBuf<R> {
+    fn read(&mut self, mut into: &mut [u8]) -> io::Result<usize> {
+        let mut amt = 0;
+        if self.eof {
+            return self.read_footer(into);
+        } else if self.pos < self.header.len() {
+            amt += copy(into, &self.header, &mut self.pos);
+            if amt == into.len() {
+                return Ok(amt);
+            }
+            let tmp = into;
+            into = &mut tmp[amt..];
+        }
+        match try!(self.inner.read(into)) {
+            0 => {
+                self.eof = true;
+                self.pos = 0;
+                self.read_footer(into)
+            }
+            n => Ok(amt + n),
+        }
+    }
+}
+
+impl<R: BufRead + Write> Write for EncoderReaderBuf<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+impl<R: Read> DecoderReader<R> {
+    /// Creates a new decoder from the given reader, immediately parsing the
+    /// gzip header.
+    ///
+    /// If an error is encountered when parsing the gzip header, an error is
+    /// returned.
+    pub fn new(r: R) -> io::Result<DecoderReader<R>> {
+        DecoderReaderBuf::new(BufReader::new(r)).map(|r| {
+            DecoderReader { inner: r }
+        })
+    }
+
+    /// Returns the header associated with this stream.
+    pub fn header(&self) -> &Header {
+        self.inner.header()
+    }
+
+    /// Acquires a reference to the underlying reader.
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream.
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+}
+
+impl<R: Read> Read for DecoderReader<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(into)
+    }
+}
+
+impl<R: Read + Write> Write for DecoderReader<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+impl<R: Read> MultiDecoderReader<R> {
+    /// Creates a new decoder from the given reader, immediately parsing the
+    /// (first) gzip header. If the gzip stream contains multiple members all will
+    /// be decoded.
+    ///
+    /// If an error is encountered when parsing the gzip header, an error is
+    /// returned.
+    pub fn new(r: R) -> io::Result<MultiDecoderReader<R>> {
+        MultiDecoderReaderBuf::new(BufReader::new(r)).map(|r| {
+            MultiDecoderReader { inner: r }
+        })
+    }
+
+    /// Returns the current header associated with this stream.
+    pub fn header(&self) -> &Header {
+        self.inner.header()
+    }
+
+    /// Acquires a reference to the underlying reader.
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream.
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+}
+
+impl<R: Read> Read for MultiDecoderReader<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(into)
+    }
+}
+
+impl<R: Read + Write> Write for MultiDecoderReader<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+impl<R: BufRead> DecoderReaderBuf<R> {
+    /// Creates a new decoder from the given reader, immediately parsing the
+    /// gzip header.
+    ///
+    /// If an error is encountered when parsing the gzip header, an error is
+    /// returned.
+    pub fn new(mut r: R) -> io::Result<DecoderReaderBuf<R>> {
+        let header = try!(read_gz_header(&mut r));
+
+        let flate = deflate::DecoderReaderBuf::new(r);
+        return Ok(DecoderReaderBuf {
+            inner: CrcReader::new(flate),
+            header: header,
+            finished: false,
+        });
+    }
+
+
+    /// Returns the header associated with this stream.
+    pub fn header(&self) -> &Header {
+        &self.header
+    }
+
+    /// Acquires a reference to the underlying reader.
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream.
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    fn finish(&mut self) -> io::Result<()> {
+        if self.finished {
+            return Ok(());
+        }
+        let ref mut buf = [0u8; 8];
+        {
+            let mut len = 0;
+
+            while len < buf.len() {
+                match try!(self.inner.get_mut().get_mut().read(&mut buf[len..])) {
+                    0 => return Err(corrupt()),
+                    n => len += n,
+                }
+            }
+        }
+
+        let crc = ((buf[0] as u32) << 0) | ((buf[1] as u32) << 8) |
+                  ((buf[2] as u32) << 16) |
+                  ((buf[3] as u32) << 24);
+        let amt = ((buf[4] as u32) << 0) | ((buf[5] as u32) << 8) |
+                  ((buf[6] as u32) << 16) |
+                  ((buf[7] as u32) << 24);
+        if crc != self.inner.crc().sum() as u32 {
+            return Err(corrupt());
+        }
+        if amt != self.inner.crc().amount() {
+            return Err(corrupt());
+        }
+        self.finished = true;
+        Ok(())
+    }
+}
+
+impl<R: BufRead> Read for DecoderReaderBuf<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        match try!(self.inner.read(into)) {
+            0 => {
+                try!(self.finish());
+                Ok(0)
+            }
+            n => Ok(n),
+        }
+    }
+}
+
+impl<R: BufRead + Write> Write for DecoderReaderBuf<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+impl<R: BufRead> MultiDecoderReaderBuf<R> {
+    /// Creates a new decoder from the given reader, immediately parsing the
+    /// (first) gzip header. If the gzip stream contains multiple members all will
+    /// be decoded.
+    ///
+    /// If an error is encountered when parsing the gzip header, an error is
+    /// returned.
+    pub fn new(mut r: R) -> io::Result<MultiDecoderReaderBuf<R>> {
+        let header = try!(read_gz_header(&mut r));
+
+        let flate = deflate::DecoderReaderBuf::new(r);
+        return Ok(MultiDecoderReaderBuf {
+            inner: CrcReader::new(flate),
+            header: header,
+            finished: false,
+        });
+    }
+
+
+    /// Returns the current header associated with this stream.
+    pub fn header(&self) -> &Header {
+        &self.header
+    }
+
+    /// Acquires a reference to the underlying reader.
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream.
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    fn finish_member(&mut self) -> io::Result<usize> {
+        if self.finished {
+            return Ok(0);
+        }
+        let ref mut buf = [0u8; 8];
+        {
+            let mut len = 0;
+
+            while len < buf.len() {
+                match try!(self.inner.get_mut().get_mut().read(&mut buf[len..])) {
+                    0 => return Err(corrupt()),
+                    n => len += n,
+                }
+            }
+        }
+
+        let crc = ((buf[0] as u32) << 0) | ((buf[1] as u32) << 8) |
+                  ((buf[2] as u32) << 16) |
+                  ((buf[3] as u32) << 24);
+        let amt = ((buf[4] as u32) << 0) | ((buf[5] as u32) << 8) |
+                  ((buf[6] as u32) << 16) |
+                  ((buf[7] as u32) << 24);
+        if crc != self.inner.crc().sum() as u32 {
+            return Err(corrupt());
+        }
+        if amt != self.inner.crc().amount() {
+            return Err(corrupt());
+        }
+        let remaining = match self.inner.get_mut().get_mut().fill_buf() {
+            Ok(b) => {
+                if b.is_empty() {
+                    self.finished = true;
+                    return Ok(0);
+                } else {
+                    b.len()
+                }
+            },
+            Err(e) => return Err(e)
+        };
+
+        let next_header = try!(read_gz_header(self.inner.get_mut().get_mut()));
+        mem::replace(&mut self.header, next_header);
+        self.inner.reset();
+        self.inner.get_mut().reset_data();
+
+        Ok(remaining)
+    }
+}
+
+impl<R: BufRead> Read for MultiDecoderReaderBuf<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        match try!(self.inner.read(into)) {
+            0 => {
+                match self.finish_member() {
+                    Ok(0) => Ok(0),
+                    Ok(_) => self.read(into),
+                    Err(e) => Err(e)
+                }
+            },
+            n => Ok(n),
+        }
+    }
+}
+
+impl<R: BufRead + Write> Write for MultiDecoderReaderBuf<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+impl Header {
+    /// Returns the `filename` field of this gzip stream's header, if present.
+    pub fn filename(&self) -> Option<&[u8]> {
+        self.filename.as_ref().map(|s| &s[..])
+    }
+
+    /// Returns the `extra` field of this gzip stream's header, if present.
+    pub fn extra(&self) -> Option<&[u8]> {
+        self.extra.as_ref().map(|s| &s[..])
+    }
+
+    /// Returns the `comment` field of this gzip stream's header, if present.
+    pub fn comment(&self) -> Option<&[u8]> {
+        self.comment.as_ref().map(|s| &s[..])
+    }
+
+    /// Returns the `mtime` field of this gzip stream's header, if present.
+    pub fn mtime(&self) -> u32 {
+        self.mtime
+    }
+}
+
+fn corrupt() -> io::Error {
+    io::Error::new(io::ErrorKind::InvalidInput,
+                   "corrupt gzip stream does not have a matching checksum")
+}
+
+fn bad_header() -> io::Error {
+    io::Error::new(io::ErrorKind::InvalidInput, "invalid gzip header")
+}
+
+fn read_le_u16<R: Read>(r: &mut R) -> io::Result<u16> {
+    let mut b = [0; 2];
+    try!(r.read_exact(&mut b));
+    Ok((b[0] as u16) | ((b[1] as u16) << 8))
+}
+
+fn read_gz_header<R: Read>(r: &mut R) -> io::Result<Header> {
+    let mut crc_reader = CrcReader::new(r);
+    let mut header = [0; 10];
+    try!(crc_reader.read_exact(&mut header));
+
+    let id1 = header[0];
+    let id2 = header[1];
+    if id1 != 0x1f || id2 != 0x8b {
+        return Err(bad_header());
+    }
+    let cm = header[2];
+    if cm != 8 {
+        return Err(bad_header());
+    }
+
+    let flg = header[3];
+    let mtime = ((header[4] as u32) << 0) | ((header[5] as u32) << 8) |
+        ((header[6] as u32) << 16) |
+        ((header[7] as u32) << 24);
+    let _xfl = header[8];
+    let _os = header[9];
+
+    let extra = if flg & FEXTRA != 0 {
+        let xlen = try!(read_le_u16(&mut crc_reader));
+        let mut extra = vec![0; xlen as usize];
+        try!(crc_reader.read_exact(&mut extra));
+        Some(extra)
+    } else {
+        None
+    };
+    let filename = if flg & FNAME != 0 {
+        // wow this is slow
+        let mut b = Vec::new();
+        for byte in crc_reader.by_ref().bytes() {
+            let byte = try!(byte);
+            if byte == 0 {
+                break;
+            }
+            b.push(byte);
+        }
+        Some(b)
+    } else {
+        None
+    };
+    let comment = if flg & FCOMMENT != 0 {
+        // wow this is slow
+        let mut b = Vec::new();
+        for byte in crc_reader.by_ref().bytes() {
+            let byte = try!(byte);
+            if byte == 0 {
+                break;
+            }
+            b.push(byte);
+        }
+        Some(b)
+    } else {
+        None
+    };
+
+    if flg & FHCRC != 0 {
+        let calced_crc = crc_reader.crc().sum() as u16;
+        let stored_crc = try!(read_le_u16(&mut crc_reader));
+        if calced_crc != stored_crc {
+            return Err(corrupt());
+        }
+    }
+
+    Ok(Header {
+        extra: extra,
+        filename: filename,
+        comment: comment,
+        mtime: mtime,
+    })
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::prelude::*;
+
+    use super::{EncoderWriter, EncoderReader, DecoderReader, Builder};
+    use Compression::Default;
+    use rand::{thread_rng, Rng};
+
+    #[test]
+    fn roundtrip() {
+        let mut e = EncoderWriter::new(Vec::new(), Default);
+        e.write_all(b"foo bar baz").unwrap();
+        let inner = e.finish().unwrap();
+        let mut d = DecoderReader::new(&inner[..]).unwrap();
+        let mut s = String::new();
+        d.read_to_string(&mut s).unwrap();
+        assert_eq!(s, "foo bar baz");
+    }
+
+    #[test]
+    fn roundtrip_zero() {
+        let e = EncoderWriter::new(Vec::new(), Default);
+        let inner = e.finish().unwrap();
+        let mut d = DecoderReader::new(&inner[..]).unwrap();
+        let mut s = String::new();
+        d.read_to_string(&mut s).unwrap();
+        assert_eq!(s, "");
+    }
+
+    #[test]
+    fn roundtrip_big() {
+        let mut real = Vec::new();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        let v = thread_rng().gen_iter::<u8>().take(1024).collect::<Vec<_>>();
+        for _ in 0..200 {
+            let to_write = &v[..thread_rng().gen_range(0, v.len())];
+            real.extend(to_write.iter().map(|x| *x));
+            w.write_all(to_write).unwrap();
+        }
+        let result = w.finish().unwrap();
+        let mut r = DecoderReader::new(&result[..]).unwrap();
+        let mut v = Vec::new();
+        r.read_to_end(&mut v).unwrap();
+        assert!(v == real);
+    }
+
+    #[test]
+    fn roundtrip_big2() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut r = DecoderReader::new(EncoderReader::new(&v[..], Default))
+                        .unwrap();
+        let mut res = Vec::new();
+        r.read_to_end(&mut res).unwrap();
+        assert!(res == v);
+    }
+
+    #[test]
+    fn fields() {
+        let r = vec![0, 2, 4, 6];
+        let e = Builder::new()
+                    .filename(b"foo.rs")
+                    .comment(b"bar")
+                    .extra(vec![0, 1, 2, 3])
+                    .read(&r[..], Default);
+        let mut d = DecoderReader::new(e).unwrap();
+        assert_eq!(d.header().filename(), Some(&b"foo.rs"[..]));
+        assert_eq!(d.header().comment(), Some(&b"bar"[..]));
+        assert_eq!(d.header().extra(), Some(&b"\x00\x01\x02\x03"[..]));
+        let mut res = Vec::new();
+        d.read_to_end(&mut res).unwrap();
+        assert_eq!(res, vec![0, 2, 4, 6]);
+
+    }
+
+    #[test]
+    fn keep_reading_after_end() {
+        let mut e = EncoderWriter::new(Vec::new(), Default);
+        e.write_all(b"foo bar baz").unwrap();
+        let inner = e.finish().unwrap();
+        let mut d = DecoderReader::new(&inner[..]).unwrap();
+        let mut s = String::new();
+        d.read_to_string(&mut s).unwrap();
+        assert_eq!(s, "foo bar baz");
+        d.read_to_string(&mut s).unwrap();
+        assert_eq!(s, "foo bar baz");
+    }
+
+    #[test]
+    fn qc_reader() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let r = EncoderReader::new(&v[..], Default);
+            let mut r = DecoderReader::new(r).unwrap();
+            let mut v2 = Vec::new();
+            r.read_to_end(&mut v2).unwrap();
+            v == v2
+        }
+    }
+
+    #[test]
+    fn flush_after_write() {
+		let mut f = EncoderWriter::new(Vec::new(), Default);
+		write!(f, "Hello world").unwrap();
+		f.flush().unwrap();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/lib.rs
@@ -0,0 +1,242 @@
+//! A DEFLATE-based stream compression/decompression library
+//!
+//! This library is meant to supplement/replace the standard distributon's
+//! libflate library by providing a streaming encoder/decoder rather than purely
+//! an in-memory encoder/decoder.
+//!
+//! Like with libflate, flate2 is based on [`miniz.c`][1]
+//!
+//! [1]: https://code.google.com/p/miniz/
+//!
+//! # Organization
+//!
+//! This crate consists mainly of two modules, `read` and `write`. Each
+//! module contains a number of types used to encode and decode various streams
+//! of data. All types in the `write` module work on instances of `Write`,
+//! whereas all types in the `read` module work on instances of `Read`.
+//!
+//! Other various types are provided at the top-level of the crate for
+//! management and dealing with encoders/decoders.
+//!
+//! # Helper traits
+//!
+//! There are two helper traits provided: `FlateReader` and `FlateWriter`.
+//! These provide convenience methods for creating a decoder/encoder out of an
+//! already existing stream to chain construction.
+//!
+//! # Async I/O
+//!
+//! This crate optionally can support async I/O streams with the Tokio stack via
+//! the `tokio` feature of this crate:
+//!
+//! ```toml
+//! flate2 = { version = "0.2", features = ["tokio"] }
+//! ```
+//!
+//! All methods are internally capable of working with streams that may return
+//! `ErrorKind::WouldBlock` when they're not ready to perform the particular
+//! operation.
+//!
+//! Note that care needs to be taken when using these objects, however. The
+//! Tokio runtime, in particular, requires that data is fully flushed before
+//! dropping streams. For compatibility with blocking streams all streams are
+//! flushed/written when they are dropped, and this is not always a suitable
+//! time to perform I/O. If I/O streams are flushed before drop, however, then
+//! these operations will be a noop.
+
+#![doc(html_root_url = "https://docs.rs/flate2/0.2")]
+#![deny(missing_docs)]
+#![allow(trivial_numeric_casts)]
+#![cfg_attr(test, deny(warnings))]
+
+extern crate libc;
+#[cfg(test)]
+extern crate rand;
+#[cfg(test)]
+extern crate quickcheck;
+#[cfg(feature = "tokio")]
+#[macro_use]
+extern crate tokio_io;
+#[cfg(feature = "tokio")]
+extern crate futures;
+
+use std::io::prelude::*;
+use std::io;
+
+pub use gz::Builder as GzBuilder;
+pub use gz::Header as GzHeader;
+pub use mem::{Compress, Decompress, DataError, Status, Flush};
+pub use crc::{Crc, CrcReader};
+
+mod bufreader;
+mod crc;
+mod deflate;
+mod ffi;
+mod gz;
+mod zio;
+mod mem;
+mod zlib;
+
+/// Types which operate over `Read` streams, both encoders and decoders for
+/// various formats.
+pub mod read {
+    pub use deflate::EncoderReader as DeflateEncoder;
+    pub use deflate::DecoderReader as DeflateDecoder;
+    pub use zlib::EncoderReader as ZlibEncoder;
+    pub use zlib::DecoderReader as ZlibDecoder;
+    pub use gz::EncoderReader as GzEncoder;
+    pub use gz::DecoderReader as GzDecoder;
+    pub use gz::MultiDecoderReader as MultiGzDecoder;
+}
+
+/// Types which operate over `Write` streams, both encoders and decoders for
+/// various formats.
+pub mod write {
+    pub use deflate::EncoderWriter as DeflateEncoder;
+    pub use deflate::DecoderWriter as DeflateDecoder;
+    pub use zlib::EncoderWriter as ZlibEncoder;
+    pub use zlib::DecoderWriter as ZlibDecoder;
+    pub use gz::EncoderWriter as GzEncoder;
+}
+
+/// Types which operate over `BufRead` streams, both encoders and decoders for
+/// various formats.
+pub mod bufread {
+    pub use deflate::EncoderReaderBuf as DeflateEncoder;
+    pub use deflate::DecoderReaderBuf as DeflateDecoder;
+    pub use zlib::EncoderReaderBuf as ZlibEncoder;
+    pub use zlib::DecoderReaderBuf as ZlibDecoder;
+    pub use gz::EncoderReaderBuf as GzEncoder;
+    pub use gz::DecoderReaderBuf as GzDecoder;
+    pub use gz::MultiDecoderReaderBuf as MultiGzDecoder;
+}
+
+fn _assert_send_sync() {
+    fn _assert_send_sync<T: Send + Sync>() {}
+
+    _assert_send_sync::<read::DeflateEncoder<&[u8]>>();
+    _assert_send_sync::<read::DeflateDecoder<&[u8]>>();
+    _assert_send_sync::<read::ZlibEncoder<&[u8]>>();
+    _assert_send_sync::<read::ZlibDecoder<&[u8]>>();
+    _assert_send_sync::<read::GzEncoder<&[u8]>>();
+    _assert_send_sync::<read::GzDecoder<&[u8]>>();
+    _assert_send_sync::<read::MultiGzDecoder<&[u8]>>();
+    _assert_send_sync::<write::DeflateEncoder<Vec<u8>>>();
+    _assert_send_sync::<write::DeflateDecoder<Vec<u8>>>();
+    _assert_send_sync::<write::ZlibEncoder<Vec<u8>>>();
+    _assert_send_sync::<write::ZlibDecoder<Vec<u8>>>();
+    _assert_send_sync::<write::GzEncoder<Vec<u8>>>();
+}
+
+/// When compressing data, the compression level can be specified by a value in
+/// this enum.
+#[derive(Copy, Clone)]
+pub enum Compression {
+    /// No compression is to be performed, this may actually inflate data
+    /// slightly when encoding.
+    None = 0,
+    /// Optimize for the best speed of encoding.
+    Fast = 1,
+    /// Optimize for the size of data being encoded.
+    Best = 9,
+    /// Choose the default compression, a balance between speed and size.
+    Default = 6,
+}
+
+/// A helper trait to create encoder/decoders with method syntax.
+pub trait FlateReadExt: Read + Sized {
+    /// Consume this reader to create a compression stream at the specified
+    /// compression level.
+    fn gz_encode(self, lvl: Compression) -> read::GzEncoder<Self> {
+        read::GzEncoder::new(self, lvl)
+    }
+
+    /// Consume this reader to create a decompression stream of this stream.
+    fn gz_decode(self) -> io::Result<read::GzDecoder<Self>> {
+        read::GzDecoder::new(self)
+    }
+
+    /// Consume this reader to create a compression stream at the specified
+    /// compression level.
+    fn zlib_encode(self, lvl: Compression) -> read::ZlibEncoder<Self> {
+        read::ZlibEncoder::new(self, lvl)
+    }
+
+    /// Consume this reader to create a decompression stream of this stream.
+    fn zlib_decode(self) -> read::ZlibDecoder<Self> {
+        read::ZlibDecoder::new(self)
+    }
+
+    /// Consume this reader to create a compression stream at the specified
+    /// compression level.
+    fn deflate_encode(self, lvl: Compression) -> read::DeflateEncoder<Self> {
+        read::DeflateEncoder::new(self, lvl)
+    }
+
+    /// Consume this reader to create a decompression stream of this stream.
+    fn deflate_decode(self) -> read::DeflateDecoder<Self> {
+        read::DeflateDecoder::new(self)
+    }
+}
+
+/// A helper trait to create encoder/decoders with method syntax.
+pub trait FlateWriteExt: Write + Sized {
+    /// Consume this writer to create a compression stream at the specified
+    /// compression level.
+    fn gz_encode(self, lvl: Compression) -> write::GzEncoder<Self> {
+        write::GzEncoder::new(self, lvl)
+    }
+
+    // TODO: coming soon to a theater near you!
+    // /// Consume this writer to create a decompression stream of this stream.
+    // fn gz_decode(self) -> IoResult<write::GzDecoder<Self>> {
+    //     write::GzDecoder::new(self)
+    // }
+
+    /// Consume this writer to create a compression stream at the specified
+    /// compression level.
+    fn zlib_encode(self, lvl: Compression) -> write::ZlibEncoder<Self> {
+        write::ZlibEncoder::new(self, lvl)
+    }
+
+    /// Consume this writer to create a decompression stream of this stream.
+    fn zlib_decode(self) -> write::ZlibDecoder<Self> {
+        write::ZlibDecoder::new(self)
+    }
+
+    /// Consume this writer to create a compression stream at the specified
+    /// compression level.
+    fn deflate_encode(self, lvl: Compression) -> write::DeflateEncoder<Self> {
+        write::DeflateEncoder::new(self, lvl)
+    }
+
+    /// Consume this writer to create a decompression stream of this stream.
+    fn deflate_decode(self) -> write::DeflateDecoder<Self> {
+        write::DeflateDecoder::new(self)
+    }
+}
+
+impl<T: Read> FlateReadExt for T {}
+impl<T: Write> FlateWriteExt for T {}
+
+#[cfg(test)]
+mod test {
+    use std::io::prelude::*;
+    use {FlateReadExt, Compression};
+
+    #[test]
+    fn crazy() {
+        let rdr = &mut b"foobar";
+        let mut res = Vec::new();
+        rdr.gz_encode(Compression::Default)
+           .deflate_encode(Compression::Default)
+           .zlib_encode(Compression::Default)
+           .zlib_decode()
+           .deflate_decode()
+           .gz_decode()
+           .unwrap()
+           .read_to_end(&mut res)
+           .unwrap();
+        assert_eq!(res, b"foobar");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/mem.rs
@@ -0,0 +1,491 @@
+use std::error::Error;
+use std::fmt;
+use std::io;
+use std::marker;
+use std::slice;
+
+use libc::{c_int, c_uint};
+
+use Compression;
+use ffi;
+
+/// Raw in-memory compression stream for blocks of data.
+///
+/// This type is the building block for the I/O streams in the rest of this
+/// crate. It requires more management than the `Read`/`Write` API but is
+/// maximally flexible in terms of accepting input from any source and being
+/// able to produce output to any memory location.
+///
+/// It is recommended to use the I/O stream adaptors over this type as they're
+/// easier to use.
+pub struct Compress {
+    inner: Stream<DirCompress>,
+}
+
+/// Raw in-memory decompression stream for blocks of data.
+///
+/// This type is the building block for the I/O streams in the rest of this
+/// crate. It requires more management than the `Read`/`Write` API but is
+/// maximally flexible in terms of accepting input from any source and being
+/// able to produce output to any memory location.
+///
+/// It is recommended to use the I/O stream adaptors over this type as they're
+/// easier to use.
+pub struct Decompress {
+    inner: Stream<DirDecompress>,
+}
+
+struct Stream<D: Direction> {
+    stream_wrapper: ffi::StreamWrapper,
+    total_in: u64,
+    total_out: u64,
+    _marker: marker::PhantomData<D>,
+}
+
+unsafe impl<D: Direction> Send for Stream<D> {}
+unsafe impl<D: Direction> Sync for Stream<D> {}
+
+trait Direction {
+    unsafe fn destroy(stream: *mut ffi::mz_stream) -> c_int;
+}
+
+enum DirCompress {}
+enum DirDecompress {}
+
+/// Values which indicate the form of flushing to be used when compressing or
+/// decompressing in-memory data.
+pub enum Flush {
+    /// A typical parameter for passing to compression/decompression functions,
+    /// this indicates that the underlying stream to decide how much data to
+    /// accumulate before producing output in order to maximize compression.
+    None = ffi::MZ_NO_FLUSH as isize,
+
+    /// All pending output is flushed to the output buffer and the output is
+    /// aligned on a byte boundary so that the decompressor can get all input
+    /// data available so far.
+    ///
+    /// Flushing may degrade compression for some compression algorithms and so
+    /// it should only be used when necessary. This will complete the current
+    /// deflate block and follow it with an empty stored block.
+    Sync = ffi::MZ_SYNC_FLUSH as isize,
+
+    /// All pending output is flushed to the output buffer, but the output is
+    /// not aligned to a byte boundary.
+    ///
+    /// All of the input data so far will be available to the decompressor (as
+    /// with `Flush::Sync`. This completes the current deflate block and follows
+    /// it with an empty fixed codes block that is 10 bites long, and it assures
+    /// that enough bytes are output in order for the decompessor to finish the
+    /// block before the empty fixed code block.
+    Partial = ffi::MZ_PARTIAL_FLUSH as isize,
+
+    /// A deflate block is completed and emitted, as for `Flush::Sync`, but the
+    /// output is not aligned on a byte boundary and up to seven vits of the
+    /// current block are held to be written as the next byte after the next
+    /// deflate block is completed.
+    ///
+    /// In this case the decompressor may not be provided enough bits at this
+    /// point in order to complete decompression of the data provided so far to
+    /// the compressor, it may need to wait for the next block to be emitted.
+    /// This is for advanced applications that need to control the emission of
+    /// deflate blocks.
+    Block = ffi::MZ_BLOCK as isize,
+
+    /// All output is flushed as with `Flush::Sync` and the compression state is
+    /// reset so decompression can restart from this point if previous
+    /// compressed data has been damaged or if random access is desired.
+    ///
+    /// Using this option too often can seriously degrade compression.
+    Full = ffi::MZ_FULL_FLUSH as isize,
+
+    /// Pending input is processed and pending output is flushed.
+    ///
+    /// The return value may indicate that the stream is not yet done and more
+    /// data has yet to be processed.
+    Finish = ffi::MZ_FINISH as isize,
+}
+
+/// Error returned when a decompression object finds that the input stream of
+/// bytes was not a valid input stream of bytes.
+#[derive(Debug)]
+pub struct DataError(());
+
+/// Possible status results of compressing some data or successfully
+/// decompressing a block of data.
+pub enum Status {
+    /// Indicates success.
+    ///
+    /// Means that more input may be needed but isn't available
+    /// and/or there' smore output to be written but the output buffer is full.
+    Ok,
+
+    /// Indicates that forward progress is not possible due to input or output
+    /// buffers being empty.
+    ///
+    /// For compression it means the input buffer needs some more data or the
+    /// output buffer needs to be freed up before trying again.
+    ///
+    /// For decompression this means that more input is needed to continue or
+    /// the output buffer isn't large enough to contain the result. The function
+    /// can be called again after fixing both.
+    BufError,
+
+    /// Indicates that all input has been consumed and all output bytes have
+    /// been written. Decompression/compression should not be called again.
+    ///
+    /// For decompression with zlib streams the adler-32 of the decompressed
+    /// data has also been verified.
+    StreamEnd,
+}
+
+impl Compress {
+    /// Creates a new object ready for compressing data that it's given.
+    ///
+    /// The `level` argument here indicates what level of compression is going
+    /// to be performed, and the `zlib_header` argument indicates whether the
+    /// output data should have a zlib header or not.
+    pub fn new(level: Compression, zlib_header: bool) -> Compress {
+        unsafe {
+            let mut state = ffi::StreamWrapper::default();
+            let ret = ffi::mz_deflateInit2(&mut *state,
+                                           level as c_int,
+                                           ffi::MZ_DEFLATED,
+                                           if zlib_header {
+                                               ffi::MZ_DEFAULT_WINDOW_BITS
+                                           } else {
+                                               -ffi::MZ_DEFAULT_WINDOW_BITS
+                                           },
+                                           9,
+                                           ffi::MZ_DEFAULT_STRATEGY);
+            debug_assert_eq!(ret, 0);
+            Compress {
+                inner: Stream {
+                    stream_wrapper: state,
+                    total_in: 0,
+                    total_out: 0,
+                    _marker: marker::PhantomData,
+                },
+            }
+        }
+    }
+
+    /// Returns the total number of input bytes which have been processed by
+    /// this compression object.
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in
+    }
+
+    /// Returns the total number of output bytes which have been produced by
+    /// this compression object.
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out
+    }
+
+    /// Quickly resets this compressor without having to reallocate anything.
+    ///
+    /// This is equivalent to dropping this object and then creating a new one.
+    pub fn reset(&mut self) {
+        let rc = unsafe { ffi::mz_deflateReset(&mut *self.inner.stream_wrapper) };
+        assert_eq!(rc, ffi::MZ_OK);
+
+        self.inner.total_in = 0;
+        self.inner.total_out = 0;
+    }
+
+    /// Compresses the input data into the output, consuming only as much
+    /// input as needed and writing as much output as possible.
+    ///
+    /// The flush option can be any of the available flushing parameters.
+    ///
+    /// To learn how much data was consumed or how much output was produced, use
+    /// the `total_in` and `total_out` functions before/after this is called.
+    pub fn compress(&mut self,
+                    input: &[u8],
+                    output: &mut [u8],
+                    flush: Flush)
+                    -> Status {
+        let raw = &mut *self.inner.stream_wrapper;
+        raw.next_in = input.as_ptr() as *mut _;
+        raw.avail_in = input.len() as c_uint;
+        raw.next_out = output.as_mut_ptr();
+        raw.avail_out = output.len() as c_uint;
+
+        let rc = unsafe { ffi::mz_deflate(raw, flush as c_int) };
+
+        // Unfortunately the total counters provided by zlib might be only
+        // 32 bits wide and overflow while processing large amounts of data.
+        self.inner.total_in += (raw.next_in as usize -
+                                input.as_ptr() as usize) as u64;
+        self.inner.total_out += (raw.next_out as usize -
+                                 output.as_ptr() as usize) as u64;
+
+        match rc {
+            ffi::MZ_OK => Status::Ok,
+            ffi::MZ_BUF_ERROR => Status::BufError,
+            ffi::MZ_STREAM_END => Status::StreamEnd,
+            c => panic!("unknown return code: {}", c),
+        }
+    }
+
+    /// Compresses the input data into the extra space of the output, consuming
+    /// only as much input as needed and writing as much output as possible.
+    ///
+    /// This function has the same semantics as `compress`, except that the
+    /// length of `vec` is managed by this function. This will not reallocate
+    /// the vector provided or attempt to grow it, so space for the output must
+    /// be reserved in the output vector by the caller before calling this
+    /// function.
+    pub fn compress_vec(&mut self,
+                        input: &[u8],
+                        output: &mut Vec<u8>,
+                        flush: Flush)
+                        -> Status {
+        let cap = output.capacity();
+        let len = output.len();
+
+        unsafe {
+            let before = self.total_out();
+            let ret = {
+                let ptr = output.as_mut_ptr().offset(len as isize);
+                let out = slice::from_raw_parts_mut(ptr, cap - len);
+                self.compress(input, out, flush)
+            };
+            output.set_len((self.total_out() - before) as usize + len);
+            return ret
+        }
+    }
+}
+
+impl Decompress {
+    /// Creates a new object ready for decompressing data that it's given.
+    ///
+    /// The `zlib_header` argument indicates whether the input data is expected
+    /// to have a zlib header or not.
+    pub fn new(zlib_header: bool) -> Decompress {
+        unsafe {
+            let mut state = ffi::StreamWrapper::default();
+            let ret = ffi::mz_inflateInit2(&mut *state,
+                                           if zlib_header {
+                                               ffi::MZ_DEFAULT_WINDOW_BITS
+                                           } else {
+                                               -ffi::MZ_DEFAULT_WINDOW_BITS
+                                           });
+            debug_assert_eq!(ret, 0);
+            Decompress {
+                inner: Stream {
+                    stream_wrapper: state,
+                    total_in: 0,
+                    total_out: 0,
+                    _marker: marker::PhantomData,
+                },
+            }
+        }
+    }
+
+    /// Returns the total number of input bytes which have been processed by
+    /// this decompression object.
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in
+    }
+
+    /// Returns the total number of output bytes which have been produced by
+    /// this decompression object.
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out
+    }
+
+    /// Decompresses the input data into the output, consuming only as much
+    /// input as needed and writing as much output as possible.
+    ///
+    /// The flush option provided can either be `Flush::None`, `Flush::Sync`,
+    /// or `Flush::Finish`. If the first call passes `Flush::Finish` it is
+    /// assumed that the input and output buffers are both sized large enough to
+    /// decompress the entire stream in a single call.
+    ///
+    /// A flush value of `Flush::Finish` indicates that there are no more source
+    /// bytes available beside what's already in the input buffer, and the
+    /// output buffer is large enough to hold the rest of the decompressed data.
+    ///
+    /// To learn how much data was consumed or how much output was produced, use
+    /// the `total_in` and `total_out` functions before/after this is called.
+    pub fn decompress(&mut self,
+                      input: &[u8],
+                      output: &mut [u8],
+                      flush: Flush)
+                      -> Result<Status, DataError> {
+        let raw = &mut *self.inner.stream_wrapper;
+        raw.next_in = input.as_ptr() as *mut u8;
+        raw.avail_in = input.len() as c_uint;
+        raw.next_out = output.as_mut_ptr();
+        raw.avail_out = output.len() as c_uint;
+
+        let rc = unsafe { ffi::mz_inflate(raw, flush as c_int) };
+
+        // Unfortunately the total counters provided by zlib might be only
+        // 32 bits wide and overflow while processing large amounts of data.
+        self.inner.total_in += (raw.next_in as usize -
+                                input.as_ptr() as usize) as u64;
+        self.inner.total_out += (raw.next_out as usize -
+                                 output.as_ptr() as usize) as u64;
+
+        match rc {
+            ffi::MZ_DATA_ERROR |
+            ffi::MZ_STREAM_ERROR => Err(DataError(())),
+            ffi::MZ_OK => Ok(Status::Ok),
+            ffi::MZ_BUF_ERROR => Ok(Status::BufError),
+            ffi::MZ_STREAM_END => Ok(Status::StreamEnd),
+            c => panic!("unknown return code: {}", c),
+        }
+    }
+
+    /// Decompresses the input data into the extra space in the output vector
+    /// specified by `output`.
+    ///
+    /// This function has the same semantics as `decompress`, except that the
+    /// length of `vec` is managed by this function. This will not reallocate
+    /// the vector provided or attempt to grow it, so space for the output must
+    /// be reserved in the output vector by the caller before calling this
+    /// function.
+    pub fn decompress_vec(&mut self,
+                          input: &[u8],
+                          output: &mut Vec<u8>,
+                          flush: Flush)
+                          -> Result<Status, DataError> {
+        let cap = output.capacity();
+        let len = output.len();
+
+        unsafe {
+            let before = self.total_out();
+            let ret = {
+                let ptr = output.as_mut_ptr().offset(len as isize);
+                let out = slice::from_raw_parts_mut(ptr, cap - len);
+                self.decompress(input, out, flush)
+            };
+            output.set_len((self.total_out() - before) as usize + len);
+            return ret
+        }
+    }
+
+    /// Performs the equivalent of replacing this decompression state with a
+    /// freshly allocated copy.
+    ///
+    /// This function may not allocate memory, though, and attempts to reuse any
+    /// previously existing resources.
+    ///
+    /// The argument provided here indicates whether the reset state will
+    /// attempt to decode a zlib header first or not.
+    pub fn reset(&mut self, zlib_header: bool) {
+        self._reset(zlib_header);
+    }
+
+    #[cfg(feature = "zlib")]
+    fn _reset(&mut self, zlib_header: bool) {
+        let bits = if zlib_header {
+            ffi::MZ_DEFAULT_WINDOW_BITS
+        } else {
+            -ffi::MZ_DEFAULT_WINDOW_BITS
+        };
+        unsafe {
+            ffi::inflateReset2(&mut *self.inner.stream_wrapper, bits);
+        }
+        self.inner.total_out = 0;
+        self.inner.total_in = 0;
+    }
+
+    #[cfg(not(feature = "zlib"))]
+    fn _reset(&mut self, zlib_header: bool) {
+        *self = Decompress::new(zlib_header);
+    }
+}
+
+impl Error for DataError {
+    fn description(&self) -> &str { "deflate data error" }
+}
+
+impl From<DataError> for io::Error {
+    fn from(data: DataError) -> io::Error {
+        io::Error::new(io::ErrorKind::Other, data)
+    }
+}
+
+impl fmt::Display for DataError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.description().fmt(f)
+    }
+}
+
+impl Direction for DirCompress {
+    unsafe fn destroy(stream: *mut ffi::mz_stream) -> c_int {
+        ffi::mz_deflateEnd(stream)
+    }
+}
+impl Direction for DirDecompress {
+    unsafe fn destroy(stream: *mut ffi::mz_stream) -> c_int {
+        ffi::mz_inflateEnd(stream)
+    }
+}
+
+impl<D: Direction> Drop for Stream<D> {
+    fn drop(&mut self) {
+        unsafe {
+            let _ = D::destroy(&mut *self.stream_wrapper);
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::Write;
+
+    use write;
+    use {Compression, Decompress, Flush};
+
+    #[test]
+    fn issue51() {
+        let data = vec![
+            0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xb3, 0xc9,
+            0x28, 0xc9, 0xcd, 0xb1, 0xe3, 0xe5, 0xb2, 0xc9, 0x48, 0x4d, 0x4c, 0xb1,
+            0xb3, 0x29, 0xc9, 0x2c, 0xc9, 0x49, 0xb5, 0x33, 0x31, 0x30, 0x51, 0xf0,
+            0xcb, 0x2f, 0x51, 0x70, 0xcb, 0x2f, 0xcd, 0x4b, 0xb1, 0xd1, 0x87, 0x08,
+            0xda, 0xe8, 0x83, 0x95, 0x00, 0x95, 0x26, 0xe5, 0xa7, 0x54, 0x2a, 0x24,
+            0xa5, 0x27, 0xe7, 0xe7, 0xe4, 0x17, 0xd9, 0x2a, 0x95, 0x67, 0x64, 0x96,
+            0xa4, 0x2a, 0x81, 0x8c, 0x48, 0x4e, 0xcd, 0x2b, 0x49, 0x2d, 0xb2, 0xb3,
+            0xc9, 0x30, 0x44, 0x37, 0x01, 0x28, 0x62, 0xa3, 0x0f, 0x95, 0x06, 0xd9,
+            0x05, 0x54, 0x04, 0xe5, 0xe5, 0xa5, 0x67, 0xe6, 0x55, 0xe8, 0x1b, 0xea,
+            0x99, 0xe9, 0x19, 0x21, 0xab, 0xd0, 0x07, 0xd9, 0x01, 0x32, 0x53, 0x1f,
+            0xea, 0x3e, 0x00, 0x94, 0x85, 0xeb, 0xe4, 0xa8, 0x00, 0x00, 0x00
+        ];
+
+        let mut decoded = Vec::with_capacity(data.len()*2);
+
+        let mut d = Decompress::new(false);
+        // decompressed whole deflate stream
+        assert!(d.decompress_vec(&data[10..], &mut decoded, Flush::Finish).is_ok());
+
+        // decompress data that has nothing to do with the deflate stream (this
+        // used to panic)
+        drop(d.decompress_vec(&[0], &mut decoded, Flush::None));
+    }
+
+    #[test]
+    fn reset() {
+        let string = "hello world".as_bytes();
+        let mut zlib = Vec::new();
+        let mut deflate = Vec::new();
+
+        let comp = Compression::Default;
+        write::ZlibEncoder::new(&mut zlib, comp).write_all(string).unwrap();
+        write::DeflateEncoder::new(&mut deflate, comp).write_all(string).unwrap();
+
+        let mut dst = [0; 1024];
+        let mut decoder = Decompress::new(true);
+        decoder.decompress(&zlib, &mut dst, Flush::Finish).unwrap();
+        assert_eq!(decoder.total_out(), string.len() as u64);
+        assert!(dst.starts_with(string));
+
+        decoder.reset(false);
+        decoder.decompress(&deflate, &mut dst, Flush::Finish).unwrap();
+        assert_eq!(decoder.total_out(), string.len() as u64);
+        assert!(dst.starts_with(string));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/zio.rs
@@ -0,0 +1,197 @@
+use std::io::prelude::*;
+use std::io;
+use std::mem;
+
+use {Decompress, Compress, Status, Flush, DataError};
+
+pub struct Writer<W: Write, D: Ops> {
+    obj: Option<W>,
+    pub data: D,
+    buf: Vec<u8>,
+}
+
+pub trait Ops {
+    fn total_in(&self) -> u64;
+    fn total_out(&self) -> u64;
+    fn run(&mut self, input: &[u8], output: &mut [u8], flush: Flush)
+           -> Result<Status, DataError>;
+    fn run_vec(&mut self, input: &[u8], output: &mut Vec<u8>, flush: Flush)
+               -> Result<Status, DataError>;
+}
+
+impl Ops for Compress {
+    fn total_in(&self) -> u64 { self.total_in() }
+    fn total_out(&self) -> u64 { self.total_out() }
+    fn run(&mut self, input: &[u8], output: &mut [u8], flush: Flush)
+           -> Result<Status, DataError> {
+        Ok(self.compress(input, output, flush))
+    }
+    fn run_vec(&mut self, input: &[u8], output: &mut Vec<u8>, flush: Flush)
+               -> Result<Status, DataError> {
+        Ok(self.compress_vec(input, output, flush))
+    }
+}
+
+impl Ops for Decompress {
+    fn total_in(&self) -> u64 { self.total_in() }
+    fn total_out(&self) -> u64 { self.total_out() }
+    fn run(&mut self, input: &[u8], output: &mut [u8], flush: Flush)
+           -> Result<Status, DataError> {
+        self.decompress(input, output, flush)
+    }
+    fn run_vec(&mut self, input: &[u8], output: &mut Vec<u8>, flush: Flush)
+               -> Result<Status, DataError> {
+        self.decompress_vec(input, output, flush)
+    }
+}
+
+pub fn read<R, D>(obj: &mut R, data: &mut D, dst: &mut [u8]) -> io::Result<usize>
+    where R: BufRead, D: Ops
+{
+    loop {
+        let (read, consumed, ret, eof);
+        {
+            let input = try!(obj.fill_buf());
+            eof = input.is_empty();
+            let before_out = data.total_out();
+            let before_in = data.total_in();
+            let flush = if eof {Flush::Finish} else {Flush::None};
+            ret = data.run(input, dst, flush);
+            read = (data.total_out() - before_out) as usize;
+            consumed = (data.total_in() - before_in) as usize;
+        }
+        obj.consume(consumed);
+
+        match ret {
+            // If we haven't ready any data and we haven't hit EOF yet,
+            // then we need to keep asking for more data because if we
+            // return that 0 bytes of data have been read then it will
+            // be interpreted as EOF.
+            Ok(Status::Ok) |
+            Ok(Status::BufError) if read == 0 && !eof && dst.len() > 0 => {
+                continue
+            }
+            Ok(Status::Ok) |
+            Ok(Status::BufError) |
+            Ok(Status::StreamEnd) => return Ok(read),
+
+            Err(..) => return Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                                 "corrupt deflate stream"))
+        }
+    }
+}
+
+impl<W: Write, D: Ops> Writer<W, D> {
+    pub fn new(w: W, d: D) -> Writer<W, D> {
+        Writer {
+            obj: Some(w),
+            data: d,
+            buf: Vec::with_capacity(32 * 1024),
+        }
+    }
+
+    pub fn finish(&mut self) -> io::Result<()> {
+        loop {
+            try!(self.dump());
+
+            let before = self.data.total_out();
+            try!(self.data.run_vec(&[], &mut self.buf, Flush::Finish));
+            if before == self.data.total_out() {
+                return Ok(())
+            }
+        }
+    }
+
+    pub fn replace(&mut self, w: W) -> W {
+        self.buf.truncate(0);
+        mem::replace(self.get_mut(), w)
+    }
+
+    pub fn get_ref(&self) -> &W {
+        self.obj.as_ref().unwrap()
+    }
+
+    pub fn get_mut(&mut self) -> &mut W {
+        self.obj.as_mut().unwrap()
+    }
+
+    // Note that this should only be called if the outer object is just about
+    // to be consumed!
+    //
+    // (e.g. an implementation of `into_inner`)
+    pub fn take_inner(&mut self) -> W {
+        self.obj.take().unwrap()
+    }
+
+    pub fn is_present(&self) -> bool {
+        self.obj.is_some()
+    }
+
+    fn dump(&mut self) -> io::Result<()> {
+        // TODO: should manage this buffer not with `drain` but probably more of
+        // a deque-like strategy.
+        while self.buf.len() > 0 {
+            let n = try!(self.obj.as_mut().unwrap().write(&self.buf));
+            self.buf.drain(..n);
+        }
+        Ok(())
+    }
+}
+
+impl<W: Write, D: Ops> Write for Writer<W, D> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        // miniz isn't guaranteed to actually write any of the buffer provided,
+        // it may be in a flushing mode where it's just giving us data before
+        // we're actually giving it any data. We don't want to spuriously return
+        // `Ok(0)` when possible as it will cause calls to write_all() to fail.
+        // As a result we execute this in a loop to ensure that we try our
+        // darndest to write the data.
+        loop {
+            try!(self.dump());
+
+            let before_in = self.data.total_in();
+            let ret = self.data.run_vec(buf, &mut self.buf, Flush::None);
+            let written = (self.data.total_in() - before_in) as usize;
+
+            if buf.len() > 0 && written == 0 && ret.is_ok() {
+                continue
+            }
+            return match ret {
+                Ok(Status::Ok) |
+                Ok(Status::BufError) |
+                Ok(Status::StreamEnd) => Ok(written),
+
+                Err(..) => Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                              "corrupt deflate stream"))
+            }
+        }
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.data.run_vec(&[], &mut self.buf, Flush::Sync).unwrap();
+
+        // Unfortunately miniz doesn't actually tell us when we're done with
+        // pulling out all the data from the internal stream. To remedy this we
+        // have to continually ask the stream for more memory until it doesn't
+        // give us a chunk of memory the same size as our own internal buffer,
+        // at which point we assume it's reached the end.
+        loop {
+            try!(self.dump());
+            let before = self.data.total_out();
+            self.data.run_vec(&[], &mut self.buf, Flush::None).unwrap();
+            if before == self.data.total_out() {
+                break
+            }
+        }
+
+        self.obj.as_mut().unwrap().flush()
+    }
+}
+
+impl<W: Write, D: Ops> Drop for Writer<W, D> {
+    fn drop(&mut self) {
+        if self.obj.is_some() {
+            let _ = self.finish();
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/src/zlib.rs
@@ -0,0 +1,810 @@
+//! ZLIB compression and decompression of streams
+
+use std::io::prelude::*;
+use std::io;
+use std::mem;
+
+#[cfg(feature = "tokio")]
+use futures::Poll;
+#[cfg(feature = "tokio")]
+use tokio_io::{AsyncRead, AsyncWrite};
+
+use bufreader::BufReader;
+use zio;
+use {Compress, Decompress};
+
+/// A ZLIB encoder, or compressor.
+///
+/// This structure implements a `Write` interface and takes a stream of
+/// uncompressed data, writing the compressed data to the wrapped writer.
+pub struct EncoderWriter<W: Write> {
+    inner: zio::Writer<W, Compress>,
+}
+
+/// A ZLIB encoder, or compressor.
+///
+/// This structure implements a `Read` interface and will read uncompressed
+/// data from an underlying stream and emit a stream of compressed data.
+pub struct EncoderReader<R> {
+    inner: EncoderReaderBuf<BufReader<R>>,
+}
+
+/// A ZLIB encoder, or compressor.
+///
+/// This structure implements a `BufRead` interface and will read uncompressed
+/// data from an underlying stream and emit a stream of compressed data.
+pub struct EncoderReaderBuf<R> {
+    obj: R,
+    data: Compress,
+}
+
+/// A ZLIB decoder, or decompressor.
+///
+/// This structure implements a `Read` interface and takes a stream of
+/// compressed data as input, providing the decompressed data when read from.
+pub struct DecoderReader<R> {
+    inner: DecoderReaderBuf<BufReader<R>>,
+}
+
+/// A ZLIB decoder, or decompressor.
+///
+/// This structure implements a `BufRead` interface and takes a stream of
+/// compressed data as input, providing the decompressed data when read from.
+pub struct DecoderReaderBuf<R> {
+    obj: R,
+    data: Decompress,
+}
+
+/// A ZLIB decoder, or decompressor.
+///
+/// This structure implements a `Write` and will emit a stream of decompressed
+/// data when fed a stream of compressed data.
+pub struct DecoderWriter<W: Write> {
+    inner: zio::Writer<W, Decompress>,
+}
+
+impl<W: Write> EncoderWriter<W> {
+    /// Creates a new encoder which will write compressed data to the stream
+    /// given at the given compression level.
+    ///
+    /// When this encoder is dropped or unwrapped the final pieces of data will
+    /// be flushed.
+    pub fn new(w: W, level: ::Compression) -> EncoderWriter<W> {
+        EncoderWriter {
+            inner: zio::Writer::new(w, Compress::new(level, true)),
+        }
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.inner.get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutating the output/input state of the stream may corrupt this
+    /// object, so care must be taken when using this method.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.inner.get_mut()
+    }
+
+    /// Resets the state of this encoder entirely, swapping out the output
+    /// stream for another.
+    ///
+    /// This function will finish encoding the current stream into the current
+    /// output stream before swapping out the two output streams. If the stream
+    /// cannot be finished an error is returned.
+    ///
+    /// After the current stream has been finished, this will reset the internal
+    /// state of this encoder and replace the output stream with the one
+    /// provided, returning the previous output stream. Future data written to
+    /// this encoder will be the compressed into the stream `w` provided.
+    pub fn reset(&mut self, w: W) -> io::Result<W> {
+        try!(self.inner.finish());
+        self.inner.data.reset();
+        Ok(self.inner.replace(w))
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        self.inner.finish()
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream, close off the compressed
+    /// stream and, if successful, return the contained writer.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(mut self) -> io::Result<W> {
+        try!(self.inner.finish());
+        Ok(self.inner.take_inner())
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream and then return the contained
+    /// writer if the flush succeeded.
+    /// The compressed stream will not closed but only flushed. This
+    /// means that obtained byte array can by extended by another deflated
+    /// stream. To close the stream add the two bytes 0x3 and 0x0.
+    pub fn flush_finish(mut self) -> io::Result<W> {
+        try!(self.inner.flush());
+        Ok(self.inner.take_inner())
+    }
+
+    /// Returns the number of bytes that have been written to this compresor.
+    ///
+    /// Note that not all bytes written to this object may be accounted for,
+    /// there may still be some active buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.data.total_in()
+    }
+
+    /// Returns the number of bytes that the compressor has produced.
+    ///
+    /// Note that not all bytes may have been written yet, some may still be
+    /// buffered.
+    pub fn total_out(&self) -> u64 {
+        self.inner.data.total_out()
+    }
+}
+
+impl<W: Write> Write for EncoderWriter<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.inner.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.inner.flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for EncoderWriter<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.try_finish());
+        self.get_mut().shutdown()
+    }
+}
+
+impl<W: Read + Write> Read for EncoderWriter<W> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncRead + AsyncWrite> AsyncRead for EncoderWriter<W> {
+}
+
+impl<R: Read> EncoderReader<R> {
+    /// Creates a new encoder which will read uncompressed data from the given
+    /// stream and emit the compressed stream.
+    pub fn new(r: R, level: ::Compression) -> EncoderReader<R> {
+        EncoderReader {
+            inner: EncoderReaderBuf::new(BufReader::new(r), level),
+        }
+    }
+
+    /// Resets the state of this encoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This function will reset the internal state of this encoder and replace
+    /// the input stream with the one provided, returning the previous input
+    /// stream. Future data read from this encoder will be the compressed
+    /// version of `r`'s data.
+    ///
+    /// Note that there may be currently buffered data when this function is
+    /// called, and in that case the buffered data is discarded.
+    pub fn reset(&mut self, r: R) -> R {
+        self.inner.data.reset();
+        self.inner.obj.reset(r)
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this encoder, returning the underlying reader.
+    ///
+    /// Note that there may be buffered bytes which are not re-acquired as part
+    /// of this transition. It's recommended to only call this function after
+    /// EOF has been reached.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    /// Returns the number of bytes that have been read into this compressor.
+    ///
+    /// Note that not all bytes read from the underlying object may be accounted
+    /// for, there may still be some active buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.data.total_in()
+    }
+
+    /// Returns the number of bytes that the compressor has produced.
+    ///
+    /// Note that not all bytes may have been read yet, some may still be
+    /// buffered.
+    pub fn total_out(&self) -> u64 {
+        self.inner.data.total_out()
+    }
+}
+
+impl<R: Read> Read for EncoderReader<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead> AsyncRead for EncoderReader<R> {
+}
+
+impl<W: Read + Write> Write for EncoderReader<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + AsyncWrite> AsyncWrite for EncoderReader<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: BufRead> EncoderReaderBuf<R> {
+    /// Creates a new encoder which will read uncompressed data from the given
+    /// stream and emit the compressed stream.
+    pub fn new(r: R, level: ::Compression) -> EncoderReaderBuf<R> {
+        EncoderReaderBuf {
+            obj: r,
+            data: Compress::new(level, true),
+        }
+    }
+
+    /// Resets the state of this encoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This function will reset the internal state of this encoder and replace
+    /// the input stream with the one provided, returning the previous input
+    /// stream. Future data read from this encoder will be the compressed
+    /// version of `r`'s data.
+    pub fn reset(&mut self, r: R) -> R {
+        self.data.reset();
+        mem::replace(&mut self.obj, r)
+    }
+
+    /// Acquires a reference to the underlying reader
+    pub fn get_ref(&self) -> &R {
+        &self.obj
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.obj
+    }
+
+    /// Consumes this encoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.obj
+    }
+
+    /// Returns the number of bytes that have been read into this compressor.
+    ///
+    /// Note that not all bytes read from the underlying object may be accounted
+    /// for, there may still be some active buffering.
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+
+    /// Returns the number of bytes that the compressor has produced.
+    ///
+    /// Note that not all bytes may have been read yet, some may still be
+    /// buffered.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+}
+
+impl<R: BufRead> Read for EncoderReaderBuf<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        zio::read(&mut self.obj, &mut self.data, buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + BufRead> AsyncRead for EncoderReaderBuf<R> {
+}
+
+impl<R: BufRead + Write> Write for EncoderReaderBuf<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + BufRead> AsyncWrite for EncoderReaderBuf<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: Read> DecoderReader<R> {
+    /// Creates a new decoder which will decompress data read from the given
+    /// stream.
+    pub fn new(r: R) -> DecoderReader<R> {
+        DecoderReader::new_with_buf(r, vec![0; 32 * 1024])
+    }
+
+    /// Same as `new`, but the intermediate buffer for data is specified.
+    ///
+    /// Note that the specified buffer will only be used up to its current
+    /// length. The buffer's capacity will also not grow over time.
+    pub fn new_with_buf(r: R, buf: Vec<u8>) -> DecoderReader<R> {
+        DecoderReader {
+            inner: DecoderReaderBuf::new(BufReader::with_buf(buf, r)),
+        }
+    }
+
+    /// Resets the state of this decoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This will reset the internal state of this decoder and replace the
+    /// input stream with the one provided, returning the previous input
+    /// stream. Future data read from this decoder will be the decompressed
+    /// version of `r`'s data.
+    ///
+    /// Note that there may be currently buffered data when this function is
+    /// called, and in that case the buffered data is discarded.
+    pub fn reset(&mut self, r: R) -> R {
+        self.inner.data = Decompress::new(true);
+        self.inner.obj.reset(r)
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        self.inner.get_ref().get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        self.inner.get_mut().get_mut()
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    ///
+    /// Note that there may be buffered bytes which are not re-acquired as part
+    /// of this transition. It's recommended to only call this function after
+    /// EOF has been reached.
+    pub fn into_inner(self) -> R {
+        self.inner.into_inner().into_inner()
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed.
+    ///
+    /// Note that this will likely be smaller than what the decompressor
+    /// actually read from the underlying stream due to buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has produced.
+    pub fn total_out(&self) -> u64 {
+        self.inner.total_out()
+    }
+}
+
+impl<R: Read> Read for DecoderReader<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        self.inner.read(into)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead> AsyncRead for DecoderReader<R> {
+}
+
+impl<R: Read + Write> Write for DecoderReader<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + AsyncRead> AsyncWrite for DecoderReader<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<R: BufRead> DecoderReaderBuf<R> {
+    /// Creates a new decoder which will decompress data read from the given
+    /// stream.
+    pub fn new(r: R) -> DecoderReaderBuf<R> {
+        DecoderReaderBuf {
+            obj: r,
+            data: Decompress::new(true),
+        }
+    }
+
+    /// Resets the state of this decoder entirely, swapping out the input
+    /// stream for another.
+    ///
+    /// This will reset the internal state of this decoder and replace the
+    /// input stream with the one provided, returning the previous input
+    /// stream. Future data read from this decoder will be the decompressed
+    /// version of `r`'s data.
+    pub fn reset(&mut self, r: R) -> R {
+        self.data = Decompress::new(true);
+        mem::replace(&mut self.obj, r)
+    }
+
+    /// Acquires a reference to the underlying stream
+    pub fn get_ref(&self) -> &R {
+        &self.obj
+    }
+
+    /// Acquires a mutable reference to the underlying stream
+    ///
+    /// Note that mutation of the stream may result in surprising results if
+    /// this encoder is continued to be used.
+    pub fn get_mut(&mut self) -> &mut R {
+        &mut self.obj
+    }
+
+    /// Consumes this decoder, returning the underlying reader.
+    pub fn into_inner(self) -> R {
+        self.obj
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed.
+    ///
+    /// Note that this will likely be smaller than what the decompressor
+    /// actually read from the underlying stream due to buffering.
+    pub fn total_in(&self) -> u64 {
+        self.data.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has produced.
+    pub fn total_out(&self) -> u64 {
+        self.data.total_out()
+    }
+}
+
+impl<R: BufRead> Read for DecoderReaderBuf<R> {
+    fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
+        zio::read(&mut self.obj, &mut self.data, into)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncRead + BufRead> AsyncRead for DecoderReaderBuf<R> {
+}
+
+impl<R: BufRead + Write> Write for DecoderReaderBuf<R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.get_mut().write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.get_mut().flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<R: AsyncWrite + BufRead> AsyncWrite for DecoderReaderBuf<R> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        self.get_mut().shutdown()
+    }
+}
+
+impl<W: Write> DecoderWriter<W> {
+    /// Creates a new decoder which will write uncompressed data to the stream.
+    ///
+    /// When this decoder is dropped or unwrapped the final pieces of data will
+    /// be flushed.
+    pub fn new(w: W) -> DecoderWriter<W> {
+        DecoderWriter {
+            inner: zio::Writer::new(w, Decompress::new(true)),
+        }
+    }
+
+    /// Acquires a reference to the underlying writer.
+    pub fn get_ref(&self) -> &W {
+        self.inner.get_ref()
+    }
+
+    /// Acquires a mutable reference to the underlying writer.
+    ///
+    /// Note that mutating the output/input state of the stream may corrupt this
+    /// object, so care must be taken when using this method.
+    pub fn get_mut(&mut self) -> &mut W {
+        self.inner.get_mut()
+    }
+
+    /// Resets the state of this decoder entirely, swapping out the output
+    /// stream for another.
+    ///
+    /// This will reset the internal state of this decoder and replace the
+    /// output stream with the one provided, returning the previous output
+    /// stream. Future data written to this decoder will be decompressed into
+    /// the output stream `w`.
+    pub fn reset(&mut self, w: W) -> io::Result<W> {
+        try!(self.inner.finish());
+        self.inner.data = Decompress::new(true);
+        Ok(self.inner.replace(w))
+    }
+
+    /// Attempt to finish this output stream, writing out final chunks of data.
+    ///
+    /// Note that this function can only be used once data has finished being
+    /// written to the output stream. After this function is called then further
+    /// calls to `write` may result in a panic.
+    ///
+    /// # Panics
+    ///
+    /// Attempts to write data to this stream may result in a panic after this
+    /// function is called.
+    pub fn try_finish(&mut self) -> io::Result<()> {
+        self.inner.finish()
+    }
+
+    /// Consumes this encoder, flushing the output stream.
+    ///
+    /// This will flush the underlying data stream and then return the contained
+    /// writer if the flush succeeded.
+    ///
+    /// Note that this function may not be suitable to call in a situation where
+    /// the underlying stream is an asynchronous I/O stream. To finish a stream
+    /// the `try_finish` (or `shutdown`) method should be used instead. To
+    /// re-acquire ownership of a stream it is safe to call this method after
+    /// `try_finish` or `shutdown` has returned `Ok`.
+    pub fn finish(mut self) -> io::Result<W> {
+        try!(self.inner.finish());
+        Ok(self.inner.take_inner())
+    }
+
+    /// Returns the number of bytes that the decompressor has consumed for
+    /// decompression.
+    ///
+    /// Note that this will likely be smaller than the number of bytes
+    /// successfully written to this stream due to internal buffering.
+    pub fn total_in(&self) -> u64 {
+        self.inner.data.total_in()
+    }
+
+    /// Returns the number of bytes that the decompressor has written to its
+    /// output stream.
+    pub fn total_out(&self) -> u64 {
+        self.inner.data.total_out()
+    }
+}
+
+impl<W: Write> Write for DecoderWriter<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.inner.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.inner.flush()
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncWrite> AsyncWrite for DecoderWriter<W> {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        try_nb!(self.inner.finish());
+        self.inner.get_mut().shutdown()
+    }
+}
+
+impl<W: Read + Write> Read for DecoderWriter<W> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.inner.get_mut().read(buf)
+    }
+}
+
+#[cfg(feature = "tokio")]
+impl<W: AsyncRead + AsyncWrite> AsyncRead for DecoderWriter<W> {
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::prelude::*;
+    use std::io;
+
+    use rand::{thread_rng, Rng};
+
+    use zlib::{EncoderWriter, EncoderReader, DecoderReader, DecoderWriter};
+    use Compression::Default;
+
+    #[test]
+    fn roundtrip() {
+        let mut real = Vec::new();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        let v = thread_rng().gen_iter::<u8>().take(1024).collect::<Vec<_>>();
+        for _ in 0..200 {
+            let to_write = &v[..thread_rng().gen_range(0, v.len())];
+            real.extend(to_write.iter().map(|x| *x));
+            w.write_all(to_write).unwrap();
+        }
+        let result = w.finish().unwrap();
+        let mut r = DecoderReader::new(&result[..]);
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert!(ret == real);
+    }
+
+    #[test]
+    fn drop_writes() {
+        let mut data = Vec::new();
+        EncoderWriter::new(&mut data, Default).write_all(b"foo").unwrap();
+        let mut r = DecoderReader::new(&data[..]);
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert!(ret == b"foo");
+    }
+
+    #[test]
+    fn total_in() {
+        let mut real = Vec::new();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        let v = thread_rng().gen_iter::<u8>().take(1024).collect::<Vec<_>>();
+        for _ in 0..200 {
+            let to_write = &v[..thread_rng().gen_range(0, v.len())];
+            real.extend(to_write.iter().map(|x| *x));
+            w.write_all(to_write).unwrap();
+        }
+        let mut result = w.finish().unwrap();
+
+        let result_len = result.len();
+
+        for _ in 0..200 {
+            result.extend(v.iter().map(|x| *x));
+        }
+
+        let mut r = DecoderReader::new(&result[..]);
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert!(ret == real);
+        assert_eq!(r.total_in(), result_len as u64);
+    }
+
+    #[test]
+    fn roundtrip2() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut r = DecoderReader::new(EncoderReader::new(&v[..], Default));
+        let mut ret = Vec::new();
+        r.read_to_end(&mut ret).unwrap();
+        assert_eq!(ret, v);
+    }
+
+    #[test]
+    fn roundtrip3() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut w = EncoderWriter::new(DecoderWriter::new(Vec::new()), Default);
+        w.write_all(&v).unwrap();
+        let w = w.finish().unwrap().finish().unwrap();
+        assert!(w == v);
+    }
+
+    #[test]
+    fn reset_decoder() {
+        let v = thread_rng()
+                    .gen_iter::<u8>()
+                    .take(1024 * 1024)
+                    .collect::<Vec<_>>();
+        let mut w = EncoderWriter::new(Vec::new(), Default);
+        w.write_all(&v).unwrap();
+        let data = w.finish().unwrap();
+
+        {
+            let (mut a, mut b, mut c) = (Vec::new(), Vec::new(), Vec::new());
+            let mut r = DecoderReader::new(&data[..]);
+            r.read_to_end(&mut a).unwrap();
+            r.reset(&data);
+            r.read_to_end(&mut b).unwrap();
+
+            let mut r = DecoderReader::new(&data[..]);
+            r.read_to_end(&mut c).unwrap();
+            assert!(a == b && b == c && c == v);
+        }
+
+        {
+            let mut w = DecoderWriter::new(Vec::new());
+            w.write_all(&data).unwrap();
+            let a = w.reset(Vec::new()).unwrap();
+            w.write_all(&data).unwrap();
+            let b = w.finish().unwrap();
+
+            let mut w = DecoderWriter::new(Vec::new());
+            w.write_all(&data).unwrap();
+            let c = w.finish().unwrap();
+            assert!(a == b && b == c && c == v);
+        }
+    }
+
+    #[test]
+    fn bad_input() {
+        // regress tests: previously caused a panic on drop
+        let mut out: Vec<u8> = Vec::new();
+        let data: Vec<u8> = (0..255).cycle().take(1024).collect();
+        let mut w = DecoderWriter::new(&mut out);
+        match w.write_all(&data[..]) {
+            Ok(_) => panic!("Expected an error to be returned!"),
+            Err(e) => assert_eq!(e.kind(), io::ErrorKind::InvalidInput),
+        }
+    }
+
+    #[test]
+    fn qc_reader() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let mut r = DecoderReader::new(EncoderReader::new(&v[..], Default));
+            let mut v2 = Vec::new();
+            r.read_to_end(&mut v2).unwrap();
+            v == v2
+        }
+    }
+
+    #[test]
+    fn qc_writer() {
+        ::quickcheck::quickcheck(test as fn(_) -> _);
+
+        fn test(v: Vec<u8>) -> bool {
+            let mut w = EncoderWriter::new(DecoderWriter::new(Vec::new()), Default);
+            w.write_all(&v).unwrap();
+            v == w.finish().unwrap().finish().unwrap()
+        }
+    }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..159333b032751969263eeb152e7e94782ab2cd39
GIT binary patch
literal 7128
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
LalHo10|5UIqgUPt
new file mode 100644
index 0000000000000000000000000000000000000000..f968689cce01efba445a1d33eb4a21aabf551981
GIT binary patch
literal 6766
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
Q1j6n4e^Ey!O&vM_02~uR(f|Me
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/tests/good-file.txt
@@ -0,0 +1,733 @@
+##	##
+timestep	simulated EIR	patent hosts
+0	0.136402	16855
+1	0.146872	18564
+2	0.150157	20334
+3	0.146358	22159
+4	0.136315	23655
+5	0.122354	24848
+6	0.104753	25887
+7	0.084439	26770
+8	0.06417	27238
+9	0.0450397	27349
+10	0.0295473	27274
+11	0.0184662	26909
+12	0.0110032	26324
+13	0.00634348	25513
+14	0.0036144	24469
+15	0.00208133	23383
+16	0.00122468	22345
+17	0.000752514	21342
+18	0.000545333	20416
+19	0.000546139	19657
+20	0.00054572	18806
+21	0.000545757	18015
+22	0.000545898	17349
+23	0.000546719	16594
+24	0.000547353	15955
+25	0.000547944	15374
+26	0.000547606	14765
+27	0.000594773	14212
+28	0.000969163	13677
+29	0.00168295	13180
+30	0.003059	12760
+31	0.00571599	12313
+32	0.0107918	11896
+33	0.0201943	11512
+34	0.0368013	11340
+35	0.0640629	11323
+36	0.104447	11769
+37	0.157207	12728
+38	0.216682	14261
+39	0.271159	16491
+40	0.303552	19274
+41	0.303678	22157
+42	0.271945	24875
+43	0.215445	27027
+44	0.154503	28690
+45	0.100717	30046
+46	0.0600343	30602
+47	0.0328576	30709
+48	0.016964	30315
+49	0.00841526	29310
+50	0.0040958	28058
+51	0.0019953	26662
+52	0.000986531	25259
+53	0.000545786	24049
+54	0.000546405	22966
+55	0.000546036	21933
+56	0.00054427	20953
+57	0.000542769	20057
+58	0.000541566	19304
+59	0.000541822	18477
+60	0.000541643	17695
+61	0.000541989	17002
+62	0.000769298	16391
+63	0.00150811	15805
+64	0.00295097	15172
+65	0.00566197	14690
+66	0.0105243	14206
+67	0.0186965	13791
+68	0.0313363	13470
+69	0.0490605	13377
+70	0.0711679	13631
+71	0.0953625	14209
+72	0.118026	15277
+73	0.134612	16760
+74	0.144311	18339
+75	0.146328	20124
+76	0.142936	21803
+77	0.134029	23435
+78	0.120562	24854
+79	0.103157	25880
+80	0.0834054	26597
+81	0.0632474	27226
+82	0.0447785	27294
+83	0.0295654	27169
+84	0.0184081	26803
+85	0.0109489	26265
+86	0.00631234	25375
+87	0.00359978	24306
+88	0.00206967	23260
+89	0.00122197	22225
+90	0.000751031	21277
+91	0.000544507	20295
+92	0.000543897	19417
+93	0.000543483	18623
+94	0.000542926	17837
+95	0.000542685	17070
+96	0.000542387	16424
+97	0.000541194	15838
+98	0.000540427	15177
+99	0.000540774	14608
+100	0.000588312	14066
+101	0.000959183	13499
+102	0.00166774	12979
+103	0.00303278	12545
+104	0.00567457	12067
+105	0.0107272	11712
+106	0.0200606	11368
+107	0.0364637	11207
+108	0.063339	11238
+109	0.103717	11660
+110	0.156884	12621
+111	0.217072	14151
+112	0.272311	16358
+113	0.305046	19005
+114	0.304927	21926
+115	0.272427	24662
+116	0.216478	27080
+117	0.155168	29064
+118	0.10079	30370
+119	0.0599659	30992
+120	0.0331287	30975
+121	0.017235	30317
+122	0.00860221	29455
+123	0.00419286	28172
+124	0.00203361	26809
+125	0.000998847	25476
+126	0.000551418	24230
+127	0.000551119	23106
+128	0.000552786	22147
+129	0.000553814	21183
+130	0.000553743	20280
+131	0.000554428	19423
+132	0.000555022	18598
+133	0.000555921	17864
+134	0.000556687	17187
+135	0.000789996	16527
+136	0.00154597	15870
+137	0.00302776	15226
+138	0.00581484	14685
+139	0.010812	14234
+140	0.0191832	13818
+141	0.0321572	13571
+142	0.050328	13538
+143	0.072817	13812
+144	0.0974321	14368
+145	0.120225	15436
+146	0.137418	16988
+147	0.147086	18775
+148	0.149165	20563
+149	0.144943	22223
+150	0.136631	23741
+151	0.123355	24920
+152	0.105401	25779
+153	0.0851918	26781
+154	0.0641702	27265
+155	0.0450746	27505
+156	0.0294136	27416
+157	0.0183811	27028
+158	0.0109285	26260
+159	0.00634296	25451
+160	0.00364513	24472
+161	0.0021051	23427
+162	0.00123693	22403
+163	0.000759531	21393
+164	0.000551727	20485
+165	0.000552256	19660
+166	0.000552303	18862
+167	0.000550927	18094
+168	0.000551098	17378
+169	0.000551093	16691
+170	0.000551885	16050
+171	0.000552282	15420
+172	0.000552591	14878
+173	0.00060109	14357
+174	0.000980446	13768
+175	0.00170301	13241
+176	0.003096	12745
+177	0.00579971	12294
+178	0.010976	11879
+179	0.0205422	11636
+180	0.0374515	11431
+181	0.0649916	11517
+182	0.106008	11966
+183	0.159983	12918
+184	0.221127	14484
+185	0.276503	16696
+186	0.310316	19518
+187	0.311205	22301
+188	0.276769	25047
+189	0.220506	27360
+190	0.159123	29133
+191	0.103761	30440
+192	0.0613797	31087
+193	0.033583	31037
+194	0.0173275	30555
+195	0.00861968	29617
+196	0.00419503	28292
+197	0.00203304	26944
+198	0.00100126	25569
+199	0.000553511	24349
+200	0.000554687	23257
+201	0.00055586	22204
+202	0.000555419	21176
+203	0.000556032	20316
+204	0.000555974	19509
+205	0.000556859	18746
+206	0.000556996	17978
+207	0.000557102	17288
+208	0.000790187	16672
+209	0.00154711	16057
+210	0.00303521	15449
+211	0.00584201	14915
+212	0.0108854	14397
+213	0.0193386	14010
+214	0.0324346	13730
+215	0.0507192	13674
+216	0.0736661	13874
+217	0.0987887	14515
+218	0.122411	15693
+219	0.139964	17265
+220	0.149125	18894
+221	0.151434	20662
+222	0.148067	22442
+223	0.138894	24116
+224	0.125436	25367
+225	0.107664	26360
+226	0.0865709	27044
+227	0.0655588	27428
+228	0.0459664	27714
+229	0.0301384	27687
+230	0.0186481	27262
+231	0.01103	26677
+232	0.00636957	25722
+233	0.00366188	24662
+234	0.00212213	23575
+235	0.00125358	22520
+236	0.000768665	21480
+237	0.000556393	20563
+238	0.000555892	19706
+239	0.00055534	18914
+240	0.000555027	18165
+241	0.000555062	17432
+242	0.000553766	16733
+243	0.000552984	16070
+244	0.000553634	15396
+245	0.000554286	14867
+246	0.000603759	14362
+247	0.000982974	13867
+248	0.00170532	13379
+249	0.00310471	12907
+250	0.00582577	12446
+251	0.0110122	12018
+252	0.0206284	11730
+253	0.0375835	11546
+254	0.0652192	11605
+255	0.10646	11981
+256	0.160858	12949
+257	0.223122	14478
+258	0.279678	16810
+259	0.312171	19452
+260	0.311778	22391
+261	0.276966	25204
+262	0.22251	27379
+263	0.159246	29248
+264	0.104109	30532
+265	0.0617903	30995
+266	0.0338421	31042
+267	0.0174647	30620
+268	0.00867821	29589
+269	0.00419968	28293
+270	0.00203244	26916
+271	0.00100204	25464
+272	0.000555586	24219
+273	0.000555599	23207
+274	0.00055582	22187
+275	0.00055516	21136
+276	0.000555436	20243
+277	0.000555618	19426
+278	0.000556778	18635
+279	0.000556976	17870
+280	0.000557162	17190
+281	0.0007904	16506
+282	0.00154557	15837
+283	0.00302973	15234
+284	0.00584543	14717
+285	0.0108796	14225
+286	0.0192919	13810
+287	0.032329	13605
+288	0.0505293	13536
+289	0.0733417	13760
+290	0.0982413	14378
+291	0.121477	15400
+292	0.138636	17017
+293	0.14875	18764
+294	0.150515	20516
+295	0.146372	22389
+296	0.137332	23975
+297	0.124076	25120
+298	0.106469	26137
+299	0.0862987	26973
+300	0.0650552	27584
+301	0.0456456	27741
+302	0.0300744	27565
+303	0.0187879	27212
+304	0.0112085	26432
+305	0.00648306	25501
+306	0.00370346	24466
+307	0.00213399	23472
+308	0.00125463	22415
+309	0.000765794	21427
+310	0.000552587	20533
+311	0.000553175	19632
+312	0.000553525	18831
+313	0.000554941	18119
+314	0.000556327	17336
+315	0.000556008	16721
+316	0.00055593	16086
+317	0.000556421	15516
+318	0.000557308	14918
+319	0.00060681	14402
+320	0.000990746	13849
+321	0.00172359	13355
+322	0.00313688	12902
+323	0.0058708	12425
+324	0.0110637	12087
+325	0.0206777	11743
+326	0.0376394	11531
+327	0.0656182	11582
+328	0.107414	12034
+329	0.162101	12955
+330	0.223525	14571
+331	0.279935	16842
+332	0.314601	19566
+333	0.313556	22575
+334	0.279571	25279
+335	0.221638	27642
+336	0.158038	29275
+337	0.102505	30638
+338	0.0608328	31209
+339	0.0335531	31260
+340	0.0173332	30520
+341	0.00861545	29604
+342	0.00419454	28370
+343	0.00202587	26940
+344	0.000994029	25614
+345	0.000549339	24445
+346	0.000551477	23239
+347	0.000552891	22300
+348	0.000551775	21280
+349	0.000552425	20424
+350	0.000552135	19571
+351	0.000552542	18753
+352	0.000552863	18058
+353	0.000554438	17348
+354	0.000786735	16671
+355	0.00153958	16047
+356	0.00301482	15500
+357	0.00580589	14883
+358	0.0108227	14347
+359	0.0192357	13947
+360	0.0321613	13672
+361	0.050229	13606
+362	0.0729462	13815
+363	0.0978564	14566
+364	0.120879	15674
+365	0.137663	17049
+366	0.147092	18813
+367	0.150184	20578
+368	0.146971	22245
+369	0.136769	23723
+370	0.12367	24905
+371	0.106187	25871
+372	0.0860921	26687
+373	0.0645899	27375
+374	0.0453473	27635
+375	0.0298122	27551
+376	0.0185448	27134
+377	0.0110517	26468
+378	0.00640294	25661
+379	0.00367011	24653
+380	0.00211832	23556
+381	0.00125246	22513
+382	0.00076891	21568
+383	0.000557384	20672
+384	0.000557295	19811
+385	0.000556837	18982
+386	0.000557433	18179
+387	0.000557376	17457
+388	0.000557751	16720
+389	0.000556844	16112
+390	0.000555603	15479
+391	0.000554871	14809
+392	0.00060335	14275
+393	0.000982808	13757
+394	0.00170757	13221
+395	0.00310351	12758
+396	0.0058181	12286
+397	0.010991	11906
+398	0.0205342	11557
+399	0.0373486	11393
+400	0.0647659	11487
+401	0.105589	11887
+402	0.15967	12798
+403	0.220945	14260
+404	0.277122	16477
+405	0.310108	19295
+406	0.308854	22110
+407	0.274911	24915
+408	0.218618	27273
+409	0.156618	29189
+410	0.101775	30572
+411	0.0607503	31174
+412	0.0334708	31316
+413	0.0173443	30731
+414	0.00865633	29636
+415	0.00421141	28342
+416	0.00204387	26991
+417	0.00100602	25595
+418	0.000555131	24336
+419	0.000555037	23251
+420	0.000555559	22267
+421	0.000554916	21212
+422	0.000554432	20306
+423	0.000554751	19488
+424	0.00055638	18727
+425	0.000556727	17927
+426	0.000556368	17198
+427	0.000788004	16578
+428	0.00154404	15944
+429	0.00302383	15315
+430	0.00582586	14786
+431	0.0108457	14290
+432	0.0192962	13815
+433	0.0323072	13561
+434	0.0505101	13456
+435	0.0732162	13811
+436	0.0978737	14403
+437	0.121405	15460
+438	0.138202	16993
+439	0.1482	18710
+440	0.149707	20578
+441	0.146945	22256
+442	0.137785	23713
+443	0.123767	25058
+444	0.105989	26087
+445	0.085483	26759
+446	0.0646144	27375
+447	0.0454389	27680
+448	0.0299337	27531
+449	0.018663	27041
+450	0.0111347	26416
+451	0.00644197	25614
+452	0.00369229	24666
+453	0.00211986	23647
+454	0.00124761	22650
+455	0.000769104	21642
+456	0.000558796	20693
+457	0.000559908	19746
+458	0.000559562	18952
+459	0.00056042	18100
+460	0.000559447	17401
+461	0.000557893	16756
+462	0.000557137	16148
+463	0.000557269	15504
+464	0.000557596	14974
+465	0.000606298	14408
+466	0.000987712	13909
+467	0.00171257	13402
+468	0.00311667	12891
+469	0.00584794	12433
+470	0.0110774	11980
+471	0.0207006	11713
+472	0.037673	11583
+473	0.0654988	11677
+474	0.106982	12072
+475	0.161926	12898
+476	0.224327	14548
+477	0.281709	16796
+478	0.314567	19512
+479	0.313419	22428
+480	0.278962	25186
+481	0.221864	27755
+482	0.158559	29556
+483	0.103532	30572
+484	0.0611592	31162
+485	0.0337539	31197
+486	0.0175096	30619
+487	0.00865906	29606
+488	0.00420125	28271
+489	0.00203207	26856
+490	0.00100238	25542
+491	0.000554405	24306
+492	0.00055373	23160
+493	0.0005552	22152
+494	0.000553776	21192
+495	0.000553636	20302
+496	0.000553165	19505
+497	0.000554014	18719
+498	0.00055519	17993
+499	0.000556582	17233
+500	0.000788165	16569
+501	0.00154132	15953
+502	0.00302099	15350
+503	0.00581186	14752
+504	0.0108291	14267
+505	0.0192368	13946
+506	0.0322191	13677
+507	0.0503789	13594
+508	0.0730706	13768
+509	0.0980646	14416
+510	0.121601	15634
+511	0.139046	17110
+512	0.147779	18876
+513	0.149612	20734
+514	0.145796	22414
+515	0.136936	23884
+516	0.123807	25078
+517	0.106212	26066
+518	0.0855482	26779
+519	0.0643386	27340
+520	0.0452926	27530
+521	0.0298659	27573
+522	0.0185447	27169
+523	0.0110178	26489
+524	0.00635235	25588
+525	0.00362881	24549
+526	0.00209238	23528
+527	0.00123133	22541
+528	0.000755917	21498
+529	0.000546368	20607
+530	0.000547382	19712
+531	0.000547084	18975
+532	0.000546453	18178
+533	0.000546062	17452
+534	0.000546085	16749
+535	0.000546151	16135
+536	0.000545628	15567
+537	0.000545969	14968
+538	0.000594606	14392
+539	0.000968849	13854
+540	0.00168489	13360
+541	0.00306337	12899
+542	0.00573505	12407
+543	0.0108348	12017
+544	0.02025	11713
+545	0.0368201	11517
+546	0.0639795	11556
+547	0.104882	11941
+548	0.158923	12854
+549	0.219796	14396
+550	0.275801	16733
+551	0.307622	19367
+552	0.30785	22230
+553	0.272898	24873
+554	0.217351	27152
+555	0.156138	29108
+556	0.101477	30379
+557	0.0601091	30971
+558	0.0331551	31126
+559	0.017167	30418
+560	0.00853886	29430
+561	0.00415201	28190
+562	0.00201849	26849
+563	0.000991957	25528
+564	0.000546751	24180
+565	0.00054534	23090
+566	0.000544403	22096
+567	0.00054368	21140
+568	0.000543407	20213
+569	0.000544421	19405
+570	0.000545241	18625
+571	0.000546995	17868
+572	0.000547101	17102
+573	0.00077428	16423
+574	0.00151348	15783
+575	0.00296212	15220
+576	0.00569555	14602
+577	0.0106307	14154
+578	0.0188783	13743
+579	0.0316572	13538
+580	0.0495211	13467
+581	0.0718936	13665
+582	0.0961304	14240
+583	0.119127	15341
+584	0.136233	16912
+585	0.145327	18567
+586	0.146983	20301
+587	0.143022	21953
+588	0.134931	23439
+589	0.121892	24750
+590	0.103955	25688
+591	0.0833804	26253
+592	0.0625106	26918
+593	0.0440419	27279
+594	0.0290823	27159
+595	0.0180758	26786
+596	0.0107654	26049
+597	0.00622673	25202
+598	0.00356716	24168
+599	0.00205866	23122
+600	0.00121254	22076
+601	0.000745744	21100
+602	0.000537789	20207
+603	0.000537982	19340
+604	0.000537795	18527
+605	0.000537955	17768
+606	0.000539259	17117
+607	0.00053942	16425
+608	0.000540477	15701
+609	0.000540424	15134
+610	0.000540084	14558
+611	0.00058571	14069
+612	0.00095364	13498
+613	0.00165505	13054
+614	0.00300205	12616
+615	0.00561724	12142
+616	0.0106079	11720
+617	0.0198178	11410
+618	0.0360368	11231
+619	0.0623418	11314
+620	0.101856	11688
+621	0.15376	12623
+622	0.213046	14078
+623	0.267285	16225
+624	0.299225	18856
+625	0.299517	21756
+626	0.26697	24652
+627	0.2119	27051
+628	0.151393	28925
+629	0.098869	30065
+630	0.0593653	30570
+631	0.0327177	30483
+632	0.0170081	29735
+633	0.0084493	28844
+634	0.00409333	27665
+635	0.00197466	26356
+636	0.000967996	25009
+637	0.000533137	23839
+638	0.000532992	22721
+639	0.000534258	21676
+640	0.000534251	20709
+641	0.000534556	19798
+642	0.000535287	19008
+643	0.000536214	18278
+644	0.000536647	17547
+645	0.000536556	16901
+646	0.000761043	16256
+647	0.00149108	15621
+648	0.00292808	15032
+649	0.0056527	14504
+650	0.0105421	14010
+651	0.0186823	13646
+652	0.0312164	13356
+653	0.0485643	13404
+654	0.0704061	13612
+655	0.0945219	14230
+656	0.117178	15374
+657	0.134568	16843
+658	0.144475	18492
+659	0.146915	20238
+660	0.14393	21958
+661	0.134621	23537
+662	0.121737	24773
+663	0.104744	25772
+664	0.0846226	26427
+665	0.0639754	27040
+666	0.0448457	27279
+667	0.029482	27106
+668	0.0183036	26853
+669	0.0108721	26178
+670	0.00627116	25425
+671	0.0035776	24326
+672	0.00206466	23279
+673	0.00122064	22191
+674	0.000751578	21231
+675	0.000542574	20323
+676	0.000540396	19496
+677	0.000538805	18651
+678	0.00053881	17920
+679	0.000537801	17217
+680	0.000537866	16520
+681	0.000538522	15876
+682	0.000538795	15229
+683	0.000539519	14656
+684	0.000587348	14121
+685	0.000955855	13626
+686	0.00165656	13086
+687	0.00301095	12666
+688	0.00564993	12250
+689	0.0106767	11869
+690	0.0199729	11524
+691	0.03641	11331
+692	0.0632378	11402
+693	0.103483	11788
+694	0.156399	12682
+695	0.215591	14337
+696	0.269462	16547
+697	0.303615	19239
+698	0.304506	22023
+699	0.273068	24769
+700	0.21682	27223
+701	0.154934	29029
+702	0.100495	30241
+703	0.0597382	30801
+704	0.0329221	30881
+705	0.0170591	30288
+706	0.00845353	29329
+707	0.00408176	28108
+708	0.00198037	26715
+709	0.000977102	25340
+710	0.000541566	24039
+711	0.000542333	22965
+712	0.000542417	21858
+713	0.000541182	20952
+714	0.00054038	20049
+715	0.000539725	19192
+716	0.000539603	18409
+717	0.000539754	17700
+718	0.000539679	16960
+719	0.000763508	16287
+720	0.00149327	15637
+721	0.00292609	15057
+722	0.00563308	14524
+723	0.0104893	14003
+724	0.0185874	13625
+725	0.0310985	13319
+726	0.0487417	13278
+727	0.0707124	13502
+728	0.0947795	14147
+729	0.117155	15183
+730	0.133995	16622
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/tests/gunzip.rs
@@ -0,0 +1,59 @@
+extern crate flate2;
+
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::{self, BufReader};
+use std::path::Path;
+use flate2::read::GzDecoder;
+use flate2::read::MultiGzDecoder;
+
+// test extraction of a gzipped file
+#[test]
+fn test_extract_success() {
+    let content = extract_file(Path::new("tests/good-file.gz")).unwrap();
+    let mut expected = Vec::new();
+    File::open("tests/good-file.txt").unwrap().read_to_end(&mut expected).unwrap();
+    assert!(content == expected);
+}
+//
+// test partial extraction of a multistream gzipped file
+#[test]
+fn test_extract_success_partial_multi() {
+    let content = extract_file(Path::new("tests/multi.gz")).unwrap();
+    let mut expected = String::new();
+    BufReader::new(File::open("tests/multi.txt").unwrap()).read_line(&mut expected).unwrap();
+    assert_eq!(content, expected.as_bytes());
+}
+
+// test extraction fails on a corrupt file
+#[test]
+fn test_extract_failure() {
+    let result = extract_file(Path::new("tests/corrupt-file.gz"));
+    assert_eq!(result.err().unwrap().kind(), io::ErrorKind::InvalidInput);
+}
+
+//test complete extraction of a multistream gzipped file
+#[test]
+fn test_extract_success_multi() {
+    let content = extract_file_multi(Path::new("tests/multi.gz")).unwrap();
+    let mut expected = Vec::new();
+    File::open("tests/multi.txt").unwrap().read_to_end(&mut expected).unwrap();
+    assert_eq!(content, expected);
+}
+
+// Tries to extract path into memory (assuming a .gz file).
+fn extract_file(path_compressed: &Path) -> io::Result<Vec<u8>>{
+    let mut v = Vec::new();
+    let f = try!(File::open(path_compressed));
+    try!(try!(GzDecoder::new(f)).read_to_end(&mut v));
+    Ok(v)
+}
+
+// Tries to extract path into memory (decompressing all members in case
+// of a multi member .gz file).
+fn extract_file_multi(path_compressed: &Path) -> io::Result<Vec<u8>>{
+    let mut v = Vec::new();
+    let f = try!(File::open(path_compressed));
+    try!(try!(MultiGzDecoder::new(f)).read_to_end(&mut v));
+    Ok(v)
+}
new file mode 100644
index 0000000000000000000000000000000000000000..cabc89630fe00d6a611e16fdad958ecfd479cd8d
GIT binary patch
literal 53
zc$|~(=3qED)ij)e+55DPmfk}q2CdCr$JrPd803L6C%`h=e!l0<djqBF4)C+F1Em0&
CdJd8R
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/tests/multi.txt
@@ -0,0 +1,2 @@
+first
+second
new file mode 100644
--- /dev/null
+++ b/third_party/rust/flate2/tests/tokio.rs
@@ -0,0 +1,125 @@
+#![cfg(feature = "tokio")]
+
+extern crate tokio_core;
+extern crate flate2;
+extern crate tokio_io;
+extern crate futures;
+extern crate rand;
+
+use std::thread;
+use std::net::{Shutdown, TcpListener};
+use std::io::{Read, Write};
+
+use flate2::Compression;
+use flate2::read;
+use flate2::write;
+use futures::Future;
+use rand::{Rng, thread_rng};
+use tokio_core::net::TcpStream;
+use tokio_core::reactor::Core;
+use tokio_io::AsyncRead;
+use tokio_io::io::{copy, shutdown};
+
+#[test]
+fn tcp_stream_echo_pattern() {
+    const N: u8 = 16;
+    const M: usize = 16 * 1024;
+
+    let mut core = Core::new().unwrap();
+    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
+    let addr = listener.local_addr().unwrap();
+    let t = thread::spawn(move || {
+        let a = listener.accept().unwrap().0;
+        let b = a.try_clone().unwrap();
+
+        let t = thread::spawn(move || {
+            let mut b = read::DeflateDecoder::new(b);
+            let mut buf = [0; M];
+            for i in 0..N {
+                b.read_exact(&mut buf).unwrap();
+                for byte in buf.iter() {
+                    assert_eq!(*byte, i);
+                }
+            }
+
+            assert_eq!(b.read(&mut buf).unwrap(), 0);
+        });
+
+        let mut a = write::ZlibEncoder::new(a, Compression::Default);
+        for i in 0..N {
+            let buf = [i; M];
+            a.write_all(&buf).unwrap();
+        }
+        a.finish().unwrap()
+         .shutdown(Shutdown::Write).unwrap();
+
+        t.join().unwrap();
+    });
+
+    let handle = core.handle();
+    let stream = TcpStream::connect(&addr, &handle);
+    let copy = stream.and_then(|s| {
+        let (a, b) = s.split();
+        let a = read::ZlibDecoder::new(a);
+        let b = write::DeflateEncoder::new(b, Compression::Default);
+        copy(a, b)
+    }).then(|result| {
+        let (amt, _a, b) = result.unwrap();
+        assert_eq!(amt, (N as u64) * (M as u64));
+        shutdown(b).map(|_| ())
+    });
+
+    core.run(copy).unwrap();
+    t.join().unwrap();
+}
+
+#[test]
+fn echo_random() {
+    let v = thread_rng().gen_iter::<u8>().take(1024 * 1024).collect::<Vec<_>>();
+    let mut core = Core::new().unwrap();
+    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
+    let addr = listener.local_addr().unwrap();
+    let v2 = v.clone();
+    let t = thread::spawn(move || {
+        let a = listener.accept().unwrap().0;
+        let b = a.try_clone().unwrap();
+
+        let mut v3 = v2.clone();
+        let t = thread::spawn(move || {
+            let mut b = read::DeflateDecoder::new(b);
+            let mut buf = [0; 1024];
+            while v3.len() > 0 {
+                let n = b.read(&mut buf).unwrap();
+                for (actual, expected) in buf[..n].iter().zip(&v3) {
+                    assert_eq!(*actual, *expected);
+                }
+                v3.drain(..n);
+            }
+
+            assert_eq!(b.read(&mut buf).unwrap(), 0);
+        });
+
+        let mut a = write::ZlibEncoder::new(a, Compression::Default);
+        a.write_all(&v2).unwrap();
+        a.finish().unwrap()
+         .shutdown(Shutdown::Write).unwrap();
+
+        t.join().unwrap();
+    });
+
+    let handle = core.handle();
+    let stream = TcpStream::connect(&addr, &handle);
+    let copy = stream.and_then(|s| {
+        let (a, b) = s.split();
+        let a = read::ZlibDecoder::new(a);
+        let b = write::DeflateEncoder::new(b, Compression::Default);
+        copy(a, b)
+    }).then(|result| {
+        let (amt, _a, b) = result.unwrap();
+        assert_eq!(amt, v.len() as u64);
+        shutdown(b).map(|_| ())
+    });
+
+    core.run(copy).unwrap();
+    t.join().unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"0e08f9e581bb3267d56a41d62838bdfe0dd57ac14025732284e04c399144df1d",".travis.yml":"be18ed6efd3eb179681f340007aaaa2a2fdbe859dee2088268306ca771662f82",".travis_after.sh":"8a2b7facdb728db96f856211101a6ec70d08e8a6c97e2b88b95aacc6e9d43633","Cargo.toml":"8decbc46cc24226324027edebbfa878a887f2cacb2a9b4c9e9cde101a26d05b4","LICENSE-APACHE":"7cfd738c53d61c79f07e348f622bf7707c9084237054d37fbe07788a75f5881c","LICENSE-MIT":"1bc1057abd72f06decbd02da13037adbe5e8f92a719c5032e34ac52aa0f9e62f","README.md":"0d390941cb326a4a5baf06d930285192b5a98e2967e6dec2826acd593fa9bab3","benches/parse.rs":"a4927e4c379e8859b18b40c019655f2b75c3c75977eab066586a5fedee5d6b94","src/iter.rs":"e018f14fbcdcc501218737e2bfb3c44163e42f024756a5de74e9b3ed63c64fcc","src/lib.rs":"4bdb2eaf6e47468ddce4cda0d66440a31294fb6b5fc7dd0d06c032c1281c9624"},"package":"77f756bed9ee3a83ce98774f4155b42a31b787029013f3a7d83eca714e500e21"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/.travis.yml
@@ -0,0 +1,35 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+
+sudo: false
+
+cache:
+  apt: true
+  directories:
+    - target/debug/deps
+    - target/debug/build
+
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo build --verbose --no-default-features
+  - cargo test --verbose --no-default-features
+
+notifications:
+  email: false
+
+addons:
+  apt:
+    packages:
+      - libcurl4-openssl-dev
+      - libelf-dev
+      - libdw-dev
+
+after_success: ./.travis_after.sh
+
+env:
+  global:
+    secure: VhNfac39x05yr7aAwvg973wdaFxFfg0PqApgHIKyilq0aNDacpPi94sSEjSw1Qan9R6SaAH5nXj6xMst18sCw9DCLZzXr7cboun6Zd+O4eB9Kna5veXASpIa9KH/GMZvILfDFTXnIbLDpvzzEuSS5tWIUu7elikmoZhOXXP82B4=
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/.travis_after.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+set -ev
+if [[ $TRAVIS_RUST_VERSION = stable ]]; then
+  wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz
+  tar xzf master.tar.gz
+  mkdir kcov-master/build
+  cd kcov-master/build
+  cmake ..
+  make
+  make install DESTDIR=../tmp
+  cd ../..
+  ls target/debug
+  ./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=$TRAVIS_JOB_ID --exclude-pattern=/.cargo target/kcov target/debug/httparse-*
+fi
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+
+name = "httparse"
+version = "1.2.2"
+authors = ["Sean McArthur <sean.monstar@gmail.com>"]
+license = "MIT/Apache-2.0"
+description = "A tiny, safe, speedy, zero-copy HTTP/1.x parser."
+repository = "https://github.com/seanmonstar/httparse"
+
+[features]
+default = ["std"]
+std = []
+
+[dev-dependencies]
+pico-sys = "0.0"
+
+[profile.bench]
+lto = true
+codegen-units = 1
+opt-level = 3
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/LICENSE-MIT
@@ -0,0 +1,20 @@
+Copyright (c) 2015 Sean McArthur
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/README.md
@@ -0,0 +1,35 @@
+# httparse
+
+[![Build Status](https://travis-ci.org/seanmonstar/httparse.svg?branch=master)](https://travis-ci.org/seanmonstar/httparse)
+[![Coverage Status](https://coveralls.io/repos/seanmonstar/httparse/badge.svg)](https://coveralls.io/r/seanmonstar/httparse)
+[![crates.io](http://meritbadge.herokuapp.com/httparse)](https://crates.io/crates/httparse)
+
+A push parser for the HTTP 1.x protocol. Avoids allocations. Fast.
+
+[Documentation](https://docs.rs/httparse)
+
+## Usage
+
+```rust
+let mut headers = [httparse::EMPTY_HEADER; 16];
+let mut req = httparse::Request::new(&mut headers);
+
+let buf = b"GET /index.html HTTP/1.1\r\nHost";
+assert!(try!(req.parse(buf)).is_partial());
+
+// a partial request, so we try again once we have more data
+
+let buf = b"GET /index.html HTTP/1.1\r\nHost: example.domain\r\n\r\n";
+assert!(try!(req.parse(buf)).is_complete());
+```
+
+## License
+
+Licensed under either of
+
+- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://apache.org/licenses/LICENSE-2.0)
+- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/benches/parse.rs
@@ -0,0 +1,68 @@
+#![feature(test)]
+
+extern crate pico_sys as pico;
+extern crate httparse;
+
+extern crate test;
+
+const REQ: &'static [u8] = b"\
+GET /wp-content/uploads/2010/03/hello-kitty-darth-vader-pink.jpg HTTP/1.1\r\n\
+Host: www.kittyhell.com\r\n\
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Pathtraq/0.9\r\n\
+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n\
+Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n\
+Accept-Encoding: gzip,deflate\r\n\
+Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n\
+Keep-Alive: 115\r\n\
+Connection: keep-alive\r\n\
+Cookie: wp_ozh_wsa_visits=2; wp_ozh_wsa_visit_lasttime=xxxxxxxxxx; __utma=xxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.x; __utmz=xxxxxxxxx.xxxxxxxxxx.x.x.utmccn=(referral)|utmcsr=reader.livedoor.com|utmcct=/reader/|utmcmd=referral\r\n\r\n";
+
+
+
+
+#[bench]
+fn bench_pico(b: &mut test::Bencher) {
+    use std::mem;
+
+    #[repr(C)]
+    #[derive(Clone, Copy)]
+    struct Header<'a>(&'a [u8], &'a [u8]);
+
+
+    #[repr(C)]
+    struct Headers<'a>(&'a mut [Header<'a>]);
+    let method = [0i8; 16];
+    let path = [0i8; 16];
+    let mut minor_version = 0;
+    let mut h = [Header(&[], &[]); 16];
+    let mut h_len = h.len();
+    let headers = Headers(&mut h);
+    let prev_buf_len = 0;
+
+    b.iter(|| {
+        let ret = unsafe {
+            pico::ffi::phr_parse_request(
+                REQ.as_ptr() as *const _,
+                REQ.len(),
+                &mut method.as_ptr(),
+                &mut 16,
+                &mut path.as_ptr(),
+                &mut 16,
+                &mut minor_version,
+                mem::transmute::<*mut Header, *mut pico::ffi::phr_header>(headers.0.as_mut_ptr()),
+                &mut h_len as *mut usize as *mut _,
+                prev_buf_len
+            )
+        };
+        assert_eq!(ret, REQ.len() as i32);
+    })
+}
+
+#[bench]
+fn bench_httparse(b: &mut test::Bencher) {
+    let mut headers = [httparse::Header{ name: "", value: &[] }; 16];
+    let mut req = httparse::Request::new(&mut headers);
+    b.iter(|| {
+        assert_eq!(req.parse(REQ).unwrap(), httparse::Status::Complete(REQ.len()));
+    })
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/src/iter.rs
@@ -0,0 +1,116 @@
+use core::slice;
+
+pub struct Bytes<'a> {
+    slice: &'a [u8],
+    pos: usize
+}
+
+impl<'a> Bytes<'a> {
+    #[inline]
+    pub fn new(slice: &'a [u8]) -> Bytes<'a> {
+        Bytes {
+            slice: slice,
+            pos: 0
+        }
+    }
+
+    #[inline]
+    pub fn pos(&self) -> usize {
+        self.pos
+    }
+
+    #[inline]
+    pub fn peek(&self) -> Option<u8> {
+        self.slice.get(self.pos).cloned()
+    }
+
+    #[inline]
+    pub fn bump(&mut self) {
+        self.pos += 1;
+    }
+
+    #[inline]
+    pub fn len(&self) -> usize {
+        self.slice.len()
+    }
+
+    #[inline]
+    pub fn slice(&mut self) -> &'a [u8] {
+        self.slice_skip(0)
+    }
+
+    #[inline]
+    pub fn slice_skip(&mut self, skip: usize) -> &'a [u8] {
+        debug_assert!(self.pos >= skip);
+        let head_pos = self.pos - skip;
+        unsafe {
+            let ptr = self.slice.as_ptr();
+            let head = slice::from_raw_parts(ptr, head_pos);
+            let tail = slice::from_raw_parts(ptr.offset(self.pos as isize), self.slice.len() - self.pos);
+            self.pos = 0;
+            self.slice = tail;
+            head
+        }
+    }
+
+    #[inline]
+    pub fn next_8<'b>(&'b mut self) -> Option<Bytes8<'b, 'a>> {
+        if self.slice.len() > self.pos + 8 {
+            Some(Bytes8 { bytes: self, pos: 0 })
+        } else {
+            None
+        }
+    }
+}
+
+impl<'a> Iterator for Bytes<'a> {
+    type Item = u8;
+
+    #[inline]
+    fn next(&mut self) -> Option<u8> {
+        if self.slice.len() > self.pos {
+            let b = unsafe { *self.slice.get_unchecked(self.pos) };
+            self.pos += 1;
+            Some(b)
+        } else {
+            None
+        }
+    }
+}
+
+pub struct Bytes8<'a, 'b: 'a> {
+    bytes: &'a mut Bytes<'b>,
+    pos: usize
+}
+
+macro_rules! bytes8_methods {
+    ($f:ident, $pos:expr) => {
+        #[inline]
+        pub fn $f(&mut self) -> u8 {
+            debug_assert!(self.assert_pos($pos));
+            let b = unsafe { *self.bytes.slice.get_unchecked(self.bytes.pos) };
+            self.bytes.pos += 1;
+            b
+        }
+    };
+    () => {
+        bytes8_methods!(_0, 0);
+        bytes8_methods!(_1, 1);
+        bytes8_methods!(_2, 2);
+        bytes8_methods!(_3, 3);
+        bytes8_methods!(_4, 4);
+        bytes8_methods!(_5, 5);
+        bytes8_methods!(_6, 6);
+        bytes8_methods!(_7, 7);
+    }
+}
+
+impl<'a, 'b: 'a> Bytes8<'a, 'b> {
+    bytes8_methods! {}
+
+    fn assert_pos(&mut self, pos: usize) -> bool {
+        let ret = self.pos == pos;
+        self.pos += 1;
+        ret
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/httparse/src/lib.rs
@@ -0,0 +1,946 @@
+#![cfg_attr(not(feature = "std"),  no_std)]
+#![cfg_attr(test, deny(warnings))]
+#![deny(missing_docs)]
+//! # httparse
+//!
+//! A push library for parsing HTTP/1.x requests and responses.
+//!
+//! The focus is on speed and safety. Unsafe code is used to keep parsing fast,
+//! but unsafety is contained in a submodule, with invariants enforced. The
+//! parsing internals use an `Iterator` instead of direct indexing, while
+//! skipping bounds checks.
+//!
+//! The speed is comparable to the fast picohttpparser, currently being around
+//! 1.6 times slower than pico. Improvements can be made as a `likely`
+//! intrinsic, and simd, are stabilized in rustc.
+
+#[cfg(feature = "std")] extern crate std as core;
+
+use core::{fmt, result, str, slice};
+
+use iter::Bytes;
+
+mod iter;
+
+macro_rules! next {
+    ($bytes:ident) => ({
+        match $bytes.next() {
+            Some(b) => b,
+            None => return Ok(Status::Partial)
+        }
+    })
+}
+
+macro_rules! expect {
+    ($bytes:ident.next() == $pat:pat => $ret:expr) => {
+        expect!(next!($bytes) => $pat |? $ret)
+    };
+    ($e:expr => $pat:pat |? $ret:expr) => {
+        match $e {
+            v@$pat => v,
+            _ => return $ret
+        }
+    };
+}
+
+macro_rules! complete {
+    ($e:expr) => {
+        match try!($e) {
+            Status::Complete(v) => v,
+            Status::Partial => return Ok(Status::Partial)
+        }
+    }
+}
+
+#[inline]
+fn shrink<T>(slice: &mut &mut [T], len: usize) {
+    debug_assert!(slice.len() >= len);
+    let ptr = slice.as_mut_ptr();
+    *slice = unsafe { slice::from_raw_parts_mut(ptr, len) };
+}
+
+/// Determines if byte is a token char.
+///
+/// > ```notrust
+/// > token          = 1*tchar
+/// >
+/// > tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+/// >                / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+/// >                / DIGIT / ALPHA
+/// >                ; any VCHAR, except delimiters
+/// > ```
+#[inline]
+fn is_token(b: u8) -> bool {
+    b > 0x1F && b < 0x7F
+}
+
+macro_rules! space {
+    ($bytes:ident or $err:expr) => ({
+        expect!($bytes.next() == b' ' => Err($err));
+        $bytes.slice();
+    })
+}
+
+macro_rules! newline {
+    ($bytes:ident) => ({
+        match next!($bytes) {
+            b'\r' => {
+                expect!($bytes.next() == b'\n' => Err(Error::NewLine));
+                $bytes.slice();
+            },
+            b'\n' => {
+                $bytes.slice();
+            },
+            _ => return Err(Error::NewLine)
+        }
+    })
+}
+
+/// An error in parsing.
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Error {
+    /// Invalid byte in header name.
+    HeaderName,
+    /// Invalid byte in header value.
+    HeaderValue,
+    /// Invalid byte in new line.
+    NewLine,
+    /// Invalid byte in Response status.
+    Status,
+    /// Invalid byte where token is required.
+    Token,
+    /// Parsed more headers than provided buffer can contain.
+    TooManyHeaders,
+    /// Invalid byte in HTTP version.
+    Version,
+}
+
+impl Error {
+    #[inline]
+    fn description_str(&self) -> &'static str {
+        match *self {
+            Error::HeaderName => "invalid header name",
+            Error::HeaderValue => "invalid header value",
+            Error::NewLine => "invalid new line",
+            Error::Status => "invalid response status",
+            Error::Token => "invalid token",
+            Error::TooManyHeaders => "too many headers",
+            Error::Version => "invalid HTTP version",
+        }
+    }
+}
+
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(self.description_str())
+    }
+}
+
+#[cfg(feature = "std")]
+impl std::error::Error for Error {
+    fn description(&self) -> &str {
+        self.description_str()
+    }
+}
+
+/// An error in parsing a chunk size.
+// Note: Move this into the error enum once v2.0 is released.
+#[derive(Debug, PartialEq, Eq)]
+pub struct InvalidChunkSize;
+
+impl fmt::Display for InvalidChunkSize {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str("invalid chunk size")
+    }
+}
+
+/// A Result of any parsing action.
+///
+/// If the input is invalid, an `Error` will be returned. Note that incomplete
+/// data is not considered invalid, and so will not return an error, but rather
+/// a `Ok(Status::Partial)`.
+pub type Result<T> = result::Result<Status<T>, Error>;
+
+/// The result of a successful parse pass.
+///
+/// `Complete` is used when the buffer contained the complete value.
+/// `Partial` is used when parsing did not reach the end of the expected value,
+/// but no invalid data was found.
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub enum Status<T> {
+    /// The completed result.
+    Complete(T),
+    /// A partial result.
+    Partial
+}
+
+impl<T> Status<T> {
+    /// Convenience method to check if status is complete.
+    #[inline]
+    pub fn is_complete(&self) -> bool {
+        match *self {
+            Status::Complete(..) => true,
+            Status::Partial => false
+        }
+    }
+
+    /// Convenience method to check if status is partial.
+    #[inline]
+    pub fn is_partial(&self) -> bool {
+        match *self {
+            Status::Complete(..) => false,
+            Status::Partial => true
+        }
+    }
+
+    /// Convenience method to unwrap a Complete value. Panics if the status is
+    /// `Partial`.
+    #[inline]
+    pub fn unwrap(self) -> T {
+        match self {
+            Status::Complete(t) => t,
+            Status::Partial => panic!("Tried to unwrap Status::Partial")
+        }
+    }
+}
+
+/// A parsed Request.
+///
+/// The optional values will be `None` if a parse was not complete, and did not
+/// parse the associated property. This allows you to inspect the parts that
+/// could be parsed, before reading more, in case you wish to exit early.
+///
+/// # Example
+///
+/// ```no_run
+/// let buf = b"GET /404 HTTP/1.1\r\nHost:";
+/// let mut headers = [httparse::EMPTY_HEADER; 16];
+/// let mut req = httparse::Request::new(&mut headers);
+/// let res = req.parse(buf).unwrap();
+/// if res.is_partial() {
+///     match req.path {
+///         Some(ref path) => {
+///             // check router for path.
+///             // /404 doesn't exist? we could stop parsing
+///         },
+///         None => {
+///             // must read more and parse again
+///         }
+///     }
+/// }
+/// ```
+pub struct Request<'headers, 'buf: 'headers> {
+    /// The request method, such as `GET`.
+    pub method: Option<&'buf str>,
+    /// The request path, such as `/about-us`.
+    pub path: Option<&'buf str>,
+    /// The request version, such as `HTTP/1.1`.
+    pub version: Option<u8>,
+    /// The request headers.
+    pub headers: &'headers mut [Header<'buf>]
+}
+
+impl<'h, 'b> Request<'h, 'b> {
+    /// Creates a new Request, using a slice of headers you allocate.
+    #[inline]
+    pub fn new(headers: &'h mut [Header<'b>]) -> Request<'h, 'b> {
+        Request {
+            method: None,
+            path: None,
+            version: None,
+            headers: headers,
+        }
+    }
+
+    /// Try to parse a buffer of bytes into the Request.
+    pub fn parse(&mut self, buf: &'b [u8]) -> Result<usize> {
+        let orig_len = buf.len();
+        let mut bytes = Bytes::new(buf);
+        complete!(skip_empty_lines(&mut bytes));
+        self.method = Some(complete!(parse_token(&mut bytes)));
+        self.path = Some(complete!(parse_token(&mut bytes)));
+        self.version = Some(complete!(parse_version(&mut bytes)));
+        newline!(bytes);
+
+        let len = orig_len - bytes.len();
+        let headers_len = complete!(parse_headers_iter(&mut self.headers, &mut bytes));
+
+        Ok(Status::Complete(len + headers_len))
+    }
+}
+
+#[inline]
+fn skip_empty_lines(bytes: &mut Bytes) -> Result<()> {
+    loop {
+        let b = bytes.peek();
+        match b {
+            Some(b'\r') => {
+                bytes.bump();
+                expect!(bytes.next() == b'\n' => Err(Error::NewLine));
+            },
+            Some(b'\n') => {
+                bytes.bump();
+            },
+            Some(..) => {
+                bytes.slice();
+                return Ok(Status::Complete(()));
+            },
+            None => return Ok(Status::Partial)
+        }
+    }
+}
+
+/// A parsed Response.
+///
+/// See `Request` docs for explanation of optional values.
+pub struct Response<'headers, 'buf: 'headers> {
+    /// The response version, such as `HTTP/1.1`.
+    pub version: Option<u8>,
+    /// The response code, such as `200`.
+    pub code: Option<u16>,
+    /// The response reason-phrase, such as `OK`.
+    pub reason: Option<&'buf str>,
+    /// The response headers.
+    pub headers: &'headers mut [Header<'buf>]
+}
+
+impl<'h, 'b> Response<'h, 'b> {
+    /// Creates a new `Response` using a slice of `Header`s you have allocated.
+    #[inline]
+    pub fn new(headers: &'h mut [Header<'b>]) -> Response<'h, 'b> {
+        Response {
+            version: None,
+            code: None,
+            reason: None,
+            headers: headers,
+        }
+    }
+
+    /// Try to parse a buffer of bytes into this `Response`.
+    pub fn parse(&mut self, buf: &'b [u8]) -> Result<usize> {
+        let orig_len = buf.len();
+        let mut bytes = Bytes::new(buf);
+
+        complete!(skip_empty_lines(&mut bytes));
+        self.version = Some(complete!(parse_version(&mut bytes)));
+        space!(bytes or Error::Version);
+        self.code = Some(complete!(parse_code(&mut bytes)));
+
+        // RFC7230 says there must be 'SP' and then reason-phrase, but admits
+        // its only for legacy reasons. With the reason-phrase completely
+        // optional (and preferred to be omitted) in HTTP2, we'll just
+        // handle any response that doesn't include a reason-phrase, because
+        // it's more lenient, and we don't care anyways.
+        //
+        // So, a SP means parse a reason-phrase.
+        // A newline means go to headers.
+        // Anything else we'll say is a malformed status.
+        match next!(bytes) {
+            b' ' => {
+                bytes.slice();
+                self.reason = Some(complete!(parse_reason(&mut bytes)));
+            },
+            b'\r' => {
+                expect!(bytes.next() == b'\n' => Err(Error::Status));
+                self.reason = Some("");
+            },
+            b'\n' => self.reason = Some(""),
+            _ => return Err(Error::Status),
+        }
+
+
+        let len = orig_len - bytes.len();
+        let headers_len = complete!(parse_headers_iter(&mut self.headers, &mut bytes));
+        Ok(Status::Complete(len + headers_len))
+    }
+}
+
+/// Represents a parsed header.
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub struct Header<'a> {
+    /// The name portion of a header.
+    ///
+    /// A header name must be valid ASCII-US, so it's safe to store as a `&str`.
+    pub name: &'a str,
+    /// The value portion of a header.
+    ///
+    /// While headers **should** be ASCII-US, the specification allows for
+    /// values that may not be, and so the value is stored as bytes.
+    pub value: &'a [u8],
+}
+
+/// An empty header, useful for constructing a `Header` array to pass in for
+/// parsing.
+///
+/// # Example
+///
+/// ```
+/// let headers = [httparse::EMPTY_HEADER; 64];
+/// ```
+pub const EMPTY_HEADER: Header<'static> = Header { name: "", value: b"" };
+
+#[inline]
+fn parse_version(bytes: &mut Bytes) -> Result<u8> {
+    if let Some(mut eight) = bytes.next_8() {
+        expect!(eight._0() => b'H' |? Err(Error::Version));
+        expect!(eight._1() => b'T' |? Err(Error::Version));
+        expect!(eight._2() => b'T' |? Err(Error::Version));
+        expect!(eight._3() => b'P' |? Err(Error::Version));
+        expect!(eight._4() => b'/' |? Err(Error::Version));
+        expect!(eight._5() => b'1' |? Err(Error::Version));
+        expect!(eight._6() => b'.' |? Err(Error::Version));
+        let v = match eight._7() {
+            b'0' => 0,
+            b'1' => 1,
+            _ => return Err(Error::Version)
+        };
+        Ok(Status::Complete(v))
+    } else {
+        Ok(Status::Partial)
+    }
+}
+
+/// From [RFC 7230](https://tools.ietf.org/html/rfc7230):
+///
+/// > ```notrust
+/// > reason-phrase  = *( HTAB / SP / VCHAR / obs-text )
+/// > HTAB           = %x09        ; horizontal tab
+/// > VCHAR          = %x21-7E     ; visible (printing) characters
+/// > obs-text       = %x80-FF
+/// > ```
+///
+/// > A.2.  Changes from RFC 2616
+/// >
+/// > Non-US-ASCII content in header fields and the reason phrase
+/// > has been obsoleted and made opaque (the TEXT rule was removed).
+///
+/// Note that the following implementation deliberately rejects the obsoleted (non-US-ASCII) text range.
+///
+/// The fully compliant parser should probably just return the reason-phrase as an opaque &[u8] data
+/// and leave interpretation to user or specialized helpers (akin to .display() in std::path::Path)
+#[inline]
+fn parse_reason<'a>(bytes: &mut Bytes<'a>) -> Result<&'a str> {
+    loop {
+        let b = next!(bytes);
+        if b == b'\r' {
+            expect!(bytes.next() == b'\n' => Err(Error::Status));
+            return Ok(Status::Complete(unsafe {
+                // all bytes up till `i` must have been HTAB / SP / VCHAR
+                str::from_utf8_unchecked(bytes.slice_skip(2))
+            }));
+        } else if b == b'\n' {
+            return Ok(Status::Complete(unsafe {
+                // all bytes up till `i` must have been HTAB / SP / VCHAR
+                str::from_utf8_unchecked(bytes.slice_skip(1))
+            }));
+        } else if !((b >= 0x20 && b <= 0x7E) || b == b'\t') {
+            return Err(Error::Status);
+        }
+    }
+}
+
+#[inline]
+fn parse_token<'a>(bytes: &mut Bytes<'a>) -> Result<&'a str> {
+    loop {
+        let b = next!(bytes);
+        if b == b' ' {
+            return Ok(Status::Complete(unsafe {
+                // all bytes up till `i` must have been `is_token`.
+                str::from_utf8_unchecked(bytes.slice_skip(1))
+            }));
+        } else if !is_token(b) {
+            return Err(Error::Token);
+        }
+    }
+}
+
+#[inline]
+fn parse_code(bytes: &mut Bytes) -> Result<u16> {
+    let hundreds = expect!(bytes.next() == b'0'...b'9' => Err(Error::Status));
+    let tens = expect!(bytes.next() == b'0'...b'9' => Err(Error::Status));
+    let ones = expect!(bytes.next() == b'0'...b'9' => Err(Error::Status));
+
+    Ok(Status::Complete((hundreds - b'0') as u16 * 100 +
+                        (tens - b'0') as u16 * 10 +
+                        (ones - b'0') as u16))
+}
+
+/// Parse a buffer of bytes as headers.
+///
+/// The return value, if complete and successful, includes the index of the
+/// buffer that parsing stopped at, and a sliced reference to the parsed
+/// headers. The length of the slice will be equal to the number of properly
+/// parsed headers.
+///
+/// # Example
+///
+/// ```
+/// let buf = b"Host: foo.bar\nAccept: */*\n\nblah blah";
+/// let mut headers = [httparse::EMPTY_HEADER; 4];
+/// assert_eq!(httparse::parse_headers(buf, &mut headers),
+///            Ok(httparse::Status::Complete((27, &[
+///                httparse::Header { name: "Host", value: b"foo.bar" },
+///                httparse::Header { name: "Accept", value: b"*/*" }
+///            ][..]))));
+/// ```
+pub fn parse_headers<'b: 'h, 'h>(src: &'b [u8], mut dst: &'h mut [Header<'b>])
+    -> Result<(usize, &'h [Header<'b>])> {
+    let mut iter = Bytes::new(src);
+    let pos = complete!(parse_headers_iter(&mut dst, &mut iter));
+    Ok(Status::Complete((pos, dst)))
+}
+
+#[inline]
+fn parse_headers_iter<'a, 'b>(headers: &mut &mut [Header<'a>], bytes: &'b mut Bytes<'a>)
+    -> Result<usize> {
+    let mut num_headers: usize = 0;
+    let mut count: usize = 0;
+    let mut result = Err(Error::TooManyHeaders);
+
+    {
+        let mut iter = headers.iter_mut();
+
+        'headers: loop {
+            // a newline here means the head is over!
+            let b = next!(bytes);
+            if b == b'\r' {
+                expect!(bytes.next() == b'\n' => Err(Error::NewLine));
+                result = Ok(Status::Complete(count + bytes.pos()));
+                break;
+            } else if b == b'\n' {
+                result = Ok(Status::Complete(count + bytes.pos()));
+                break;
+            } else if b == b':' || !is_token(b) {
+                return Err(Error::HeaderName);
+            }
+
+            let header = match iter.next() {
+                Some(header) => header,
+                None => break 'headers
+            };
+
+            num_headers += 1;
+            // parse header name until colon
+            loop {
+                let b = next!(bytes);
+                if b == b':' {
+                    count += bytes.pos();
+                    header.name = unsafe {
+                        str::from_utf8_unchecked(bytes.slice_skip(1))
+                    };
+                    break;
+                } else if !is_token(b) {
+                    return Err(Error::HeaderName);
+                }
+            }
+
+            let mut b;
+
+            'value: loop {
+
+                // eat white space between colon and value
+                loop {
+                    b = next!(bytes);
+                    if b == b' ' || b == b'\t' {
+                        count += bytes.pos();
+                        bytes.slice();
+                        continue;
+                    } else {
+                        if !is_token(b) {
+                            if (b < 0o40 && b != 0o11) || b == 0o177 {
+                                break 'value;
+                            }
+                        }
+                        break;
+                    }
+                }
+
+                // parse value till EOL
+
+
+
+                macro_rules! check {
+                    ($bytes:ident, $i:ident) => ({
+                        b = $bytes.$i();
+                        if !is_token(b) {
+                            if (b < 0o40 && b != 0o11) || b == 0o177 {
+                                break 'value;
+                            }
+                        }
+                    });
+                    ($bytes:ident) => ({
+                        check!($bytes, _0);
+                        check!($bytes, _1);
+                        check!($bytes, _2);
+                        check!($bytes, _3);
+                        check!($bytes, _4);
+                        check!($bytes, _5);
+                        check!($bytes, _6);
+                        check!($bytes, _7);
+                    })
+                }
+                while let Some(mut bytes8) = bytes.next_8() {
+                    check!(bytes8);
+                }
+                loop {
+                    b = next!(bytes);
+                    if !is_token(b) {
+                        if (b < 0o40 && b != 0o11) || b == 0o177 {
+                            break 'value;
+                        }
+                    }
+                }
+            }
+
+            //found_ctl
+            if b == b'\r' {
+                expect!(bytes.next() == b'\n' => Err(Error::HeaderValue));
+                count += bytes.pos();
+                header.value = bytes.slice_skip(2);
+            } else if b == b'\n' {
+                count += bytes.pos();
+                header.value = bytes.slice_skip(1);
+            } else {
+                return Err(Error::HeaderValue);
+            }
+
+        }
+    } // drop iter
+
+    shrink(headers, num_headers);
+    result
+}
+
+/// Parse a buffer of bytes as a chunk size.
+///
+/// The return value, if complete and successful, includes the index of the
+/// buffer that parsing stopped at, and the size of the following chunk.
+///
+/// # Example
+///
+/// ```
+/// let buf = b"4\r\nRust\r\n0\r\n\r\n";
+/// assert_eq!(httparse::parse_chunk_size(buf),
+///            Ok(httparse::Status::Complete((3, 4))));
+/// ```
+pub fn parse_chunk_size(buf: &[u8])
+        -> result::Result<Status<(usize, u64)>, InvalidChunkSize> {
+    const RADIX: u64 = 16;
+    let mut bytes = Bytes::new(buf);
+    let mut size = 0;
+    let mut in_chunk_size = true;
+    let mut in_ext = false;
+    let mut count = 0;
+    loop {
+        let b = next!(bytes);
+        match b {
+            b'0'...b'9' if in_chunk_size => {
+                if count > 15 {
+                    return Err(InvalidChunkSize);
+                }
+                count += 1;
+                size *= RADIX;
+                size += (b - b'0') as u64;
+            },
+            b'a'...b'f' if in_chunk_size => {
+                if count > 15 {
+                    return Err(InvalidChunkSize);
+                }
+                count += 1;
+                size *= RADIX;
+                size += (b + 10 - b'a') as u64;
+            }
+            b'A'...b'F' if in_chunk_size => {
+                if count > 15 {
+                    return Err(InvalidChunkSize);
+                }
+                count += 1;
+                size *= RADIX;
+                size += (b + 10 - b'A') as u64;
+            }
+            b'\r' => {
+                match next!(bytes) {
+                    b'\n' => break,
+                    _ => return Err(InvalidChunkSize),
+                }
+            }
+            // If we weren't in the extension yet, the ";" signals its start
+            b';' if !in_ext => {
+                in_ext = true;
+                in_chunk_size = false;
+            }
+            // "Linear white space" is ignored between the chunk size and the
+            // extension separator token (";") due to the "implied *LWS rule".
+            b'\t' | b' ' if !in_ext & !in_chunk_size => {}
+            // LWS can follow the chunk size, but no more digits can come
+            b'\t' | b' ' if in_chunk_size => in_chunk_size = false,
+            // We allow any arbitrary octet once we are in the extension, since
+            // they all get ignored anyway. According to the HTTP spec, valid
+            // extensions would have a more strict syntax:
+            //     (token ["=" (token | quoted-string)])
+            // but we gain nothing by rejecting an otherwise valid chunk size.
+            _ if in_ext => {}
+            // Finally, if we aren't in the extension and we're reading any
+            // other octet, the chunk size line is invalid!
+            _ => return Err(InvalidChunkSize),
+        }
+    }
+    Ok(Status::Complete((bytes.pos(), size)))
+}
+
+#[cfg(test)]
+mod tests {
+    use super::{Request, Response, Status, EMPTY_HEADER, shrink, parse_chunk_size};
+
+    const NUM_OF_HEADERS: usize = 4;
+
+    #[test]
+    fn test_shrink() {
+        let mut arr = [EMPTY_HEADER; 16];
+        {
+            let slice = &mut &mut arr[..];
+            assert_eq!(slice.len(), 16);
+            shrink(slice, 4);
+            assert_eq!(slice.len(), 4);
+        }
+        assert_eq!(arr.len(), 16);
+    }
+
+    macro_rules! req {
+        ($name:ident, $buf:expr, |$arg:ident| $body:expr) => (
+            req! {$name, $buf, Ok(Status::Complete($buf.len())), |$arg| $body }
+        );
+        ($name:ident, $buf:expr, $len:expr, |$arg:ident| $body:expr) => (
+        #[test]
+        fn $name() {
+            let mut headers = [EMPTY_HEADER; NUM_OF_HEADERS];
+            let mut req = Request::new(&mut headers[..]);
+            let status = req.parse($buf.as_ref());
+            assert_eq!(status, $len);
+            closure(req);
+
+            fn closure($arg: Request) {
+                $body
+            }
+        }
+        )
+    }
+
+    req! {
+        test_request_simple,
+        b"GET / HTTP/1.1\r\n\r\n",
+        |req| {
+            assert_eq!(req.method.unwrap(), "GET");
+            assert_eq!(req.path.unwrap(), "/");
+            assert_eq!(req.version.unwrap(), 1);
+            assert_eq!(req.headers.len(), 0);
+        }
+    }
+
+    req! {
+        test_request_headers,
+        b"GET / HTTP/1.1\r\nHost: foo.com\r\nCookie: \r\n\r\n",
+        |req| {
+            assert_eq!(req.method.unwrap(), "GET");
+            assert_eq!(req.path.unwrap(), "/");
+            assert_eq!(req.version.unwrap(), 1);
+            assert_eq!(req.headers.len(), 2);
+            assert_eq!(req.headers[0].name, "Host");
+            assert_eq!(req.headers[0].value, b"foo.com");
+            assert_eq!(req.headers[1].name, "Cookie");
+            assert_eq!(req.headers[1].value, b"");
+        }
+    }
+
+    req! {
+        test_request_headers_max,
+        b"GET / HTTP/1.1\r\nA: A\r\nB: B\r\nC: C\r\nD: D\r\n\r\n",
+        |req| {
+            assert_eq!(req.headers.len(), NUM_OF_HEADERS);
+        }
+    }
+
+    req! {
+        test_request_multibyte,
+        b"GET / HTTP/1.1\r\nHost: foo.com\r\nUser-Agent: \xe3\x81\xb2\xe3/1.0\r\n\r\n",
+        |req| {
+            assert_eq!(req.method.unwrap(), "GET");
+            assert_eq!(req.path.unwrap(), "/");
+            assert_eq!(req.version.unwrap(), 1);
+            assert_eq!(req.headers[0].name, "Host");
+            assert_eq!(req.headers[0].value, b"foo.com");
+            assert_eq!(req.headers[1].name, "User-Agent");
+            assert_eq!(req.headers[1].value, b"\xe3\x81\xb2\xe3/1.0");
+        }
+    }
+
+
+    req! {
+        test_request_partial,
+        b"GET / HTTP/1.1\r\n\r", Ok(Status::Partial),
+        |_req| {}
+    }
+
+    req! {
+        test_request_newlines,
+        b"GET / HTTP/1.1\nHost: foo.bar\n\n",
+        |_r| {}
+    }
+
+    req! {
+        test_request_empty_lines_prefix,
+        b"\r\n\r\nGET / HTTP/1.1\r\n\r\n",
+        |req| {
+            assert_eq!(req.method.unwrap(), "GET");
+            assert_eq!(req.path.unwrap(), "/");
+            assert_eq!(req.version.unwrap(), 1);
+            assert_eq!(req.headers.len(), 0);
+        }
+    }
+
+    req! {
+        test_request_empty_lines_prefix_lf_only,
+        b"\n\nGET / HTTP/1.1\n\n",
+        |req| {
+            assert_eq!(req.method.unwrap(), "GET");
+            assert_eq!(req.path.unwrap(), "/");
+            assert_eq!(req.version.unwrap(), 1);
+            assert_eq!(req.headers.len(), 0);
+        }
+    }
+
+    req! {
+        test_request_with_invalid_token_delimiter,
+        b"GET\n/ HTTP/1.1\r\nHost: foo.bar\r\n\r\n",
+        Err(::Error::Token),
+        |_r| {}
+    }
+
+    macro_rules! res {
+        ($name:ident, $buf:expr, |$arg:ident| $body:expr) => (
+            res! {$name, $buf, Ok(Status::Complete($buf.len())), |$arg| $body }
+        );
+        ($name:ident, $buf:expr, $len:expr, |$arg:ident| $body:expr) => (
+        #[test]
+        fn $name() {
+            let mut headers = [EMPTY_HEADER; NUM_OF_HEADERS];
+            let mut res = Response::new(&mut headers[..]);
+            let status = res.parse($buf.as_ref());
+            assert_eq!(status, $len);
+            closure(res);
+
+            fn closure($arg: Response) {
+                $body
+            }
+        }
+        )
+    }
+
+    res! {
+        test_response_simple,
+        b"HTTP/1.1 200 OK\r\n\r\n",
+        |res| {
+            assert_eq!(res.version.unwrap(), 1);
+            assert_eq!(res.code.unwrap(), 200);
+            assert_eq!(res.reason.unwrap(), "OK");
+        }
+    }
+
+    res! {
+        test_response_newlines,
+        b"HTTP/1.0 403 Forbidden\nServer: foo.bar\n\n",
+        |_r| {}
+    }
+
+    res! {
+        test_response_reason_missing,
+        b"HTTP/1.1 200 \r\n\r\n",
+        |res| {
+            assert_eq!(res.version.unwrap(), 1);
+            assert_eq!(res.code.unwrap(), 200);
+            assert_eq!(res.reason.unwrap(), "");
+        }
+    }
+
+    res! {
+        test_response_reason_missing_no_space,
+        b"HTTP/1.1 200\r\n\r\n",
+        |res| {
+            assert_eq!(res.version.unwrap(), 1);
+            assert_eq!(res.code.unwrap(), 200);
+            assert_eq!(res.reason.unwrap(), "");
+        }
+    }
+
+    res! {
+        test_response_reason_with_space_and_tab,
+        b"HTTP/1.1 101 Switching Protocols\t\r\n\r\n",
+        |res| {
+            assert_eq!(res.version.unwrap(), 1);
+            assert_eq!(res.code.unwrap(), 101);
+            assert_eq!(res.reason.unwrap(), "Switching Protocols\t");
+        }
+    }
+
+    static RESPONSE_REASON_WITH_OBS_TEXT_BYTE: &'static [u8] = b"HTTP/1.1 200 X\xFFZ\r\n\r\n";
+    res! {
+        test_response_reason_with_obsolete_text_byte,
+        RESPONSE_REASON_WITH_OBS_TEXT_BYTE,
+        Err(::Error::Status),
+        |_res| {}
+    }
+
+    res! {
+        test_response_reason_with_nul_byte,
+        b"HTTP/1.1 200 \x00\r\n\r\n",
+        Err(::Error::Status),
+        |_res| {}
+    }
+
+    res! {
+        test_response_version_missing_space,
+        b"HTTP/1.1",
+        Ok(Status::Partial),
+        |_res| {}
+    }
+
+    res! {
+        test_response_code_missing_space,
+        b"HTTP/1.1 200",
+        Ok(Status::Partial),
+        |_res| {}
+    }
+
+    res! {
+        test_response_empty_lines_prefix_lf_only,
+        b"\n\nHTTP/1.1 200 OK\n\n",
+        |_res| {}
+    }
+
+    #[test]
+    fn test_chunk_size() {
+        assert_eq!(parse_chunk_size(b"0\r\n"), Ok(Status::Complete((3, 0))));
+        assert_eq!(parse_chunk_size(b"12\r\nchunk"), Ok(Status::Complete((4, 18))));
+        assert_eq!(parse_chunk_size(b"3086d\r\n"), Ok(Status::Complete((7, 198765))));
+        assert_eq!(parse_chunk_size(b"3735AB1;foo bar*\r\n"), Ok(Status::Complete((18, 57891505))));
+        assert_eq!(parse_chunk_size(b"3735ab1 ; baz \r\n"), Ok(Status::Complete((16, 57891505))));
+        assert_eq!(parse_chunk_size(b"77a65\r"), Ok(Status::Partial));
+        assert_eq!(parse_chunk_size(b"ab"), Ok(Status::Partial));
+        assert_eq!(parse_chunk_size(b"567f8a\rfoo"), Err(::InvalidChunkSize));
+        assert_eq!(parse_chunk_size(b"567f8a\rfoo"), Err(::InvalidChunkSize));
+        assert_eq!(parse_chunk_size(b"567xf8a\r\n"), Err(::InvalidChunkSize));
+        assert_eq!(parse_chunk_size(b"ffffffffffffffff\r\n"), Ok(Status::Complete((18, ::core::u64::MAX))));
+        assert_eq!(parse_chunk_size(b"1ffffffffffffffff\r\n"), Err(::InvalidChunkSize));
+        assert_eq!(parse_chunk_size(b"Affffffffffffffff\r\n"), Err(::InvalidChunkSize));
+        assert_eq!(parse_chunk_size(b"fffffffffffffffff\r\n"), Err(::InvalidChunkSize));
+    }
+
+    #[cfg(feature = "std")]
+    #[test]
+    fn test_std_error() {
+        use super::Error;
+        use std::error::Error as StdError;
+        let err = Error::HeaderName;
+        assert_eq!(err.to_string(), err.description());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"fdead335b20982f9530d61f0bc2049b61af773ec712d1895a780478abbcf4dfd","LICENSE":"df9cfd06d8a44d9a671eadd39ffd97f166481da015a30f45dfd27886209c5922","build.rs":"5b349037786f2f81402943423213d8c63e8fc8e321937da85f6d854ed825a84f","src/buffer.rs":"c8c7dbbb1d848b2c08a18c38b5214bfbd8aa457557c31a9a6f1de2f5aadc3d6a","src/client/mod.rs":"adca4f6090c9806641ace04488a4b28a56e8cd60411bbd9cc856b349fdb19797","src/client/pool.rs":"7c22c8e09af9d56e05a6caaf174b78043e10171982143b8e64118d0dd401efab","src/client/proxy.rs":"0fb671fddb1c377646dc86b620b086941d56354659eace4eb387f414c345fe6b","src/client/request.rs":"c9029bbf1c27ad11d78f61e1f1175b6417eecbc3b9053c33d8c08daf61f72570","src/client/response.rs":"64fa127a3d0f5b234a921eb3be26f89021a06f03e8770f7cbe64047ec40522e5","src/error.rs":"3b3d27425118d08b1205fe7a1c91037b6ad5791cb7ccfbf53207388cb4edca1b","src/header/common/accept.rs":"d4203a24788e23fcf1ef081e9d5ab010e95d48b67532417600b6f4ff7b4a103b","src/header/common/accept_charset.rs":"f2664acc80c429c32325b4128feedc12e47357be17550821929f8002c85af214","src/header/common/accept_encoding.rs":"bea61eb5cd40564a01a0cbbd139e8b070fd8b8489c7af08de9541f607e50fbb2","src/header/common/accept_language.rs":"2e0155b85d991a0b917be1e54a9eda019597aeb4bf61cbd841fbe92f186262a3","src/header/common/accept_ranges.rs":"df351621f0753340697b0a0ceab030580c8604d6a3a5c3c3415b9fca55c04330","src/header/common/access_control_allow_credentials.rs":"c68a618d51235be37d12746fad6248c07d6c904106cd0a97be2239efab8ce941","src/header/common/access_control_allow_headers.rs":"4781e3ce4ef2ee4e90a9f775742d55751c5403b0b11539f96c9e5c76d7a3029e","src/header/common/access_control_allow_methods.rs":"0f72c4e70e74f0be8ddae576220b2cea11e2d848512e5ffb329206275908383d","src/header/common/access_control_allow_origin.rs":"933fdc7d147f7706b191ad6943b341887d9260ef7480384deb2563cd31a43cd1","src/header/common/access_control_expose_headers.rs":"f026676e762ac5c5e6ae33543ceba4e484406e89306d0b3873507814675f408a","src/header/common/access_control_max_age.rs":"1c5970cfaf15ab3ab602b215ab119f100343a7f9e4f85a6711ea21a12f369402","src/header/common/access_control_request_headers.rs":"879810240d82544c581b5057808657f9445bf823e19a990e5e88d43d28b88ce6","src/header/common/access_control_request_method.rs":"fd5bc2396dbf0977c616d7b262f2441e60d3e2806c54d0838195cdedd992e7f1","src/header/common/allow.rs":"8b12d0c7f9a76f2aec826ba80097efa784304f50e2e0ce330d8ffd810bb7dd7d","src/header/common/authorization.rs":"888cca057e0c45757ccbe31c7fdf34b9fa4b62285869e4d525f338d7003ac67c","src/header/common/cache_control.rs":"de2c876b78b83ce080007d3413a13e7770963cec49cd0202a8ffb0259185f95f","src/header/common/connection.rs":"5584948f8baae51a480ab6badf23fcb2aa2df6f3db5bd12ba09dcd08d1d01643","src/header/common/content_disposition.rs":"b6be5e65ec73113e045b73a0f69f63204942e25a3b9469f2f59c032c587e111f","src/header/common/content_encoding.rs":"636e07b326036f0d903fe7bce4e49da56dc43ed53d7dd158a906c06bd7466ad2","src/header/common/content_language.rs":"0c42bebf462b570a6dae46580685cb931feaf83b8fd6a0e89a29f7383397f393","src/header/common/content_length.rs":"c792029182c0213d4e2cc90f66210c01f164a4a8b25abadaa74ce51947ad4c76","src/header/common/content_range.rs":"5fab7832b985489b76c698654a4891aaaff6b671b7174dc25c2c4abeeb0d14eb","src/header/common/content_type.rs":"cd6db1ac9159317a467df0feebf66fa0f2e976f81aa339f3e1402110ee16cdad","src/header/common/cookie.rs":"f38e0ece0f4ddf6f5bacd7b1199aab289a5943dd1151c525970837b24fb7e59c","src/header/common/date.rs":"b3516aee3bb26ee5b2a97829ea45d6440512cbd9ef862f9e7f65a39f282e207e","src/header/common/etag.rs":"d7548c554751bb74c5ef53095cd30074e48bb39802190d8caec90621d16c6e9b","src/header/common/expect.rs":"754c5d648086429d6d9c7cebcd86d59703893d6ff904ae5de5217bb71a860496","src/header/common/expires.rs":"351a28af03596aa5ae7dbe97485ef2e717bb5567d8a5ae830e8c1968bbb236ec","src/header/common/from.rs":"05d9f1675c7d3f2caa7082fe44f5e89c3a4104af26ff21b9846443ccde0df12a","src/header/common/host.rs":"f296d9c92c0462a937636190bc3aae8a8f9e3473bd8b7cd5963870fc03686bc2","src/header/common/if_match.rs":"a0919e71b40b51e447d21fce6b9fbe779de84ae228dc4769a237a2aa34cbb201","src/header/common/if_modified_since.rs":"b722b471531740b4e200da3f53182fea6d0b750931664d233674d99f7f92767f","src/header/common/if_none_match.rs":"f810a9fc0161bd293b8ea6f18d84120d7950557c46fb07028e7351c0fbaed0fa","src/header/common/if_range.rs":"bdc77ca3c6b392aaf38c778f69756933f8a59cb946839e801508548aef891153","src/header/common/if_unmodified_since.rs":"9783ab6133cab3b38800c0049338ff697390f0915f6b7d9b81a485f028ae2dbc","src/header/common/last-event-id.rs":"e773661a46c926b2ecd93cd1a1ca5a6c361b1b8d0c9d004c9ba0bb6b96995e4a","src/header/common/last_modified.rs":"26949ae19bb17e660a3c2c967a7e066c1cc79ea987e5c5b8627a211952d18eb0","src/header/common/location.rs":"ed3482f4f806e6241d70aabbc5ce409022ab5d85aa33d7c1e8a50385aec31a7a","src/header/common/mod.rs":"2af70a911729077f2bfa4fc5da46bf9adf122426ce78ef529de9317069d28117","src/header/common/origin.rs":"c5d38d5c47494038badf85154eae5aa529821adbb8d91e04845cd1939a3acb70","src/header/common/pragma.rs":"024f6d401d6a2c363fb81afcf57dd4cfb164a7ce5a5e4dc9f9b7a95d1ea829d1","src/header/common/prefer.rs":"e680be23a4ed754e357d607a3cbdd9e00d2591fd26058f7f43f7757a86be32f5","src/header/common/preference_applied.rs":"13841597fcd9f1049fc515ea0a401975b3a0c4851c6664e9e4afcba987184680","src/header/common/range.rs":"553a3cb2ba7531418ca56f39f20a6f03b7cb07258b8a70a9ff52c224ae410e93","src/header/common/referer.rs":"e40aebce1e21a8a939df1cb331ed6ab84c37a261fde83b788be1f82710bdb2ba","src/header/common/referrer_policy.rs":"a72fd93ae042aaa5ecfe548a12b6ac07dcd8efdc375591f6f851332f4398684c","src/header/common/server.rs":"e3c7963bd341573c513bf1a1a15bbe38a78f5d8029f6783a8d679ce17969cbe0","src/header/common/set_cookie.rs":"ca02d00f2ec18b4059b1979e3f66a4fadcacacb0f9a8c7faf7a2535f7ad0d6e8","src/header/common/strict_transport_security.rs":"16d20d713979143c9a22326bffc29b31d15e51937f150888c5cdf5b844c881bb","src/header/common/transfer_encoding.rs":"0ae112334bba0b5bb64e4a67059209ed5fb8f034cd24966d63cbfff714480df1","src/header/common/upgrade.rs":"caa2777900ebbd1239a322e0f84b745b688d270fac331d86b0979fe0140cfe63","src/header/common/user_agent.rs":"3f8396206a2cad8d925d391321ebc2d7625f18ea2efcb8562958748369f83111","src/header/common/vary.rs":"ea9ca2d338f01b3a60cb7734532e8717a85c93c15eb1f4701c620fee42a5e9f5","src/header/internals/cell.rs":"0dcc63cf60ce028cf5bfabfcf3e04cb295b474174807c7ea9a97e9f6b7bfadb7","src/header/internals/item.rs":"05973f19f40deaccf9b363645cc13cf4c702c4d22ddebb5e6af9a14d592e5a24","src/header/internals/mod.rs":"a7584044f256ee1be3ba1542c7ce32263aa9d62700571430b1d723c5cf53f383","src/header/internals/vec_map.rs":"5ff364116d9864d05a8488291def3b754844c082aea4cd58d6243ddae7277ce0","src/header/mod.rs":"df6412ebd012881dc188ffff1b5c4a3a0f7f271845760fdd7ffb2d8f97a67e77","src/header/parsing.rs":"5cb02c694b2bdd16abf9b6bc6af3c01b143f01e26f60ce2fb69c6b0c0c19017f","src/header/shared/charset.rs":"71087f535a425d7d17cb3de69f1016e6602032b957d49fe121f6e56f1bf26e2f","src/header/shared/encoding.rs":"9c3b39f074bcadab68e158beea5e35d43de0c717971839d2e1ae43468d7bd7f7","src/header/shared/entity.rs":"b70b08c6511f7fd5539e4e42685423bf2f5fb3d5333fe3175e9010b890d0b654","src/header/shared/httpdate.rs":"6401ebff650228ddc457e3d4b008208254c62a478ea98367e87ffe6cbb106992","src/header/shared/mod.rs":"7216081f6253959364d9aa3abf16f17462baab48f16d174078c61c71ad023c0f","src/header/shared/quality_item.rs":"284d1b35af35d2244459f4ade87c1897a949ef047d4e784738635d558ea157b4","src/http/h1.rs":"1d607c89a390d629648a2ff38ae95059a698ad0b36b925d9c7bbad7c764c8538","src/http/message.rs":"c09939bb38c40d5a8124f5b60b8fc539aa10a11b4a46c1c3f74d097fa8ecc088","src/http/mod.rs":"9112fb2e59070d105fb361afc600f85cd6a5e21d4d007eaa821145e9b7e63f55","src/lib.rs":"0c130e83db8da5d631cb10c364b879aa0b0b7926d8025a4c874de496b87fa900","src/method.rs":"f6fbd5f697cb28f073881cca26004ea3e97638a4b0e44c6192a426b9e762e9cc","src/mock.rs":"e366916d8c55099b1b9dee5cdbe26f1f2faff6ff9d659e476cbe578263dda2c6","src/net.rs":"15d6e3c20ca97641cca8bdf80a67296823e79be28b4492b48b0f74411439a105","src/server/listener.rs":"6bd4abda51fde6e38087923dff198aef7b5bc119add2e81d59173a215c512b9d","src/server/mod.rs":"d9f8796114740b08592621d9f461eb6c7d6baf692f409ebce4f0c44588148cdd","src/server/request.rs":"ce125e73bd3b9bf8b75af94c31a85fb5a5e8d3d11f7e758ecbbd51a4b2670af0","src/server/response.rs":"7b1e40ba04f2321a62042c13723596729e69883abc4912a5371911d9a0e2a474","src/status.rs":"6c3af3f4cac43748be938bfc7c2aeabe63f32fef233d7c2a7ea7a933c7c19699","src/uri.rs":"26c357704a80d5c8ffd28123617862ffff0213613f1aec6a5758be49244379c8","src/version.rs":"e56f6962a2ae701f3923bfce0a3d150f9caea28e8880598affb723190776cd4a"},"package":"36e108e0b1fa2d17491cbaac4bc460dc0956029d10ccf83c913dd0e5db3e7f07"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/Cargo.toml
@@ -0,0 +1,44 @@
+[package]
+
+name = "hyper"
+version = "0.10.10"
+description = "A modern HTTP library."
+readme = "README.md"
+homepage = "http://hyper.rs"
+documentation = "http://hyper.rs/hyper"
+repository = "https://github.com/hyperium/hyper"
+license = "MIT"
+authors = ["Sean McArthur <sean.monstar@gmail.com>",
+           "Jonathan Reem <jonathan.reem@gmail.com>"]
+keywords = ["http", "hyper", "hyperium"]
+categories = ["web-programming::http-client", "web-programming::http-server"]
+build = "build.rs"
+
+include = [
+  "build.rs",
+  "Cargo.toml",
+  "LICENSE",
+  "src/**/*"
+]
+
+[dependencies]
+base64 = "0.5.2"
+httparse = "1.0"
+language-tags = "0.2"
+log = "0.3"
+mime = "0.2"
+num_cpus = "1.0"
+time = "0.1"
+traitobject = "0.1"
+typeable = "0.1"
+unicase = "1.0"
+url = "1.0"
+
+[dev-dependencies]
+env_logger = "0.3"
+
+[build-dependencies]
+rustc_version = "0.1"
+
+[features]
+nightly = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2014 Sean McArthur
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/build.rs
@@ -0,0 +1,7 @@
+extern crate rustc_version as rustc;
+
+fn main() {
+    if rustc::version_matches(">= 1.9") {
+        println!("cargo:rustc-cfg=has_deprecated");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/buffer.rs
@@ -0,0 +1,197 @@
+use std::cmp;
+use std::io::{self, Read, BufRead};
+
+pub struct BufReader<R> {
+    inner: R,
+    buf: Vec<u8>,
+    pos: usize,
+    cap: usize,
+}
+
+const INIT_BUFFER_SIZE: usize = 4096;
+const MAX_BUFFER_SIZE: usize = 8192 + 4096 * 100;
+
+impl<R: Read> BufReader<R> {
+    #[inline]
+    pub fn new(rdr: R) -> BufReader<R> {
+        BufReader::with_capacity(rdr, INIT_BUFFER_SIZE)
+    }
+
+    #[inline]
+    pub fn from_parts(rdr: R, buf: Vec<u8>, pos: usize, cap: usize) -> BufReader<R> {
+        BufReader {
+            inner: rdr,
+            buf: buf,
+            pos: pos,
+            cap: cap,
+        }
+    }
+
+    #[inline]
+    pub fn with_capacity(rdr: R, cap: usize) -> BufReader<R> {
+        BufReader {
+            inner: rdr,
+            buf: vec![0; cap],
+            pos: 0,
+            cap: 0,
+        }
+    }
+
+    #[inline]
+    pub fn get_ref(&self) -> &R { &self.inner }
+
+    #[inline]
+    pub fn get_mut(&mut self) -> &mut R { &mut self.inner }
+
+    #[inline]
+    pub fn get_buf(&self) -> &[u8] {
+        if self.pos < self.cap {
+            trace!("get_buf [u8; {}][{}..{}]", self.buf.len(), self.pos, self.cap);
+            &self.buf[self.pos..self.cap]
+        } else {
+            trace!("get_buf []");
+            &[]
+        }
+    }
+
+    /// Extracts the buffer from this reader. Return the current cursor position
+    /// and the position of the last valid byte.
+    ///
+    /// This operation does not copy the buffer. Instead, it directly returns
+    /// the internal buffer. As a result, this reader will no longer have any
+    /// buffered contents and any subsequent read from this reader will not
+    /// include the returned buffered contents.
+    #[inline]
+    pub fn take_buf(&mut self) -> (Vec<u8>, usize, usize) {
+        let (pos, cap) = (self.pos, self.cap);
+        self.pos = 0;
+        self.cap = 0;
+
+        let mut output = vec![0; INIT_BUFFER_SIZE];
+        ::std::mem::swap(&mut self.buf, &mut output);
+        (output, pos, cap)
+    }
+
+    #[inline]
+    pub fn into_inner(self) -> R { self.inner }
+
+    #[inline]
+    pub fn into_parts(self) -> (R, Vec<u8>, usize, usize) {
+        (self.inner, self.buf, self.pos, self.cap)
+    }
+
+    #[inline]
+    pub fn read_into_buf(&mut self) -> io::Result<usize> {
+        self.maybe_reserve();
+        let v = &mut self.buf;
+        trace!("read_into_buf buf[{}..{}]", self.cap, v.len());
+        if self.cap < v.capacity() {
+            let nread = try!(self.inner.read(&mut v[self.cap..]));
+            self.cap += nread;
+            Ok(nread)
+        } else {
+            trace!("read_into_buf at full capacity");
+            Ok(0)
+        }
+    }
+
+    #[inline]
+    fn maybe_reserve(&mut self) {
+        let cap = self.buf.capacity();
+        if self.cap == cap && cap < MAX_BUFFER_SIZE {
+            self.buf.reserve(cmp::min(cap * 4, MAX_BUFFER_SIZE) - cap);
+            let new = self.buf.capacity() - self.buf.len();
+            trace!("reserved {}", new);
+            unsafe { grow_zerofill(&mut self.buf, new) }
+        }
+    }
+}
+
+#[inline]
+unsafe fn grow_zerofill(buf: &mut Vec<u8>, additional: usize) {
+    use std::ptr;
+    let len = buf.len();
+    buf.set_len(len + additional);
+    ptr::write_bytes(buf.as_mut_ptr().offset(len as isize), 0, additional);
+}
+
+impl<R: Read> Read for BufReader<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        if self.cap == self.pos && buf.len() >= self.buf.len() {
+            return self.inner.read(buf);
+        }
+        let nread = {
+           let mut rem = try!(self.fill_buf());
+           try!(rem.read(buf))
+        };
+        self.consume(nread);
+        Ok(nread)
+    }
+}
+
+impl<R: Read> BufRead for BufReader<R> {
+    fn fill_buf(&mut self) -> io::Result<&[u8]> {
+        if self.pos == self.cap {
+            self.cap = try!(self.inner.read(&mut self.buf));
+            self.pos = 0;
+        }
+        Ok(&self.buf[self.pos..self.cap])
+    }
+
+    #[inline]
+    fn consume(&mut self, amt: usize) {
+        self.pos = cmp::min(self.pos + amt, self.cap);
+        if self.pos == self.cap {
+            self.pos = 0;
+            self.cap = 0;
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+
+    use std::io::{self, Read, BufRead};
+    use super::BufReader;
+
+    struct SlowRead(u8);
+
+    impl Read for SlowRead {
+        fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+            let state = self.0;
+            self.0 += 1;
+            (&match state % 3 {
+                0 => b"foo",
+                1 => b"bar",
+                _ => b"baz",
+            }[..]).read(buf)
+        }
+    }
+
+    #[test]
+    fn test_consume_and_get_buf() {
+        let mut rdr = BufReader::new(SlowRead(0));
+        rdr.read_into_buf().unwrap();
+        rdr.consume(1);
+        assert_eq!(rdr.get_buf(), b"oo");
+        rdr.read_into_buf().unwrap();
+        rdr.read_into_buf().unwrap();
+        assert_eq!(rdr.get_buf(), b"oobarbaz");
+        rdr.consume(5);
+        assert_eq!(rdr.get_buf(), b"baz");
+        rdr.consume(3);
+        assert_eq!(rdr.get_buf(), b"");
+        assert_eq!(rdr.pos, 0);
+        assert_eq!(rdr.cap, 0);
+    }
+
+    #[test]
+    fn test_resize() {
+        let raw = b"hello world";
+        let mut rdr = BufReader::with_capacity(&raw[..], 5);
+        rdr.read_into_buf().unwrap();
+        assert_eq!(rdr.get_buf(), b"hello");
+        rdr.read_into_buf().unwrap();
+        assert_eq!(rdr.get_buf(), b"hello world");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/client/mod.rs
@@ -0,0 +1,724 @@
+//! HTTP Client
+//!
+//! # Usage
+//!
+//! The `Client` API is designed for most people to make HTTP requests.
+//! It utilizes the lower level `Request` API.
+//!
+//! ## GET
+//!
+//! ```no_run
+//! # use hyper::Client;
+//! let client = Client::new();
+//!
+//! let res = client.get("http://example.domain").send().unwrap();
+//! assert_eq!(res.status, hyper::Ok);
+//! ```
+//!
+//! The returned value is a `Response`, which provides easy access to
+//! the `status`, the `headers`, and the response body via the `Read`
+//! trait.
+//!
+//! ## POST
+//!
+//! ```no_run
+//! # use hyper::Client;
+//! let client = Client::new();
+//!
+//! let res = client.post("http://example.domain")
+//!     .body("foo=bar")
+//!     .send()
+//!     .unwrap();
+//! assert_eq!(res.status, hyper::Ok);
+//! ```
+//!
+//! # Sync
+//!
+//! The `Client` implements `Sync`, so you can share it among multiple threads
+//! and make multiple requests simultaneously.
+//!
+//! ```no_run
+//! # use hyper::Client;
+//! use std::sync::Arc;
+//! use std::thread;
+//!
+//! // Note: an Arc is used here because `thread::spawn` creates threads that
+//! // can outlive the main thread, so we must use reference counting to keep
+//! // the Client alive long enough. Scoped threads could skip the Arc.
+//! let client = Arc::new(Client::new());
+//! let clone1 = client.clone();
+//! let clone2 = client.clone();
+//! thread::spawn(move || {
+//!     clone1.get("http://example.domain").send().unwrap();
+//! });
+//! thread::spawn(move || {
+//!     clone2.post("http://example.domain/post").body("foo=bar").send().unwrap();
+//! });
+//! ```
+use std::borrow::Cow;
+use std::default::Default;
+use std::io::{self, copy, Read};
+use std::fmt;
+
+use std::time::Duration;
+
+use url::Url;
+use url::ParseError as UrlError;
+
+use header::{Headers, Header, HeaderFormat};
+use header::{ContentLength, Host, Location};
+use method::Method;
+use net::{NetworkConnector, NetworkStream, SslClient};
+use Error;
+
+use self::proxy::{Proxy, tunnel};
+use self::scheme::Scheme;
+pub use self::pool::Pool;
+pub use self::request::Request;
+pub use self::response::Response;
+
+mod proxy;
+pub mod pool;
+pub mod request;
+pub mod response;
+
+use http::Protocol;
+use http::h1::Http11Protocol;
+
+
+/// A Client to use additional features with Requests.
+///
+/// Clients can handle things such as: redirect policy, connection pooling.
+pub struct Client {
+    protocol: Box<Protocol + Send + Sync>,
+    redirect_policy: RedirectPolicy,
+    read_timeout: Option<Duration>,
+    write_timeout: Option<Duration>,
+    proxy: Option<(Scheme, Cow<'static, str>, u16)>
+}
+
+impl fmt::Debug for Client {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.debug_struct("Client")
+           .field("redirect_policy", &self.redirect_policy)
+           .field("read_timeout", &self.read_timeout)
+           .field("write_timeout", &self.write_timeout)
+           .field("proxy", &self.proxy)
+           .finish()
+    }
+}
+
+impl Client {
+
+    /// Create a new Client.
+    pub fn new() -> Client {
+        Client::with_pool_config(Default::default())
+    }
+
+    /// Create a new Client with a configured Pool Config.
+    pub fn with_pool_config(config: pool::Config) -> Client {
+        Client::with_connector(Pool::new(config))
+    }
+
+    /// Create a Client with an HTTP proxy to a (host, port).
+    pub fn with_http_proxy<H>(host: H, port: u16) -> Client
+    where H: Into<Cow<'static, str>> {
+        let host = host.into();
+        let proxy = tunnel((Scheme::Http, host.clone(), port));
+        let mut client = Client::with_connector(Pool::with_connector(Default::default(), proxy));
+        client.proxy = Some((Scheme::Http, host, port));
+        client
+    }
+
+    /// Create a Client using a proxy with a custom connector and SSL client.
+    pub fn with_proxy_config<C, S>(proxy_config: ProxyConfig<C, S>) -> Client
+    where C: NetworkConnector + Send + Sync + 'static,
+          C::Stream: NetworkStream + Send + Clone,
+          S: SslClient<C::Stream> + Send + Sync + 'static {
+
+        let scheme = proxy_config.scheme;
+        let host = proxy_config.host;
+        let port = proxy_config.port;
+        let proxy = Proxy {
+            proxy: (scheme.clone(), host.clone(), port),
+            connector: proxy_config.connector,
+            ssl: proxy_config.ssl,
+        };
+
+        let mut client = match proxy_config.pool_config {
+            Some(pool_config) => Client::with_connector(Pool::with_connector(pool_config, proxy)),
+            None => Client::with_connector(proxy),
+        };
+        client.proxy = Some((scheme, host, port));
+        client
+    }
+
+    /// Create a new client with a specific connector.
+    pub fn with_connector<C, S>(connector: C) -> Client
+    where C: NetworkConnector<Stream=S> + Send + Sync + 'static, S: NetworkStream + Send {
+        Client::with_protocol(Http11Protocol::with_connector(connector))
+    }
+
+    /// Create a new client with a specific `Protocol`.
+    pub fn with_protocol<P: Protocol + Send + Sync + 'static>(protocol: P) -> Client {
+        Client {
+            protocol: Box::new(protocol),
+            redirect_policy: Default::default(),
+            read_timeout: None,
+            write_timeout: None,
+            proxy: None,
+        }
+    }
+
+    /// Set the RedirectPolicy.
+    pub fn set_redirect_policy(&mut self, policy: RedirectPolicy) {
+        self.redirect_policy = policy;
+    }
+
+    /// Set the read timeout value for all requests.
+    pub fn set_read_timeout(&mut self, dur: Option<Duration>) {
+        self.read_timeout = dur;
+    }
+
+    /// Set the write timeout value for all requests.
+    pub fn set_write_timeout(&mut self, dur: Option<Duration>) {
+        self.write_timeout = dur;
+    }
+
+    /// Build a Get request.
+    pub fn get<U: IntoUrl>(&self, url: U) -> RequestBuilder {
+        self.request(Method::Get, url)
+    }
+
+    /// Build a Head request.
+    pub fn head<U: IntoUrl>(&self, url: U) -> RequestBuilder {
+        self.request(Method::Head, url)
+    }
+
+    /// Build a Patch request.
+    pub fn patch<U: IntoUrl>(&self, url: U) -> RequestBuilder {
+        self.request(Method::Patch, url)
+    }
+
+    /// Build a Post request.
+    pub fn post<U: IntoUrl>(&self, url: U) -> RequestBuilder {
+        self.request(Method::Post, url)
+    }
+
+    /// Build a Put request.
+    pub fn put<U: IntoUrl>(&self, url: U) -> RequestBuilder {
+        self.request(Method::Put, url)
+    }
+
+    /// Build a Delete request.
+    pub fn delete<U: IntoUrl>(&self, url: U) -> RequestBuilder {
+        self.request(Method::Delete, url)
+    }
+
+
+    /// Build a new request using this Client.
+    pub fn request<U: IntoUrl>(&self, method: Method, url: U) -> RequestBuilder {
+        RequestBuilder {
+            client: self,
+            method: method,
+            url: url.into_url(),
+            body: None,
+            headers: None,
+        }
+    }
+}
+
+impl Default for Client {
+    fn default() -> Client { Client::new() }
+}
+
+/// Options for an individual Request.
+///
+/// One of these will be built for you if you use one of the convenience
+/// methods, such as `get()`, `post()`, etc.
+pub struct RequestBuilder<'a> {
+    client: &'a Client,
+    // We store a result here because it's good to keep RequestBuilder
+    // from being generic, but it is a nicer API to report the error
+    // from `send` (when other errors may be happening, so it already
+    // returns a `Result`). Why's it good to keep it non-generic? It
+    // stops downstream crates having to remonomorphise and recompile
+    // the code, which can take a while, since `send` is fairly large.
+    // (For an extreme example, a tiny crate containing
+    // `hyper::Client::new().get("x").send().unwrap();` took ~4s to
+    // compile with a generic RequestBuilder, but 2s with this scheme,)
+    url: Result<Url, UrlError>,
+    headers: Option<Headers>,
+    method: Method,
+    body: Option<Body<'a>>,
+}
+
+impl<'a> RequestBuilder<'a> {
+
+    /// Set a request body to be sent.
+    pub fn body<B: Into<Body<'a>>>(mut self, body: B) -> RequestBuilder<'a> {
+        self.body = Some(body.into());
+        self
+    }
+
+    /// Add additional headers to the request.
+    pub fn headers(mut self, headers: Headers) -> RequestBuilder<'a> {
+        self.headers = Some(headers);
+        self
+    }
+
+    /// Add an individual new header to the request.
+    pub fn header<H: Header + HeaderFormat>(mut self, header: H) -> RequestBuilder<'a> {
+        {
+            let mut headers = match self.headers {
+                Some(ref mut h) => h,
+                None => {
+                    self.headers = Some(Headers::new());
+                    self.headers.as_mut().unwrap()
+                }
+            };
+
+            headers.set(header);
+        }
+        self
+    }
+
+    /// Execute this request and receive a Response back.
+    pub fn send(self) -> ::Result<Response> {
+        let RequestBuilder { client, method, url, headers, body } = self;
+        let mut url = try!(url);
+        trace!("send method={:?}, url={:?}, client={:?}", method, url, client);
+
+        let can_have_body = match method {
+            Method::Get | Method::Head => false,
+            _ => true
+        };
+
+        let mut body = if can_have_body {
+            body
+        } else {
+            None
+        };
+
+        loop {
+            let mut req = {
+                let (host, port) = try!(get_host_and_port(&url));
+                let mut message = try!(client.protocol.new_message(&host, port, url.scheme()));
+                if url.scheme() == "http" && client.proxy.is_some() {
+                    message.set_proxied(true);
+                }
+
+                let mut h = Headers::new();
+                h.set(Host {
+                    hostname: host.to_owned(),
+                    port: Some(port),
+                });
+                if let Some(ref headers) = headers {
+                    h.extend(headers.iter());
+                }
+                let headers = h;
+                Request::with_headers_and_message(method.clone(), url.clone(), headers, message)
+            };
+
+            try!(req.set_write_timeout(client.write_timeout));
+            try!(req.set_read_timeout(client.read_timeout));
+
+            match (can_have_body, body.as_ref()) {
+                (true, Some(body)) => match body.size() {
+                    Some(size) => req.headers_mut().set(ContentLength(size)),
+                    None => (), // chunked, Request will add it automatically
+                },
+                (true, None) => req.headers_mut().set(ContentLength(0)),
+                _ => () // neither
+            }
+            let mut streaming = try!(req.start());
+            body.take().map(|mut rdr| copy(&mut rdr, &mut streaming));
+            let res = try!(streaming.send());
+            if !res.status.is_redirection() {
+                return Ok(res)
+            }
+            debug!("redirect code {:?} for {}", res.status, url);
+
+            let loc = {
+                // punching borrowck here
+                let loc = match res.headers.get::<Location>() {
+                    Some(&Location(ref loc)) => {
+                        Some(url.join(loc))
+                    }
+                    None => {
+                        debug!("no Location header");
+                        // could be 304 Not Modified?
+                        None
+                    }
+                };
+                match loc {
+                    Some(r) => r,
+                    None => return Ok(res)
+                }
+            };
+            url = match loc {
+                Ok(u) => u,
+                Err(e) => {
+                    debug!("Location header had invalid URI: {:?}", e);
+                    return Ok(res);
+                }
+            };
+            match client.redirect_policy {
+                // separate branches because they can't be one
+                RedirectPolicy::FollowAll => (), //continue
+                RedirectPolicy::FollowIf(cond) if cond(&url) => (), //continue
+                _ => return Ok(res),
+            }
+        }
+    }
+}
+
+/// An enum of possible body types for a Request.
+pub enum Body<'a> {
+    /// A Reader does not necessarily know it's size, so it is chunked.
+    ChunkedBody(&'a mut (Read + 'a)),
+    /// For Readers that can know their size, like a `File`.
+    SizedBody(&'a mut (Read + 'a), u64),
+    /// A String has a size, and uses Content-Length.
+    BufBody(&'a [u8] , usize),
+}
+
+impl<'a> Body<'a> {
+    fn size(&self) -> Option<u64> {
+        match *self {
+            Body::SizedBody(_, len) => Some(len),
+            Body::BufBody(_, len) => Some(len as u64),
+            _ => None
+        }
+    }
+}
+
+impl<'a> Read for Body<'a> {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match *self {
+            Body::ChunkedBody(ref mut r) => r.read(buf),
+            Body::SizedBody(ref mut r, _) => r.read(buf),
+            Body::BufBody(ref mut r, _) => Read::read(r, buf),
+        }
+    }
+}
+
+impl<'a> Into<Body<'a>> for &'a [u8] {
+    #[inline]
+    fn into(self) -> Body<'a> {
+        Body::BufBody(self, self.len())
+    }
+}
+
+impl<'a> Into<Body<'a>> for &'a str {
+    #[inline]
+    fn into(self) -> Body<'a> {
+        self.as_bytes().into()
+    }
+}
+
+impl<'a> Into<Body<'a>> for &'a String {
+    #[inline]
+    fn into(self) -> Body<'a> {
+        self.as_bytes().into()
+    }
+}
+
+impl<'a, R: Read> From<&'a mut R> for Body<'a> {
+    #[inline]
+    fn from(r: &'a mut R) -> Body<'a> {
+        Body::ChunkedBody(r)
+    }
+}
+
+/// A helper trait to convert common objects into a Url.
+pub trait IntoUrl {
+    /// Consumes the object, trying to return a Url.
+    fn into_url(self) -> Result<Url, UrlError>;
+}
+
+impl IntoUrl for Url {
+    fn into_url(self) -> Result<Url, UrlError> {
+        Ok(self)
+    }
+}
+
+impl<'a> IntoUrl for &'a str {
+    fn into_url(self) -> Result<Url, UrlError> {
+        Url::parse(self)
+    }
+}
+
+impl<'a> IntoUrl for &'a String {
+    fn into_url(self) -> Result<Url, UrlError> {
+        Url::parse(self)
+    }
+}
+
+/// Proxy server configuration with a custom connector and TLS wrapper.
+pub struct ProxyConfig<C, S>
+where C: NetworkConnector + Send + Sync + 'static,
+      C::Stream: NetworkStream + Clone + Send,
+      S: SslClient<C::Stream> + Send + Sync + 'static {
+    scheme: Scheme,
+    host: Cow<'static, str>,
+    port: u16,
+    pool_config: Option<pool::Config>,
+    connector: C,
+    ssl: S,
+}
+
+impl<C, S> ProxyConfig<C, S>
+where C: NetworkConnector + Send + Sync + 'static,
+      C::Stream: NetworkStream + Clone + Send,
+      S: SslClient<C::Stream> + Send + Sync + 'static {
+
+    /// Create a new `ProxyConfig`.
+    #[inline]
+    pub fn new<H: Into<Cow<'static, str>>>(scheme: &str, host: H, port: u16, connector: C, ssl: S) -> ProxyConfig<C, S> {
+        ProxyConfig {
+            scheme: scheme.into(),
+            host: host.into(),
+            port: port,
+            pool_config: Some(pool::Config::default()),
+            connector: connector,
+            ssl: ssl,
+        }
+    }
+
+    /// Change the `pool::Config` for the proxy.
+    ///
+    /// Passing `None` disables the `Pool`.
+    ///
+    /// The default is enabled, with the default `pool::Config`.
+    pub fn set_pool_config(&mut self, pool_config: Option<pool::Config>) {
+        self.pool_config = pool_config;
+    }
+}
+
+/// Behavior regarding how to handle redirects within a Client.
+#[derive(Copy)]
+pub enum RedirectPolicy {
+    /// Don't follow any redirects.
+    FollowNone,
+    /// Follow all redirects.
+    FollowAll,
+    /// Follow a redirect if the contained function returns true.
+    FollowIf(fn(&Url) -> bool),
+}
+
+impl fmt::Debug for RedirectPolicy {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            RedirectPolicy::FollowNone => fmt.write_str("FollowNone"),
+            RedirectPolicy::FollowAll => fmt.write_str("FollowAll"),
+            RedirectPolicy::FollowIf(_) => fmt.write_str("FollowIf"),
+        }
+    }
+}
+
+// This is a hack because of upstream typesystem issues.
+impl Clone for RedirectPolicy {
+    fn clone(&self) -> RedirectPolicy {
+        *self
+    }
+}
+
+impl Default for RedirectPolicy {
+    fn default() -> RedirectPolicy {
+        RedirectPolicy::FollowAll
+    }
+}
+
+
+fn get_host_and_port(url: &Url) -> ::Result<(&str, u16)> {
+    let host = match url.host_str() {
+        Some(host) => host,
+        None => return Err(Error::Uri(UrlError::EmptyHost)),
+    };
+    trace!("host={:?}", host);
+    let port = match url.port_or_known_default() {
+        Some(port) => port,
+        None => return Err(Error::Uri(UrlError::InvalidPort)),
+    };
+    trace!("port={:?}", port);
+    Ok((host, port))
+}
+
+mod scheme {
+
+    #[derive(Clone, PartialEq, Eq, Debug, Hash)]
+    pub enum Scheme {
+        Http,
+        Https,
+        Other(String),
+    }
+
+    impl<'a> From<&'a str> for Scheme {
+        fn from(s: &'a str) -> Scheme {
+            match s {
+                "http" => Scheme::Http,
+                "https" => Scheme::Https,
+                s => Scheme::Other(String::from(s)),
+            }
+        }
+    }
+
+    impl AsRef<str> for Scheme {
+        fn as_ref(&self) -> &str {
+            match *self {
+                Scheme::Http => "http",
+                Scheme::Https => "https",
+                Scheme::Other(ref s) => s,
+            }
+        }
+    }
+
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::Read;
+    use header::Server;
+    use http::h1::Http11Message;
+    use mock::{MockStream, MockSsl};
+    use super::{Client, RedirectPolicy};
+    use super::scheme::Scheme;
+    use super::proxy::Proxy;
+    use super::pool::Pool;
+    use url::Url;
+
+    mock_connector!(MockRedirectPolicy {
+        "http://127.0.0.1" =>       "HTTP/1.1 301 Redirect\r\n\
+                                     Location: http://127.0.0.2\r\n\
+                                     Server: mock1\r\n\
+                                     \r\n\
+                                    "
+        "http://127.0.0.2" =>       "HTTP/1.1 302 Found\r\n\
+                                     Location: https://127.0.0.3\r\n\
+                                     Server: mock2\r\n\
+                                     \r\n\
+                                    "
+        "https://127.0.0.3" =>      "HTTP/1.1 200 OK\r\n\
+                                     Server: mock3\r\n\
+                                     \r\n\
+                                    "
+    });
+
+
+    #[test]
+    fn test_proxy() {
+        use super::pool::PooledStream;
+        type MessageStream = PooledStream<super::proxy::Proxied<MockStream, MockStream>>;
+        mock_connector!(ProxyConnector {
+            b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"
+        });
+        let tunnel = Proxy {
+            connector: ProxyConnector,
+            proxy: (Scheme::Http, "example.proxy".into(), 8008),
+            ssl: MockSsl,
+        };
+        let mut client = Client::with_connector(Pool::with_connector(Default::default(), tunnel));
+        client.proxy = Some((Scheme::Http, "example.proxy".into(), 8008));
+        let mut dump = vec![];
+        client.get("http://127.0.0.1/foo/bar").send().unwrap().read_to_end(&mut dump).unwrap();
+
+        let box_message = client.protocol.new_message("127.0.0.1", 80, "http").unwrap();
+        let message = box_message.downcast::<Http11Message>().unwrap();
+        let stream =  message.into_inner().downcast::<MessageStream>().unwrap().into_inner().into_normal().unwrap();
+
+        let s = ::std::str::from_utf8(&stream.write).unwrap();
+        let request_line = "GET http://127.0.0.1/foo/bar HTTP/1.1\r\n";
+        assert!(s.starts_with(request_line), "{:?} doesn't start with {:?}", s, request_line);
+        assert!(s.contains("Host: 127.0.0.1\r\n"));
+    }
+
+    #[test]
+    fn test_proxy_tunnel() {
+        use super::pool::PooledStream;
+        type MessageStream = PooledStream<super::proxy::Proxied<MockStream, MockStream>>;
+
+        mock_connector!(ProxyConnector {
+            b"HTTP/1.1 200 OK\r\n\r\n",
+            b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"
+        });
+        let tunnel = Proxy {
+            connector: ProxyConnector,
+            proxy: (Scheme::Http, "example.proxy".into(), 8008),
+            ssl: MockSsl,
+        };
+        let mut client = Client::with_connector(Pool::with_connector(Default::default(), tunnel));
+        client.proxy = Some((Scheme::Http, "example.proxy".into(), 8008));
+        let mut dump = vec![];
+        client.get("https://127.0.0.1/foo/bar").send().unwrap().read_to_end(&mut dump).unwrap();
+
+        let box_message = client.protocol.new_message("127.0.0.1", 443, "https").unwrap();
+        let message = box_message.downcast::<Http11Message>().unwrap();
+        let stream = message.into_inner().downcast::<MessageStream>().unwrap().into_inner().into_tunneled().unwrap();
+
+        let s = ::std::str::from_utf8(&stream.write).unwrap();
+        let connect_line = "CONNECT 127.0.0.1:443 HTTP/1.1\r\nHost: 127.0.0.1:443\r\n\r\n";
+        assert_eq!(&s[..connect_line.len()], connect_line);
+
+        let s = &s[connect_line.len()..];
+        let request_line = "GET /foo/bar HTTP/1.1\r\n";
+        assert_eq!(&s[..request_line.len()], request_line);
+        assert!(s.contains("Host: 127.0.0.1\r\n"));
+    }
+
+    #[test]
+    fn test_redirect_followall() {
+        let mut client = Client::with_connector(MockRedirectPolicy);
+        client.set_redirect_policy(RedirectPolicy::FollowAll);
+
+        let res = client.get("http://127.0.0.1").send().unwrap();
+        assert_eq!(res.headers.get(), Some(&Server("mock3".to_owned())));
+    }
+
+    #[test]
+    fn test_redirect_dontfollow() {
+        let mut client = Client::with_connector(MockRedirectPolicy);
+        client.set_redirect_policy(RedirectPolicy::FollowNone);
+        let res = client.get("http://127.0.0.1").send().unwrap();
+        assert_eq!(res.headers.get(), Some(&Server("mock1".to_owned())));
+    }
+
+    #[test]
+    fn test_redirect_followif() {
+        fn follow_if(url: &Url) -> bool {
+            !url.as_str().contains("127.0.0.3")
+        }
+        let mut client = Client::with_connector(MockRedirectPolicy);
+        client.set_redirect_policy(RedirectPolicy::FollowIf(follow_if));
+        let res = client.get("http://127.0.0.1").send().unwrap();
+        assert_eq!(res.headers.get(), Some(&Server("mock2".to_owned())));
+    }
+
+    mock_connector!(Issue640Connector {
+        b"HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\n",
+        b"GET",
+        b"HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\n",
+        b"HEAD",
+        b"HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\n",
+        b"POST"
+    });
+
+    // see issue #640
+    #[test]
+    fn test_head_response_body_keep_alive() {
+        let client = Client::with_connector(Pool::with_connector(Default::default(), Issue640Connector));
+
+        let mut s = String::new();
+        client.get("http://127.0.0.1").send().unwrap().read_to_string(&mut s).unwrap();
+        assert_eq!(s, "GET");
+
+        let mut s = String::new();
+        client.head("http://127.0.0.1").send().unwrap().read_to_string(&mut s).unwrap();
+        assert_eq!(s, "");
+
+        let mut s = String::new();
+        client.post("http://127.0.0.1").send().unwrap().read_to_string(&mut s).unwrap();
+        assert_eq!(s, "POST");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/client/pool.rs
@@ -0,0 +1,305 @@
+//! Client Connection Pooling
+use std::borrow::ToOwned;
+use std::collections::HashMap;
+use std::fmt;
+use std::io::{self, Read, Write};
+use std::net::{SocketAddr, Shutdown};
+use std::sync::{Arc, Mutex};
+use std::sync::atomic::{AtomicBool, Ordering};
+
+use std::time::Duration;
+
+use net::{NetworkConnector, NetworkStream, DefaultConnector};
+use client::scheme::Scheme;
+
+/// The `NetworkConnector` that behaves as a connection pool used by hyper's `Client`.
+pub struct Pool<C: NetworkConnector> {
+    connector: C,
+    inner: Arc<Mutex<PoolImpl<<C as NetworkConnector>::Stream>>>
+}
+
+/// Config options for the `Pool`.
+#[derive(Debug)]
+pub struct Config {
+    /// The maximum idle connections *per host*.
+    pub max_idle: usize,
+}
+
+impl Default for Config {
+    #[inline]
+    fn default() -> Config {
+        Config {
+            max_idle: 5,
+        }
+    }
+}
+
+#[derive(Debug)]
+struct PoolImpl<S> {
+    conns: HashMap<Key, Vec<PooledStreamInner<S>>>,
+    config: Config,
+}
+
+type Key = (String, u16, Scheme);
+
+fn key<T: Into<Scheme>>(host: &str, port: u16, scheme: T) -> Key {
+    (host.to_owned(), port, scheme.into())
+}
+
+impl Pool<DefaultConnector> {
+    /// Creates a `Pool` with a `DefaultConnector`.
+    #[inline]
+    pub fn new(config: Config) -> Pool<DefaultConnector> {
+        Pool::with_connector(config, DefaultConnector::default())
+    }
+}
+
+impl<C: NetworkConnector> Pool<C> {
+    /// Creates a `Pool` with a specified `NetworkConnector`.
+    #[inline]
+    pub fn with_connector(config: Config, connector: C) -> Pool<C> {
+        Pool {
+            connector: connector,
+            inner: Arc::new(Mutex::new(PoolImpl {
+                conns: HashMap::new(),
+                config: config,
+            }))
+        }
+    }
+
+    /// Clear all idle connections from the Pool, closing them.
+    #[inline]
+    pub fn clear_idle(&mut self) {
+        self.inner.lock().unwrap().conns.clear();
+    }
+}
+
+impl<S> PoolImpl<S> {
+    fn reuse(&mut self, key: Key, conn: PooledStreamInner<S>) {
+        trace!("reuse {:?}", key);
+        let conns = self.conns.entry(key).or_insert(vec![]);
+        if conns.len() < self.config.max_idle {
+            conns.push(conn);
+        }
+    }
+}
+
+impl<C: NetworkConnector<Stream=S>, S: NetworkStream + Send> NetworkConnector for Pool<C> {
+    type Stream = PooledStream<S>;
+    fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<PooledStream<S>> {
+        let key = key(host, port, scheme);
+
+        let inner = {
+            // keep the mutex locked only in this block
+            let mut locked = self.inner.lock().unwrap();
+            let mut should_remove = false;
+            let inner = locked.conns.get_mut(&key).map(|vec| {
+                trace!("Pool had connection, using");
+                should_remove = vec.len() == 1;
+                vec.pop().unwrap()
+            });
+            if should_remove {
+                locked.conns.remove(&key);
+            }
+            inner
+        };
+
+        let inner = match inner {
+            Some(inner) => inner,
+            None => PooledStreamInner {
+                key: key.clone(),
+                stream: try!(self.connector.connect(host, port, scheme)),
+                previous_response_expected_no_content: false,
+            }
+
+        };
+        Ok(PooledStream {
+            inner: Some(inner),
+            is_closed: AtomicBool::new(false),
+            pool: self.inner.clone(),
+        })
+    }
+}
+
+/// A Stream that will try to be returned to the Pool when dropped.
+pub struct PooledStream<S> {
+    inner: Option<PooledStreamInner<S>>,
+    is_closed: AtomicBool,
+    pool: Arc<Mutex<PoolImpl<S>>>,
+}
+
+// manual impl to add the 'static bound for 1.7 compat
+impl<S> fmt::Debug for PooledStream<S> where S: fmt::Debug + 'static {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.debug_struct("PooledStream")
+           .field("inner", &self.inner)
+           .field("is_closed", &self.is_closed.load(Ordering::Relaxed))
+           .field("pool", &self.pool)
+           .finish()
+    }
+}
+
+impl<S: NetworkStream> PooledStream<S> {
+    /// Take the wrapped stream out of the pool completely.
+    pub fn into_inner(mut self) -> S {
+        self.inner.take().expect("PooledStream lost its inner stream").stream
+    }
+
+    /// Gets a borrowed reference to the underlying stream.
+    pub fn get_ref(&self) -> &S {
+        &self.inner.as_ref().expect("PooledStream lost its inner stream").stream
+    }
+}
+
+#[derive(Debug)]
+struct PooledStreamInner<S> {
+    key: Key,
+    stream: S,
+    previous_response_expected_no_content: bool,
+}
+
+impl<S: NetworkStream> Read for PooledStream<S> {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match self.inner.as_mut().unwrap().stream.read(buf) {
+            Ok(0) => {
+                // if the wrapped stream returns EOF (Ok(0)), that means the
+                // server has closed the stream. we must be sure this stream
+                // is dropped and not put back into the pool.
+                self.is_closed.store(true, Ordering::Relaxed);
+                Ok(0)
+            },
+            r => r
+        }
+    }
+}
+
+impl<S: NetworkStream> Write for PooledStream<S> {
+    #[inline]
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.inner.as_mut().unwrap().stream.write(buf)
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        self.inner.as_mut().unwrap().stream.flush()
+    }
+}
+
+impl<S: NetworkStream> NetworkStream for PooledStream<S> {
+    #[inline]
+    fn peer_addr(&mut self) -> io::Result<SocketAddr> {
+        self.inner.as_mut().unwrap().stream.peer_addr()
+            .map_err(|e| {
+                self.is_closed.store(true, Ordering::Relaxed);
+                e
+            })
+    }
+
+    #[inline]
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.inner.as_ref().unwrap().stream.set_read_timeout(dur)
+            .map_err(|e| {
+                self.is_closed.store(true, Ordering::Relaxed);
+                e
+            })
+    }
+
+    #[inline]
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.inner.as_ref().unwrap().stream.set_write_timeout(dur)
+            .map_err(|e| {
+                self.is_closed.store(true, Ordering::Relaxed);
+                e
+            })
+    }
+
+    #[inline]
+    fn close(&mut self, how: Shutdown) -> io::Result<()> {
+        self.is_closed.store(true, Ordering::Relaxed);
+        self.inner.as_mut().unwrap().stream.close(how)
+    }
+
+    #[inline]
+    fn set_previous_response_expected_no_content(&mut self, expected: bool) {
+        trace!("set_previous_response_expected_no_content {}", expected);
+        self.inner.as_mut().unwrap().previous_response_expected_no_content = expected;
+    }
+
+    #[inline]
+    fn previous_response_expected_no_content(&self) -> bool {
+        let answer = self.inner.as_ref().unwrap().previous_response_expected_no_content;
+        trace!("previous_response_expected_no_content {}", answer);
+        answer
+    }
+}
+
+impl<S> Drop for PooledStream<S> {
+    fn drop(&mut self) {
+        let is_closed = self.is_closed.load(Ordering::Relaxed);
+        trace!("PooledStream.drop, is_closed={}", is_closed);
+        if !is_closed {
+            self.inner.take().map(|inner| {
+                if let Ok(mut pool) = self.pool.lock() {
+                    pool.reuse(inner.key.clone(), inner);
+                }
+                // else poisoned, give up
+            });
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::net::Shutdown;
+    use std::io::Read;
+    use mock::{MockConnector};
+    use net::{NetworkConnector, NetworkStream};
+
+    use super::{Pool, key};
+
+    macro_rules! mocked {
+        () => ({
+            Pool::with_connector(Default::default(), MockConnector)
+        })
+    }
+
+    #[test]
+    fn test_connect_and_drop() {
+        let pool = mocked!();
+        let key = key("127.0.0.1", 3000, "http");
+        pool.connect("127.0.0.1", 3000, "http").unwrap();
+        {
+            let locked = pool.inner.lock().unwrap();
+            assert_eq!(locked.conns.len(), 1);
+            assert_eq!(locked.conns.get(&key).unwrap().len(), 1);
+        }
+        pool.connect("127.0.0.1", 3000, "http").unwrap(); //reused
+        {
+            let locked = pool.inner.lock().unwrap();
+            assert_eq!(locked.conns.len(), 1);
+            assert_eq!(locked.conns.get(&key).unwrap().len(), 1);
+        }
+    }
+
+    #[test]
+    fn test_closed() {
+        let pool = mocked!();
+        let mut stream = pool.connect("127.0.0.1", 3000, "http").unwrap();
+        stream.close(Shutdown::Both).unwrap();
+        drop(stream);
+        let locked = pool.inner.lock().unwrap();
+        assert_eq!(locked.conns.len(), 0);
+    }
+
+    #[test]
+    fn test_eof_closes() {
+        let pool = mocked!();
+
+        let mut stream = pool.connect("127.0.0.1", 3000, "http").unwrap();
+        assert_eq!(stream.read(&mut [0]).unwrap(), 0);
+        drop(stream);
+        let locked = pool.inner.lock().unwrap();
+        assert_eq!(locked.conns.len(), 0);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/client/proxy.rs
@@ -0,0 +1,221 @@
+use std::borrow::Cow;
+use std::io;
+use std::net::{SocketAddr, Shutdown};
+use std::time::Duration;
+
+use client::scheme::Scheme;
+use method::Method;
+use net::{NetworkConnector, HttpConnector, NetworkStream, SslClient};
+
+pub fn tunnel(proxy: (Scheme, Cow<'static, str>, u16)) -> Proxy<HttpConnector, self::no_ssl::Plaintext> {
+    Proxy {
+        connector: HttpConnector,
+        proxy: proxy,
+        ssl: self::no_ssl::Plaintext,
+    }
+
+}
+
+pub struct Proxy<C, S>
+where C: NetworkConnector + Send + Sync + 'static,
+      C::Stream: NetworkStream + Send + Clone,
+      S: SslClient<C::Stream> {
+    pub connector: C,
+    pub proxy: (Scheme, Cow<'static, str>, u16),
+    pub ssl: S,
+}
+
+impl<C, S> NetworkConnector for Proxy<C, S>
+where C: NetworkConnector + Send + Sync + 'static,
+      C::Stream: NetworkStream + Send + Clone,
+      S: SslClient<C::Stream> {
+    type Stream = Proxied<C::Stream, S::Stream>;
+
+    fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<Self::Stream> {
+        use httparse;
+        use std::io::{Read, Write};
+        use ::version::HttpVersion::Http11;
+        trace!("{:?} proxy for '{}://{}:{}'", self.proxy, scheme, host, port);
+        match scheme {
+            "http" => {
+                self.connector.connect(self.proxy.1.as_ref(), self.proxy.2, self.proxy.0.as_ref())
+                    .map(Proxied::Normal)
+            },
+            "https" => {
+                let mut stream = try!(self.connector.connect(self.proxy.1.as_ref(), self.proxy.2, self.proxy.0.as_ref()));
+                trace!("{:?} CONNECT {}:{}", self.proxy, host, port);
+                try!(write!(&mut stream, "{method} {host}:{port} {version}\r\nHost: {host}:{port}\r\n\r\n",
+                            method=Method::Connect, host=host, port=port, version=Http11));
+                try!(stream.flush());
+                let mut buf = [0; 1024];
+                let mut n = 0;
+                while n < buf.len() {
+                    n += try!(stream.read(&mut buf[n..]));
+                    let mut headers = [httparse::EMPTY_HEADER; 10];
+                    let mut res = httparse::Response::new(&mut headers);
+                    if try!(res.parse(&buf[..n])).is_complete() {
+                        let code = res.code.expect("complete parsing lost code");
+                        if code >= 200 && code < 300 {
+                            trace!("CONNECT success = {:?}", code);
+                            return self.ssl.wrap_client(stream, host)
+                                .map(Proxied::Tunneled)
+                        } else {
+                            trace!("CONNECT response = {:?}", code);
+                            return Err(::Error::Status);
+                        }
+                    }
+                }
+                Err(::Error::TooLarge)
+            },
+            _ => Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid scheme").into())
+        }
+    }
+}
+
+#[derive(Debug)]
+pub enum Proxied<T1, T2> {
+    Normal(T1),
+    Tunneled(T2)
+}
+
+#[cfg(test)]
+impl<T1, T2> Proxied<T1, T2> {
+    pub fn into_normal(self) -> Result<T1, Self> {
+        match self {
+            Proxied::Normal(t1) => Ok(t1),
+            _ => Err(self)
+        }
+    }
+
+    pub fn into_tunneled(self) -> Result<T2, Self> {
+        match self {
+            Proxied::Tunneled(t2) => Ok(t2),
+            _ => Err(self)
+        }
+    }
+}
+
+impl<T1: NetworkStream, T2: NetworkStream> io::Read for Proxied<T1, T2> {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match *self {
+            Proxied::Normal(ref mut t) => io::Read::read(t, buf),
+            Proxied::Tunneled(ref mut t) => io::Read::read(t, buf),
+        }
+    }
+}
+
+impl<T1: NetworkStream, T2: NetworkStream> io::Write for Proxied<T1, T2> {
+    #[inline]
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        match *self {
+            Proxied::Normal(ref mut t) => io::Write::write(t, buf),
+            Proxied::Tunneled(ref mut t) => io::Write::write(t, buf),
+        }
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        match *self {
+            Proxied::Normal(ref mut t) => io::Write::flush(t),
+            Proxied::Tunneled(ref mut t) => io::Write::flush(t),
+        }
+    }
+}
+
+impl<T1: NetworkStream, T2: NetworkStream> NetworkStream for Proxied<T1, T2> {
+    #[inline]
+    fn peer_addr(&mut self) -> io::Result<SocketAddr> {
+        match *self {
+            Proxied::Normal(ref mut s) => s.peer_addr(),
+            Proxied::Tunneled(ref mut s) => s.peer_addr()
+        }
+    }
+
+    #[inline]
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        match *self {
+            Proxied::Normal(ref inner) => inner.set_read_timeout(dur),
+            Proxied::Tunneled(ref inner) => inner.set_read_timeout(dur)
+        }
+    }
+
+    #[inline]
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        match *self {
+            Proxied::Normal(ref inner) => inner.set_write_timeout(dur),
+            Proxied::Tunneled(ref inner) => inner.set_write_timeout(dur)
+        }
+    }
+
+    #[inline]
+    fn close(&mut self, how: Shutdown) -> io::Result<()> {
+        match *self {
+            Proxied::Normal(ref mut s) => s.close(how),
+            Proxied::Tunneled(ref mut s) => s.close(how)
+        }
+    }
+}
+
+#[cfg(not(any(feature = "openssl", feature = "security-framework")))]
+mod no_ssl {
+    use std::io;
+    use std::net::{Shutdown, SocketAddr};
+    use std::time::Duration;
+
+    use net::{SslClient, NetworkStream};
+
+    pub struct Plaintext;
+
+    #[derive(Clone)]
+    pub enum Void {}
+
+    impl io::Read for Void {
+        #[inline]
+        fn read(&mut self, _buf: &mut [u8]) -> io::Result<usize> {
+            match *self {}
+        }
+    }
+
+    impl io::Write for Void {
+        #[inline]
+        fn write(&mut self, _buf: &[u8]) -> io::Result<usize> {
+            match *self {}
+        }
+
+        #[inline]
+        fn flush(&mut self) -> io::Result<()> {
+            match *self {}
+        }
+    }
+
+    impl NetworkStream for Void {
+        #[inline]
+        fn peer_addr(&mut self) -> io::Result<SocketAddr> {
+            match *self {}
+        }
+
+        #[inline]
+        fn set_read_timeout(&self, _dur: Option<Duration>) -> io::Result<()> {
+            match *self {}
+        }
+
+        #[inline]
+        fn set_write_timeout(&self, _dur: Option<Duration>) -> io::Result<()> {
+            match *self {}
+        }
+
+        #[inline]
+        fn close(&mut self, _how: Shutdown) -> io::Result<()> {
+            match *self {}
+        }
+    }
+
+    impl<T: NetworkStream + Send + Clone> SslClient<T> for Plaintext {
+        type Stream = Void;
+
+        fn wrap_client(&self, _stream: T, _host: &str) -> ::Result<Self::Stream> {
+            Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid scheme").into())
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/client/request.rs
@@ -0,0 +1,314 @@
+//! Client Requests
+use std::marker::PhantomData;
+use std::io::{self, Write};
+
+use std::time::Duration;
+
+use url::Url;
+
+use method::Method;
+use header::Headers;
+use header::Host;
+use net::{NetworkStream, NetworkConnector, DefaultConnector, Fresh, Streaming};
+use version;
+use client::{Response, get_host_and_port};
+
+use http::{HttpMessage, RequestHead};
+use http::h1::Http11Message;
+
+
+/// A client request to a remote server.
+/// The W type tracks the state of the request, Fresh vs Streaming.
+pub struct Request<W> {
+    /// The target URI for this request.
+    pub url: Url,
+
+    /// The HTTP version of this request.
+    pub version: version::HttpVersion,
+
+    message: Box<HttpMessage>,
+    headers: Headers,
+    method: Method,
+
+    _marker: PhantomData<W>,
+}
+
+impl<W> Request<W> {
+    /// Read the Request headers.
+    #[inline]
+    pub fn headers(&self) -> &Headers { &self.headers }
+
+    /// Read the Request method.
+    #[inline]
+    pub fn method(&self) -> Method { self.method.clone() }
+
+    /// Set the write timeout.
+    #[inline]
+    pub fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.message.set_write_timeout(dur)
+    }
+
+    /// Set the read timeout.
+    #[inline]
+    pub fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.message.set_read_timeout(dur)
+    }
+}
+
+impl Request<Fresh> {
+    /// Create a new `Request<Fresh>` that will use the given `HttpMessage` for its communication
+    /// with the server. This implies that the given `HttpMessage` instance has already been
+    /// properly initialized by the caller (e.g. a TCP connection's already established).
+    pub fn with_message(method: Method, url: Url, message: Box<HttpMessage>)
+            -> ::Result<Request<Fresh>> {
+        let mut headers = Headers::new();
+        {
+            let (host, port) = try!(get_host_and_port(&url));
+            headers.set(Host {
+                hostname: host.to_owned(),
+                port: Some(port),
+            });
+        }
+
+        Ok(Request::with_headers_and_message(method, url, headers, message))
+    }
+
+    #[doc(hidden)]
+    pub fn with_headers_and_message(method: Method, url: Url, headers: Headers,  message: Box<HttpMessage>)
+                -> Request<Fresh> {
+        Request {
+            method: method,
+            headers: headers,
+            url: url,
+            version: version::HttpVersion::Http11,
+            message: message,
+            _marker: PhantomData,
+        }
+    }
+
+    /// Create a new client request.
+    pub fn new(method: Method, url: Url) -> ::Result<Request<Fresh>> {
+        let conn = DefaultConnector::default();
+        Request::with_connector(method, url, &conn)
+    }
+
+    /// Create a new client request with a specific underlying NetworkStream.
+    pub fn with_connector<C, S>(method: Method, url: Url, connector: &C)
+        -> ::Result<Request<Fresh>> where
+        C: NetworkConnector<Stream=S>,
+        S: Into<Box<NetworkStream + Send>> {
+        let stream = {
+            let (host, port) = try!(get_host_and_port(&url));
+            try!(connector.connect(host, port, url.scheme())).into()
+        };
+
+        Request::with_message(method, url, Box::new(Http11Message::with_stream(stream)))
+    }
+
+    /// Consume a Fresh Request, writing the headers and method,
+    /// returning a Streaming Request.
+    pub fn start(mut self) -> ::Result<Request<Streaming>> {
+        let head = match self.message.set_outgoing(RequestHead {
+            headers: self.headers,
+            method: self.method,
+            url: self.url,
+        }) {
+            Ok(head) => head,
+            Err(e) => {
+                let _ = self.message.close_connection();
+                return Err(From::from(e));
+            }
+        };
+
+        Ok(Request {
+            method: head.method,
+            headers: head.headers,
+            url: head.url,
+            version: self.version,
+            message: self.message,
+            _marker: PhantomData,
+        })
+    }
+
+    /// Get a mutable reference to the Request headers.
+    #[inline]
+    pub fn headers_mut(&mut self) -> &mut Headers { &mut self.headers }
+}
+
+
+
+impl Request<Streaming> {
+    /// Completes writing the request, and returns a response to read from.
+    ///
+    /// Consumes the Request.
+    pub fn send(self) -> ::Result<Response> {
+        Response::with_message(self.url, self.message)
+    }
+}
+
+impl Write for Request<Streaming> {
+    #[inline]
+    fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
+        match self.message.write(msg) {
+            Ok(n) => Ok(n),
+            Err(e) => {
+                let _ = self.message.close_connection();
+                Err(e)
+            }
+        }
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        match self.message.flush() {
+            Ok(r) => Ok(r),
+            Err(e) => {
+                let _ = self.message.close_connection();
+                Err(e)
+            }
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::Write;
+    use std::str::from_utf8;
+    use url::Url;
+    use method::Method::{Get, Head, Post};
+    use mock::{MockStream, MockConnector};
+    use net::Fresh;
+    use header::{ContentLength,TransferEncoding,Encoding};
+    use url::form_urlencoded;
+    use super::Request;
+    use http::h1::Http11Message;
+
+    fn run_request(req: Request<Fresh>) -> Vec<u8> {
+        let req = req.start().unwrap();
+        let message = req.message;
+        let mut message = message.downcast::<Http11Message>().ok().unwrap();
+        message.flush_outgoing().unwrap();
+        let stream = *message
+            .into_inner().downcast::<MockStream>().ok().unwrap();
+        stream.write
+    }
+
+    fn assert_no_body(s: &str) {
+        assert!(!s.contains("Content-Length:"));
+        assert!(!s.contains("Transfer-Encoding:"));
+    }
+
+    #[test]
+    fn test_get_empty_body() {
+        let req = Request::with_connector(
+            Get, Url::parse("http://example.dom").unwrap(), &mut MockConnector
+        ).unwrap();
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert_no_body(s);
+    }
+
+    #[test]
+    fn test_head_empty_body() {
+        let req = Request::with_connector(
+            Head, Url::parse("http://example.dom").unwrap(), &mut MockConnector
+        ).unwrap();
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert_no_body(s);
+    }
+
+    #[test]
+    fn test_url_query() {
+        let url = Url::parse("http://example.dom?q=value").unwrap();
+        let req = Request::with_connector(
+            Get, url, &mut MockConnector
+        ).unwrap();
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert!(s.contains("?q=value"));
+    }
+
+    #[test]
+    fn test_post_content_length() {
+        let url = Url::parse("http://example.dom").unwrap();
+        let mut req = Request::with_connector(
+            Post, url, &mut MockConnector
+        ).unwrap();
+        let mut body = String::new();
+        form_urlencoded::Serializer::new(&mut body).append_pair("q", "value");
+        req.headers_mut().set(ContentLength(body.len() as u64));
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert!(s.contains("Content-Length:"));
+    }
+
+    #[test]
+    fn test_post_chunked() {
+        let url = Url::parse("http://example.dom").unwrap();
+        let req = Request::with_connector(
+            Post, url, &mut MockConnector
+        ).unwrap();
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert!(!s.contains("Content-Length:"));
+    }
+
+    #[test]
+    fn test_host_header() {
+        let url = Url::parse("http://example.dom").unwrap();
+        let req = Request::with_connector(
+            Get, url, &mut MockConnector
+        ).unwrap();
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert!(s.contains("Host: example.dom"));
+    }
+
+    #[test]
+    fn test_proxy() {
+        let url = Url::parse("http://example.dom").unwrap();
+        let mut req = Request::with_connector(
+            Get, url, &mut MockConnector
+        ).unwrap();
+        req.message.set_proxied(true);
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        let request_line = "GET http://example.dom/ HTTP/1.1";
+        assert_eq!(&s[..request_line.len()], request_line);
+        assert!(s.contains("Host: example.dom"));
+    }
+
+    #[test]
+    fn test_post_chunked_with_encoding() {
+        let url = Url::parse("http://example.dom").unwrap();
+        let mut req = Request::with_connector(
+            Post, url, &mut MockConnector
+        ).unwrap();
+        req.headers_mut().set(TransferEncoding(vec![Encoding::Chunked]));
+        let bytes = run_request(req);
+        let s = from_utf8(&bytes[..]).unwrap();
+        assert!(!s.contains("Content-Length:"));
+        assert!(s.contains("Transfer-Encoding:"));
+    }
+
+    #[test]
+    fn test_write_error_closes() {
+        let url = Url::parse("http://hyper.rs").unwrap();
+        let req = Request::with_connector(
+            Get, url, &mut MockConnector
+        ).unwrap();
+        let mut req = req.start().unwrap();
+
+        req.message.downcast_mut::<Http11Message>().unwrap()
+            .get_mut().downcast_mut::<MockStream>().unwrap()
+            .error_on_write = true;
+
+        req.write(b"foo").unwrap();
+        assert!(req.flush().is_err());
+
+        assert!(req.message.downcast_ref::<Http11Message>().unwrap()
+            .get_ref().downcast_ref::<MockStream>().unwrap()
+            .is_closed);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/client/response.rs
@@ -0,0 +1,239 @@
+//! Client Responses
+use std::io::{self, Read};
+
+use url::Url;
+
+use header;
+use net::NetworkStream;
+use http::{self, RawStatus, ResponseHead, HttpMessage};
+use http::h1::Http11Message;
+use status;
+use version;
+
+/// A response for a client request to a remote server.
+#[derive(Debug)]
+pub struct Response {
+    /// The status from the server.
+    pub status: status::StatusCode,
+    /// The headers from the server.
+    pub headers: header::Headers,
+    /// The HTTP version of this response from the server.
+    pub version: version::HttpVersion,
+    /// The final URL of this response.
+    pub url: Url,
+    status_raw: RawStatus,
+    message: Box<HttpMessage>,
+}
+
+impl Response {
+    /// Creates a new response from a server.
+    pub fn new(url: Url, stream: Box<NetworkStream + Send>) -> ::Result<Response> {
+        trace!("Response::new");
+        Response::with_message(url, Box::new(Http11Message::with_stream(stream)))
+    }
+
+    /// Creates a new response received from the server on the given `HttpMessage`.
+    pub fn with_message(url: Url, mut message: Box<HttpMessage>) -> ::Result<Response> {
+        trace!("Response::with_message");
+        let ResponseHead { headers, raw_status, version } = match message.get_incoming() {
+            Ok(head) => head,
+            Err(e) => {
+                let _ = message.close_connection();
+                return Err(From::from(e));
+            }
+        };
+        let status = status::StatusCode::from_u16(raw_status.0);
+        debug!("version={:?}, status={:?}", version, status);
+        debug!("headers={:?}", headers);
+
+        Ok(Response {
+            status: status,
+            version: version,
+            headers: headers,
+            url: url,
+            status_raw: raw_status,
+            message: message,
+        })
+    }
+
+    /// Get the raw status code and reason.
+    #[inline]
+    pub fn status_raw(&self) -> &RawStatus {
+        &self.status_raw
+    }
+
+    /// Gets a borrowed reference to the underlying `HttpMessage`.
+    #[inline]
+    pub fn get_ref(&self) -> &HttpMessage {
+        &*self.message
+    }
+}
+
+/// Read the response body.
+impl Read for Response {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match self.message.read(buf) {
+            Err(e) => {
+                let _ = self.message.close_connection();
+                Err(e)
+            }
+            r => r
+        }
+    }
+}
+
+impl Drop for Response {
+    fn drop(&mut self) {
+        // if not drained, theres old bits in the Reader. we can't reuse this,
+        // since those old bits would end up in new Responses
+        //
+        // otherwise, the response has been drained. we should check that the
+        // server has agreed to keep the connection open
+        let is_drained = !self.message.has_body();
+        trace!("Response.drop is_drained={}", is_drained);
+        if !(is_drained && http::should_keep_alive(self.version, &self.headers)) {
+            trace!("Response.drop closing connection");
+            if let Err(e) = self.message.close_connection() {
+                error!("Response.drop error closing connection: {}", e);
+            }
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::io::{self, Read};
+
+    use url::Url;
+
+    use header::TransferEncoding;
+    use header::Encoding;
+    use http::HttpMessage;
+    use mock::MockStream;
+    use status;
+    use version;
+    use http::h1::Http11Message;
+
+    use super::Response;
+
+    fn read_to_string(mut r: Response) -> io::Result<String> {
+        let mut s = String::new();
+        try!(r.read_to_string(&mut s));
+        Ok(s)
+    }
+
+
+    #[test]
+    fn test_into_inner() {
+        let message: Box<HttpMessage> = Box::new(
+            Http11Message::with_stream(Box::new(MockStream::new())));
+        let message = message.downcast::<Http11Message>().ok().unwrap();
+        let b = message.into_inner().downcast::<MockStream>().ok().unwrap();
+        assert_eq!(b, Box::new(MockStream::new()));
+    }
+
+    #[test]
+    fn test_parse_chunked_response() {
+        let stream = MockStream::with_input(b"\
+            HTTP/1.1 200 OK\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            1\r\n\
+            q\r\n\
+            2\r\n\
+            we\r\n\
+            2\r\n\
+            rt\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        let url = Url::parse("http://hyper.rs").unwrap();
+        let res = Response::new(url, Box::new(stream)).unwrap();
+
+        // The status line is correct?
+        assert_eq!(res.status, status::StatusCode::Ok);
+        assert_eq!(res.version, version::HttpVersion::Http11);
+        // The header is correct?
+        match res.headers.get::<TransferEncoding>() {
+            Some(encodings) => {
+                assert_eq!(1, encodings.len());
+                assert_eq!(Encoding::Chunked, encodings[0]);
+            },
+            None => panic!("Transfer-Encoding: chunked expected!"),
+        };
+        // The body is correct?
+        assert_eq!(read_to_string(res).unwrap(), "qwert".to_owned());
+    }
+
+    /// Tests that when a chunk size is not a valid radix-16 number, an error
+    /// is returned.
+    #[test]
+    fn test_invalid_chunk_size_not_hex_digit() {
+        let stream = MockStream::with_input(b"\
+            HTTP/1.1 200 OK\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            X\r\n\
+            1\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        let url = Url::parse("http://hyper.rs").unwrap();
+        let res = Response::new(url, Box::new(stream)).unwrap();
+
+        assert!(read_to_string(res).is_err());
+    }
+
+    /// Tests that when a chunk size contains an invalid extension, an error is
+    /// returned.
+    #[test]
+    fn test_invalid_chunk_size_extension() {
+        let stream = MockStream::with_input(b"\
+            HTTP/1.1 200 OK\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            1 this is an invalid extension\r\n\
+            1\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        let url = Url::parse("http://hyper.rs").unwrap();
+        let res = Response::new(url, Box::new(stream)).unwrap();
+
+        assert!(read_to_string(res).is_err());
+    }
+
+    /// Tests that when a valid extension that contains a digit is appended to
+    /// the chunk size, the chunk is correctly read.
+    #[test]
+    fn test_chunk_size_with_extension() {
+        let stream = MockStream::with_input(b"\
+            HTTP/1.1 200 OK\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            1;this is an extension with a digit 1\r\n\
+            1\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        let url = Url::parse("http://hyper.rs").unwrap();
+        let res = Response::new(url, Box::new(stream)).unwrap();
+
+        assert_eq!(read_to_string(res).unwrap(), "1".to_owned());
+    }
+
+    #[test]
+    fn test_parse_error_closes() {
+        let url = Url::parse("http://hyper.rs").unwrap();
+        let stream = MockStream::with_input(b"\
+            definitely not http
+        ");
+
+        assert!(Response::new(url, Box::new(stream)).is_err());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/error.rs
@@ -0,0 +1,219 @@
+//! Error and Result module.
+use std::error::Error as StdError;
+use std::fmt;
+use std::io::Error as IoError;
+use std::str::Utf8Error;
+use std::string::FromUtf8Error;
+
+use httparse;
+use url;
+
+#[cfg(feature = "openssl")]
+use openssl::ssl::error::SslError;
+
+use self::Error::{
+    Method,
+    Uri,
+    Version,
+    Header,
+    Status,
+    Io,
+    Ssl,
+    TooLarge,
+    Utf8
+};
+
+pub use url::ParseError;
+
+/// Result type often returned from methods that can have hyper `Error`s.
+pub type Result<T> = ::std::result::Result<T, Error>;
+
+/// A set of errors that can occur parsing HTTP streams.
+#[derive(Debug)]
+pub enum Error {
+    /// An invalid `Method`, such as `GE,T`.
+    Method,
+    /// An invalid `RequestUri`, such as `exam ple.domain`.
+    Uri(url::ParseError),
+    /// An invalid `HttpVersion`, such as `HTP/1.1`
+    Version,
+    /// An invalid `Header`.
+    Header,
+    /// A message head is too large to be reasonable.
+    TooLarge,
+    /// An invalid `Status`, such as `1337 ELITE`.
+    Status,
+    /// An `io::Error` that occurred while trying to read or write to a network stream.
+    Io(IoError),
+    /// An error from a SSL library.
+    Ssl(Box<StdError + Send + Sync>),
+    /// Parsing a field as string failed
+    Utf8(Utf8Error),
+
+    #[doc(hidden)]
+    __Nonexhaustive(Void)
+}
+
+#[doc(hidden)]
+pub struct Void(());
+
+impl fmt::Debug for Void {
+    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result {
+        unreachable!()
+    }
+}
+
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Uri(ref e) => fmt::Display::fmt(e, f),
+            Io(ref e) => fmt::Display::fmt(e, f),
+            Ssl(ref e) => fmt::Display::fmt(e, f),
+            Utf8(ref e) => fmt::Display::fmt(e, f),
+            ref e => f.write_str(e.description()),
+        }
+    }
+}
+
+impl StdError for Error {
+    fn description(&self) -> &str {
+        match *self {
+            Method => "Invalid Method specified",
+            Version => "Invalid HTTP version specified",
+            Header => "Invalid Header provided",
+            TooLarge => "Message head is too large",
+            Status => "Invalid Status provided",
+            Uri(ref e) => e.description(),
+            Io(ref e) => e.description(),
+            Ssl(ref e) => e.description(),
+            Utf8(ref e) => e.description(),
+            Error::__Nonexhaustive(..) =>  unreachable!(),
+        }
+    }
+
+    fn cause(&self) -> Option<&StdError> {
+        match *self {
+            Io(ref error) => Some(error),
+            Ssl(ref error) => Some(&**error),
+            Uri(ref error) => Some(error),
+            Utf8(ref error) => Some(error),
+            _ => None,
+        }
+    }
+}
+
+impl From<IoError> for Error {
+    fn from(err: IoError) -> Error {
+        Io(err)
+    }
+}
+
+impl From<url::ParseError> for Error {
+    fn from(err: url::ParseError) -> Error {
+        Uri(err)
+    }
+}
+
+#[cfg(feature = "openssl")]
+impl From<SslError> for Error {
+    fn from(err: SslError) -> Error {
+        match err {
+            SslError::StreamError(err) => Io(err),
+            err => Ssl(Box::new(err)),
+        }
+    }
+}
+
+impl From<Utf8Error> for Error {
+    fn from(err: Utf8Error) -> Error {
+        Utf8(err)
+    }
+}
+
+impl From<FromUtf8Error> for Error {
+    fn from(err: FromUtf8Error) -> Error {
+        Utf8(err.utf8_error())
+    }
+}
+
+impl From<httparse::Error> for Error {
+    fn from(err: httparse::Error) -> Error {
+        match err {
+            httparse::Error::HeaderName => Header,
+            httparse::Error::HeaderValue => Header,
+            httparse::Error::NewLine => Header,
+            httparse::Error::Status => Status,
+            httparse::Error::Token => Header,
+            httparse::Error::TooManyHeaders => TooLarge,
+            httparse::Error::Version => Version,
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::error::Error as StdError;
+    use std::io;
+    use httparse;
+    use url;
+    use super::Error;
+    use super::Error::*;
+
+    #[test]
+    fn test_cause() {
+        let orig = io::Error::new(io::ErrorKind::Other, "other");
+        let desc = orig.description().to_owned();
+        let e = Io(orig);
+        assert_eq!(e.cause().unwrap().description(), desc);
+    }
+
+    macro_rules! from {
+        ($from:expr => $error:pat) => {
+            match Error::from($from) {
+                e @ $error => {
+                    assert!(e.description().len() > 5);
+                } ,
+                _ => panic!("{:?}", $from)
+            }
+        }
+    }
+
+    macro_rules! from_and_cause {
+        ($from:expr => $error:pat) => {
+            match Error::from($from) {
+                e @ $error => {
+                    let desc = e.cause().unwrap().description();
+                    assert_eq!(desc, $from.description().to_owned());
+                    assert_eq!(desc, e.description());
+                },
+                _ => panic!("{:?}", $from)
+            }
+        }
+    }
+
+    #[test]
+    fn test_from() {
+
+        from_and_cause!(io::Error::new(io::ErrorKind::Other, "other") => Io(..));
+        from_and_cause!(url::ParseError::EmptyHost => Uri(..));
+
+        from!(httparse::Error::HeaderName => Header);
+        from!(httparse::Error::HeaderName => Header);
+        from!(httparse::Error::HeaderValue => Header);
+        from!(httparse::Error::NewLine => Header);
+        from!(httparse::Error::Status => Status);
+        from!(httparse::Error::Token => Header);
+        from!(httparse::Error::TooManyHeaders => TooLarge);
+        from!(httparse::Error::Version => Version);
+    }
+
+    #[cfg(feature = "openssl")]
+    #[test]
+    fn test_from_ssl() {
+        use openssl::ssl::error::SslError;
+
+        from!(SslError::StreamError(
+            io::Error::new(io::ErrorKind::Other, "ssl negotiation")) => Io(..));
+        from_and_cause!(SslError::SslSessionClosed => Ssl(..));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/accept.rs
@@ -0,0 +1,143 @@
+use mime::Mime;
+
+use header::{QualityItem, qitem};
+
+header! {
+    /// `Accept` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.2)
+    ///
+    /// The `Accept` header field can be used by user agents to specify
+    /// response media types that are acceptable.  Accept header fields can
+    /// be used to indicate that the request is specifically limited to a
+    /// small set of desired types, as in the case of a request for an
+    /// in-line image
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Accept = #( media-range [ accept-params ] )
+    ///
+    /// media-range    = ( "*/*"
+    ///                  / ( type "/" "*" )
+    ///                  / ( type "/" subtype )
+    ///                  ) *( OWS ";" OWS parameter )
+    /// accept-params  = weight *( accept-ext )
+    /// accept-ext = OWS ";" OWS token [ "=" ( token / quoted-string ) ]
+    /// ```
+    ///
+    /// # Example values
+    /// * `audio/*; q=0.2, audio/basic` (`*` value won't parse correctly)
+    /// * `text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, Accept, qitem};
+    /// use hyper::mime::{Mime, TopLevel, SubLevel};
+    ///
+    /// let mut headers = Headers::new();
+    ///
+    /// headers.set(
+    ///     Accept(vec![
+    ///         qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])),
+    ///     ])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, Accept, qitem};
+    /// use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     Accept(vec![
+    ///         qitem(Mime(TopLevel::Application, SubLevel::Json,
+    ///                    vec![(Attr::Charset, Value::Utf8)])),
+    ///     ])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, Accept, QualityItem, Quality, qitem};
+    /// use hyper::mime::{Mime, TopLevel, SubLevel};
+    ///
+    /// let mut headers = Headers::new();
+    ///
+    /// headers.set(
+    ///     Accept(vec![
+    ///         qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])),
+    ///         qitem(Mime(TopLevel::Application,
+    ///                    SubLevel::Ext("xhtml+xml".to_owned()), vec![])),
+    ///         QualityItem::new(Mime(TopLevel::Application, SubLevel::Xml, vec![]),
+    ///                          Quality(900)),
+    ///                          qitem(Mime(TopLevel::Image,
+    ///                                     SubLevel::Ext("webp".to_owned()), vec![])),
+    ///                          QualityItem::new(Mime(TopLevel::Star, SubLevel::Star, vec![]),
+    ///                                           Quality(800))
+    ///     ])
+    /// );
+    /// ```
+    ///
+    /// # Notes
+    /// * Using always Mime types to represent `media-range` differs from the ABNF.
+    /// * **FIXME**: `accept-ext` is not supported.
+    (Accept, "Accept") => (QualityItem<Mime>)+
+
+    test_accept {
+        // Tests from the RFC
+        // FIXME: Test fails, first value containing a "*" fails to parse
+        // test_header!(
+        //    test1,
+        //    vec![b"audio/*; q=0.2, audio/basic"],
+        //    Some(HeaderField(vec![
+        //        QualityItem::new(Mime(TopLevel::Audio, SubLevel::Star, vec![]), Quality(200)),
+        //        qitem(Mime(TopLevel::Audio, SubLevel::Ext("basic".to_owned()), vec![])),
+        //        ])));
+        test_header!(
+            test2,
+            vec![b"text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c"],
+            Some(HeaderField(vec![
+                QualityItem::new(Mime(TopLevel::Text, SubLevel::Plain, vec![]), Quality(500)),
+                qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])),
+                QualityItem::new(
+                    Mime(TopLevel::Text, SubLevel::Ext("x-dvi".to_owned()), vec![]),
+                    Quality(800)),
+                qitem(Mime(TopLevel::Text, SubLevel::Ext("x-c".to_owned()), vec![])),
+                ])));
+        // Custom tests
+        test_header!(
+            test3,
+            vec![b"text/plain; charset=utf-8"],
+            Some(Accept(vec![
+                qitem(Mime(TopLevel::Text, SubLevel::Plain, vec![(Attr::Charset, Value::Utf8)])),
+                ])));
+        test_header!(
+            test4,
+            vec![b"text/plain; charset=utf-8; q=0.5"],
+            Some(Accept(vec![
+                QualityItem::new(Mime(TopLevel::Text,
+                    SubLevel::Plain, vec![(Attr::Charset, Value::Utf8)]),
+                    Quality(500)),
+            ])));
+    }
+}
+
+impl Accept {
+    /// A constructor to easily create `Accept: */*`.
+    pub fn star() -> Accept {
+        Accept(vec![qitem(mime!(Star/Star))])
+    }
+
+    /// A constructor to easily create `Accept: application/json`.
+    pub fn json() -> Accept {
+        Accept(vec![qitem(mime!(Application/Json))])
+    }
+
+    /// A constructor to easily create `Accept: text/*`.
+    pub fn text() -> Accept {
+        Accept(vec![qitem(mime!(Text/Star))])
+    }
+
+    /// A constructor to easily create `Accept: image/*`.
+    pub fn image() -> Accept {
+        Accept(vec![qitem(mime!(Image/Star))])
+    }
+}
+
+
+bench_header!(bench, Accept, { vec![b"text/plain; q=0.5, text/html".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/accept_charset.rs
@@ -0,0 +1,56 @@
+use header::{Charset, QualityItem};
+
+header! {
+    /// `Accept-Charset` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.3)
+    ///
+    /// The `Accept-Charset` header field can be sent by a user agent to
+    /// indicate what charsets are acceptable in textual response content.
+    /// This field allows user agents capable of understanding more
+    /// comprehensive or special-purpose charsets to signal that capability
+    /// to an origin server that is capable of representing information in
+    /// those charsets.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Accept-Charset = 1#( ( charset / "*" ) [ weight ] )
+    /// ```
+    ///
+    /// # Example values
+    /// * `iso-8859-5, unicode-1-1;q=0.8`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, AcceptCharset, Charset, qitem};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptCharset(vec![qitem(Charset::Us_Ascii)])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AcceptCharset, Charset, Quality, QualityItem};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptCharset(vec![
+    ///         QualityItem::new(Charset::Us_Ascii, Quality(900)),
+    ///         QualityItem::new(Charset::Iso_8859_10, Quality(200)),
+    ///     ])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AcceptCharset, Charset, qitem};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptCharset(vec![qitem(Charset::Ext("utf-8".to_owned()))])
+    /// );
+    /// ```
+    (AcceptCharset, "Accept-Charset") => (QualityItem<Charset>)+
+
+    test_accept_charset {
+        /// Testcase from RFC
+        test_header!(test1, vec![b"iso-8859-5, unicode-1-1;q=0.8"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/accept_encoding.rs
@@ -0,0 +1,71 @@
+use header::{Encoding, QualityItem};
+
+header! {
+    /// `Accept-Encoding` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.4)
+    ///
+    /// The `Accept-Encoding` header field can be used by user agents to
+    /// indicate what response content-codings are
+    /// acceptable in the response.  An  `identity` token is used as a synonym
+    /// for "no encoding" in order to communicate when no encoding is
+    /// preferred.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Accept-Encoding  = #( codings [ weight ] )
+    /// codings          = content-coding / "identity" / "*"
+    /// ```
+    ///
+    /// # Example values
+    /// * `compress, gzip`
+    /// * ``
+    /// * `*`
+    /// * `compress;q=0.5, gzip;q=1`
+    /// * `gzip;q=1.0, identity; q=0.5, *;q=0`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, AcceptEncoding, Encoding, qitem};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptEncoding(vec![qitem(Encoding::Chunked)])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AcceptEncoding, Encoding, qitem};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptEncoding(vec![
+    ///         qitem(Encoding::Chunked),
+    ///         qitem(Encoding::Gzip),
+    ///         qitem(Encoding::Deflate),
+    ///     ])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AcceptEncoding, Encoding, QualityItem, Quality, qitem};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptEncoding(vec![
+    ///         qitem(Encoding::Chunked),
+    ///         QualityItem::new(Encoding::Gzip, Quality(600)),
+    ///         QualityItem::new(Encoding::EncodingExt("*".to_owned()), Quality(0)),
+    ///     ])
+    /// );
+    /// ```
+    (AcceptEncoding, "Accept-Encoding") => (QualityItem<Encoding>)*
+
+    test_accept_encoding {
+        // From the RFC
+        test_header!(test1, vec![b"compress, gzip"]);
+        test_header!(test2, vec![b""], Some(AcceptEncoding(vec![])));
+        test_header!(test3, vec![b"*"]);
+        // Note: Removed quality 1 from gzip
+        test_header!(test4, vec![b"compress;q=0.5, gzip"]);
+        // Note: Removed quality 1 from gzip
+        test_header!(test5, vec![b"gzip, identity; q=0.5, *;q=0"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/accept_language.rs
@@ -0,0 +1,70 @@
+use language_tags::LanguageTag;
+use header::QualityItem;
+
+header! {
+    /// `Accept-Language` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.5)
+    ///
+    /// The `Accept-Language` header field can be used by user agents to
+    /// indicate the set of natural languages that are preferred in the
+    /// response.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Accept-Language = 1#( language-range [ weight ] )
+    /// language-range  = <language-range, see [RFC4647], Section 2.1>
+    /// ```
+    ///
+    /// # Example values
+    /// * `da, en-gb;q=0.8, en;q=0.7`
+    /// * `en-us;q=1.0, en;q=0.5, fr`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::LanguageTag;
+    /// use hyper::header::{Headers, AcceptLanguage, qitem};
+    ///
+    /// let mut headers = Headers::new();
+    /// let mut langtag: LanguageTag = Default::default();
+    /// langtag.language = Some("en".to_owned());
+    /// langtag.region = Some("US".to_owned());
+    /// headers.set(
+    ///     AcceptLanguage(vec![
+    ///         qitem(langtag),
+    ///     ])
+    /// );
+    /// ```
+    /// ```
+    /// # extern crate hyper;
+    /// # #[macro_use] extern crate language_tags;
+    /// # use hyper::header::{Headers, AcceptLanguage, QualityItem, Quality, qitem};
+    /// #
+    /// # fn main() {
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptLanguage(vec![
+    ///         qitem(langtag!(da)),
+    ///         QualityItem::new(langtag!(en;;;GB), Quality(800)),
+    ///         QualityItem::new(langtag!(en), Quality(700)),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (AcceptLanguage, "Accept-Language") => (QualityItem<LanguageTag>)+
+
+    test_accept_language {
+        // From the RFC
+        test_header!(test1, vec![b"da, en-gb;q=0.8, en;q=0.7"]);
+        // Own test
+        test_header!(
+            test2, vec![b"en-US, en; q=0.5, fr"],
+            Some(AcceptLanguage(vec![
+                qitem(langtag!(en;;;US)),
+                QualityItem::new(langtag!(en), Quality(500)),
+                qitem(langtag!(fr)),
+        ])));
+    }
+}
+
+bench_header!(bench, AcceptLanguage,
+              { vec![b"en-us;q=1.0, en;q=0.5, fr".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/accept_ranges.rs
@@ -0,0 +1,101 @@
+use std::fmt::{self, Display};
+use std::str::FromStr;
+
+header! {
+    /// `Accept-Ranges` header, defined in
+    /// [RFC7233](http://tools.ietf.org/html/rfc7233#section-2.3)
+    ///
+    /// The `Accept-Ranges` header field allows a server to indicate that it
+    /// supports range requests for the target resource.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Accept-Ranges     = acceptable-ranges
+    /// acceptable-ranges = 1#range-unit / \"none\"
+    ///
+    /// # Example values
+    /// * `bytes`
+    /// * `none`
+    /// * `unknown-unit`
+    /// ```
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, AcceptRanges, RangeUnit};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(AcceptRanges(vec![RangeUnit::Bytes]));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AcceptRanges, RangeUnit};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(AcceptRanges(vec![RangeUnit::None]));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AcceptRanges, RangeUnit};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AcceptRanges(vec![
+    ///         RangeUnit::Unregistered("nibbles".to_owned()),
+    ///         RangeUnit::Bytes,
+    ///         RangeUnit::Unregistered("doublets".to_owned()),
+    ///         RangeUnit::Unregistered("quadlets".to_owned()),
+    ///     ])
+    /// );
+    /// ```
+    (AcceptRanges, "Accept-Ranges") => (RangeUnit)+
+
+    test_acccept_ranges {
+        test_header!(test1, vec![b"bytes"]);
+        test_header!(test2, vec![b"none"]);
+        test_header!(test3, vec![b"unknown-unit"]);
+        test_header!(test4, vec![b"bytes, unknown-unit"]);
+    }
+}
+
+/// Range Units, described in [RFC7233](http://tools.ietf.org/html/rfc7233#section-2)
+///
+/// A representation can be partitioned into subranges according to
+/// various structural units, depending on the structure inherent in the
+/// representation's media type.
+///
+/// # ABNF
+/// ```plain
+/// range-unit       = bytes-unit / other-range-unit
+/// bytes-unit       = "bytes"
+/// other-range-unit = token
+/// ```
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum RangeUnit {
+    /// Indicating byte-range requests are supported.
+    Bytes,
+    /// Reserved as keyword, indicating no ranges are supported.
+    None,
+    /// The given range unit is not registered at IANA.
+    Unregistered(String),
+}
+
+
+impl FromStr for RangeUnit {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<Self> {
+        match s {
+            "bytes" => Ok(RangeUnit::Bytes),
+            "none" => Ok(RangeUnit::None),
+            // FIXME: Check if s is really a Token
+            _ => Ok(RangeUnit::Unregistered(s.to_owned())),
+        }
+    }
+}
+
+impl Display for RangeUnit {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            RangeUnit::Bytes => f.write_str("bytes"),
+            RangeUnit::None => f.write_str("none"),
+            RangeUnit::Unregistered(ref x) => f.write_str(&x),
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_allow_credentials.rs
@@ -0,0 +1,89 @@
+use std::fmt::{self, Display};
+use std::str;
+use unicase::UniCase;
+use header::{Header, HeaderFormat};
+
+/// `Access-Control-Allow-Credentials` header, part of
+/// [CORS](http://www.w3.org/TR/cors/#access-control-allow-headers-response-header)
+///
+/// > The Access-Control-Allow-Credentials HTTP response header indicates whether the
+/// > response to request can be exposed when the credentials flag is true. When part
+/// > of the response to an preflight request it indicates that the actual request can
+/// > be made with credentials. The Access-Control-Allow-Credentials HTTP header must
+/// > match the following ABNF:
+///
+/// # ABNF
+/// ```plain
+/// Access-Control-Allow-Credentials: "Access-Control-Allow-Credentials" ":" "true"
+/// ```
+///
+/// Since there is only one acceptable field value, the header struct does not accept
+/// any values at all. Setting an empty `AccessControlAllowCredentials` header is
+/// sufficient. See the examples below.
+///
+/// # Example values
+/// * "true"
+///
+/// # Examples
+/// ```
+/// # extern crate hyper;
+/// # fn main() {
+///
+/// use hyper::header::{Headers, AccessControlAllowCredentials};
+///
+/// let mut headers = Headers::new();
+/// headers.set(AccessControlAllowCredentials);
+/// # }
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub struct AccessControlAllowCredentials;
+
+const ACCESS_CONTROL_ALLOW_CREDENTIALS_TRUE: UniCase<&'static str> = UniCase("true");
+
+impl Header for AccessControlAllowCredentials {
+    fn header_name() -> &'static str {
+        "Access-Control-Allow-Credentials"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<AccessControlAllowCredentials> {
+        if raw.len() == 1 {
+            let text = unsafe {
+                // safe because:
+                // 1. we just checked raw.len == 1
+                // 2. we don't actually care if it's utf8, we just want to
+                //    compare the bytes with the "case" normalized. If it's not
+                //    utf8, then the byte comparison will fail, and we'll return
+                //    None. No big deal.
+                str::from_utf8_unchecked(raw.get_unchecked(0))
+            };
+            if UniCase(text) == ACCESS_CONTROL_ALLOW_CREDENTIALS_TRUE {
+                return Ok(AccessControlAllowCredentials);
+            }
+        }
+        Err(::Error::Header)
+    }
+}
+
+impl HeaderFormat for AccessControlAllowCredentials {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str("true")
+    }
+}
+
+impl Display for AccessControlAllowCredentials {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        self.fmt_header(f)
+    }
+}
+
+#[cfg(test)]
+mod test_access_control_allow_credentials {
+    use std::str;
+    use header::*;
+    use super::AccessControlAllowCredentials as HeaderField;
+    test_header!(works,        vec![b"true"], Some(HeaderField));
+    test_header!(ignores_case, vec![b"True"]);
+    test_header!(not_bool,     vec![b"false"], None);
+    test_header!(only_single,  vec![b"true", b"true"], None);
+    test_header!(no_gibberish, vec!["\u{645}\u{631}\u{62d}\u{628}\u{627}".as_bytes()], None);
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_allow_headers.rs
@@ -0,0 +1,58 @@
+use unicase::UniCase;
+
+header! {
+    /// `Access-Control-Allow-Headers` header, part of
+    /// [CORS](http://www.w3.org/TR/cors/#access-control-allow-headers-response-header)
+    ///
+    /// The `Access-Control-Allow-Headers` header indicates, as part of the
+    /// response to a preflight request, which header field names can be used
+    /// during the actual request.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Access-Control-Allow-Headers: "Access-Control-Allow-Headers" ":" #field-name
+    /// ```
+    ///
+    /// # Example values
+    /// * `accept-language, date`
+    ///
+    /// # Examples
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, AccessControlAllowHeaders};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlAllowHeaders(vec![UniCase("date".to_owned())])
+    /// );
+    /// # }
+    /// ```
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, AccessControlAllowHeaders};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlAllowHeaders(vec![
+    ///         UniCase("accept-language".to_owned()),
+    ///         UniCase("date".to_owned()),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (AccessControlAllowHeaders, "Access-Control-Allow-Headers") => (UniCase<String>)*
+
+    test_access_control_allow_headers {
+        test_header!(test1, vec![b"accept-language, date"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_allow_methods.rs
@@ -0,0 +1,48 @@
+use method::Method;
+
+header! {
+    /// `Access-Control-Allow-Methods` header, part of
+    /// [CORS](http://www.w3.org/TR/cors/#access-control-allow-methods-response-header)
+    ///
+    /// The `Access-Control-Allow-Methods` header indicates, as part of the
+    /// response to a preflight request, which methods can be used during the
+    /// actual request.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Access-Control-Allow-Methods: "Access-Control-Allow-Methods" ":" #Method
+    /// ```
+    ///
+    /// # Example values
+    /// * `PUT, DELETE, XMODIFY`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, AccessControlAllowMethods};
+    /// use hyper::method::Method;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlAllowMethods(vec![Method::Get])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, AccessControlAllowMethods};
+    /// use hyper::method::Method;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlAllowMethods(vec![
+    ///         Method::Get,
+    ///         Method::Post,
+    ///         Method::Patch,
+    ///         Method::Extension("COPY".to_owned()),
+    ///     ])
+    /// );
+    /// ```
+    (AccessControlAllowMethods, "Access-Control-Allow-Methods") => (Method)*
+
+    test_access_control_allow_methods {
+        test_header!(test1, vec![b"PUT, DELETE, XMODIFY"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_allow_origin.rs
@@ -0,0 +1,98 @@
+use std::fmt::{self, Display};
+
+use header::{Header, HeaderFormat};
+
+/// The `Access-Control-Allow-Origin` response header,
+/// part of [CORS](http://www.w3.org/TR/cors/#access-control-allow-origin-response-header)
+///
+/// The `Access-Control-Allow-Origin` header indicates whether a resource
+/// can be shared based by returning the value of the Origin request header,
+/// "*", or "null" in the response.
+///
+/// # ABNF
+/// ```plain
+/// Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
+/// ```
+///
+/// # Example values
+/// * `null`
+/// * `*`
+/// * `http://google.com/`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, AccessControlAllowOrigin};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     AccessControlAllowOrigin::Any
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, AccessControlAllowOrigin};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     AccessControlAllowOrigin::Null,
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, AccessControlAllowOrigin};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     AccessControlAllowOrigin::Value("http://hyper.rs".to_owned())
+/// );
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub enum AccessControlAllowOrigin {
+    /// Allow all origins
+    Any,
+    /// A hidden origin
+    Null,
+    /// Allow one particular origin
+    Value(String),
+}
+
+impl Header for AccessControlAllowOrigin {
+    fn header_name() -> &'static str {
+        "Access-Control-Allow-Origin"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<AccessControlAllowOrigin> {
+        if raw.len() != 1 {
+            return Err(::Error::Header)
+        }
+        let value = unsafe { raw.get_unchecked(0) };
+        Ok(match &value[..] {
+            b"*" => AccessControlAllowOrigin::Any,
+            b"null" => AccessControlAllowOrigin::Null,
+            _ => AccessControlAllowOrigin::Value(try!(String::from_utf8(value.clone())))
+        })
+    }
+}
+
+impl HeaderFormat for AccessControlAllowOrigin {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            AccessControlAllowOrigin::Any => f.write_str("*"),
+            AccessControlAllowOrigin::Null => f.write_str("null"),
+            AccessControlAllowOrigin::Value(ref url) => Display::fmt(url, f),
+        }
+    }
+}
+
+impl Display for AccessControlAllowOrigin {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        self.fmt_header(f)
+    }
+}
+
+#[cfg(test)]
+mod test_access_control_allow_orgin {
+    use header::*;
+    use super::AccessControlAllowOrigin as HeaderField;
+    test_header!(test1, vec![b"null"]);
+    test_header!(test2, vec![b"*"]);
+    test_header!(test3, vec![b"http://google.com/"]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_expose_headers.rs
@@ -0,0 +1,60 @@
+use unicase::UniCase;
+
+header! {
+    /// `Access-Control-Expose-Headers` header, part of
+    /// [CORS](http://www.w3.org/TR/cors/#access-control-expose-headers-response-header)
+    ///
+    /// The Access-Control-Expose-Headers header indicates which headers are safe to expose to the
+    /// API of a CORS API specification.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Access-Control-Expose-Headers = "Access-Control-Expose-Headers" ":" #field-name
+    /// ```
+    ///
+    /// # Example values
+    /// * `ETag, Content-Length`
+    ///
+    /// # Examples
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, AccessControlExposeHeaders};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlExposeHeaders(vec![
+    ///         UniCase("etag".to_owned()),
+    ///         UniCase("content-length".to_owned())
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, AccessControlExposeHeaders};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlExposeHeaders(vec![
+    ///         UniCase("etag".to_owned()),
+    ///         UniCase("content-length".to_owned())
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (AccessControlExposeHeaders, "Access-Control-Expose-Headers") => (UniCase<String>)*
+
+    test_access_control_expose_headers {
+        test_header!(test1, vec![b"etag, content-length"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_max_age.rs
@@ -0,0 +1,28 @@
+header! {
+    /// `Access-Control-Max-Age` header, part of
+    /// [CORS](http://www.w3.org/TR/cors/#access-control-max-age-response-header)
+    ///
+    /// The `Access-Control-Max-Age` header indicates how long the results of a
+    /// preflight request can be cached in a preflight result cache.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Access-Control-Max-Age = \"Access-Control-Max-Age\" \":\" delta-seconds
+    /// ```
+    ///
+    /// # Example values
+    /// * `531`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, AccessControlMaxAge};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(AccessControlMaxAge(1728000u32));
+    /// ```
+    (AccessControlMaxAge, "Access-Control-Max-Age") => [u32]
+
+    test_access_control_max_age {
+        test_header!(test1, vec![b"531"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_request_headers.rs
@@ -0,0 +1,58 @@
+use unicase::UniCase;
+
+header! {
+    /// `Access-Control-Request-Headers` header, part of
+    /// [CORS](http://www.w3.org/TR/cors/#access-control-request-headers-request-header)
+    ///
+    /// The `Access-Control-Request-Headers` header indicates which headers will
+    /// be used in the actual request as part of the preflight request.
+    /// during the actual request.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Access-Control-Allow-Headers: "Access-Control-Allow-Headers" ":" #field-name
+    /// ```
+    ///
+    /// # Example values
+    /// * `accept-language, date`
+    ///
+    /// # Examples
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, AccessControlRequestHeaders};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlRequestHeaders(vec![UniCase("date".to_owned())])
+    /// );
+    /// # }
+    /// ```
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, AccessControlRequestHeaders};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     AccessControlRequestHeaders(vec![
+    ///         UniCase("accept-language".to_owned()),
+    ///         UniCase("date".to_owned()),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (AccessControlRequestHeaders, "Access-Control-Request-Headers") => (UniCase<String>)*
+
+    test_access_control_request_headers {
+        test_header!(test1, vec![b"accept-language, date"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/access_control_request_method.rs
@@ -0,0 +1,30 @@
+use method::Method;
+
+header! {
+    /// `Access-Control-Request-Method` header, part of
+    /// [CORS](http://www.w3.org/TR/cors/#access-control-request-method-request-header)
+    /// 
+    /// The `Access-Control-Request-Method` header indicates which method will be
+    /// used in the actual request as part of the preflight request.
+    /// # ABNF
+    /// ```plain
+    /// Access-Control-Request-Method: \"Access-Control-Request-Method\" \":\" Method
+    /// ```
+    /// 
+    /// # Example values
+    /// * `GET`
+    /// 
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, AccessControlRequestMethod};
+    /// use hyper::method::Method;
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(AccessControlRequestMethod(Method::Get));
+    /// ```
+    (AccessControlRequestMethod, "Access-Control-Request-Method") => [Method]
+
+    test_access_control_request_method {
+        test_header!(test1, vec![b"GET"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/allow.rs
@@ -0,0 +1,76 @@
+use method::Method;
+
+header! {
+    /// `Allow` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.4.1)
+    ///
+    /// The `Allow` header field lists the set of methods advertised as
+    /// supported by the target resource.  The purpose of this field is
+    /// strictly to inform the recipient of valid request methods associated
+    /// with the resource.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Allow = #method
+    /// ```
+    ///
+    /// # Example values
+    /// * `GET, HEAD, PUT`
+    /// * `OPTIONS, GET, PUT, POST, DELETE, HEAD, TRACE, CONNECT, PATCH, fOObAr`
+    /// * ``
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, Allow};
+    /// use hyper::method::Method;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     Allow(vec![Method::Get])
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, Allow};
+    /// use hyper::method::Method;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     Allow(vec![
+    ///         Method::Get,
+    ///         Method::Post,
+    ///         Method::Patch,
+    ///         Method::Extension("COPY".to_owned()),
+    ///     ])
+    /// );
+    /// ```
+    (Allow, "Allow") => (Method)*
+
+    test_allow {
+        // From the RFC
+        test_header!(
+            test1,
+            vec![b"GET, HEAD, PUT"],
+            Some(HeaderField(vec![Method::Get, Method::Head, Method::Put])));
+        // Own tests
+        test_header!(
+            test2,
+            vec![b"OPTIONS, GET, PUT, POST, DELETE, HEAD, TRACE, CONNECT, PATCH, fOObAr"],
+            Some(HeaderField(vec![
+                Method::Options,
+                Method::Get,
+                Method::Put,
+                Method::Post,
+                Method::Delete,
+                Method::Head,
+                Method::Trace,
+                Method::Connect,
+                Method::Patch,
+                Method::Extension("fOObAr".to_owned())])));
+        test_header!(
+            test3,
+            vec![b""],
+            Some(HeaderField(Vec::<Method>::new())));
+    }
+}
+
+bench_header!(bench,
+    Allow, { vec![b"OPTIONS,GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,PATCH,fOObAr".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/authorization.rs
@@ -0,0 +1,289 @@
+use std::any::Any;
+use std::fmt::{self, Display};
+use std::str::{FromStr, from_utf8};
+use std::ops::{Deref, DerefMut};
+use base64::{encode, decode};
+use header::{Header, HeaderFormat};
+
+/// `Authorization` header, defined in [RFC7235](https://tools.ietf.org/html/rfc7235#section-4.2)
+///
+/// The `Authorization` header field allows a user agent to authenticate
+/// itself with an origin server -- usually, but not necessarily, after
+/// receiving a 401 (Unauthorized) response.  Its value consists of
+/// credentials containing the authentication information of the user
+/// agent for the realm of the resource being requested.
+///
+/// # ABNF
+/// ```plain
+/// Authorization = credentials
+/// ```
+///
+/// # Example values
+/// * `Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==`
+/// * `Bearer fpKL54jvWmEGVoRdCNjG`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, Authorization};
+///
+/// let mut headers = Headers::new();
+/// headers.set(Authorization("let me in".to_owned()));
+/// ```
+/// ```
+/// use hyper::header::{Headers, Authorization, Basic};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///    Authorization(
+///        Basic {
+///            username: "Aladdin".to_owned(),
+///            password: Some("open sesame".to_owned())
+///        }
+///    )
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, Authorization, Bearer};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///    Authorization(
+///        Bearer {
+///            token: "QWxhZGRpbjpvcGVuIHNlc2FtZQ".to_owned()
+///        }
+///    )
+/// );
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub struct Authorization<S: Scheme>(pub S);
+
+impl<S: Scheme> Deref for Authorization<S> {
+    type Target = S;
+
+    fn deref(&self) -> &S {
+        &self.0
+    }
+}
+
+impl<S: Scheme> DerefMut for Authorization<S> {
+    fn deref_mut(&mut self) -> &mut S {
+        &mut self.0
+    }
+}
+
+impl<S: Scheme + Any> Header for Authorization<S> where <S as FromStr>::Err: 'static {
+    fn header_name() -> &'static str {
+        "Authorization"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Authorization<S>> {
+        if raw.len() != 1 {
+            return Err(::Error::Header);
+        }
+        let header = try!(from_utf8(unsafe { &raw.get_unchecked(0)[..] }));
+        if let Some(scheme) = <S as Scheme>::scheme() {
+            if header.starts_with(scheme) && header.len() > scheme.len() + 1 {
+                match header[scheme.len() + 1..].parse::<S>().map(Authorization) {
+                    Ok(h) => Ok(h),
+                    Err(_) => Err(::Error::Header)
+                }
+            } else {
+                Err(::Error::Header)
+            }
+        } else {
+            match header.parse::<S>().map(Authorization) {
+                Ok(h) => Ok(h),
+                Err(_) => Err(::Error::Header)
+            }
+        }
+    }
+}
+
+impl<S: Scheme + Any> HeaderFormat for Authorization<S> where <S as FromStr>::Err: 'static {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if let Some(scheme) = <S as Scheme>::scheme() {
+            try!(write!(f, "{} ", scheme))
+        };
+        self.0.fmt_scheme(f)
+    }
+}
+
+/// An Authorization scheme to be used in the header.
+pub trait Scheme: FromStr + fmt::Debug + Clone + Send + Sync {
+    /// An optional Scheme name.
+    ///
+    /// Will be replaced with an associated constant once available.
+    fn scheme() -> Option<&'static str>;
+    /// Format the Scheme data into a header value.
+    fn fmt_scheme(&self, &mut fmt::Formatter) -> fmt::Result;
+}
+
+impl Scheme for String {
+    fn scheme() -> Option<&'static str> {
+        None
+    }
+
+    fn fmt_scheme(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        Display::fmt(self, f)
+    }
+}
+
+/// Credential holder for Basic Authentication
+#[derive(Clone, PartialEq, Debug)]
+pub struct Basic {
+    /// The username as a possibly empty string
+    pub username: String,
+    /// The password. `None` if the `:` delimiter character was not
+    /// part of the parsed input.
+    pub password: Option<String>
+}
+
+impl Scheme for Basic {
+    fn scheme() -> Option<&'static str> {
+        Some("Basic")
+    }
+
+    fn fmt_scheme(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        //FIXME: serialize::base64 could use some Debug implementation, so
+        //that we don't have to allocate a new string here just to write it
+        //to the formatter.
+        let mut text = self.username.clone();
+        text.push(':');
+        if let Some(ref pass) = self.password {
+            text.push_str(&pass[..]);
+        }
+
+        f.write_str(&encode(text.as_bytes()))
+    }
+}
+
+impl FromStr for Basic {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<Basic> {
+        match decode(s) {
+            Ok(decoded) => match String::from_utf8(decoded) {
+                Ok(text) => {
+                    let mut parts = &mut text.split(':');
+                    let user = match parts.next() {
+                        Some(part) => part.to_owned(),
+                        None => return Err(::Error::Header)
+                    };
+                    let password = match parts.next() {
+                        Some(part) => Some(part.to_owned()),
+                        None => None
+                    };
+                    Ok(Basic {
+                        username: user,
+                        password: password
+                    })
+                },
+                Err(e) => {
+                    debug!("Basic::from_utf8 error={:?}", e);
+                    Err(::Error::Header)
+                }
+            },
+            Err(e) => {
+                debug!("Basic::from_base64 error={:?}", e);
+                Err(::Error::Header)
+            }
+        }
+    }
+}
+
+#[derive(Clone, PartialEq, Debug)]
+///Token holder for Bearer Authentication, most often seen with oauth
+pub struct Bearer {
+	///Actual bearer token as a string
+	pub token: String
+}
+
+impl Scheme for Bearer {
+	fn scheme() -> Option<&'static str> {
+		Some("Bearer")
+	}
+
+	fn fmt_scheme(&self, f: &mut fmt::Formatter) -> fmt::Result {
+		write!(f, "{}", self.token)
+	}
+}
+
+impl FromStr for Bearer {
+	type Err = ::Error;
+	fn from_str(s: &str) -> ::Result<Bearer> {
+		Ok(Bearer { token: s.to_owned()})
+	}
+}
+
+#[cfg(test)]
+mod tests {
+    use super::{Authorization, Basic, Bearer};
+    use super::super::super::{Headers, Header};
+
+    #[test]
+    fn test_raw_auth() {
+        let mut headers = Headers::new();
+        headers.set(Authorization("foo bar baz".to_owned()));
+        assert_eq!(headers.to_string(), "Authorization: foo bar baz\r\n".to_owned());
+    }
+
+    #[test]
+    fn test_raw_auth_parse() {
+        let header: Authorization<String> = Header::parse_header(
+            &[b"foo bar baz".to_vec()]).unwrap();
+        assert_eq!(header.0, "foo bar baz");
+    }
+
+    #[test]
+    fn test_basic_auth() {
+        let mut headers = Headers::new();
+        headers.set(Authorization(
+            Basic { username: "Aladdin".to_owned(), password: Some("open sesame".to_owned()) }));
+        assert_eq!(
+            headers.to_string(),
+            "Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\r\n".to_owned());
+    }
+
+    #[test]
+    fn test_basic_auth_no_password() {
+        let mut headers = Headers::new();
+        headers.set(Authorization(Basic { username: "Aladdin".to_owned(), password: None }));
+        assert_eq!(headers.to_string(), "Authorization: Basic QWxhZGRpbjo=\r\n".to_owned());
+    }
+
+    #[test]
+    fn test_basic_auth_parse() {
+        let auth: Authorization<Basic> = Header::parse_header(
+            &[b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==".to_vec()]).unwrap();
+        assert_eq!(auth.0.username, "Aladdin");
+        assert_eq!(auth.0.password, Some("open sesame".to_owned()));
+    }
+
+    #[test]
+    fn test_basic_auth_parse_no_password() {
+        let auth: Authorization<Basic> = Header::parse_header(
+            &[b"Basic QWxhZGRpbjo=".to_vec()]).unwrap();
+        assert_eq!(auth.0.username, "Aladdin");
+        assert_eq!(auth.0.password, Some("".to_owned()));
+    }
+
+	#[test]
+    fn test_bearer_auth() {
+        let mut headers = Headers::new();
+        headers.set(Authorization(
+            Bearer { token: "fpKL54jvWmEGVoRdCNjG".to_owned() }));
+        assert_eq!(
+            headers.to_string(),
+            "Authorization: Bearer fpKL54jvWmEGVoRdCNjG\r\n".to_owned());
+    }
+
+    #[test]
+    fn test_bearer_auth_parse() {
+        let auth: Authorization<Bearer> = Header::parse_header(
+            &[b"Bearer fpKL54jvWmEGVoRdCNjG".to_vec()]).unwrap();
+        assert_eq!(auth.0.token, "fpKL54jvWmEGVoRdCNjG");
+    }
+}
+
+bench_header!(raw, Authorization<String>, { vec![b"foo bar baz".to_vec()] });
+bench_header!(basic, Authorization<Basic>, { vec![b"Basic QWxhZGRpbjpuIHNlc2FtZQ==".to_vec()] });
+bench_header!(bearer, Authorization<Bearer>, { vec![b"Bearer fpKL54jvWmEGVoRdCNjG".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/cache_control.rs
@@ -0,0 +1,211 @@
+use std::fmt;
+use std::str::FromStr;
+use header::{Header, HeaderFormat};
+use header::parsing::{from_comma_delimited, fmt_comma_delimited};
+
+/// `Cache-Control` header, defined in [RFC7234](https://tools.ietf.org/html/rfc7234#section-5.2)
+///
+/// The `Cache-Control` header field is used to specify directives for
+/// caches along the request/response chain.  Such cache directives are
+/// unidirectional in that the presence of a directive in a request does
+/// not imply that the same directive is to be given in the response.
+///
+/// # ABNF
+/// ```plain
+/// Cache-Control   = 1#cache-directive
+/// cache-directive = token [ "=" ( token / quoted-string ) ]
+/// ```
+///
+/// # Example values
+/// * `no-cache`
+/// * `private, community="UCI"`
+/// * `max-age=30`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, CacheControl, CacheDirective};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     CacheControl(vec![CacheDirective::MaxAge(86400u32)])
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, CacheControl, CacheDirective};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     CacheControl(vec![
+///         CacheDirective::NoCache,
+///         CacheDirective::Private,
+///         CacheDirective::MaxAge(360u32),
+///         CacheDirective::Extension("foo".to_owned(),
+///                                   Some("bar".to_owned())),
+///     ])
+/// );
+/// ```
+#[derive(PartialEq, Clone, Debug)]
+pub struct CacheControl(pub Vec<CacheDirective>);
+
+__hyper__deref!(CacheControl => Vec<CacheDirective>);
+
+impl Header for CacheControl {
+    fn header_name() -> &'static str {
+        "Cache-Control"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<CacheControl> {
+        let directives = try!(from_comma_delimited(raw));
+        if !directives.is_empty() {
+            Ok(CacheControl(directives))
+        } else {
+            Err(::Error::Header)
+        }
+    }
+}
+
+impl HeaderFormat for CacheControl {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for CacheControl {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt_comma_delimited(f, &self[..])
+    }
+}
+
+/// `CacheControl` contains a list of these directives.
+#[derive(PartialEq, Clone, Debug)]
+pub enum CacheDirective {
+    /// "no-cache"
+    NoCache,
+    /// "no-store"
+    NoStore,
+    /// "no-transform"
+    NoTransform,
+    /// "only-if-cached"
+    OnlyIfCached,
+
+    // request directives
+    /// "max-age=delta"
+    MaxAge(u32),
+    /// "max-stale=delta"
+    MaxStale(u32),
+    /// "min-fresh=delta"
+    MinFresh(u32),
+
+    // response directives
+    /// "must-revalidate"
+    MustRevalidate,
+    /// "public"
+    Public,
+    /// "private"
+    Private,
+    /// "proxy-revalidate"
+    ProxyRevalidate,
+    /// "s-maxage=delta"
+    SMaxAge(u32),
+
+    /// Extension directives. Optionally include an argument.
+    Extension(String, Option<String>)
+}
+
+impl fmt::Display for CacheDirective {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::CacheDirective::*;
+        fmt::Display::fmt(match *self {
+            NoCache => "no-cache",
+            NoStore => "no-store",
+            NoTransform => "no-transform",
+            OnlyIfCached => "only-if-cached",
+
+            MaxAge(secs) => return write!(f, "max-age={}", secs),
+            MaxStale(secs) => return write!(f, "max-stale={}", secs),
+            MinFresh(secs) => return write!(f, "min-fresh={}", secs),
+
+            MustRevalidate => "must-revalidate",
+            Public => "public",
+            Private => "private",
+            ProxyRevalidate => "proxy-revalidate",
+            SMaxAge(secs) => return write!(f, "s-maxage={}", secs),
+
+            Extension(ref name, None) => &name[..],
+            Extension(ref name, Some(ref arg)) => return write!(f, "{}={}", name, arg),
+
+        }, f)
+    }
+}
+
+impl FromStr for CacheDirective {
+    type Err = Option<<u32 as FromStr>::Err>;
+    fn from_str(s: &str) -> Result<CacheDirective, Option<<u32 as FromStr>::Err>> {
+        use self::CacheDirective::*;
+        match s {
+            "no-cache" => Ok(NoCache),
+            "no-store" => Ok(NoStore),
+            "no-transform" => Ok(NoTransform),
+            "only-if-cached" => Ok(OnlyIfCached),
+            "must-revalidate" => Ok(MustRevalidate),
+            "public" => Ok(Public),
+            "private" => Ok(Private),
+            "proxy-revalidate" => Ok(ProxyRevalidate),
+            "" => Err(None),
+            _ => match s.find('=') {
+                Some(idx) if idx+1 < s.len() => match (&s[..idx], (&s[idx+1..]).trim_matches('"')) {
+                    ("max-age" , secs) => secs.parse().map(MaxAge).map_err(Some),
+                    ("max-stale", secs) => secs.parse().map(MaxStale).map_err(Some),
+                    ("min-fresh", secs) => secs.parse().map(MinFresh).map_err(Some),
+                    ("s-maxage", secs) => secs.parse().map(SMaxAge).map_err(Some),
+                    (left, right) => Ok(Extension(left.to_owned(), Some(right.to_owned())))
+                },
+                Some(_) => Err(None),
+                None => Ok(Extension(s.to_owned(), None))
+            }
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use header::Header;
+    use super::*;
+
+    #[test]
+    fn test_parse_multiple_headers() {
+        let cache = Header::parse_header(&[b"no-cache".to_vec(), b"private".to_vec()]);
+        assert_eq!(cache.ok(), Some(CacheControl(vec![CacheDirective::NoCache,
+                                                 CacheDirective::Private])))
+    }
+
+    #[test]
+    fn test_parse_argument() {
+        let cache = Header::parse_header(&[b"max-age=100, private".to_vec()]);
+        assert_eq!(cache.ok(), Some(CacheControl(vec![CacheDirective::MaxAge(100),
+                                                 CacheDirective::Private])))
+    }
+
+    #[test]
+    fn test_parse_quote_form() {
+        let cache = Header::parse_header(&[b"max-age=\"200\"".to_vec()]);
+        assert_eq!(cache.ok(), Some(CacheControl(vec![CacheDirective::MaxAge(200)])))
+    }
+
+    #[test]
+    fn test_parse_extension() {
+        let cache = Header::parse_header(&[b"foo, bar=baz".to_vec()]);
+        assert_eq!(cache.ok(), Some(CacheControl(vec![
+            CacheDirective::Extension("foo".to_owned(), None),
+            CacheDirective::Extension("bar".to_owned(), Some("baz".to_owned()))])))
+    }
+
+    #[test]
+    fn test_parse_bad_syntax() {
+        let cache: ::Result<CacheControl> = Header::parse_header(&[b"foo=".to_vec()]);
+        assert_eq!(cache.ok(), None)
+    }
+}
+
+bench_header!(normal,
+    CacheControl, { vec![b"no-cache, private".to_vec(), b"max-age=100".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/connection.rs
@@ -0,0 +1,143 @@
+use std::fmt::{self, Display};
+use std::str::FromStr;
+use unicase::UniCase;
+
+pub use self::ConnectionOption::{KeepAlive, Close, ConnectionHeader};
+
+const KEEP_ALIVE: UniCase<&'static str> = UniCase("keep-alive");
+const CLOSE: UniCase<&'static str> = UniCase("close");
+
+/// Values that can be in the `Connection` header.
+#[derive(Clone, PartialEq, Debug)]
+pub enum ConnectionOption {
+    /// The `keep-alive` connection value.
+    KeepAlive,
+    /// The `close` connection value.
+    Close,
+    /// Values in the Connection header that are supposed to be names of other Headers.
+    ///
+    /// > When a header field aside from Connection is used to supply control
+    /// > information for or about the current connection, the sender MUST list
+    /// > the corresponding field-name within the Connection header field.
+    // TODO: it would be nice if these "Strings" could be stronger types, since
+    // they are supposed to relate to other Header fields (which we have strong
+    // types for).
+    ConnectionHeader(UniCase<String>),
+}
+
+impl FromStr for ConnectionOption {
+    type Err = ();
+    fn from_str(s: &str) -> Result<ConnectionOption, ()> {
+        if UniCase(s) == KEEP_ALIVE {
+            Ok(KeepAlive)
+        } else if UniCase(s) == CLOSE {
+            Ok(Close)
+        } else {
+            Ok(ConnectionHeader(UniCase(s.to_owned())))
+        }
+    }
+}
+
+impl Display for ConnectionOption {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match *self {
+            KeepAlive => "keep-alive",
+            Close => "close",
+            ConnectionHeader(UniCase(ref s)) => s.as_ref()
+        })
+    }
+}
+
+header! {
+    /// `Connection` header, defined in
+    /// [RFC7230](http://tools.ietf.org/html/rfc7230#section-6.1)
+    ///
+    /// The `Connection` header field allows the sender to indicate desired
+    /// control options for the current connection.  In order to avoid
+    /// confusing downstream recipients, a proxy or gateway MUST remove or
+    /// replace any received connection options before forwarding the
+    /// message.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Connection        = 1#connection-option
+    /// connection-option = token
+    ///
+    /// # Example values
+    /// * `close`
+    /// * `keep-alive`
+    /// * `upgrade`
+    /// ```
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, Connection};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Connection::keep_alive());
+    /// ```
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, Connection, ConnectionOption};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     Connection(vec![
+    ///         ConnectionOption::ConnectionHeader(UniCase("upgrade".to_owned())),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (Connection, "Connection") => (ConnectionOption)+
+
+    test_connection {
+        test_header!(test1, vec![b"close"]);
+        test_header!(test2, vec![b"keep-alive"]);
+        test_header!(test3, vec![b"upgrade"]);
+    }
+}
+
+impl Connection {
+    /// A constructor to easily create a `Connection: close` header.
+    #[inline]
+    pub fn close() -> Connection {
+        Connection(vec![ConnectionOption::Close])
+    }
+
+    /// A constructor to easily create a `Connection: keep-alive` header.
+    #[inline]
+    pub fn keep_alive() -> Connection {
+        Connection(vec![ConnectionOption::KeepAlive])
+    }
+}
+
+bench_header!(close, Connection, { vec![b"close".to_vec()] });
+bench_header!(keep_alive, Connection, { vec![b"keep-alive".to_vec()] });
+bench_header!(header, Connection, { vec![b"authorization".to_vec()] });
+
+#[cfg(test)]
+mod tests {
+    use super::{Connection,ConnectionHeader};
+    use header::Header;
+    use unicase::UniCase;
+
+    fn parse_option(header: Vec<u8>) -> Connection {
+        let val = vec![header];
+        let connection: Connection = Header::parse_header(&val[..]).unwrap();
+        connection
+    }
+
+    #[test]
+    fn test_parse() {
+        assert_eq!(Connection::close(),parse_option(b"close".to_vec()));
+        assert_eq!(Connection::keep_alive(),parse_option(b"keep-alive".to_vec()));
+        assert_eq!(Connection::keep_alive(),parse_option(b"Keep-Alive".to_vec()));
+        assert_eq!(Connection(vec![ConnectionHeader(UniCase("upgrade".to_owned()))]),
+            parse_option(b"upgrade".to_vec()));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/content_disposition.rs
@@ -0,0 +1,265 @@
+// # References
+//
+// "The Content-Disposition Header Field" https://www.ietf.org/rfc/rfc2183.txt
+// "The Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)" https://www.ietf.org/rfc/rfc6266.txt
+// "Returning Values from Forms: multipart/form-data" https://www.ietf.org/rfc/rfc2388.txt
+// Browser conformance tests at: http://greenbytes.de/tech/tc2231/
+// IANA assignment: http://www.iana.org/assignments/cont-disp/cont-disp.xhtml
+
+use language_tags::LanguageTag;
+use std::fmt;
+use unicase::UniCase;
+use url::percent_encoding;
+
+use header::{Header, HeaderFormat, parsing};
+use header::parsing::{parse_extended_value, HTTP_VALUE};
+use header::shared::Charset;
+
+/// The implied disposition of the content of the HTTP body
+#[derive(Clone, Debug, PartialEq)]
+pub enum DispositionType {
+    /// Inline implies default processing
+    Inline,
+    /// Attachment implies that the recipient should prompt the user to save the response locally,
+    /// rather than process it normally (as per its media type).
+    Attachment,
+    /// Extension type.  Should be handled by recipients the same way as Attachment
+    Ext(String)
+}
+
+/// A parameter to the disposition type
+#[derive(Clone, Debug, PartialEq)]
+pub enum DispositionParam {
+    /// A Filename consisting of a Charset, an optional LanguageTag, and finally a sequence of
+    /// bytes representing the filename
+    Filename(Charset, Option<LanguageTag>, Vec<u8>),
+    /// Extension type consisting of token and value.  Recipients should ignore unrecognized
+    /// parameters.
+    Ext(String, String)
+}
+
+/// A `Content-Disposition` header, (re)defined in [RFC6266](https://tools.ietf.org/html/rfc6266)
+///
+/// The Content-Disposition response header field is used to convey
+/// additional information about how to process the response payload, and
+/// also can be used to attach additional metadata, such as the filename
+/// to use when saving the response payload locally.
+///
+/// # ABNF
+/// ```plain
+/// content-disposition = "Content-Disposition" ":"
+///                       disposition-type *( ";" disposition-parm )
+///
+/// disposition-type    = "inline" | "attachment" | disp-ext-type
+///                       ; case-insensitive
+///
+/// disp-ext-type       = token
+///
+/// disposition-parm    = filename-parm | disp-ext-parm
+///
+/// filename-parm       = "filename" "=" value
+///                     | "filename*" "=" ext-value
+///
+/// disp-ext-parm       = token "=" value
+///                     | ext-token "=" ext-value
+///
+/// ext-token           = <the characters in token, followed by "*">
+/// ```
+///
+/// # Example
+/// ```
+/// use hyper::header::{Headers, ContentDisposition, DispositionType, DispositionParam, Charset};
+///
+/// let mut headers = Headers::new();
+/// headers.set(ContentDisposition {
+///     disposition: DispositionType::Attachment,
+///     parameters: vec![DispositionParam::Filename(
+///       Charset::Iso_8859_1, // The character set for the bytes of the filename
+///       None, // The optional language tag (see `language-tag` crate)
+///       b"\xa9 Copyright 1989.txt".to_vec() // the actual bytes of the filename
+///     )]
+/// });
+/// ```
+#[derive(Clone, Debug, PartialEq)]
+pub struct ContentDisposition {
+    /// The disposition
+    pub disposition: DispositionType,
+    /// Disposition parameters
+    pub parameters: Vec<DispositionParam>,
+}
+
+impl Header for ContentDisposition {
+    fn header_name() -> &'static str {
+        "Content-Disposition"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<ContentDisposition> {
+        parsing::from_one_raw_str(raw).and_then(|s: String| {
+            let mut sections = s.split(';');
+            let disposition = match sections.next() {
+                Some(s) => s.trim(),
+                None => return Err(::Error::Header),
+            };
+
+            let mut cd = ContentDisposition {
+                disposition: if UniCase(&*disposition) == UniCase("inline") {
+                    DispositionType::Inline
+                } else if UniCase(&*disposition) == UniCase("attachment") {
+                    DispositionType::Attachment
+                } else {
+                    DispositionType::Ext(disposition.to_owned())
+                },
+                parameters: Vec::new(),
+            };
+
+            for section in sections {
+                let mut parts = section.splitn(2, '=');
+
+                let key = if let Some(key) = parts.next() {
+                    key.trim()
+                } else {
+                    return Err(::Error::Header);
+                };
+
+                let val = if let Some(val) = parts.next() {
+                    val.trim()
+                } else {
+                    return Err(::Error::Header);
+                };
+
+                cd.parameters.push(
+                    if UniCase(&*key) == UniCase("filename") {
+                        DispositionParam::Filename(
+                            Charset::Ext("UTF-8".to_owned()), None,
+                            val.trim_matches('"').as_bytes().to_owned())
+                    } else if UniCase(&*key) == UniCase("filename*") {
+                        let extended_value = try!(parse_extended_value(val));
+                        DispositionParam::Filename(extended_value.charset, extended_value.language_tag, extended_value.value)
+                    } else {
+                        DispositionParam::Ext(key.to_owned(), val.trim_matches('"').to_owned())
+                    }
+                );
+            }
+
+            Ok(cd)
+        })
+    }
+}
+
+impl HeaderFormat for ContentDisposition {
+    #[inline]
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self, f)
+    }
+}
+
+impl fmt::Display for ContentDisposition {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.disposition {
+            DispositionType::Inline => try!(write!(f, "inline")),
+            DispositionType::Attachment => try!(write!(f, "attachment")),
+            DispositionType::Ext(ref s) => try!(write!(f, "{}", s)),
+        }
+        for param in &self.parameters {
+            match *param {
+                DispositionParam::Filename(ref charset, ref opt_lang, ref bytes) => {
+                    let mut use_simple_format: bool = false;
+                    if opt_lang.is_none() {
+                        if let Charset::Ext(ref ext) = *charset {
+                            if UniCase(&**ext) == UniCase("utf-8") {
+                                use_simple_format = true;
+                            }
+                        }
+                    }
+                    if use_simple_format {
+                        try!(write!(f, "; filename=\"{}\"",
+                                    match String::from_utf8(bytes.clone()) {
+                                        Ok(s) => s,
+                                        Err(_) => return Err(fmt::Error),
+                                    }));
+                    } else {
+                        try!(write!(f, "; filename*={}'", charset));
+                        if let Some(ref lang) = *opt_lang {
+                            try!(write!(f, "{}", lang));
+                        };
+                        try!(write!(f, "'"));
+                        try!(f.write_str(
+                            &percent_encoding::percent_encode(bytes, HTTP_VALUE).to_string()))
+                    }
+                },
+                DispositionParam::Ext(ref k, ref v) => try!(write!(f, "; {}=\"{}\"", k, v)),
+            }
+        }
+        Ok(())
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::{ContentDisposition,DispositionType,DispositionParam};
+    use ::header::Header;
+    use ::header::shared::Charset;
+
+    #[test]
+    fn test_parse_header() {
+        assert!(ContentDisposition::parse_header([b"".to_vec()].as_ref()).is_err());
+
+        let a = [b"form-data; dummy=3; name=upload;\r\n filename=\"sample.png\"".to_vec()];
+        let a: ContentDisposition = ContentDisposition::parse_header(a.as_ref()).unwrap();
+        let b = ContentDisposition {
+            disposition: DispositionType::Ext("form-data".to_owned()),
+            parameters: vec![
+                DispositionParam::Ext("dummy".to_owned(), "3".to_owned()),
+                DispositionParam::Ext("name".to_owned(), "upload".to_owned()),
+                DispositionParam::Filename(
+                    Charset::Ext("UTF-8".to_owned()),
+                    None,
+                    "sample.png".bytes().collect()) ]
+        };
+        assert_eq!(a, b);
+
+        let a = [b"attachment; filename=\"image.jpg\"".to_vec()];
+        let a: ContentDisposition = ContentDisposition::parse_header(a.as_ref()).unwrap();
+        let b = ContentDisposition {
+            disposition: DispositionType::Attachment,
+            parameters: vec![
+                DispositionParam::Filename(
+                    Charset::Ext("UTF-8".to_owned()),
+                    None,
+                    "image.jpg".bytes().collect()) ]
+        };
+        assert_eq!(a, b);
+
+        let a = [b"attachment; filename*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates".to_vec()];
+        let a: ContentDisposition = ContentDisposition::parse_header(a.as_ref()).unwrap();
+        let b = ContentDisposition {
+            disposition: DispositionType::Attachment,
+            parameters: vec![
+                DispositionParam::Filename(
+                    Charset::Ext("UTF-8".to_owned()),
+                    None,
+                    vec![0xc2, 0xa3, 0x20, b'a', b'n', b'd', 0x20,
+                         0xe2, 0x82, 0xac, 0x20, b'r', b'a', b't', b'e', b's']) ]
+        };
+        assert_eq!(a, b);
+    }
+
+    #[test]
+    fn test_display() {
+        let a = [b"attachment; filename*=UTF-8'en'%C2%A3%20and%20%E2%82%AC%20rates".to_vec()];
+        let as_string = ::std::str::from_utf8(&(a[0])).unwrap();
+        let a: ContentDisposition = ContentDisposition::parse_header(a.as_ref()).unwrap();
+        let display_rendered = format!("{}",a);
+        assert_eq!(as_string, display_rendered);
+
+        let a = [b"attachment; filename*=UTF-8''black%20and%20white.csv".to_vec()];
+        let a: ContentDisposition = ContentDisposition::parse_header(a.as_ref()).unwrap();
+        let display_rendered = format!("{}",a);
+        assert_eq!("attachment; filename=\"black and white.csv\"".to_owned(), display_rendered);
+
+        let a = [b"attachment; filename=colourful.csv".to_vec()];
+        let a: ContentDisposition = ContentDisposition::parse_header(a.as_ref()).unwrap();
+        let display_rendered = format!("{}",a);
+        assert_eq!("attachment; filename=\"colourful.csv\"".to_owned(), display_rendered);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/content_encoding.rs
@@ -0,0 +1,50 @@
+use header::Encoding;
+
+header! {
+    /// `Content-Encoding` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-3.1.2.2)
+    /// 
+    /// The `Content-Encoding` header field indicates what content codings
+    /// have been applied to the representation, beyond those inherent in the
+    /// media type, and thus what decoding mechanisms have to be applied in
+    /// order to obtain data in the media type referenced by the Content-Type
+    /// header field.  Content-Encoding is primarily used to allow a
+    /// representation's data to be compressed without losing the identity of
+    /// its underlying media type.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Content-Encoding = 1#content-coding
+    /// ```
+    /// 
+    /// # Example values
+    /// * `gzip`
+    /// 
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, ContentEncoding, Encoding};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(ContentEncoding(vec![Encoding::Chunked]));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, ContentEncoding, Encoding};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     ContentEncoding(vec![
+    ///         Encoding::Gzip,
+    ///         Encoding::Chunked,
+    ///     ])
+    /// );
+    /// ```
+    (ContentEncoding, "Content-Encoding") => (Encoding)+
+
+    test_content_encoding {
+        /// Testcase from the RFC
+        test_header!(test1, vec![b"gzip"], Some(ContentEncoding(vec![Encoding::Gzip])));
+    }
+}
+
+bench_header!(single, ContentEncoding, { vec![b"gzip".to_vec()] });
+bench_header!(multiple, ContentEncoding, { vec![b"gzip, deflate".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/content_language.rs
@@ -0,0 +1,59 @@
+use language_tags::LanguageTag;
+use header::QualityItem;
+
+header! {
+    /// `Content-Language` header, defined in
+    /// [RFC7231](https://tools.ietf.org/html/rfc7231#section-3.1.3.2)
+    /// 
+    /// The `Content-Language` header field describes the natural language(s)
+    /// of the intended audience for the representation.  Note that this
+    /// might not be equivalent to all the languages used within the
+    /// representation.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Content-Language = 1#language-tag
+    /// ```
+    /// 
+    /// # Example values
+    /// * `da`
+    /// * `mi, en`
+    /// 
+    /// # Examples
+    /// ```
+    /// # extern crate hyper;
+    /// # #[macro_use] extern crate language_tags;
+    /// # use hyper::header::{Headers, ContentLanguage, qitem};
+    /// # 
+    /// # fn main() {
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     ContentLanguage(vec![
+    ///         qitem(langtag!(en)),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    /// ```
+    /// # extern crate hyper;
+    /// # #[macro_use] extern crate language_tags;
+    /// # use hyper::header::{Headers, ContentLanguage, qitem};
+    /// # 
+    /// # fn main() {
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     ContentLanguage(vec![
+    ///         qitem(langtag!(da)),
+    ///         qitem(langtag!(en;;;GB)),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (ContentLanguage, "Content-Language") => (QualityItem<LanguageTag>)+
+
+    test_content_language {
+        test_header!(test1, vec![b"da"]);
+        test_header!(test2, vec![b"mi, en"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/content_length.rs
@@ -0,0 +1,94 @@
+use std::fmt;
+
+use header::{HeaderFormat, Header, parsing};
+
+/// `Content-Length` header, defined in
+/// [RFC7230](http://tools.ietf.org/html/rfc7230#section-3.3.2)
+/// 
+/// When a message does not have a `Transfer-Encoding` header field, a
+/// Content-Length header field can provide the anticipated size, as a
+/// decimal number of octets, for a potential payload body.  For messages
+/// that do include a payload body, the Content-Length field-value
+/// provides the framing information necessary for determining where the
+/// body (and message) ends.  For messages that do not include a payload
+/// body, the Content-Length indicates the size of the selected
+/// representation.
+/// 
+/// # ABNF
+/// ```plain
+/// Content-Length = 1*DIGIT
+/// ```
+/// 
+/// # Example values
+/// * `3495`
+/// 
+/// # Example
+/// ```
+/// use hyper::header::{Headers, ContentLength};
+/// 
+/// let mut headers = Headers::new();
+/// headers.set(ContentLength(1024u64));
+/// ```
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub struct ContentLength(pub u64);
+
+impl Header for ContentLength {
+    #[inline]
+    fn header_name() -> &'static str {
+        "Content-Length"
+    }
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<ContentLength> {
+        // If multiple Content-Length headers were sent, everything can still
+        // be alright if they all contain the same value, and all parse
+        // correctly. If not, then it's an error.
+        raw.iter()
+            .map(::std::ops::Deref::deref)
+            .map(parsing::from_raw_str)
+            .fold(None, |prev, x| {
+                match (prev, x) {
+                    (None, x) => Some(x),
+                    (e@Some(Err(_)), _ ) => e,
+                    (Some(Ok(prev)), Ok(x)) if prev == x => Some(Ok(prev)),
+                    _ => Some(Err(::Error::Header))
+                }
+            })
+            .unwrap_or(Err(::Error::Header))
+            .map(ContentLength)
+    }
+}
+
+impl HeaderFormat for ContentLength {
+    #[inline]
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self.0, f)
+    }
+}
+
+impl fmt::Display for ContentLength {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self.0, f)
+    }
+}
+
+__hyper__deref!(ContentLength => u64);
+
+__hyper__tm!(ContentLength, tests {
+    // Testcase from RFC
+    test_header!(test1, vec![b"3495"], Some(HeaderField(3495)));
+
+    test_header!(test_invalid, vec![b"34v95"], None);
+
+    // Can't use the test_header macro because "5, 5" gets cleaned to "5".
+    #[test]
+    fn test_duplicates() {
+        let parsed = HeaderField::parse_header(&[b"5"[..].into(),
+                                                 b"5"[..].into()]).unwrap();
+        assert_eq!(parsed, HeaderField(5));
+        assert_eq!(format!("{}", parsed), "5");
+    }
+
+    test_header!(test_duplicates_vary, vec![b"5", b"6", b"5"], None);
+});
+
+bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/content_range.rs
@@ -0,0 +1,189 @@
+use std::fmt::{self, Display};
+use std::str::FromStr;
+
+header! {
+    /// `Content-Range` header, defined in
+    /// [RFC7233](http://tools.ietf.org/html/rfc7233#section-4.2)
+    (ContentRange, "Content-Range") => [ContentRangeSpec]
+
+    test_content_range {
+        test_header!(test_bytes,
+            vec![b"bytes 0-499/500"],
+            Some(ContentRange(ContentRangeSpec::Bytes {
+                range: Some((0, 499)),
+                instance_length: Some(500)
+            })));
+
+        test_header!(test_bytes_unknown_len,
+            vec![b"bytes 0-499/*"],
+            Some(ContentRange(ContentRangeSpec::Bytes {
+                range: Some((0, 499)),
+                instance_length: None
+            })));
+
+        test_header!(test_bytes_unknown_range,
+            vec![b"bytes */500"],
+            Some(ContentRange(ContentRangeSpec::Bytes {
+                range: None,
+                instance_length: Some(500)
+            })));
+
+        test_header!(test_unregistered,
+            vec![b"seconds 1-2"],
+            Some(ContentRange(ContentRangeSpec::Unregistered {
+                unit: "seconds".to_owned(),
+                resp: "1-2".to_owned()
+            })));
+
+        test_header!(test_no_len,
+            vec![b"bytes 0-499"],
+            None::<ContentRange>);
+
+        test_header!(test_only_unit,
+            vec![b"bytes"],
+            None::<ContentRange>);
+
+        test_header!(test_end_less_than_start,
+            vec![b"bytes 499-0/500"],
+            None::<ContentRange>);
+
+        test_header!(test_blank,
+            vec![b""],
+            None::<ContentRange>);
+
+        test_header!(test_bytes_many_spaces,
+            vec![b"bytes 1-2/500 3"],
+            None::<ContentRange>);
+
+        test_header!(test_bytes_many_slashes,
+            vec![b"bytes 1-2/500/600"],
+            None::<ContentRange>);
+
+        test_header!(test_bytes_many_dashes,
+            vec![b"bytes 1-2-3/500"],
+            None::<ContentRange>);
+
+    }
+}
+
+
+/// Content-Range, described in [RFC7233](https://tools.ietf.org/html/rfc7233#section-4.2)
+///
+/// # ABNF
+/// ```plain
+/// Content-Range       = byte-content-range
+///                     / other-content-range
+///
+/// byte-content-range  = bytes-unit SP
+///                       ( byte-range-resp / unsatisfied-range )
+///
+/// byte-range-resp     = byte-range "/" ( complete-length / "*" )
+/// byte-range          = first-byte-pos "-" last-byte-pos
+/// unsatisfied-range   = "*/" complete-length
+///
+/// complete-length     = 1*DIGIT
+///
+/// other-content-range = other-range-unit SP other-range-resp
+/// other-range-resp    = *CHAR
+/// ```
+#[derive(PartialEq, Clone, Debug)]
+pub enum ContentRangeSpec {
+    /// Byte range
+    Bytes {
+        /// First and last bytes of the range, omitted if request could not be
+        /// satisfied
+        range: Option<(u64, u64)>,
+
+        /// Total length of the instance, can be omitted if unknown
+        instance_length: Option<u64>
+    },
+
+    /// Custom range, with unit not registered at IANA
+    Unregistered {
+        /// other-range-unit
+        unit: String,
+
+        /// other-range-resp
+        resp: String
+    }
+}
+
+fn split_in_two(s: &str, separator: char) -> Option<(&str, &str)> {
+    let mut iter = s.splitn(2, separator);
+    match (iter.next(), iter.next()) {
+        (Some(a), Some(b)) => Some((a, b)),
+        _ => None
+    }
+}
+
+impl FromStr for ContentRangeSpec {
+    type Err = ::Error;
+
+    fn from_str(s: &str) -> ::Result<Self> {
+        let res = match split_in_two(s, ' ') {
+            Some(("bytes", resp)) => {
+                let (range, instance_length) = try!(split_in_two(resp, '/').ok_or(::Error::Header));
+
+                let instance_length = if instance_length == "*" {
+                    None
+                } else {
+                    Some(try!(instance_length.parse().map_err(|_| ::Error::Header)))
+                };
+
+                let range = if range == "*" {
+                    None
+                } else {
+                    let (first_byte, last_byte) = try!(split_in_two(range, '-').ok_or(::Error::Header));
+                    let first_byte = try!(first_byte.parse().map_err(|_| ::Error::Header));
+                    let last_byte = try!(last_byte.parse().map_err(|_| ::Error::Header));
+                    if last_byte < first_byte {
+                        return Err(::Error::Header);
+                    }
+                    Some((first_byte, last_byte))
+                };
+
+                ContentRangeSpec::Bytes {
+                    range: range,
+                    instance_length: instance_length
+                }
+            }
+            Some((unit, resp)) => {
+                ContentRangeSpec::Unregistered {
+                    unit: unit.to_owned(),
+                    resp: resp.to_owned()
+                }
+            }
+            _ => return Err(::Error::Header)
+        };
+        Ok(res)
+    }
+}
+
+impl Display for ContentRangeSpec {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            ContentRangeSpec::Bytes { range, instance_length } => {
+                try!(f.write_str("bytes "));
+                match range {
+                    Some((first_byte, last_byte)) => {
+                        try!(write!(f, "{}-{}", first_byte, last_byte));
+                    },
+                    None => {
+                        try!(f.write_str("*"));
+                    }
+                };
+                try!(f.write_str("/"));
+                if let Some(v) = instance_length {
+                    write!(f, "{}", v)
+                } else {
+                    f.write_str("*")
+                }
+            }
+            ContentRangeSpec::Unregistered { ref unit, ref resp } => {
+                try!(f.write_str(&unit));
+                try!(f.write_str(" "));
+                f.write_str(&resp)
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/content_type.rs
@@ -0,0 +1,97 @@
+use mime::Mime;
+
+header! {
+    /// `Content-Type` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-3.1.1.5)
+    /// 
+    /// The `Content-Type` header field indicates the media type of the
+    /// associated representation: either the representation enclosed in the
+    /// message payload or the selected representation, as determined by the
+    /// message semantics.  The indicated media type defines both the data
+    /// format and how that data is intended to be processed by a recipient,
+    /// within the scope of the received message semantics, after any content
+    /// codings indicated by Content-Encoding are decoded.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Content-Type = media-type
+    /// ```
+    /// 
+    /// # Example values
+    /// * `text/html; charset=ISO-8859-4`
+    /// 
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, ContentType};
+    /// use hyper::mime::{Mime, TopLevel, SubLevel};
+    /// 
+    /// let mut headers = Headers::new();
+    /// 
+    /// headers.set(
+    ///     ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![]))
+    /// );
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, ContentType};
+    /// use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value};
+    /// 
+    /// let mut headers = Headers::new();
+    /// 
+    /// headers.set(
+    ///     ContentType(Mime(TopLevel::Application, SubLevel::Json,
+    ///                      vec![(Attr::Charset, Value::Utf8)]))
+    /// );
+    /// ```
+    (ContentType, "Content-Type") => [Mime]
+
+    test_content_type {
+        test_header!(
+            test1,
+            // FIXME: Should be b"text/html; charset=ISO-8859-4" but mime crate lowercases
+            // the whole value so parsing and formatting the value gives a different result
+            vec![b"text/html; charset=iso-8859-4"],
+            Some(HeaderField(Mime(
+                TopLevel::Text,
+                SubLevel::Html,
+                vec![(Attr::Charset, Value::Ext("iso-8859-4".to_owned()))]))));
+    }
+}
+
+impl ContentType {
+    /// A constructor  to easily create a `Content-Type: application/json` header.
+    #[inline]
+    pub fn json() -> ContentType {
+        ContentType(mime!(Application/Json))
+    }
+
+    /// A constructor  to easily create a `Content-Type: text/plain; charset=utf-8` header.
+    #[inline]
+    pub fn plaintext() -> ContentType {
+        ContentType(mime!(Text/Plain; Charset=Utf8))
+    }
+
+    /// A constructor  to easily create a `Content-Type: text/html; charset=utf-8` header.
+    #[inline]
+    pub fn html() -> ContentType {
+        ContentType(mime!(Text/Html; Charset=Utf8))
+    }
+
+    /// A constructor  to easily create a `Content-Type: application/www-form-url-encoded` header.
+    #[inline]
+    pub fn form_url_encoded() -> ContentType {
+        ContentType(mime!(Application/WwwFormUrlEncoded))
+    }
+    /// A constructor  to easily create a `Content-Type: image/jpeg` header.
+    #[inline]
+    pub fn jpeg() -> ContentType {
+        ContentType(mime!(Image/Jpeg))
+    }
+
+    /// A constructor  to easily create a `Content-Type: image/png` header.
+    #[inline]
+    pub fn png() -> ContentType {
+        ContentType(mime!(Image/Png))
+    }
+}
+
+bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/cookie.rs
@@ -0,0 +1,70 @@
+use header::{Header, HeaderFormat};
+use std::fmt::{self, Display};
+use std::str::from_utf8;
+
+/// `Cookie` header, defined in [RFC6265](http://tools.ietf.org/html/rfc6265#section-5.4)
+///
+/// If the user agent does attach a Cookie header field to an HTTP
+/// request, the user agent must send the cookie-string
+/// as the value of the header field.
+///
+/// When the user agent generates an HTTP request, the user agent MUST NOT
+/// attach more than one Cookie header field.
+///
+/// # Example values
+/// * `SID=31d4d96e407aad42`
+/// * `SID=31d4d96e407aad42; lang=en-US`
+///
+/// # Example
+/// ```
+/// use hyper::header::{Headers, Cookie};
+///
+/// let mut headers = Headers::new();
+///
+/// headers.set(
+///    Cookie(vec![
+///        String::from("foo=bar")
+///    ])
+/// );
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub struct Cookie(pub Vec<String>);
+
+__hyper__deref!(Cookie => Vec<String>);
+
+impl Header for Cookie {
+    fn header_name() -> &'static str {
+        "Cookie"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Cookie> {
+        let mut cookies = Vec::with_capacity(raw.len());
+        for cookies_raw in raw.iter() {
+            let cookies_str = try!(from_utf8(&cookies_raw[..]));
+            for cookie_str in cookies_str.split(';') {
+                cookies.push(cookie_str.trim().to_owned())
+            }
+        }
+
+        if !cookies.is_empty() {
+            Ok(Cookie(cookies))
+        } else {
+            Err(::Error::Header)
+        }
+    }
+}
+
+impl HeaderFormat for Cookie {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let cookies = &self.0;
+        for (i, cookie) in cookies.iter().enumerate() {
+            if i != 0 {
+                try!(f.write_str("; "));
+            }
+            try!(Display::fmt(&cookie, f));
+        }
+        Ok(())
+    }
+}
+
+bench_header!(bench, Cookie, { vec![b"foo=bar; baz=quux".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/date.rs
@@ -0,0 +1,40 @@
+use header::HttpDate;
+
+header! {
+    /// `Date` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.1.1.2)
+    /// 
+    /// The `Date` header field represents the date and time at which the
+    /// message was originated.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Date = HTTP-date
+    /// ```
+    /// 
+    /// # Example values
+    /// * `Tue, 15 Nov 1994 08:12:31 GMT`
+    /// 
+    /// # Example
+    /// ```
+    /// # extern crate time;
+    /// # extern crate hyper;
+    /// # fn main() {
+    /// // extern crate time;
+    /// 
+    /// use hyper::header::{Headers, Date, HttpDate};
+    /// use time;
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(Date(HttpDate(time::now())));
+    /// # }
+    /// ```
+    (Date, "Date") => [HttpDate]
+
+    test_date {
+        test_header!(test1, vec![b"Tue, 15 Nov 1994 08:12:31 GMT"]);
+    }
+}
+
+bench_header!(imf_fixdate, Date, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
+bench_header!(rfc_850, Date, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
+bench_header!(asctime, Date, { vec![b"Sun Nov  6 08:49:37 1994".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/etag.rs
@@ -0,0 +1,89 @@
+use header::EntityTag;
+
+header! {
+    /// `ETag` header, defined in [RFC7232](http://tools.ietf.org/html/rfc7232#section-2.3)
+    ///
+    /// The `ETag` header field in a response provides the current entity-tag
+    /// for the selected representation, as determined at the conclusion of
+    /// handling the request.  An entity-tag is an opaque validator for
+    /// differentiating between multiple representations of the same
+    /// resource, regardless of whether those multiple representations are
+    /// due to resource state changes over time, content negotiation
+    /// resulting in multiple representations being valid at the same time,
+    /// or both.  An entity-tag consists of an opaque quoted string, possibly
+    /// prefixed by a weakness indicator.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// ETag       = entity-tag
+    /// ```
+    ///
+    /// # Example values
+    /// * `"xyzzy"`
+    /// * `W/"xyzzy"`
+    /// * `""`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, ETag, EntityTag};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(ETag(EntityTag::new(false, "xyzzy".to_owned())));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, ETag, EntityTag};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(ETag(EntityTag::new(true, "xyzzy".to_owned())));
+    /// ```
+    (ETag, "ETag") => [EntityTag]
+
+    test_etag {
+        // From the RFC
+        test_header!(test1,
+            vec![b"\"xyzzy\""],
+            Some(ETag(EntityTag::new(false, "xyzzy".to_owned()))));
+        test_header!(test2,
+            vec![b"W/\"xyzzy\""],
+            Some(ETag(EntityTag::new(true, "xyzzy".to_owned()))));
+        test_header!(test3,
+            vec![b"\"\""],
+            Some(ETag(EntityTag::new(false, "".to_owned()))));
+        // Own tests
+        test_header!(test4,
+            vec![b"\"foobar\""],
+            Some(ETag(EntityTag::new(false, "foobar".to_owned()))));
+        test_header!(test5,
+            vec![b"\"\""],
+            Some(ETag(EntityTag::new(false, "".to_owned()))));
+        test_header!(test6,
+            vec![b"W/\"weak-etag\""],
+            Some(ETag(EntityTag::new(true, "weak-etag".to_owned()))));
+        test_header!(test7,
+            vec![b"W/\"\x65\x62\""],
+            Some(ETag(EntityTag::new(true, "\u{0065}\u{0062}".to_owned()))));
+        test_header!(test8,
+            vec![b"W/\"\""],
+            Some(ETag(EntityTag::new(true, "".to_owned()))));
+        test_header!(test9,
+            vec![b"no-dquotes"],
+            None::<ETag>);
+        test_header!(test10,
+            vec![b"w/\"the-first-w-is-case-sensitive\""],
+            None::<ETag>);
+        test_header!(test11,
+            vec![b""],
+            None::<ETag>);
+        test_header!(test12,
+            vec![b"\"unmatched-dquotes1"],
+            None::<ETag>);
+        test_header!(test13,
+            vec![b"unmatched-dquotes2\""],
+            None::<ETag>);
+        test_header!(test14,
+            vec![b"matched-\"dquotes\""],
+            None::<ETag>);
+    }
+}
+
+bench_header!(bench, ETag, { vec![b"W/\"nonemptytag\"".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/expect.rs
@@ -0,0 +1,68 @@
+use std::fmt;
+use std::str;
+
+use unicase::UniCase;
+
+use header::{Header, HeaderFormat};
+
+/// The `Expect` header.
+///
+/// > The "Expect" header field in a request indicates a certain set of
+/// > behaviors (expectations) that need to be supported by the server in
+/// > order to properly handle this request.  The only such expectation
+/// > defined by this specification is 100-continue.
+/// >
+/// >    Expect  = "100-continue"
+///
+/// # Example
+/// ```
+/// use hyper::header::{Headers, Expect};
+/// let mut headers = Headers::new();
+/// headers.set(Expect::Continue);
+/// ```
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub enum Expect {
+    /// The value `100-continue`.
+    Continue
+}
+
+const EXPECT_CONTINUE: UniCase<&'static str> = UniCase("100-continue");
+
+impl Header for Expect {
+    fn header_name() -> &'static str {
+        "Expect"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Expect> {
+        if raw.len() == 1 {
+            let text = unsafe {
+                // safe because:
+                // 1. we just checked raw.len == 1
+                // 2. we don't actually care if it's utf8, we just want to
+                //    compare the bytes with the "case" normalized. If it's not
+                //    utf8, then the byte comparison will fail, and we'll return
+                //    None. No big deal.
+                str::from_utf8_unchecked(raw.get_unchecked(0))
+            };
+            if UniCase(text) == EXPECT_CONTINUE {
+                Ok(Expect::Continue)
+            } else {
+                Err(::Error::Header)
+            }
+        } else {
+            Err(::Error::Header)
+        }
+    }
+}
+
+impl HeaderFormat for Expect {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for Expect {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str("100-continue")
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/expires.rs
@@ -0,0 +1,45 @@
+use header::HttpDate;
+
+header! {
+    /// `Expires` header, defined in [RFC7234](http://tools.ietf.org/html/rfc7234#section-5.3)
+    /// 
+    /// The `Expires` header field gives the date/time after which the
+    /// response is considered stale.
+    /// 
+    /// The presence of an Expires field does not imply that the original
+    /// resource will change or cease to exist at, before, or after that
+    /// time.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Expires = HTTP-date
+    /// ```
+    /// 
+    /// # Example values
+    /// * `Thu, 01 Dec 1994 16:00:00 GMT`
+    /// 
+    /// # Example
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate time;
+    /// # fn main() {
+    /// // extern crate time;
+    /// 
+    /// use hyper::header::{Headers, Expires, HttpDate};
+    /// use time::{self, Duration};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(Expires(HttpDate(time::now() + Duration::days(1))));
+    /// # }
+    /// ```
+    (Expires, "Expires") => [HttpDate]
+
+    test_expires {
+        // Testcase from RFC
+        test_header!(test1, vec![b"Thu, 01 Dec 1994 16:00:00 GMT"]);
+    }
+}
+
+bench_header!(imf_fixdate, Expires, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
+bench_header!(rfc_850, Expires, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
+bench_header!(asctime, Expires, { vec![b"Sun Nov  6 08:49:37 1994".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/from.rs
@@ -0,0 +1,26 @@
+header! {
+    /// `From` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.5.1)
+    ///
+    /// The `From` header field contains an Internet email address for a
+    /// human user who controls the requesting user agent.  The address ought
+    /// to be machine-usable.
+    /// # ABNF
+    /// ```plain
+    /// From    = mailbox
+    /// mailbox = <mailbox, see [RFC5322], Section 3.4>
+    /// ```
+    ///
+    /// # Example
+    /// ```
+    /// use hyper::header::{Headers, From};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(From("webmaster@example.org".to_owned()));
+    /// ```
+    // FIXME: Maybe use mailbox?
+    (From, "From") => [String]
+
+    test_from {
+        test_header!(test1, vec![b"webmaster@example.org"]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/host.rs
@@ -0,0 +1,145 @@
+use header::{Header, HeaderFormat};
+use std::fmt;
+use std::str::FromStr;
+use header::parsing::from_one_raw_str;
+use url::idna::domain_to_unicode;
+
+/// The `Host` header.
+///
+/// HTTP/1.1 requires that all requests include a `Host` header, and so hyper
+/// client requests add one automatically.
+///
+/// Currently is just a String, but it should probably become a better type,
+/// like `url::Host` or something.
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, Host};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     Host{
+///         hostname: "hyper.rs".to_owned(),
+///         port: None,
+///     }
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, Host};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     Host{
+///         hostname: "hyper.rs".to_owned(),
+///         port: Some(8080),
+///     }
+/// );
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub struct Host {
+    /// The hostname, such a example.domain.
+    pub hostname: String,
+    /// An optional port number.
+    pub port: Option<u16>
+}
+
+impl Header for Host {
+    fn header_name() -> &'static str {
+        "Host"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Host> {
+        from_one_raw_str(raw)
+    }
+}
+
+impl HeaderFormat for Host {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.port {
+            None | Some(80) | Some(443) => f.write_str(&self.hostname[..]),
+            Some(port) => write!(f, "{}:{}", self.hostname, port)
+        }
+    }
+}
+
+impl fmt::Display for Host {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.fmt_header(f)
+    }
+}
+
+impl FromStr for Host {
+    type Err = ::Error;
+
+    fn from_str(s: &str) -> ::Result<Host> {
+        let idx = s.rfind(':');
+        let port = idx.and_then(
+            |idx| s[idx + 1..].parse().ok()
+        );
+        let hostname_encoded = match port {
+            None => s,
+            Some(_) => &s[..idx.unwrap()]
+        };
+
+        let hostname = if hostname_encoded.starts_with("[") {
+            if !hostname_encoded.ends_with("]") {
+                return Err(::Error::Header)
+            }
+            hostname_encoded.to_owned()
+        } else {
+            let (hostname, res) = domain_to_unicode(hostname_encoded);
+            if res.is_err() {
+                return Err(::Error::Header)
+            }
+            hostname
+        };
+
+        Ok(Host {
+            hostname: hostname,
+            port: port
+        })
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::Host;
+    use header::Header;
+
+
+    #[test]
+    fn test_host() {
+        let host = Header::parse_header([b"foo.com".to_vec()].as_ref());
+        assert_eq!(host.ok(), Some(Host {
+            hostname: "foo.com".to_owned(),
+            port: None
+        }));
+
+
+        let host = Header::parse_header([b"foo.com:8080".to_vec()].as_ref());
+        assert_eq!(host.ok(), Some(Host {
+            hostname: "foo.com".to_owned(),
+            port: Some(8080)
+        }));
+
+        let host = Header::parse_header([b"foo.com".to_vec()].as_ref());
+        assert_eq!(host.ok(), Some(Host {
+            hostname: "foo.com".to_owned(),
+            port: None
+        }));
+
+        let host = Header::parse_header([b"[::1]:8080".to_vec()].as_ref());
+        assert_eq!(host.ok(), Some(Host {
+            hostname: "[::1]".to_owned(),
+            port: Some(8080)
+        }));
+
+        let host = Header::parse_header([b"[::1]".to_vec()].as_ref());
+        assert_eq!(host.ok(), Some(Host {
+            hostname: "[::1]".to_owned(),
+            port: None
+        }));
+    }
+}
+
+bench_header!(bench, Host, { vec![b"foo.com:3000".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/if_match.rs
@@ -0,0 +1,69 @@
+use header::EntityTag;
+
+header! {
+    /// `If-Match` header, defined in
+    /// [RFC7232](https://tools.ietf.org/html/rfc7232#section-3.1)
+    ///
+    /// The `If-Match` header field makes the request method conditional on
+    /// the recipient origin server either having at least one current
+    /// representation of the target resource, when the field-value is "*",
+    /// or having a current representation of the target resource that has an
+    /// entity-tag matching a member of the list of entity-tags provided in
+    /// the field-value.
+    ///
+    /// An origin server MUST use the strong comparison function when
+    /// comparing entity-tags for `If-Match`, since the client
+    /// intends this precondition to prevent the method from being applied if
+    /// there have been any changes to the representation data.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// If-Match = "*" / 1#entity-tag
+    /// ```
+    ///
+    /// # Example values
+    /// * `"xyzzy"`
+    /// * "xyzzy", "r2d2xxxx", "c3piozzzz"
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, IfMatch};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(IfMatch::Any);
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, IfMatch, EntityTag};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     IfMatch::Items(vec![
+    ///         EntityTag::new(false, "xyzzy".to_owned()),
+    ///         EntityTag::new(false, "foobar".to_owned()),
+    ///         EntityTag::new(false, "bazquux".to_owned()),
+    ///     ])
+    /// );
+    /// ```
+    (IfMatch, "If-Match") => {Any / (EntityTag)+}
+
+    test_if_match {
+        test_header!(
+            test1,
+            vec![b"\"xyzzy\""],
+            Some(HeaderField::Items(
+                vec![EntityTag::new(false, "xyzzy".to_owned())])));
+        test_header!(
+            test2,
+            vec![b"\"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\""],
+            Some(HeaderField::Items(
+                vec![EntityTag::new(false, "xyzzy".to_owned()),
+                     EntityTag::new(false, "r2d2xxxx".to_owned()),
+                     EntityTag::new(false, "c3piozzzz".to_owned())])));
+        test_header!(test3, vec![b"*"], Some(IfMatch::Any));
+    }
+}
+
+bench_header!(star, IfMatch, { vec![b"*".to_vec()] });
+bench_header!(single , IfMatch, { vec![b"\"xyzzy\"".to_vec()] });
+bench_header!(multi, IfMatch,
+              { vec![b"\"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/if_modified_since.rs
@@ -0,0 +1,45 @@
+use header::HttpDate;
+
+header! {
+    /// `If-Modified-Since` header, defined in
+    /// [RFC7232](http://tools.ietf.org/html/rfc7232#section-3.3)
+    /// 
+    /// The `If-Modified-Since` header field makes a GET or HEAD request
+    /// method conditional on the selected representation's modification date
+    /// being more recent than the date provided in the field-value.
+    /// Transfer of the selected representation's data is avoided if that
+    /// data has not changed.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// If-Unmodified-Since = HTTP-date
+    /// ```
+    /// 
+    /// # Example values
+    /// * `Sat, 29 Oct 1994 19:43:31 GMT`
+    /// 
+    /// # Example
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate time;
+    /// # fn main() {
+    /// // extern crate time;
+    /// 
+    /// use hyper::header::{Headers, IfModifiedSince, HttpDate};
+    /// use time::{self, Duration};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(IfModifiedSince(HttpDate(time::now() - Duration::days(1))));
+    /// # }
+    /// ```
+    (IfModifiedSince, "If-Modified-Since") => [HttpDate]
+
+    test_if_modified_since {
+        // Testcase from RFC
+        test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]);
+    }
+}
+
+bench_header!(imf_fixdate, IfModifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
+bench_header!(rfc_850, IfModifiedSince, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
+bench_header!(asctime, IfModifiedSince, { vec![b"Sun Nov  6 08:49:37 1994".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/if_none_match.rs
@@ -0,0 +1,83 @@
+use header::EntityTag;
+
+header! {
+    /// `If-None-Match` header, defined in
+    /// [RFC7232](https://tools.ietf.org/html/rfc7232#section-3.2)
+    ///
+    /// The `If-None-Match` header field makes the request method conditional
+    /// on a recipient cache or origin server either not having any current
+    /// representation of the target resource, when the field-value is "*",
+    /// or having a selected representation with an entity-tag that does not
+    /// match any of those listed in the field-value.
+    ///
+    /// A recipient MUST use the weak comparison function when comparing
+    /// entity-tags for If-None-Match (Section 2.3.2), since weak entity-tags
+    /// can be used for cache validation even if there have been changes to
+    /// the representation data.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// If-None-Match = "*" / 1#entity-tag
+    /// ```
+    ///
+    /// # Example values
+    /// * `"xyzzy"`
+    /// * `W/"xyzzy"`
+    /// * `"xyzzy", "r2d2xxxx", "c3piozzzz"`
+    /// * `W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"`
+    /// * `*`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, IfNoneMatch};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(IfNoneMatch::Any);
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, IfNoneMatch, EntityTag};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     IfNoneMatch::Items(vec![
+    ///         EntityTag::new(false, "xyzzy".to_owned()),
+    ///         EntityTag::new(false, "foobar".to_owned()),
+    ///         EntityTag::new(false, "bazquux".to_owned()),
+    ///     ])
+    /// );
+    /// ```
+    (IfNoneMatch, "If-None-Match") => {Any / (EntityTag)+}
+
+    test_if_none_match {
+        test_header!(test1, vec![b"\"xyzzy\""]);
+        test_header!(test2, vec![b"W/\"xyzzy\""]);
+        test_header!(test3, vec![b"\"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\""]);
+        test_header!(test4, vec![b"W/\"xyzzy\", W/\"r2d2xxxx\", W/\"c3piozzzz\""]);
+        test_header!(test5, vec![b"*"]);
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::IfNoneMatch;
+    use header::Header;
+    use header::EntityTag;
+
+    #[test]
+    fn test_if_none_match() {
+        let mut if_none_match: ::Result<IfNoneMatch>;
+
+        if_none_match = Header::parse_header([b"*".to_vec()].as_ref());
+        assert_eq!(if_none_match.ok(), Some(IfNoneMatch::Any));
+
+        if_none_match = Header::parse_header([b"\"foobar\", W/\"weak-etag\"".to_vec()].as_ref());
+        let mut entities: Vec<EntityTag> = Vec::new();
+        let foobar_etag = EntityTag::new(false, "foobar".to_owned());
+        let weak_etag = EntityTag::new(true, "weak-etag".to_owned());
+        entities.push(foobar_etag);
+        entities.push(weak_etag);
+        assert_eq!(if_none_match.ok(), Some(IfNoneMatch::Items(entities)));
+    }
+}
+
+bench_header!(bench, IfNoneMatch, { vec![b"W/\"nonemptytag\"".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/if_range.rs
@@ -0,0 +1,96 @@
+use std::fmt::{self, Display};
+use header::{self, Header, HeaderFormat, EntityTag, HttpDate};
+
+/// `If-Range` header, defined in [RFC7233](http://tools.ietf.org/html/rfc7233#section-3.2)
+///
+/// If a client has a partial copy of a representation and wishes to have
+/// an up-to-date copy of the entire representation, it could use the
+/// Range header field with a conditional GET (using either or both of
+/// If-Unmodified-Since and If-Match.)  However, if the precondition
+/// fails because the representation has been modified, the client would
+/// then have to make a second request to obtain the entire current
+/// representation.
+///
+/// The `If-Range` header field allows a client to \"short-circuit\" the
+/// second request.  Informally, its meaning is as follows: if the
+/// representation is unchanged, send me the part(s) that I am requesting
+/// in Range; otherwise, send me the entire representation.
+///
+/// # ABNF
+/// ```plain
+/// If-Range = entity-tag / HTTP-date
+/// ```
+///
+/// # Example values
+/// * `Sat, 29 Oct 1994 19:43:31 GMT`
+/// * `\"xyzzy\"`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, IfRange, EntityTag};
+///
+/// let mut headers = Headers::new();
+/// headers.set(IfRange::EntityTag(EntityTag::new(false, "xyzzy".to_owned())));
+/// ```
+/// ```
+/// # extern crate hyper;
+/// # extern crate time;
+/// # fn main() {
+/// // extern crate time;
+///
+/// use hyper::header::{Headers, IfRange, HttpDate};
+/// use time::{self, Duration};
+///
+/// let mut headers = Headers::new();
+/// headers.set(IfRange::Date(HttpDate(time::now() - Duration::days(1))));
+/// # }
+/// ```
+#[derive(Clone, Debug, PartialEq)]
+pub enum IfRange {
+    /// The entity-tag the client has of the resource
+    EntityTag(EntityTag),
+    /// The date when the client retrieved the resource
+    Date(HttpDate),
+}
+
+impl Header for IfRange {
+    fn header_name() -> &'static str {
+        "If-Range"
+    }
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<IfRange> {
+        let etag: ::Result<EntityTag> = header::parsing::from_one_raw_str(raw);
+        if etag.is_ok() {
+            return Ok(IfRange::EntityTag(etag.unwrap()));
+        }
+        let date: ::Result<HttpDate> = header::parsing::from_one_raw_str(raw);
+        if date.is_ok() {
+            return Ok(IfRange::Date(date.unwrap()));
+        }
+        Err(::Error::Header)
+    }
+}
+
+impl HeaderFormat for IfRange {
+    fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        match *self {
+            IfRange::EntityTag(ref x) => Display::fmt(x, f),
+            IfRange::Date(ref x) => Display::fmt(x, f),
+        }
+    }
+}
+
+impl Display for IfRange {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.fmt_header(f)
+    }
+}
+
+#[cfg(test)]
+mod test_if_range {
+    use std::str;
+    use header::*;
+    use super::IfRange as HeaderField;
+    test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]);
+    test_header!(test2, vec![b"\"xyzzy\""]);
+    test_header!(test3, vec![b"this-is-invalid"], None::<IfRange>);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/if_unmodified_since.rs
@@ -0,0 +1,45 @@
+use header::HttpDate;
+
+header! {
+    /// `If-Unmodified-Since` header, defined in
+    /// [RFC7232](http://tools.ietf.org/html/rfc7232#section-3.4)
+    /// 
+    /// The `If-Unmodified-Since` header field makes the request method
+    /// conditional on the selected representation's last modification date
+    /// being earlier than or equal to the date provided in the field-value.
+    /// This field accomplishes the same purpose as If-Match for cases where
+    /// the user agent does not have an entity-tag for the representation.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// If-Unmodified-Since = HTTP-date
+    /// ```
+    /// 
+    /// # Example values
+    /// * `Sat, 29 Oct 1994 19:43:31 GMT`
+    /// 
+    /// # Example
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate time;
+    /// # fn main() {
+    /// // extern crate time;
+    /// 
+    /// use hyper::header::{Headers, IfUnmodifiedSince, HttpDate};
+    /// use time::{self, Duration};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(IfUnmodifiedSince(HttpDate(time::now() - Duration::days(1))));
+    /// # }
+    /// ```
+    (IfUnmodifiedSince, "If-Unmodified-Since") => [HttpDate]
+
+    test_if_unmodified_since {
+        // Testcase from RFC
+        test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]);
+    }
+}
+
+bench_header!(imf_fixdate, IfUnmodifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
+bench_header!(rfc_850, IfUnmodifiedSince, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
+bench_header!(asctime, IfUnmodifiedSince, { vec![b"Sun Nov  6 08:49:37 1994".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/last-event-id.rs
@@ -0,0 +1,30 @@
+header! {
+    /// `Last-Event-ID` header, defined in
+    /// [RFC3864](https://html.spec.whatwg.org/multipage/references.html#refsRFC3864)
+    ///
+    /// The `Last-Event-ID` header contains information about
+    /// the last event in an http interaction so that it's easier to
+    /// track of event state. This is helpful when working
+    /// with [Server-Sent-Events](http://www.html5rocks.com/en/tutorials/eventsource/basics/). If the connection were to be dropped, for example, it'd
+    /// be useful to let the server know what the last event you
+    /// recieved was.
+    ///
+    /// The spec is a String with the id of the last event, it can be
+    /// an empty string which acts a sort of "reset".
+    ///
+    /// # Example
+    /// ```
+    /// use hyper::header::{Headers, LastEventID};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(LastEventID("1".to_owned()));
+    /// ```
+    (LastEventID, "Last-Event-ID") => [String]
+
+    test_last_event_id {
+        // Initial state
+        test_header!(test1, vec![b""]);
+        // Own testcase
+        test_header!(test2, vec![b"1"], Some(LastEventID("1".to_owned())));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/last_modified.rs
@@ -0,0 +1,43 @@
+use header::HttpDate;
+
+header! {
+    /// `Last-Modified` header, defined in
+    /// [RFC7232](http://tools.ietf.org/html/rfc7232#section-2.2)
+    /// 
+    /// The `Last-Modified` header field in a response provides a timestamp
+    /// indicating the date and time at which the origin server believes the
+    /// selected representation was last modified, as determined at the
+    /// conclusion of handling the request.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Expires = HTTP-date
+    /// ```
+    /// 
+    /// # Example values
+    /// * `Sat, 29 Oct 1994 19:43:31 GMT`
+    /// 
+    /// # Example
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate time;
+    /// # fn main() {
+    /// // extern crate time;
+    /// 
+    /// use hyper::header::{Headers, LastModified, HttpDate};
+    /// use time::{self, Duration};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(LastModified(HttpDate(time::now() - Duration::days(1))));
+    /// # }
+    /// ```
+    (LastModified, "Last-Modified") => [HttpDate]
+
+    test_last_modified {
+        // Testcase from RFC
+        test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]);}
+}
+
+bench_header!(imf_fixdate, LastModified, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
+bench_header!(rfc_850, LastModified, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
+bench_header!(asctime, LastModified, { vec![b"Sun Nov  6 08:49:37 1994".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/location.rs
@@ -0,0 +1,43 @@
+header! {
+    /// `Location` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.1.2)
+    ///
+    /// The `Location` header field is used in some responses to refer to a
+    /// specific resource in relation to the response.  The type of
+    /// relationship is defined by the combination of request method and
+    /// status code semantics.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Location = URI-reference
+    /// ```
+    ///
+    /// # Example values
+    /// * `/People.html#tim`
+    /// * `http://www.example.net/index.html`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, Location};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Location("/People.html#tim".to_owned()));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, Location};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Location("http://www.example.com/index.html".to_owned()));
+    /// ```
+    // TODO: Use URL
+    (Location, "Location") => [String]
+
+    test_location {
+        // Testcase from RFC
+        test_header!(test1, vec![b"/People.html#tim"]);
+        test_header!(test2, vec![b"http://www.example.net/index.html"]);
+    }
+
+}
+
+bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/mod.rs
@@ -0,0 +1,393 @@
+//! A Collection of Header implementations for common HTTP Headers.
+//!
+//! ## Mime
+//!
+//! Several header fields use MIME values for their contents. Keeping with the
+//! strongly-typed theme, the [mime](http://seanmonstar.github.io/mime.rs) crate
+//! is used, such as `ContentType(pub Mime)`.
+
+pub use self::accept::Accept;
+pub use self::access_control_allow_credentials::AccessControlAllowCredentials;
+pub use self::access_control_allow_headers::AccessControlAllowHeaders;
+pub use self::access_control_allow_methods::AccessControlAllowMethods;
+pub use self::access_control_allow_origin::AccessControlAllowOrigin;
+pub use self::access_control_expose_headers::AccessControlExposeHeaders;
+pub use self::access_control_max_age::AccessControlMaxAge;
+pub use self::access_control_request_headers::AccessControlRequestHeaders;
+pub use self::access_control_request_method::AccessControlRequestMethod;
+pub use self::accept_charset::AcceptCharset;
+pub use self::accept_encoding::AcceptEncoding;
+pub use self::accept_language::AcceptLanguage;
+pub use self::accept_ranges::{AcceptRanges, RangeUnit};
+pub use self::allow::Allow;
+pub use self::authorization::{Authorization, Scheme, Basic, Bearer};
+pub use self::cache_control::{CacheControl, CacheDirective};
+pub use self::connection::{Connection, ConnectionOption};
+pub use self::content_disposition::{ContentDisposition, DispositionType, DispositionParam};
+pub use self::content_length::ContentLength;
+pub use self::content_encoding::ContentEncoding;
+pub use self::content_language::ContentLanguage;
+pub use self::content_range::{ContentRange, ContentRangeSpec};
+pub use self::content_type::ContentType;
+pub use self::cookie::Cookie;
+pub use self::date::Date;
+pub use self::etag::ETag;
+pub use self::expect::Expect;
+pub use self::expires::Expires;
+pub use self::from::From;
+pub use self::host::Host;
+pub use self::if_match::IfMatch;
+pub use self::if_modified_since::IfModifiedSince;
+pub use self::if_none_match::IfNoneMatch;
+pub use self::if_unmodified_since::IfUnmodifiedSince;
+pub use self::if_range::IfRange;
+pub use self::last_modified::LastModified;
+pub use self::location::Location;
+pub use self::origin::Origin;
+pub use self::pragma::Pragma;
+pub use self::prefer::{Prefer, Preference};
+pub use self::preference_applied::PreferenceApplied;
+pub use self::range::{Range, ByteRangeSpec};
+pub use self::referer::Referer;
+pub use self::referrer_policy::ReferrerPolicy;
+pub use self::server::Server;
+pub use self::set_cookie::SetCookie;
+pub use self::strict_transport_security::StrictTransportSecurity;
+pub use self::transfer_encoding::TransferEncoding;
+pub use self::upgrade::{Upgrade, Protocol, ProtocolName};
+pub use self::user_agent::UserAgent;
+pub use self::vary::Vary;
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! bench_header(
+    ($name:ident, $ty:ty, $value:expr) => {
+        #[cfg(test)]
+        #[cfg(feature = "nightly")]
+        #[allow(deprecated)]
+        mod $name {
+            use test::Bencher;
+            use super::*;
+
+            use header::{Header, HeaderFormatter};
+
+            #[bench]
+            fn bench_parse(b: &mut Bencher) {
+                let val = $value;
+                b.iter(|| {
+                    let _: $ty = Header::parse_header(&val[..]).unwrap();
+                });
+            }
+
+            #[bench]
+            fn bench_format(b: &mut Bencher) {
+                let val: $ty = Header::parse_header(&$value[..]).unwrap();
+                let fmt = HeaderFormatter(&val);
+                b.iter(|| {
+                    format!("{}", fmt);
+                });
+            }
+        }
+    }
+);
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! __hyper__deref {
+    ($from:ty => $to:ty) => {
+        impl ::std::ops::Deref for $from {
+            type Target = $to;
+
+            fn deref(&self) -> &$to {
+                &self.0
+            }
+        }
+
+        impl ::std::ops::DerefMut for $from {
+            fn deref_mut(&mut self) -> &mut $to {
+                &mut self.0
+            }
+        }
+    }
+}
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! __hyper__tm {
+    ($id:ident, $tm:ident{$($tf:item)*}) => {
+        #[allow(unused_imports)]
+        #[cfg(test)]
+        mod $tm{
+            use std::str;
+            use $crate::header::*;
+            use $crate::mime::*;
+            use $crate::language_tags::*;
+            use $crate::method::Method;
+            use super::$id as HeaderField;
+            $($tf)*
+        }
+
+    }
+}
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! test_header {
+    ($id:ident, $raw:expr) => {
+        #[test]
+        fn $id() {
+            use std::ascii::AsciiExt;
+            let raw = $raw;
+            let a: Vec<Vec<u8>> = raw.iter().map(|x| x.to_vec()).collect();
+            let value = HeaderField::parse_header(&a[..]);
+            let result = format!("{}", value.unwrap());
+            let expected = String::from_utf8(raw[0].to_vec()).unwrap();
+            let result_cmp: Vec<String> = result
+                .to_ascii_lowercase()
+                .split(' ')
+                .map(|x| x.to_owned())
+                .collect();
+            let expected_cmp: Vec<String> = expected
+                .to_ascii_lowercase()
+                .split(' ')
+                .map(|x| x.to_owned())
+                .collect();
+            assert_eq!(result_cmp.concat(), expected_cmp.concat());
+        }
+    };
+    ($id:ident, $raw:expr, $typed:expr) => {
+        #[test]
+        fn $id() {
+            let a: Vec<Vec<u8>> = $raw.iter().map(|x| x.to_vec()).collect();
+            let val = HeaderField::parse_header(&a[..]);
+            let typed: Option<HeaderField> = $typed;
+            // Test parsing
+            assert_eq!(val.ok(), typed);
+            // Test formatting
+            if typed.is_some() {
+                let raw = &($raw)[..];
+                let mut iter = raw.iter().map(|b|str::from_utf8(&b[..]).unwrap());
+                let mut joined = String::new();
+                joined.push_str(iter.next().unwrap());
+                for s in iter {
+                    joined.push_str(", ");
+                    joined.push_str(s);
+                }
+                assert_eq!(format!("{}", typed.unwrap()), joined);
+            }
+        }
+    }
+}
+
+#[macro_export]
+macro_rules! header {
+    // $a:meta: Attributes associated with the header item (usually docs)
+    // $id:ident: Identifier of the header
+    // $n:expr: Lowercase name of the header
+    // $nn:expr: Nice name of the header
+
+    // List header, zero or more items
+    ($(#[$a:meta])*($id:ident, $n:expr) => ($item:ty)*) => {
+        $(#[$a])*
+        #[derive(Clone, Debug, PartialEq)]
+        pub struct $id(pub Vec<$item>);
+        __hyper__deref!($id => Vec<$item>);
+        impl $crate::header::Header for $id {
+            fn header_name() -> &'static str {
+                $n
+            }
+            fn parse_header(raw: &[Vec<u8>]) -> $crate::Result<Self> {
+                $crate::header::parsing::from_comma_delimited(raw).map($id)
+            }
+        }
+        impl $crate::header::HeaderFormat for $id {
+            fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                $crate::header::parsing::fmt_comma_delimited(f, &self.0[..])
+            }
+        }
+        impl ::std::fmt::Display for $id {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                use $crate::header::HeaderFormat;
+                self.fmt_header(f)
+            }
+        }
+    };
+    // List header, one or more items
+    ($(#[$a:meta])*($id:ident, $n:expr) => ($item:ty)+) => {
+        $(#[$a])*
+        #[derive(Clone, Debug, PartialEq)]
+        pub struct $id(pub Vec<$item>);
+        __hyper__deref!($id => Vec<$item>);
+        impl $crate::header::Header for $id {
+            fn header_name() -> &'static str {
+                $n
+            }
+            fn parse_header(raw: &[Vec<u8>]) -> $crate::Result<Self> {
+                $crate::header::parsing::from_comma_delimited(raw).map($id)
+            }
+        }
+        impl $crate::header::HeaderFormat for $id {
+            fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                $crate::header::parsing::fmt_comma_delimited(f, &self.0[..])
+            }
+        }
+        impl ::std::fmt::Display for $id {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                use $crate::header::HeaderFormat;
+                self.fmt_header(f)
+            }
+        }
+    };
+    // Single value header
+    ($(#[$a:meta])*($id:ident, $n:expr) => [$value:ty]) => {
+        $(#[$a])*
+        #[derive(Clone, Debug, PartialEq)]
+        pub struct $id(pub $value);
+        __hyper__deref!($id => $value);
+        impl $crate::header::Header for $id {
+            fn header_name() -> &'static str {
+                $n
+            }
+            fn parse_header(raw: &[Vec<u8>]) -> $crate::Result<Self> {
+                $crate::header::parsing::from_one_raw_str(raw).map($id)
+            }
+        }
+        impl $crate::header::HeaderFormat for $id {
+            fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                ::std::fmt::Display::fmt(&**self, f)
+            }
+        }
+        impl ::std::fmt::Display for $id {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                ::std::fmt::Display::fmt(&**self, f)
+            }
+        }
+    };
+    // List header, one or more items with "*" option
+    ($(#[$a:meta])*($id:ident, $n:expr) => {Any / ($item:ty)+}) => {
+        $(#[$a])*
+        #[derive(Clone, Debug, PartialEq)]
+        pub enum $id {
+            /// Any value is a match
+            Any,
+            /// Only the listed items are a match
+            Items(Vec<$item>),
+        }
+        impl $crate::header::Header for $id {
+            fn header_name() -> &'static str {
+                $n
+            }
+            fn parse_header(raw: &[Vec<u8>]) -> $crate::Result<Self> {
+                // FIXME: Return None if no item is in $id::Only
+                if raw.len() == 1 {
+                    if raw[0] == b"*" {
+                        return Ok($id::Any)
+                    }
+                }
+                $crate::header::parsing::from_comma_delimited(raw).map($id::Items)
+            }
+        }
+        impl $crate::header::HeaderFormat for $id {
+            fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                match *self {
+                    $id::Any => f.write_str("*"),
+                    $id::Items(ref fields) => $crate::header::parsing::fmt_comma_delimited(
+                        f, &fields[..])
+                }
+            }
+        }
+        impl ::std::fmt::Display for $id {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                use $crate::header::HeaderFormat;
+                self.fmt_header(f)
+            }
+        }
+    };
+
+    // optional test module
+    ($(#[$a:meta])*($id:ident, $n:expr) => ($item:ty)* $tm:ident{$($tf:item)*}) => {
+        header! {
+            $(#[$a])*
+            ($id, $n) => ($item)*
+        }
+
+        __hyper__tm! { $id, $tm { $($tf)* }}
+    };
+    ($(#[$a:meta])*($id:ident, $n:expr) => ($item:ty)+ $tm:ident{$($tf:item)*}) => {
+        header! {
+            $(#[$a])*
+            ($id, $n) => ($item)+
+        }
+
+        __hyper__tm! { $id, $tm { $($tf)* }}
+    };
+    ($(#[$a:meta])*($id:ident, $n:expr) => [$item:ty] $tm:ident{$($tf:item)*}) => {
+        header! {
+            $(#[$a])*
+            ($id, $n) => [$item]
+        }
+
+        __hyper__tm! { $id, $tm { $($tf)* }}
+    };
+    ($(#[$a:meta])*($id:ident, $n:expr) => {Any / ($item:ty)+} $tm:ident{$($tf:item)*}) => {
+        header! {
+            $(#[$a])*
+            ($id, $n) => {Any / ($item)+}
+        }
+
+        __hyper__tm! { $id, $tm { $($tf)* }}
+    };
+}
+
+
+mod accept;
+mod access_control_allow_credentials;
+mod access_control_allow_headers;
+mod access_control_allow_methods;
+mod access_control_allow_origin;
+mod access_control_expose_headers;
+mod access_control_max_age;
+mod access_control_request_headers;
+mod access_control_request_method;
+mod accept_charset;
+mod accept_encoding;
+mod accept_language;
+mod accept_ranges;
+mod allow;
+mod authorization;
+mod cache_control;
+mod cookie;
+mod connection;
+mod content_disposition;
+mod content_encoding;
+mod content_language;
+mod content_length;
+mod content_range;
+mod content_type;
+mod date;
+mod etag;
+mod expect;
+mod expires;
+mod from;
+mod host;
+mod if_match;
+mod if_modified_since;
+mod if_none_match;
+mod if_range;
+mod if_unmodified_since;
+mod last_modified;
+mod location;
+mod origin;
+mod pragma;
+mod prefer;
+mod preference_applied;
+mod range;
+mod referer;
+mod referrer_policy;
+mod server;
+mod set_cookie;
+mod strict_transport_security;
+mod transfer_encoding;
+mod upgrade;
+mod user_agent;
+mod vary;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/origin.rs
@@ -0,0 +1,119 @@
+use header::{Header, Host, HeaderFormat};
+use std::fmt;
+use std::str::FromStr;
+use header::parsing::from_one_raw_str;
+
+/// The `Origin` header.
+///
+/// The `Origin` header is a version of the `Referer` header that is used for all HTTP fetches and `POST`s whose CORS flag is set.
+/// This header is often used to inform recipients of the security context of where the request was initiated.
+///
+///
+/// Following the spec, https://fetch.spec.whatwg.org/#origin-header, the value of this header is composed of
+/// a String (scheme), header::Host (host/port)
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, Origin};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     Origin::new("http", "hyper.rs", None)
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, Origin};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     Origin::new("https", "wikipedia.org", Some(443))
+/// );
+/// ```
+
+#[derive(Clone, Debug)]
+pub struct Origin {
+    /// The scheme, such as http or https
+    pub scheme: String,
+    /// The host, such as Host{hostname: "hyper.rs".to_owned(), port: None}
+    pub host: Host,
+}
+
+impl Origin {
+    /// Creates a new `Origin` header.
+    pub fn new<S: Into<String>, H: Into<String>>(scheme: S, hostname: H, port: Option<u16>) -> Origin{
+        Origin {
+            scheme: scheme.into(),
+            host: Host {
+                hostname: hostname.into(),
+                port: port
+            }
+        }
+    }
+}
+
+impl Header for Origin {
+    fn header_name() -> &'static str {
+        static NAME: &'static str = "Origin";
+        NAME
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Origin> {
+        from_one_raw_str(raw)
+    }
+}
+
+impl FromStr for Origin {
+    type Err = ::Error;
+
+    fn from_str(s: &str) -> ::Result<Origin> {
+        let idx = match s.find("://") {
+            Some(idx) => idx,
+            None => return Err(::Error::Header)
+        };
+        // idx + 3 because thats how long "://" is
+        let (scheme, etc) = (&s[..idx], &s[idx + 3..]);
+        let host = try!(Host::from_str(etc));
+
+
+        Ok(Origin{
+            scheme: scheme.to_owned(),
+            host: host
+        })
+    }
+}
+
+impl HeaderFormat for Origin {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for Origin {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}://{}", self.scheme, self.host)
+    }
+}
+
+impl PartialEq for Origin {
+    fn eq(&self, other: &Origin) -> bool {
+        self.scheme == other.scheme && self.host == other.host
+    }
+}
+
+
+#[cfg(test)]
+mod tests {
+    use super::Origin;
+    use header::Header;
+
+    #[test]
+    fn test_origin() {
+        let origin = Header::parse_header([b"http://foo.com".to_vec()].as_ref());
+        assert_eq!(origin.ok(), Some(Origin::new("http", "foo.com", None)));
+
+        let origin = Header::parse_header([b"https://foo.com:443".to_vec()].as_ref());
+        assert_eq!(origin.ok(), Some(Origin::new("https", "foo.com", Some(443))));
+    }
+}
+
+bench_header!(bench, Origin, { vec![b"https://foo.com".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/pragma.rs
@@ -0,0 +1,82 @@
+use std::fmt;
+use std::ascii::AsciiExt;
+
+use header::{Header, HeaderFormat, parsing};
+
+/// The `Pragma` header defined by HTTP/1.0.
+///
+/// > The "Pragma" header field allows backwards compatibility with
+/// > HTTP/1.0 caches, so that clients can specify a "no-cache" request
+/// > that they will understand (as Cache-Control was not defined until
+/// > HTTP/1.1).  When the Cache-Control header field is also present and
+/// > understood in a request, Pragma is ignored.
+
+/// > In HTTP/1.0, Pragma was defined as an extensible field for
+/// > implementation-specified directives for recipients.  This
+/// > specification deprecates such extensions to improve interoperability.
+///
+/// Spec: https://tools.ietf.org/html/rfc7234#section-5.4
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, Pragma};
+///
+/// let mut headers = Headers::new();
+/// headers.set(Pragma::NoCache);
+/// ```
+/// ```
+/// use hyper::header::{Headers, Pragma};
+///
+/// let mut headers = Headers::new();
+/// headers.set(Pragma::Ext("foobar".to_owned()));
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub enum Pragma {
+    /// Corresponds to the `no-cache` value.
+    NoCache,
+    /// Every value other than `no-cache`.
+    Ext(String),
+}
+
+impl Header for Pragma {
+    fn header_name() -> &'static str {
+        "Pragma"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Pragma> {
+        parsing::from_one_raw_str(raw).and_then(|s: String| {
+            let slice = &s.to_ascii_lowercase()[..];
+            match slice {
+                "no-cache" => Ok(Pragma::NoCache),
+                _ => Ok(Pragma::Ext(s)),
+            }
+        })
+    }
+}
+
+impl HeaderFormat for Pragma {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for Pragma {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match *self {
+            Pragma::NoCache => "no-cache",
+            Pragma::Ext(ref string) => &string[..],
+        })
+    }
+}
+
+#[test]
+fn test_parse_header() {
+    let a: Pragma = Header::parse_header([b"no-cache".to_vec()].as_ref()).unwrap();
+    let b = Pragma::NoCache;
+    assert_eq!(a, b);
+    let c: Pragma = Header::parse_header([b"FoObar".to_vec()].as_ref()).unwrap();
+    let d = Pragma::Ext("FoObar".to_owned());
+    assert_eq!(c, d);
+    let e: ::Result<Pragma> = Header::parse_header([b"".to_vec()].as_ref());
+    assert_eq!(e.ok(), None);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/prefer.rs
@@ -0,0 +1,209 @@
+use std::fmt;
+use std::str::FromStr;
+use header::{Header, HeaderFormat};
+use header::parsing::{from_comma_delimited, fmt_comma_delimited};
+
+/// `Prefer` header, defined in [RFC7240](http://tools.ietf.org/html/rfc7240)
+///
+/// The `Prefer` header field is HTTP header field that can be used by a
+/// client to request that certain behaviors be employed by a server
+/// while processing a request.
+///
+/// # ABNF
+/// ```plain
+/// Prefer     = "Prefer" ":" 1#preference
+/// preference = token [ BWS "=" BWS word ]
+///              *( OWS ";" [ OWS parameter ] )
+/// parameter  = token [ BWS "=" BWS word ]
+/// ```
+///
+/// # Example values
+/// * `respond-async`
+/// * `return=minimal`
+/// * `wait=30`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, Prefer, Preference};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     Prefer(vec![Preference::RespondAsync])
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, Prefer, Preference};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     Prefer(vec![
+///         Preference::RespondAsync,
+///         Preference::ReturnRepresentation,
+///         Preference::Wait(10u32),
+///         Preference::Extension("foo".to_owned(),
+///                               "bar".to_owned(),
+///                               vec![]),
+///     ])
+/// );
+/// ```
+#[derive(PartialEq, Clone, Debug)]
+pub struct Prefer(pub Vec<Preference>);
+
+__hyper__deref!(Prefer => Vec<Preference>);
+
+impl Header for Prefer {
+    fn header_name() -> &'static str {
+        "Prefer"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Prefer> {
+        let preferences = try!(from_comma_delimited(raw));
+        if !preferences.is_empty() {
+            Ok(Prefer(preferences))
+        } else {
+            Err(::Error::Header)
+        }
+    }
+}
+
+impl HeaderFormat for Prefer {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for Prefer {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt_comma_delimited(f, &self[..])
+    }
+}
+
+/// Prefer contains a list of these preferences.
+#[derive(PartialEq, Clone, Debug)]
+pub enum Preference {
+    /// "respond-async"
+    RespondAsync,
+    /// "return=representation"
+    ReturnRepresentation,
+    /// "return=minimal"
+    ReturnMinimal,
+    /// "handling=strict"
+    HandlingStrict,
+    /// "handling=leniant"
+    HandlingLeniant,
+    /// "wait=delta"
+    Wait(u32),
+
+    /// Extension preferences. Always has a value, if none is specified it is
+    /// just "". A preference can also have a list of parameters.
+    Extension(String, String, Vec<(String, String)>)
+}
+
+impl fmt::Display for Preference {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Preference::*;
+        fmt::Display::fmt(match *self {
+            RespondAsync => "respond-async",
+            ReturnRepresentation => "return=representation",
+            ReturnMinimal => "return=minimal",
+            HandlingStrict => "handling=strict",
+            HandlingLeniant => "handling=leniant",
+
+            Wait(secs) => return write!(f, "wait={}", secs),
+
+            Extension(ref name, ref value, ref params) => {
+                try!(write!(f, "{}", name));
+                if value != "" { try!(write!(f, "={}", value)); }
+                if params.len() > 0 {
+                    for &(ref name, ref value) in params {
+                        try!(write!(f, "; {}", name));
+                        if value != "" { try!(write!(f, "={}", value)); }
+                    }
+                }
+                return Ok(());
+            }
+        }, f)
+    }
+}
+
+impl FromStr for Preference {
+    type Err = Option<<u32 as FromStr>::Err>;
+    fn from_str(s: &str) -> Result<Preference, Option<<u32 as FromStr>::Err>> {
+        use self::Preference::*;
+        let mut params = s.split(';').map(|p| {
+            let mut param = p.splitn(2, '=');
+            match (param.next(), param.next()) {
+                (Some(name), Some(value)) => (name.trim(), value.trim().trim_matches('"')),
+                (Some(name), None) => (name.trim(), ""),
+                // This can safely be unreachable because the [`splitn`][1]
+                // function (used above) will always have at least one value.
+                //
+                // [1]: http://doc.rust-lang.org/std/primitive.str.html#method.splitn
+                _ => { unreachable!(); }
+            }
+        });
+        match params.nth(0) {
+            Some(param) => {
+                let rest: Vec<(String, String)> = params.map(|(l, r)| (l.to_owned(), r.to_owned())).collect();
+                match param {
+                    ("respond-async", "") => if rest.len() == 0 { Ok(RespondAsync) } else { Err(None) },
+                    ("return", "representation") => if rest.len() == 0 { Ok(ReturnRepresentation) } else { Err(None) },
+                    ("return", "minimal") => if rest.len() == 0 { Ok(ReturnMinimal) } else { Err(None) },
+                    ("handling", "strict") => if rest.len() == 0 { Ok(HandlingStrict) } else { Err(None) },
+                    ("handling", "leniant") => if rest.len() == 0 { Ok(HandlingLeniant) } else { Err(None) },
+                    ("wait", secs) => if rest.len() == 0 { secs.parse().map(Wait).map_err(Some) } else { Err(None) },
+                    (left, right) => Ok(Extension(left.to_owned(), right.to_owned(), rest))
+                }
+            },
+            None => Err(None)
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use header::Header;
+    use super::*;
+
+    #[test]
+    fn test_parse_multiple_headers() {
+        let prefer = Header::parse_header(&[b"respond-async, return=representation".to_vec()]);
+        assert_eq!(prefer.ok(), Some(Prefer(vec![Preference::RespondAsync,
+                                           Preference::ReturnRepresentation])))
+    }
+
+    #[test]
+    fn test_parse_argument() {
+        let prefer = Header::parse_header(&[b"wait=100, handling=leniant, respond-async".to_vec()]);
+        assert_eq!(prefer.ok(), Some(Prefer(vec![Preference::Wait(100),
+                                           Preference::HandlingLeniant,
+                                           Preference::RespondAsync])))
+    }
+
+    #[test]
+    fn test_parse_quote_form() {
+        let prefer = Header::parse_header(&[b"wait=\"200\", handling=\"strict\"".to_vec()]);
+        assert_eq!(prefer.ok(), Some(Prefer(vec![Preference::Wait(200),
+                                           Preference::HandlingStrict])))
+    }
+
+    #[test]
+    fn test_parse_extension() {
+        let prefer = Header::parse_header(&[b"foo, bar=baz, baz; foo; bar=baz, bux=\"\"; foo=\"\", buz=\"some parameter\"".to_vec()]);
+        assert_eq!(prefer.ok(), Some(Prefer(vec![
+            Preference::Extension("foo".to_owned(), "".to_owned(), vec![]),
+            Preference::Extension("bar".to_owned(), "baz".to_owned(), vec![]),
+            Preference::Extension("baz".to_owned(), "".to_owned(), vec![("foo".to_owned(), "".to_owned()), ("bar".to_owned(), "baz".to_owned())]),
+            Preference::Extension("bux".to_owned(), "".to_owned(), vec![("foo".to_owned(), "".to_owned())]),
+            Preference::Extension("buz".to_owned(), "some parameter".to_owned(), vec![])])))
+    }
+
+    #[test]
+    fn test_fail_with_args() {
+        let prefer: ::Result<Prefer> = Header::parse_header(&[b"respond-async; foo=bar".to_vec()]);
+        assert_eq!(prefer.ok(), None);
+    }
+}
+
+bench_header!(normal,
+    Prefer, { vec![b"respond-async, return=representation".to_vec(), b"wait=100".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/preference_applied.rs
@@ -0,0 +1,107 @@
+use std::fmt;
+use header::{Header, HeaderFormat, Preference};
+use header::parsing::{from_comma_delimited, fmt_comma_delimited};
+
+/// `Preference-Applied` header, defined in [RFC7240](http://tools.ietf.org/html/rfc7240)
+///
+/// The `Preference-Applied` response header may be included within a
+/// response message as an indication as to which `Prefer` header tokens were
+/// honored by the server and applied to the processing of a request.
+///
+/// # ABNF
+/// ```plain
+/// Preference-Applied = "Preference-Applied" ":" 1#applied-pref
+/// applied-pref = token [ BWS "=" BWS word ]
+/// ```
+///
+/// # Example values
+/// * `respond-async`
+/// * `return=minimal`
+/// * `wait=30`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, PreferenceApplied, Preference};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     PreferenceApplied(vec![Preference::RespondAsync])
+/// );
+/// ```
+/// ```
+/// use hyper::header::{Headers, PreferenceApplied, Preference};
+///
+/// let mut headers = Headers::new();
+/// headers.set(
+///     PreferenceApplied(vec![
+///         Preference::RespondAsync,
+///         Preference::ReturnRepresentation,
+///         Preference::Wait(10u32),
+///         Preference::Extension("foo".to_owned(),
+///                               "bar".to_owned(),
+///                               vec![]),
+///     ])
+/// );
+/// ```
+#[derive(PartialEq, Clone, Debug)]
+pub struct PreferenceApplied(pub Vec<Preference>);
+
+__hyper__deref!(PreferenceApplied => Vec<Preference>);
+
+impl Header for PreferenceApplied {
+    fn header_name() -> &'static str {
+        "Preference-Applied"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<PreferenceApplied> {
+        let preferences = try!(from_comma_delimited(raw));
+        if !preferences.is_empty() {
+            Ok(PreferenceApplied(preferences))
+        } else {
+            Err(::Error::Header)
+        }
+    }
+}
+
+impl HeaderFormat for PreferenceApplied {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for PreferenceApplied {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        //TODO: format this without allocating a Vec and cloning contents
+        let preferences: Vec<_> = self.0.iter().map(|pref| match pref {
+            // The spec ignores parameters in `Preferences-Applied`
+            &Preference::Extension(ref name, ref value, _) => Preference::Extension(
+              name.to_owned(),
+              value.to_owned(),
+              vec![]
+            ),
+            preference @ _ => preference.clone()
+        }).collect();
+        fmt_comma_delimited(f, &preferences)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use header::{HeaderFormat, Preference};
+    use super::*;
+
+    #[test]
+    fn test_format_ignore_parameters() {
+        assert_eq!(
+            format!("{}", &PreferenceApplied(vec![Preference::Extension(
+                "foo".to_owned(),
+                "bar".to_owned(),
+                vec![("bar".to_owned(), "foo".to_owned()), ("buz".to_owned(), "".to_owned())]
+            )]) as &(HeaderFormat + Send + Sync)),
+            "foo=bar".to_owned()
+        );
+    }
+}
+
+bench_header!(normal,
+    PreferenceApplied, { vec![b"respond-async, return=representation".to_vec(), b"wait=100".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/range.rs
@@ -0,0 +1,288 @@
+use std::fmt::{self, Display};
+use std::str::FromStr;
+
+use header::{Header, HeaderFormat};
+use header::parsing::{from_one_raw_str, from_comma_delimited};
+
+/// `Range` header, defined in [RFC7233](https://tools.ietf.org/html/rfc7233#section-3.1)
+///
+/// The "Range" header field on a GET request modifies the method
+/// semantics to request transfer of only one or more subranges of the
+/// selected representation data, rather than the entire selected
+/// representation data.
+///
+/// # ABNF
+/// ```plain
+/// Range =	byte-ranges-specifier / other-ranges-specifier
+/// other-ranges-specifier = other-range-unit "=" other-range-set
+/// other-range-set = 1*VCHAR
+///
+/// bytes-unit = "bytes"
+///
+/// byte-ranges-specifier = bytes-unit "=" byte-range-set
+/// byte-range-set = 1#(byte-range-spec / suffix-byte-range-spec)
+/// byte-range-spec = first-byte-pos "-" [last-byte-pos]
+/// first-byte-pos = 1*DIGIT
+/// last-byte-pos = 1*DIGIT
+/// ```
+///
+/// # Example values
+/// * `bytes=1000-`
+/// * `bytes=-2000`
+/// * `bytes=0-1,30-40`
+/// * `bytes=0-10,20-90,-100`
+/// * `custom_unit=0-123`
+/// * `custom_unit=xxx-yyy`
+///
+/// # Examples
+/// ```
+/// use hyper::header::{Headers, Range, ByteRangeSpec};
+///
+/// let mut headers = Headers::new();
+/// headers.set(Range::Bytes(
+///     vec![ByteRangeSpec::FromTo(1, 100), ByteRangeSpec::AllFrom(200)]
+/// ));
+///
+/// headers.clear();
+/// headers.set(Range::Unregistered("letters".to_owned(), "a-f".to_owned()));
+/// ```
+/// ```
+/// use hyper::header::{Headers, Range};
+///
+/// let mut headers = Headers::new();
+/// headers.set(Range::bytes(1, 100));
+///
+/// headers.clear();
+/// headers.set(Range::bytes_multi(vec![(1, 100), (200, 300)]));
+/// ```
+#[derive(PartialEq, Clone, Debug)]
+pub enum Range {
+    /// Byte range
+    Bytes(Vec<ByteRangeSpec>),
+    /// Custom range, with unit not registered at IANA
+    /// (`other-range-unit`: String , `other-range-set`: String)
+    Unregistered(String, String)
+}
+
+/// Each `Range::Bytes` header can contain one or more `ByteRangeSpecs`.
+/// Each `ByteRangeSpec` defines a range of bytes to fetch
+#[derive(PartialEq, Clone, Debug)]
+pub enum ByteRangeSpec {
+    /// Get all bytes between x and y ("x-y")
+    FromTo(u64, u64),
+    /// Get all bytes starting from x ("x-")
+    AllFrom(u64),
+    /// Get last x bytes ("-x")
+    Last(u64)
+}
+
+impl Range {
+    /// Get the most common byte range header ("bytes=from-to")
+    pub fn bytes(from: u64, to: u64) -> Range {
+        Range::Bytes(vec![ByteRangeSpec::FromTo(from, to)])
+    }
+
+    /// Get byte range header with multiple subranges
+    /// ("bytes=from1-to1,from2-to2,fromX-toX")
+    pub fn bytes_multi(ranges: Vec<(u64, u64)>) -> Range {
+        Range::Bytes(ranges.iter().map(|r| ByteRangeSpec::FromTo(r.0, r.1)).collect())
+    }
+}
+
+
+impl fmt::Display for ByteRangeSpec {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            ByteRangeSpec::FromTo(from, to) => write!(f, "{}-{}", from, to),
+            ByteRangeSpec::Last(pos) => write!(f, "-{}", pos),
+            ByteRangeSpec::AllFrom(pos) => write!(f, "{}-", pos),
+        }
+    }
+}
+
+
+impl fmt::Display for Range {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Range::Bytes(ref ranges) => {
+                try!(write!(f, "bytes="));
+
+                for (i, range) in ranges.iter().enumerate() {
+                    if i != 0 {
+                        try!(f.write_str(","));
+                    }
+                    try!(Display::fmt(range, f));
+                }
+                Ok(())
+            },
+            Range::Unregistered(ref unit, ref range_str) => {
+                write!(f, "{}={}", unit, range_str)
+            },
+        }
+    }
+}
+
+impl FromStr for Range {
+    type Err = ::Error;
+
+    fn from_str(s: &str) -> ::Result<Range> {
+        let mut iter = s.splitn(2, "=");
+
+        match (iter.next(), iter.next()) {
+            (Some("bytes"), Some(ranges)) => {
+                match from_comma_delimited(&[ranges]) {
+                    Ok(ranges) => {
+                        if ranges.is_empty() {
+                            return Err(::Error::Header);
+                        }
+                        Ok(Range::Bytes(ranges))
+                    },
+                    Err(_) => Err(::Error::Header)
+                }
+            }
+            (Some(unit), Some(range_str)) if unit != "" && range_str != "" => {
+                Ok(Range::Unregistered(unit.to_owned(), range_str.to_owned()))
+
+            },
+            _ => Err(::Error::Header)
+        }
+    }
+}
+
+impl FromStr for ByteRangeSpec {
+    type Err = ::Error;
+
+    fn from_str(s: &str) -> ::Result<ByteRangeSpec> {
+        let mut parts = s.splitn(2, "-");
+
+        match (parts.next(), parts.next()) {
+            (Some(""), Some(end)) => {
+                end.parse().or(Err(::Error::Header)).map(ByteRangeSpec::Last)
+            },
+            (Some(start), Some("")) => {
+                start.parse().or(Err(::Error::Header)).map(ByteRangeSpec::AllFrom)
+            },
+            (Some(start), Some(end)) => {
+                match (start.parse(), end.parse()) {
+                    (Ok(start), Ok(end)) if start <= end => Ok(ByteRangeSpec::FromTo(start, end)),
+                    _ => Err(::Error::Header)
+                }
+            },
+            _ => Err(::Error::Header)
+        }
+    }
+}
+
+impl Header for Range {
+
+    fn header_name() -> &'static str {
+        "Range"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Range> {
+        from_one_raw_str(raw)
+    }
+}
+
+impl HeaderFormat for Range {
+
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        Display::fmt(self, f)
+    }
+
+}
+
+#[test]
+fn test_parse_bytes_range_valid() {
+    let r: Range = Header::parse_header(&[b"bytes=1-100".to_vec()]).unwrap();
+    let r2: Range = Header::parse_header(&[b"bytes=1-100,-".to_vec()]).unwrap();
+    let r3 =  Range::bytes(1, 100);
+    assert_eq!(r, r2);
+    assert_eq!(r2, r3);
+
+    let r: Range = Header::parse_header(&[b"bytes=1-100,200-".to_vec()]).unwrap();
+    let r2: Range = Header::parse_header(&[b"bytes= 1-100 , 101-xxx,  200- ".to_vec()]).unwrap();
+    let r3 =  Range::Bytes(
+        vec![ByteRangeSpec::FromTo(1, 100), ByteRangeSpec::AllFrom(200)]
+    );
+    assert_eq!(r, r2);
+    assert_eq!(r2, r3);
+
+    let r: Range = Header::parse_header(&[b"bytes=1-100,-100".to_vec()]).unwrap();
+    let r2: Range = Header::parse_header(&[b"bytes=1-100, ,,-100".to_vec()]).unwrap();
+    let r3 =  Range::Bytes(
+        vec![ByteRangeSpec::FromTo(1, 100), ByteRangeSpec::Last(100)]
+    );
+    assert_eq!(r, r2);
+    assert_eq!(r2, r3);
+
+    let r: Range = Header::parse_header(&[b"custom=1-100,-100".to_vec()]).unwrap();
+    let r2 =  Range::Unregistered("custom".to_owned(), "1-100,-100".to_owned());
+    assert_eq!(r, r2);
+
+}
+
+#[test]
+fn test_parse_unregistered_range_valid() {
+    let r: Range = Header::parse_header(&[b"custom=1-100,-100".to_vec()]).unwrap();
+    let r2 =  Range::Unregistered("custom".to_owned(), "1-100,-100".to_owned());
+    assert_eq!(r, r2);
+
+    let r: Range = Header::parse_header(&[b"custom=abcd".to_vec()]).unwrap();
+    let r2 =  Range::Unregistered("custom".to_owned(), "abcd".to_owned());
+    assert_eq!(r, r2);
+
+    let r: Range = Header::parse_header(&[b"custom=xxx-yyy".to_vec()]).unwrap();
+    let r2 =  Range::Unregistered("custom".to_owned(), "xxx-yyy".to_owned());
+    assert_eq!(r, r2);
+}
+
+#[test]
+fn test_parse_invalid() {
+    let r: ::Result<Range> = Header::parse_header(&[b"bytes=1-a,-".to_vec()]);
+    assert_eq!(r.ok(), None);
+
+    let r: ::Result<Range> = Header::parse_header(&[b"bytes=1-2-3".to_vec()]);
+    assert_eq!(r.ok(), None);
+
+    let r: ::Result<Range> = Header::parse_header(&[b"abc".to_vec()]);
+    assert_eq!(r.ok(), None);
+
+    let r: ::Result<Range> = Header::parse_header(&[b"bytes=1-100=".to_vec()]);
+    assert_eq!(r.ok(), None);
+
+    let r: ::Result<Range> = Header::parse_header(&[b"bytes=".to_vec()]);
+    assert_eq!(r.ok(), None);
+
+    let r: ::Result<Range> = Header::parse_header(&[b"custom=".to_vec()]);
+    assert_eq!(r.ok(), None);
+
+    let r: ::Result<Range> = Header::parse_header(&[b"=1-100".to_vec()]);
+    assert_eq!(r.ok(), None);
+}
+
+#[test]
+fn test_fmt() {
+    use header::Headers;
+
+    let mut headers = Headers::new();
+
+    headers.set(
+        Range::Bytes(
+            vec![ByteRangeSpec::FromTo(0, 1000), ByteRangeSpec::AllFrom(2000)]
+    ));
+    assert_eq!(&headers.to_string(), "Range: bytes=0-1000,2000-\r\n");
+
+    headers.clear();
+    headers.set(Range::Bytes(vec![]));
+
+    assert_eq!(&headers.to_string(), "Range: bytes=\r\n");
+
+    headers.clear();
+    headers.set(Range::Unregistered("custom".to_owned(), "1-xxx".to_owned()));
+
+    assert_eq!(&headers.to_string(), "Range: custom=1-xxx\r\n");
+}
+
+bench_header!(bytes_multi, Range, { vec![b"bytes=1-1001,2001-3001,10001-".to_vec()]});
+bench_header!(custom_unit, Range, { vec![b"other=0-100000".to_vec()]});
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/referer.rs
@@ -0,0 +1,41 @@
+header! {
+    /// `Referer` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.5.2)
+    ///
+    /// The `Referer` [sic] header field allows the user agent to specify a
+    /// URI reference for the resource from which the target URI was obtained
+    /// (i.e., the "referrer", though the field name is misspelled).  A user
+    /// agent MUST NOT include the fragment and userinfo components of the
+    /// URI reference, if any, when generating the Referer field value.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Referer = absolute-URI / partial-URI
+    /// ```
+    ///
+    /// # Example values
+    /// * `http://www.example.org/hypertext/Overview.html`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, Referer};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Referer("/People.html#tim".to_owned()));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, Referer};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Referer("http://www.example.com/index.html".to_owned()));
+    /// ```
+    // TODO Use URL
+    (Referer, "Referer") => [String]
+
+    test_referer {
+        // Testcase from the RFC
+        test_header!(test1, vec![b"http://www.example.org/hypertext/Overview.html"]);
+    }
+}
+
+bench_header!(bench, Referer, { vec![b"http://foo.com/hello:3000".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/referrer_policy.rs
@@ -0,0 +1,119 @@
+use std::fmt;
+use std::ascii::AsciiExt;
+
+use header::{Header, HeaderFormat, parsing};
+
+/// `Referrer-Policy` header, part of
+/// [Referrer Policy](https://www.w3.org/TR/referrer-policy/#referrer-policy-header)
+///
+/// The `Referrer-Policy` HTTP header specifies the referrer
+/// policy that the user agent applies when determining what
+/// referrer information should be included with requests made,
+/// and with browsing contexts created from the context of the
+/// protected resource.
+///
+/// # ABNF
+/// ```plain
+/// Referrer-Policy: 1#policy-token
+/// policy-token   = "no-referrer" / "no-referrer-when-downgrade"
+///                  / "same-origin" / "origin"
+///                  / "origin-when-cross-origin" / "unsafe-url"
+/// ```
+///
+/// # Example values
+/// * `no-referrer`
+///
+/// # Example
+/// ```
+/// use hyper::header::{Headers, ReferrerPolicy};
+///
+/// let mut headers = Headers::new();
+/// headers.set(ReferrerPolicy::NoReferrer);
+/// ```
+#[derive(Clone, PartialEq, Eq, Debug)]
+pub enum ReferrerPolicy {
+    /// `no-referrer`
+    NoReferrer,
+    /// `no-referrer-when-downgrade`
+    NoReferrerWhenDowngrade,
+    /// `same-origin`
+    SameOrigin,
+    /// `origin`
+    Origin,
+    /// `origin-when-cross-origin`
+    OriginWhenCrossOrigin,
+    /// `unsafe-url`
+    UnsafeUrl,
+     /// `strict-origin`
+    StrictOrigin,
+    ///`strict-origin-when-cross-origin`
+    StrictOriginWhenCrossOrigin,
+}
+
+impl Header for ReferrerPolicy {
+    fn header_name() -> &'static str {
+        static NAME: &'static str = "Referrer-Policy";
+        NAME
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<ReferrerPolicy> {
+        use self::ReferrerPolicy::*;
+        // See https://www.w3.org/TR/referrer-policy/#determine-policy-for-token
+        let headers: Vec<String> = try!(parsing::from_comma_delimited(raw));
+
+        for h in headers.iter().rev() {
+            let slice = &h.to_ascii_lowercase()[..];
+            match slice {
+                "no-referrer" | "never" => return Ok(NoReferrer),
+                "no-referrer-when-downgrade" | "default" => return Ok(NoReferrerWhenDowngrade),
+                "same-origin" => return Ok(SameOrigin),
+                "origin" => return Ok(Origin),
+                "origin-when-cross-origin" => return Ok(OriginWhenCrossOrigin),
+                "strict-origin" => return Ok(StrictOrigin),
+                "strict-origin-when-cross-origin" => return Ok(StrictOriginWhenCrossOrigin),
+                "unsafe-url" | "always" => return Ok(UnsafeUrl),
+                _ => continue,
+            }
+        }
+
+        Err(::Error::Header)
+    }
+}
+
+impl HeaderFormat for ReferrerPolicy {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for ReferrerPolicy {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::ReferrerPolicy::*;
+        f.write_str(match *self {
+            NoReferrer => "no-referrer",
+            NoReferrerWhenDowngrade => "no-referrer-when-downgrade",
+            SameOrigin => "same-origin",
+            Origin => "origin",
+            OriginWhenCrossOrigin => "origin-when-cross-origin",
+            StrictOrigin => "strict-origin",
+            StrictOriginWhenCrossOrigin => "strict-origin-when-cross-origin",
+            UnsafeUrl => "unsafe-url",
+        })
+    }
+}
+
+#[test]
+fn test_parse_header() {
+    let a: ReferrerPolicy = Header::parse_header([b"origin".to_vec()].as_ref()).unwrap();
+    let b = ReferrerPolicy::Origin;
+    assert_eq!(a, b);
+    let e: ::Result<ReferrerPolicy> = Header::parse_header([b"foobar".to_vec()].as_ref());
+    assert!(e.is_err());
+}
+
+#[test]
+fn test_rightmost_header() {
+    let a: ReferrerPolicy = Header::parse_header(&["same-origin, origin, foobar".into()]).unwrap();
+    let b = ReferrerPolicy::Origin;
+    assert_eq!(a, b);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/server.rs
@@ -0,0 +1,36 @@
+header! {
+    /// `Server` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.4.2)
+    ///
+    /// The `Server` header field contains information about the software
+    /// used by the origin server to handle the request, which is often used
+    /// by clients to help identify the scope of reported interoperability
+    /// problems, to work around or tailor requests to avoid particular
+    /// server limitations, and for analytics regarding server or operating
+    /// system use.  An origin server MAY generate a Server field in its
+    /// responses.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Server = product *( RWS ( product / comment ) )
+    /// ```
+    ///
+    /// # Example values
+    /// * `CERN/3.0 libwww/2.17`
+    ///
+    /// # Example
+    /// ```
+    /// use hyper::header::{Headers, Server};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Server("hyper/0.5.2".to_owned()));
+    /// ```
+    // TODO: Maybe parse as defined in the spec?
+    (Server, "Server") => [String]
+
+    test_server {
+        // Testcase from RFC
+        test_header!(test1, vec![b"CERN/3.0 libwww/2.17"]);
+    }
+}
+
+bench_header!(bench, Server, { vec![b"Some String".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/set_cookie.rs
@@ -0,0 +1,121 @@
+use header::{Header, HeaderFormat};
+use std::fmt::{self};
+use std::str::from_utf8;
+
+
+/// `Set-Cookie` header, defined [RFC6265](http://tools.ietf.org/html/rfc6265#section-4.1)
+///
+/// The Set-Cookie HTTP response header is used to send cookies from the
+/// server to the user agent.
+///
+/// Informally, the Set-Cookie response header contains the header name
+/// "Set-Cookie" followed by a ":" and a cookie.  Each cookie begins with
+/// a name-value-pair, followed by zero or more attribute-value pairs.
+///
+/// # ABNF
+/// ```plain
+///  set-cookie-header = "Set-Cookie:" SP set-cookie-string
+/// set-cookie-string = cookie-pair *( ";" SP cookie-av )
+/// cookie-pair       = cookie-name "=" cookie-value
+/// cookie-name       = token
+/// cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
+/// cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
+///                       ; US-ASCII characters excluding CTLs,
+///                       ; whitespace DQUOTE, comma, semicolon,
+///                       ; and backslash
+/// token             = <token, defined in [RFC2616], Section 2.2>
+///
+/// cookie-av         = expires-av / max-age-av / domain-av /
+///                    path-av / secure-av / httponly-av /
+///                     extension-av
+/// expires-av        = "Expires=" sane-cookie-date
+/// sane-cookie-date  = <rfc1123-date, defined in [RFC2616], Section 3.3.1>
+/// max-age-av        = "Max-Age=" non-zero-digit *DIGIT
+///                       ; In practice, both expires-av and max-age-av
+///                       ; are limited to dates representable by the
+///                       ; user agent.
+/// non-zero-digit    = %x31-39
+///                       ; digits 1 through 9
+/// domain-av         = "Domain=" domain-value
+/// domain-value      = <subdomain>
+///                       ; defined in [RFC1034], Section 3.5, as
+///                       ; enhanced by [RFC1123], Section 2.1
+/// path-av           = "Path=" path-value
+/// path-value        = <any CHAR except CTLs or ";">
+/// secure-av         = "Secure"
+/// httponly-av       = "HttpOnly"
+/// extension-av      = <any CHAR except CTLs or ";">
+/// ```
+///
+/// # Example values
+/// * `SID=31d4d96e407aad42`
+/// * `lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT`
+/// * `lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT`
+/// * `lang=en-US; Path=/; Domain=example.com`
+///
+/// # Example
+/// ```
+/// use hyper::header::{Headers, SetCookie};
+///
+/// let mut headers = Headers::new();
+///
+/// headers.set(
+///     SetCookie(vec![
+///         String::from("foo=bar; Path=/path; Domain=example.com")
+///     ])
+/// );
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub struct SetCookie(pub Vec<String>);
+
+__hyper__deref!(SetCookie => Vec<String>);
+
+impl Header for SetCookie {
+    fn header_name() -> &'static str {
+        "Set-Cookie"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<SetCookie> {
+        let mut set_cookies = Vec::with_capacity(raw.len());
+        for set_cookies_raw in raw {
+            if let Ok(s) = from_utf8(&set_cookies_raw[..]) {
+                set_cookies.push(s.trim().to_owned());
+            }
+        }
+
+        if !set_cookies.is_empty() {
+            Ok(SetCookie(set_cookies))
+        } else {
+            Err(::Error::Header)
+        }
+    }
+
+}
+
+impl HeaderFormat for SetCookie {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.0.len() == 1 {
+            write!(f, "{}", &self.0[0])
+        } else {
+            panic!("SetCookie with multiple cookies cannot be used with fmt_header, must use fmt_multi_header");
+        }
+    }
+
+    fn fmt_multi_header(&self, f: &mut ::header::MultilineFormatter) -> fmt::Result {
+        for cookie in &self.0 {
+            try!(f.fmt_line(cookie));
+        }
+        Ok(())
+    }
+}
+
+#[test]
+fn test_set_cookie_fmt() {
+    use ::header::Headers;
+    let mut headers = Headers::new();
+    headers.set(SetCookie(vec![
+        "foo=bar".into(),
+        "baz=quux".into(),
+    ]));
+    assert_eq!(headers.to_string(), "Set-Cookie: foo=bar\r\nSet-Cookie: baz=quux\r\n");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/strict_transport_security.rs
@@ -0,0 +1,201 @@
+use std::fmt;
+use std::str::{self, FromStr};
+
+use unicase::UniCase;
+
+use header::{Header, HeaderFormat, parsing};
+
+/// `StrictTransportSecurity` header, defined in [RFC6797](https://tools.ietf.org/html/rfc6797)
+///
+/// This specification defines a mechanism enabling web sites to declare
+/// themselves accessible only via secure connections and/or for users to be
+/// able to direct their user agent(s) to interact with given sites only over
+/// secure connections.  This overall policy is referred to as HTTP Strict
+/// Transport Security (HSTS).  The policy is declared by web sites via the
+/// Strict-Transport-Security HTTP response header field and/or by other means,
+/// such as user agent configuration, for example.
+///
+/// # ABNF
+///
+/// ```plain
+///      [ directive ]  *( ";" [ directive ] )
+///
+///      directive                 = directive-name [ "=" directive-value ]
+///      directive-name            = token
+///      directive-value           = token | quoted-string
+///
+/// ```
+///
+/// # Example values
+/// * `max-age=31536000`
+/// * `max-age=15768000 ; includeSubDomains`
+///
+/// # Example
+/// ```
+/// # extern crate hyper;
+/// # fn main() {
+/// use hyper::header::{Headers, StrictTransportSecurity};
+///
+/// let mut headers = Headers::new();
+///
+/// headers.set(
+///    StrictTransportSecurity::including_subdomains(31536000u64)
+/// );
+/// # }
+/// ```
+#[derive(Clone, PartialEq, Debug)]
+pub struct StrictTransportSecurity {
+    /// Signals the UA that the HSTS Policy applies to this HSTS Host as well as
+    /// any subdomains of the host's domain name.
+    pub include_subdomains: bool,
+
+    /// Specifies the number of seconds, after the reception of the STS header
+    /// field, during which the UA regards the host (from whom the message was
+    /// received) as a Known HSTS Host.
+    pub max_age: u64
+}
+
+impl StrictTransportSecurity {
+    /// Create an STS header that includes subdomains
+    pub fn including_subdomains(max_age: u64) -> StrictTransportSecurity {
+        StrictTransportSecurity {
+            max_age: max_age,
+            include_subdomains: true
+        }
+    }
+
+    /// Create an STS header that excludes subdomains
+    pub fn excluding_subdomains(max_age: u64) -> StrictTransportSecurity {
+        StrictTransportSecurity {
+            max_age: max_age,
+            include_subdomains: false
+        }
+    }
+}
+
+enum Directive {
+    MaxAge(u64),
+    IncludeSubdomains,
+    Unknown
+}
+
+impl FromStr for StrictTransportSecurity {
+    type Err = ::Error;
+
+    fn from_str(s: &str) -> ::Result<StrictTransportSecurity> {
+        s.split(';')
+            .map(str::trim)
+            .map(|sub| if UniCase(sub) == UniCase("includeSubdomains") {
+                Ok(Directive::IncludeSubdomains)
+            } else {
+                let mut sub = sub.splitn(2, '=');
+                match (sub.next(), sub.next()) {
+                    (Some(left), Some(right))
+                    if UniCase(left.trim()) == UniCase("max-age") => {
+                        right
+                            .trim()
+                            .trim_matches('"')
+                            .parse()
+                            .map(Directive::MaxAge)
+                    },
+                    _ => Ok(Directive::Unknown)
+                }
+            })
+            .fold(Ok((None, None)), |res, dir| match (res, dir) {
+                (Ok((None, sub)), Ok(Directive::MaxAge(age))) => Ok((Some(age), sub)),
+                (Ok((age, None)), Ok(Directive::IncludeSubdomains)) => Ok((age, Some(()))),
+                (Ok((Some(_), _)), Ok(Directive::MaxAge(_))) => Err(::Error::Header),
+                (Ok((_, Some(_))), Ok(Directive::IncludeSubdomains)) => Err(::Error::Header),
+                (_, Err(_)) => Err(::Error::Header),
+                (res, _) => res
+            })
+            .and_then(|res| match res {
+                (Some(age), sub) => Ok(StrictTransportSecurity {
+                    max_age: age,
+                    include_subdomains: sub.is_some()
+                }),
+                _ => Err(::Error::Header)
+            })
+    }
+}
+
+impl Header for StrictTransportSecurity {
+    fn header_name() -> &'static str {
+        "Strict-Transport-Security"
+    }
+
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<StrictTransportSecurity> {
+        parsing::from_one_raw_str(raw)
+    }
+}
+
+impl HeaderFormat for StrictTransportSecurity {
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for StrictTransportSecurity {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.include_subdomains {
+            write!(f, "max-age={}; includeSubdomains", self.max_age)
+        } else {
+            write!(f, "max-age={}", self.max_age)
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::StrictTransportSecurity;
+    use header::Header;
+
+    #[test]
+    fn test_parse_max_age() {
+        let h = Header::parse_header(&[b"max-age=31536000".to_vec()][..]);
+        assert_eq!(h.ok(), Some(StrictTransportSecurity { include_subdomains: false, max_age: 31536000u64 }));
+    }
+
+    #[test]
+    fn test_parse_max_age_no_value() {
+        let h: ::Result<StrictTransportSecurity> = Header::parse_header(&[b"max-age".to_vec()][..]);
+        assert!(h.is_err());
+    }
+
+    #[test]
+    fn test_parse_quoted_max_age() {
+        let h = Header::parse_header(&[b"max-age=\"31536000\"".to_vec()][..]);
+        assert_eq!(h.ok(), Some(StrictTransportSecurity { include_subdomains: false, max_age: 31536000u64 }));
+    }
+
+    #[test]
+    fn test_parse_spaces_max_age() {
+        let h = Header::parse_header(&[b"max-age = 31536000".to_vec()][..]);
+        assert_eq!(h.ok(), Some(StrictTransportSecurity { include_subdomains: false, max_age: 31536000u64 }));
+    }
+
+    #[test]
+    fn test_parse_include_subdomains() {
+        let h = Header::parse_header(&[b"max-age=15768000 ; includeSubDomains".to_vec()][..]);
+        assert_eq!(h.ok(), Some(StrictTransportSecurity { include_subdomains: true, max_age: 15768000u64 }));
+    }
+
+    #[test]
+    fn test_parse_no_max_age() {
+        let h: ::Result<StrictTransportSecurity> = Header::parse_header(&[b"includeSubDomains".to_vec()][..]);
+        assert!(h.is_err());
+    }
+
+    #[test]
+    fn test_parse_max_age_nan() {
+        let h: ::Result<StrictTransportSecurity> = Header::parse_header(&[b"max-age = derp".to_vec()][..]);
+        assert!(h.is_err());
+    }
+
+    #[test]
+    fn test_parse_duplicate_directives() {
+        assert!(StrictTransportSecurity::parse_header(&[b"max-age=100; max-age=5; max-age=0".to_vec()][..]).is_err());
+    }
+}
+
+bench_header!(bench, StrictTransportSecurity, { vec![b"max-age=15768000 ; includeSubDomains".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/transfer_encoding.rs
@@ -0,0 +1,53 @@
+use header::Encoding;
+
+header! {
+    /// `Transfer-Encoding` header, defined in
+    /// [RFC7230](http://tools.ietf.org/html/rfc7230#section-3.3.1)
+    /// 
+    /// The `Transfer-Encoding` header field lists the transfer coding names
+    /// corresponding to the sequence of transfer codings that have been (or
+    /// will be) applied to the payload body in order to form the message
+    /// body.
+    /// 
+    /// # ABNF
+    /// ```plain
+    /// Transfer-Encoding = 1#transfer-coding
+    /// ```
+    /// 
+    /// # Example values
+    /// * `gzip, chunked`
+    /// 
+    /// # Example
+    /// ```
+    /// use hyper::header::{Headers, TransferEncoding, Encoding};
+    /// 
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     TransferEncoding(vec![
+    ///         Encoding::Gzip,
+    ///         Encoding::Chunked,
+    ///     ])
+    /// );
+    /// ```
+    (TransferEncoding, "Transfer-Encoding") => (Encoding)+
+
+    transfer_encoding {
+        test_header!(
+            test1,
+            vec![b"gzip, chunked"],
+            Some(HeaderField(
+                vec![Encoding::Gzip, Encoding::Chunked]
+                )));
+        // Issue: #683
+        test_header!(
+            test2,
+            vec![b"chunked", b"chunked"],
+            Some(HeaderField(
+                vec![Encoding::Chunked, Encoding::Chunked]
+            )));
+
+    }
+}
+
+bench_header!(normal, TransferEncoding, { vec![b"chunked, gzip".to_vec()] });
+bench_header!(ext, TransferEncoding, { vec![b"ext".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/upgrade.rs
@@ -0,0 +1,158 @@
+use std::fmt::{self, Display};
+use std::str::FromStr;
+use unicase::UniCase;
+
+header! {
+    /// `Upgrade` header, defined in [RFC7230](http://tools.ietf.org/html/rfc7230#section-6.7)
+    ///
+    /// The `Upgrade` header field is intended to provide a simple mechanism
+    /// for transitioning from HTTP/1.1 to some other protocol on the same
+    /// connection.  A client MAY send a list of protocols in the Upgrade
+    /// header field of a request to invite the server to switch to one or
+    /// more of those protocols, in order of descending preference, before
+    /// sending the final response.  A server MAY ignore a received Upgrade
+    /// header field if it wishes to continue using the current protocol on
+    /// that connection.  Upgrade cannot be used to insist on a protocol
+    /// change.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Upgrade          = 1#protocol
+    ///
+    /// protocol         = protocol-name ["/" protocol-version]
+    /// protocol-name    = token
+    /// protocol-version = token
+    /// ```
+    ///
+    /// # Example values
+    /// * `HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11`
+    ///
+    /// # Examples
+    /// ```
+    /// use hyper::header::{Headers, Upgrade, Protocol, ProtocolName};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Upgrade(vec![Protocol::new(ProtocolName::WebSocket, None)]));
+    /// ```
+    /// ```
+    /// use hyper::header::{Headers, Upgrade, Protocol, ProtocolName};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     Upgrade(vec![
+    ///         Protocol::new(ProtocolName::Http, Some("2.0".to_owned())),
+    ///         Protocol::new(ProtocolName::Unregistered("SHTTP".to_owned()),
+    ///             Some("1.3".to_owned())),
+    ///         Protocol::new(ProtocolName::Unregistered("IRC".to_owned()),
+    ///             Some("6.9".to_owned())),
+    ///     ])
+    /// );
+    /// ```
+    (Upgrade, "Upgrade") => (Protocol)+
+
+    test_upgrade {
+        // Testcase from the RFC
+        test_header!(
+            test1,
+            vec![b"HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11"],
+            Some(Upgrade(vec![
+                Protocol::new(ProtocolName::Http, Some("2.0".to_owned())),
+                Protocol::new(ProtocolName::Unregistered("SHTTP".to_owned()),
+                    Some("1.3".to_owned())),
+                Protocol::new(ProtocolName::Unregistered("IRC".to_owned()), Some("6.9".to_owned())),
+                Protocol::new(ProtocolName::Unregistered("RTA".to_owned()), Some("x11".to_owned())),
+                ])));
+        // Own tests
+        test_header!(
+            test2, vec![b"websocket"],
+            Some(Upgrade(vec![Protocol::new(ProtocolName::WebSocket, None)])));
+        #[test]
+        fn test3() {
+            let x: ::Result<Upgrade> = Header::parse_header(&[b"WEbSOCKet".to_vec()]);
+            assert_eq!(x.ok(), Some(Upgrade(vec![Protocol::new(ProtocolName::WebSocket, None)])));
+        }
+    }
+}
+
+/// A protocol name used to identify a spefic protocol. Names are case-sensitive
+/// except for the `WebSocket` value.
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum ProtocolName {
+    /// `HTTP` value, Hypertext Transfer Protocol
+    Http,
+    /// `TLS` value, Transport Layer Security [RFC2817](http://tools.ietf.org/html/rfc2817)
+    Tls,
+    /// `WebSocket` value, matched case insensitively,Web Socket Protocol
+    /// [RFC6455](http://tools.ietf.org/html/rfc6455)
+    WebSocket,
+    /// `h2c` value, HTTP/2 over cleartext TCP
+    H2c,
+    /// Any other protocol name not known to hyper
+    Unregistered(String),
+}
+
+impl FromStr for ProtocolName {
+    type Err = ();
+    fn from_str(s: &str) -> Result<ProtocolName, ()> {
+        Ok(match s {
+            "HTTP" => ProtocolName::Http,
+            "TLS" => ProtocolName::Tls,
+            "h2c" => ProtocolName::H2c,
+            _ => {
+                if UniCase(s) == UniCase("websocket") {
+                    ProtocolName::WebSocket
+                } else {
+                    ProtocolName::Unregistered(s.to_owned())
+                }
+            }
+        })
+    }
+}
+
+impl Display for ProtocolName {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match *self {
+            ProtocolName::Http => "HTTP",
+            ProtocolName::Tls => "TLS",
+            ProtocolName::WebSocket => "websocket",
+            ProtocolName::H2c => "h2c",
+            ProtocolName::Unregistered(ref s) => s,
+        })
+    }
+}
+
+/// Protocols that appear in the `Upgrade` header field
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct Protocol {
+    /// The protocol identifier
+    pub name: ProtocolName,
+    /// The optional version of the protocol, often in the format "DIGIT.DIGIT" (e.g.. "1.2")
+    pub version: Option<String>,
+}
+
+impl Protocol {
+    /// Creates a new Protocol with the given name and version
+    pub fn new(name: ProtocolName, version: Option<String>) -> Protocol {
+        Protocol { name: name, version: version }
+    }
+}
+
+impl FromStr for Protocol {
+    type Err =();
+    fn from_str(s: &str) -> Result<Protocol, ()> {
+        let mut parts = s.splitn(2, '/');
+        Ok(Protocol::new(try!(parts.next().unwrap().parse()), parts.next().map(|x| x.to_owned())))
+    }
+}
+
+impl Display for Protocol {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(fmt::Display::fmt(&self.name, f));
+        if let Some(ref version) = self.version {
+            try!(write!(f, "/{}", version));
+        }
+        Ok(())
+    }
+}
+
+bench_header!(bench, Upgrade, { vec![b"HTTP/2.0, RTA/x11, websocket".to_vec()] });
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/user_agent.rs
@@ -0,0 +1,42 @@
+header! {
+    /// `User-Agent` header, defined in
+    /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.5.3)
+    ///
+    /// The `User-Agent` header field contains information about the user
+    /// agent originating the request, which is often used by servers to help
+    /// identify the scope of reported interoperability problems, to work
+    /// around or tailor responses to avoid particular user agent
+    /// limitations, and for analytics regarding browser or operating system
+    /// use.  A user agent SHOULD send a User-Agent field in each request
+    /// unless specifically configured not to do so.
+    ///
+    /// # ABNF
+    /// ```plain
+    /// User-Agent = product *( RWS ( product / comment ) )
+    /// product         = token ["/" product-version]
+    /// product-version = token
+    /// ```
+    ///
+    /// # Example values
+    /// * `CERN-LineMode/2.15 libwww/2.17b3`
+    /// * `Bunnies`
+    ///
+    /// # Notes
+    /// * The parser does not split the value
+    ///
+    /// # Example
+    /// ```
+    /// use hyper::header::{Headers, UserAgent};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(UserAgent("hyper/0.5.2".to_owned()));
+    /// ```
+    (UserAgent, "User-Agent") => [String]
+
+    test_user_agent {
+        // Testcase from RFC
+        test_header!(test1, vec![b"CERN-LineMode/2.15 libwww/2.17b3"]);
+        // Own testcase
+        test_header!(test2, vec![b"Bunnies"], Some(UserAgent("Bunnies".to_owned())));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/common/vary.rs
@@ -0,0 +1,66 @@
+use unicase::UniCase;
+
+header! {
+    /// `Vary` header, defined in [RFC7231](https://tools.ietf.org/html/rfc7231#section-7.1.4)
+    ///
+    /// The "Vary" header field in a response describes what parts of a
+    /// request message, aside from the method, Host header field, and
+    /// request target, might influence the origin server's process for
+    /// selecting and representing this response.  The value consists of
+    /// either a single asterisk ("*") or a list of header field names
+    /// (case-insensitive).
+    ///
+    /// # ABNF
+    /// ```plain
+    /// Vary = "*" / 1#field-name
+    /// ```
+    ///
+    /// # Example values
+    /// * `accept-encoding, accept-language`
+    ///
+    /// # Example
+    /// ```
+    /// use hyper::header::{Headers, Vary};
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(Vary::Any);
+    /// ```
+    ///
+    /// # Example
+    /// ```
+    /// # extern crate hyper;
+    /// # extern crate unicase;
+    /// # fn main() {
+    /// // extern crate unicase;
+    ///
+    /// use hyper::header::{Headers, Vary};
+    /// use unicase::UniCase;
+    ///
+    /// let mut headers = Headers::new();
+    /// headers.set(
+    ///     Vary::Items(vec![
+    ///         UniCase("accept-encoding".to_owned()),
+    ///         UniCase("accept-language".to_owned()),
+    ///     ])
+    /// );
+    /// # }
+    /// ```
+    (Vary, "Vary") => {Any / (UniCase<String>)+}
+
+    test_vary {
+        test_header!(test1, vec![b"accept-encoding, accept-language"]);
+
+        #[test]
+        fn test2() {
+            let mut vary: ::Result<Vary>;
+
+            vary = Header::parse_header([b"*".to_vec()].as_ref());
+            assert_eq!(vary.ok(), Some(Vary::Any));
+
+            vary = Header::parse_header([b"etag,cookie,allow".to_vec()].as_ref());
+            assert_eq!(vary.ok(), Some(Vary::Items(vec!["eTag".parse().unwrap(),
+                                                        "cookIE".parse().unwrap(),
+                                                        "AlLOw".parse().unwrap(),])));
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/internals/cell.rs
@@ -0,0 +1,204 @@
+use std::any::{Any, TypeId};
+use std::cell::UnsafeCell;
+use std::collections::HashMap;
+use std::fmt;
+use std::mem;
+use std::ops::Deref;
+
+pub struct OptCell<T>(UnsafeCell<Option<T>>);
+
+impl<T> OptCell<T> {
+    #[inline]
+    pub fn new(val: Option<T>) -> OptCell<T> {
+        OptCell(UnsafeCell::new(val))
+    }
+
+    #[inline]
+    pub fn set(&self, val: T) {
+        unsafe {
+            let opt = self.0.get();
+            debug_assert!((*opt).is_none());
+            *opt = Some(val)
+        }
+    }
+
+    #[inline]
+    pub unsafe fn get_mut(&mut self) -> &mut T {
+        let opt = &mut *self.0.get();
+        opt.as_mut().unwrap()
+    }
+}
+
+impl<T> Deref for OptCell<T> {
+    type Target = Option<T>;
+    #[inline]
+    fn deref(&self) -> &Option<T> {
+        unsafe { &*self.0.get() }
+    }
+}
+
+impl<T: Clone> Clone for OptCell<T> {
+    #[inline]
+    fn clone(&self) -> OptCell<T> {
+        OptCell::new((**self).clone())
+    }
+}
+
+pub struct PtrMapCell<V: ?Sized>(UnsafeCell<PtrMap<Box<V>>>);
+
+#[derive(Clone, Debug)]
+enum PtrMap<T> {
+    Empty,
+    One(TypeId, T),
+    Many(HashMap<TypeId, T>)
+}
+
+impl<V: ?Sized + fmt::Debug + Any + 'static> PtrMapCell<V> {
+    #[inline]
+    pub fn new() -> PtrMapCell<V> {
+        PtrMapCell(UnsafeCell::new(PtrMap::Empty))
+    }
+
+    #[inline]
+    pub fn get(&self, key: TypeId) -> Option<&V> {
+        let map = unsafe { &*self.0.get() };
+        match *map {
+            PtrMap::Empty => None,
+            PtrMap::One(id, ref v) => if id == key {
+                Some(v)
+            } else {
+                None
+            },
+            PtrMap::Many(ref hm) => hm.get(&key)
+        }.map(|val| &**val)
+    }
+
+    #[inline]
+    pub fn get_mut(&mut self, key: TypeId) -> Option<&mut V> {
+        let mut map = unsafe { &mut *self.0.get() };
+        match *map {
+            PtrMap::Empty => None,
+            PtrMap::One(id, ref mut v) => if id == key {
+                Some(v)
+            } else {
+                None
+            },
+            PtrMap::Many(ref mut hm) => hm.get_mut(&key)
+        }.map(|val| &mut **val)
+    }
+
+    #[inline]
+    pub unsafe fn insert(&self, key: TypeId, val: Box<V>) {
+        let mut map = &mut *self.0.get();
+        match *map {
+            PtrMap::Empty => *map = PtrMap::One(key, val),
+            PtrMap::One(..) => {
+                let one = mem::replace(map, PtrMap::Empty);
+                match one {
+                    PtrMap::One(id, one) => {
+                        debug_assert!(id != key);
+                        let mut hm = HashMap::with_capacity(2);
+                        hm.insert(id, one);
+                        hm.insert(key, val);
+                        mem::replace(map, PtrMap::Many(hm));
+                    },
+                    _ => unreachable!()
+                }
+            },
+            PtrMap::Many(ref mut hm) => { hm.insert(key, val); }
+        }
+    }
+
+    #[inline]
+    pub unsafe fn one(&self) -> &V {
+        let map = &*self.0.get();
+        match *map {
+            PtrMap::One(_, ref one) => one,
+            _ => panic!("not PtrMap::One value, {:?}", *map)
+        }
+    }
+}
+
+impl<V: ?Sized + fmt::Debug + Any + 'static> Clone for PtrMapCell<V> where Box<V>: Clone {
+    #[inline]
+    fn clone(&self) -> PtrMapCell<V> {
+        let cell = PtrMapCell::new();
+        unsafe {
+            *cell.0.get() = (&*self.0.get()).clone()
+        }
+        cell
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::any::TypeId;
+    use super::*;
+
+    #[test]
+    fn test_opt_cell_set() {
+        let one:OptCell<u32> = OptCell::new(None);
+        one.set(1);
+        assert_eq!(*one,Some(1));
+    }
+
+    #[test]
+    fn test_opt_cell_clone() {
+        let one:OptCell<u32> = OptCell::new(Some(3));
+        let stored = *one.clone();
+        assert_eq!(stored,Some(3));
+    }
+
+
+    #[test]
+    fn test_ptr_map_cell_none() {
+        let type_id = TypeId::of::<u32>();
+        let pm:PtrMapCell<u32> = PtrMapCell::new();
+        assert_eq!(pm.get(type_id),None);
+    }
+
+    #[test]
+    fn test_ptr_map_cell_one() {
+        let type_id = TypeId::of::<String>();
+        let pm:PtrMapCell<String> = PtrMapCell::new();
+        unsafe { pm.insert(type_id, Box::new("a".to_string())); }
+        assert_eq!(pm.get(type_id), Some(&"a".to_string()));
+        assert_eq!(unsafe {pm.one()}, "a");
+    }
+
+    #[test]
+    fn test_ptr_map_cell_two() {
+        let type_id = TypeId::of::<String>();
+        let type_id2 = TypeId::of::<Vec<u8>>();
+        let pm:PtrMapCell<String> = PtrMapCell::new();
+        unsafe { pm.insert(type_id, Box::new("a".to_string())); }
+        unsafe { pm.insert(type_id2, Box::new("b".to_string())); }
+        assert_eq!(pm.get(type_id), Some(&"a".to_string()));
+        assert_eq!(pm.get(type_id2), Some(&"b".to_string()));
+    }
+
+    #[test]
+    fn test_ptr_map_cell_many() {
+        let id1 = TypeId::of::<String>();
+        let id2 = TypeId::of::<Vec<u8>>();
+        let id3 = TypeId::of::<OptCell<String>>();
+        let pm:PtrMapCell<String> = PtrMapCell::new();
+        unsafe { pm.insert(id1, Box::new("a".to_string())); }
+        unsafe { pm.insert(id2, Box::new("b".to_string())); }
+        unsafe { pm.insert(id3, Box::new("c".to_string())); }
+        assert_eq!(pm.get(id1), Some(&"a".to_string()));
+        assert_eq!(pm.get(id2), Some(&"b".to_string()));
+        assert_eq!(pm.get(id3), Some(&"c".to_string()));
+    }
+
+
+    #[test]
+    fn test_ptr_map_cell_clone() {
+        let type_id = TypeId::of::<String>();
+        let pm:PtrMapCell<String> = PtrMapCell::new();
+        unsafe { pm.insert(type_id, Box::new("a".to_string())); }
+        let cloned = pm.clone();
+        assert_eq!(cloned.get(type_id), Some(&"a".to_string()));
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/internals/item.rs
@@ -0,0 +1,121 @@
+use std::any::Any;
+use std::any::TypeId;
+use std::fmt;
+use std::str::from_utf8;
+
+use super::cell::{OptCell, PtrMapCell};
+use header::{Header, HeaderFormat, MultilineFormatter};
+
+
+#[derive(Clone)]
+pub struct Item {
+    raw: OptCell<Vec<Vec<u8>>>,
+    typed: PtrMapCell<HeaderFormat + Send + Sync>
+}
+
+impl Item {
+    #[inline]
+    pub fn new_raw(data: Vec<Vec<u8>>) -> Item {
+        Item {
+            raw: OptCell::new(Some(data)),
+            typed: PtrMapCell::new(),
+        }
+    }
+
+    #[inline]
+    pub fn new_typed(ty: Box<HeaderFormat + Send + Sync>) -> Item {
+        let map = PtrMapCell::new();
+        unsafe { map.insert((*ty).get_type(), ty); }
+        Item {
+            raw: OptCell::new(None),
+            typed: map,
+        }
+    }
+
+    #[inline]
+    pub fn raw_mut(&mut self) -> &mut Vec<Vec<u8>> {
+        self.raw();
+        self.typed = PtrMapCell::new();
+        unsafe {
+            self.raw.get_mut()
+        }
+    }
+
+    pub fn raw(&self) -> &[Vec<u8>] {
+        if let Some(ref raw) = *self.raw {
+            return &raw[..];
+        }
+
+        let raw = vec![unsafe { self.typed.one() }.to_string().into_bytes()];
+        self.raw.set(raw);
+
+        let raw = self.raw.as_ref().unwrap();
+        &raw[..]
+    }
+
+    pub fn typed<H: Header + HeaderFormat + Any>(&self) -> Option<&H> {
+        let tid = TypeId::of::<H>();
+        match self.typed.get(tid) {
+            Some(val) => Some(val),
+            None => {
+                match parse::<H>(self.raw.as_ref().expect("item.raw must exist")) {
+                    Ok(typed) => {
+                        unsafe { self.typed.insert(tid, typed); }
+                        self.typed.get(tid)
+                    },
+                    Err(_) => None
+                }
+            }
+        }.map(|typed| unsafe { typed.downcast_ref_unchecked() })
+    }
+
+    pub fn typed_mut<H: Header + HeaderFormat>(&mut self) -> Option<&mut H> {
+        let tid = TypeId::of::<H>();
+        if self.typed.get_mut(tid).is_none() {
+            match parse::<H>(self.raw.as_ref().expect("item.raw must exist")) {
+                Ok(typed) => {
+                    unsafe { self.typed.insert(tid, typed); }
+                },
+                Err(_) => ()
+            }
+        }
+        if self.raw.is_some() && self.typed.get_mut(tid).is_some() {
+            self.raw = OptCell::new(None);
+        }
+        self.typed.get_mut(tid).map(|typed| unsafe { typed.downcast_mut_unchecked() })
+    }
+
+    pub fn write_h1(&self, f: &mut MultilineFormatter) -> fmt::Result {
+        match *self.raw {
+            Some(ref raw) => {
+                for part in raw.iter() {
+                    match from_utf8(&part[..]) {
+                        Ok(s) => {
+                            try!(f.fmt_line(&s));
+                        },
+                        Err(_) => {
+                            error!("raw header value is not utf8, value={:?}", part);
+                            return Err(fmt::Error);
+                        }
+                    }
+                }
+                Ok(())
+            },
+            None => {
+                let typed = unsafe { self.typed.one() };
+                typed.fmt_multi_header(f)
+            }
+        }
+    }
+}
+
+#[inline]
+fn parse<H: Header + HeaderFormat>(raw: &Vec<Vec<u8>>) ->
+        ::Result<Box<HeaderFormat + Send + Sync>> {
+    Header::parse_header(&raw[..]).map(|h: H| {
+        // FIXME: Use Type ascription
+        let h: Box<HeaderFormat + Send + Sync> = Box::new(h);
+        h
+    })
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/internals/mod.rs
@@ -0,0 +1,6 @@
+pub use self::item::Item;
+pub use self::vec_map::{VecMap, Entry};
+
+mod cell;
+mod item;
+mod vec_map;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/internals/vec_map.rs
@@ -0,0 +1,89 @@
+#[derive(Clone)]
+pub struct VecMap<K, V> {
+    vec: Vec<(K, V)>,
+}
+
+impl<K: PartialEq, V> VecMap<K, V> {
+    pub fn new() -> VecMap<K, V> {
+        VecMap {
+            vec: Vec::new()
+        }
+    }
+
+    pub fn insert(&mut self, key: K, value: V) {
+        match self.find(&key) {
+            Some(pos) => self.vec[pos] = (key, value),
+            None => self.vec.push((key, value))
+        }
+    }
+
+    pub fn entry(&mut self, key: K) -> Entry<K, V> {
+        match self.find(&key) {
+            Some(pos) => Entry::Occupied(OccupiedEntry {
+                vec: self,
+                pos: pos,
+            }),
+            None => Entry::Vacant(VacantEntry {
+                vec: self,
+                key: key,
+            })
+        }
+    }
+
+    pub fn get(&self, key: &K) -> Option<&V> {
+        self.find(key).map(move |pos| &self.vec[pos].1)
+    }
+
+    pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
+        self.find(key).map(move |pos| &mut self.vec[pos].1)
+    }
+
+    pub fn contains_key(&self, key: &K) -> bool {
+        self.find(key).is_some()
+    }
+
+    pub fn len(&self) -> usize { self.vec.len() }
+    pub fn iter(&self) -> ::std::slice::Iter<(K, V)> {
+        self.vec.iter()
+    }
+    pub fn remove(&mut self, key: &K) -> Option<V> {
+        self.find(key).map(|pos| self.vec.remove(pos)).map(|(_, v)| v)
+    }
+    pub fn clear(&mut self) {
+        self.vec.clear();
+    }
+
+    fn find(&self, key: &K) -> Option<usize> {
+        self.vec.iter().position(|entry| key == &entry.0)
+    }
+}
+
+pub enum Entry<'a, K: 'a, V: 'a> {
+    Vacant(VacantEntry<'a, K, V>),
+    Occupied(OccupiedEntry<'a, K, V>)
+}
+
+pub struct VacantEntry<'a, K: 'a, V: 'a> {
+    vec: &'a mut VecMap<K, V>,
+    key: K,
+}
+
+impl<'a, K, V> VacantEntry<'a, K, V> {
+    pub fn insert(self, val: V) -> &'a mut V {
+        let mut vec = self.vec;
+        vec.vec.push((self.key, val));
+        let pos = vec.vec.len() - 1;
+        &mut vec.vec[pos].1
+    }
+}
+
+pub struct OccupiedEntry<'a, K: 'a, V: 'a> {
+    vec: &'a mut VecMap<K, V>,
+    pos: usize,
+}
+
+impl<'a, K, V> OccupiedEntry<'a, K, V> {
+    pub fn into_mut(self) -> &'a mut V {
+        &mut self.vec.vec[self.pos].1
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/mod.rs
@@ -0,0 +1,918 @@
+//! Headers container, and common header fields.
+//!
+//! hyper has the opinion that Headers should be strongly-typed, because that's
+//! why we're using Rust in the first place. To set or get any header, an object
+//! must implement the `Header` trait from this module. Several common headers
+//! are already provided, such as `Host`, `ContentType`, `UserAgent`, and others.
+//!
+//! # Why Typed?
+//!
+//! Or, why not stringly-typed? Types give the following advantages:
+//!
+//! - More difficult to typo, since typos in types should be caught by the compiler
+//! - Parsing to a proper type by default
+//!
+//! # Defining Custom Headers
+//!
+//! Hyper provides many of the most commonly used headers in HTTP. If
+//! you need to define a custom header, it's easy to do while still taking
+//! advantage of the type system. Hyper includes a `header!` macro for defining
+//! many wrapper-style headers.
+//!
+//! ```
+//! #[macro_use] extern crate hyper;
+//! use hyper::header::Headers;
+//! header! { (XRequestGuid, "X-Request-Guid") => [String] }
+//!
+//! fn main () {
+//!     let mut headers = Headers::new();
+//!
+//!     headers.set(XRequestGuid("a proper guid".to_owned()))
+//! }
+//! ```
+//!
+//! This works well for simple "string" headers. But the header system
+//! actually involves 2 parts: parsing, and formatting. If you need to
+//! customize either part, you can do so.
+//!
+//! ## `Header` and `HeaderFormat`
+//!
+//! Consider a Do Not Track header. It can be true or false, but it represents
+//! that via the numerals `1` and `0`.
+//!
+//! ```
+//! use std::fmt;
+//! use hyper::header::{Header, HeaderFormat};
+//!
+//! #[derive(Debug, Clone, Copy)]
+//! struct Dnt(bool);
+//!
+//! impl Header for Dnt {
+//!     fn header_name() -> &'static str {
+//!         "DNT"
+//!     }
+//!
+//!     fn parse_header(raw: &[Vec<u8>]) -> hyper::Result<Dnt> {
+//!         if raw.len() == 1 {
+//!             let line = &raw[0];
+//!             if line.len() == 1 {
+//!                 let byte = line[0];
+//!                 match byte {
+//!                     b'0' => return Ok(Dnt(true)),
+//!                     b'1' => return Ok(Dnt(false)),
+//!                     _ => ()
+//!                 }
+//!             }
+//!         }
+//!         Err(hyper::Error::Header)
+//!     }
+//! }
+//!
+//! impl HeaderFormat for Dnt {
+//!     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+//!         if self.0 {
+//!             f.write_str("1")
+//!         } else {
+//!             f.write_str("0")
+//!         }
+//!     }
+//! }
+//! ```
+use std::any::Any;
+use std::borrow::{Cow, ToOwned};
+//use std::collections::HashMap;
+//use std::collections::hash_map::{Iter, Entry};
+use std::iter::{FromIterator, IntoIterator};
+use std::ops::{Deref, DerefMut};
+use std::{mem, fmt};
+
+use {httparse, traitobject};
+use typeable::Typeable;
+use unicase::UniCase;
+
+use self::internals::{Item, VecMap, Entry};
+
+pub use self::shared::*;
+pub use self::common::*;
+
+mod common;
+mod internals;
+mod shared;
+pub mod parsing;
+
+type HeaderName = UniCase<CowStr>;
+
+/// A trait for any object that will represent a header field and value.
+///
+/// This trait represents the construction and identification of headers,
+/// and contains trait-object unsafe methods.
+pub trait Header: Clone + Any + Send + Sync {
+    /// Returns the name of the header field this belongs to.
+    ///
+    /// This will become an associated constant once available.
+    fn header_name() -> &'static str;
+    /// Parse a header from a raw stream of bytes.
+    ///
+    /// It's possible that a request can include a header field more than once,
+    /// and in that case, the slice will have a length greater than 1. However,
+    /// it's not necessarily the case that a Header is *allowed* to have more
+    /// than one field value. If that's the case, you **should** return `None`
+    /// if `raw.len() > 1`.
+    fn parse_header(raw: &[Vec<u8>]) -> ::Result<Self>;
+
+}
+
+/// A trait for any object that will represent a header field and value.
+///
+/// This trait represents the formatting of a `Header` for output to a TcpStream.
+pub trait HeaderFormat: fmt::Debug + HeaderClone + Any + Typeable + Send + Sync {
+    /// Format a header to be output into a TcpStream.
+    ///
+    /// This method is not allowed to introduce an Err not produced
+    /// by the passed-in Formatter.
+    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result;
+
+    /// Formats a header over multiple lines.
+    ///
+    /// The main example here is `Set-Cookie`, which requires that every
+    /// cookie being set be specified in a separate line.
+    ///
+    /// The API here is still being explored, so this is hidden by default.
+    /// The passed in formatter doesn't have any public methods, so it would
+    /// be quite difficult to depend on this externally.
+    #[doc(hidden)]
+    #[inline]
+    fn fmt_multi_header(&self, f: &mut MultilineFormatter) -> fmt::Result {
+        f.fmt_line(&FmtHeader(self))
+    }
+}
+
+#[doc(hidden)]
+#[allow(missing_debug_implementations)]
+pub struct MultilineFormatter<'a, 'b: 'a>(Multi<'a, 'b>);
+
+enum Multi<'a, 'b: 'a> {
+    Line(&'a str, &'a mut fmt::Formatter<'b>),
+    Join(bool, &'a mut fmt::Formatter<'b>),
+}
+
+impl<'a, 'b> MultilineFormatter<'a, 'b> {
+    fn fmt_line(&mut self, line: &fmt::Display) -> fmt::Result {
+        use std::fmt::Write;
+        match self.0 {
+            Multi::Line(ref name, ref mut f) => {
+                try!(f.write_str(*name));
+                try!(f.write_str(": "));
+                try!(write!(NewlineReplacer(*f), "{}", line));
+                f.write_str("\r\n")
+            },
+            Multi::Join(ref mut first, ref mut f) => {
+                if !*first {
+                    try!(f.write_str(", "));
+                } else {
+                    *first = false;
+                }
+                write!(NewlineReplacer(*f), "{}", line)
+            }
+        }
+    }
+}
+
+// Internal helper to wrap fmt_header into a fmt::Display
+struct FmtHeader<'a, H: ?Sized + 'a>(&'a H);
+
+impl<'a, H: HeaderFormat + ?Sized + 'a> fmt::Display for FmtHeader<'a, H> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.0.fmt_header(f)
+    }
+}
+
+struct ValueString<'a>(&'a Item);
+
+impl<'a> fmt::Display for ValueString<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.0.write_h1(&mut MultilineFormatter(Multi::Join(true, f)))
+    }
+}
+
+struct NewlineReplacer<'a, 'b: 'a>(&'a mut fmt::Formatter<'b>);
+
+impl<'a, 'b> fmt::Write for NewlineReplacer<'a, 'b> {
+    fn write_str(&mut self, s: &str) -> fmt::Result {
+        let mut since = 0;
+        for (i, &byte) in s.as_bytes().iter().enumerate() {
+            if byte == b'\r' || byte == b'\n' {
+                try!(self.0.write_str(&s[since..i]));
+                try!(self.0.write_str(" "));
+                since = i + 1;
+            }
+        }
+        if since < s.len() {
+            self.0.write_str(&s[since..])
+        } else {
+            Ok(())
+        }
+    }
+}
+
+#[doc(hidden)]
+pub trait HeaderClone {
+    fn clone_box(&self) -> Box<HeaderFormat + Send + Sync>;
+}
+
+impl<T: HeaderFormat + Clone> HeaderClone for T {
+    #[inline]
+    fn clone_box(&self) -> Box<HeaderFormat + Send + Sync> {
+        Box::new(self.clone())
+    }
+}
+
+impl HeaderFormat + Send + Sync {
+    #[inline]
+    unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
+        mem::transmute(traitobject::data(self))
+    }
+
+    #[inline]
+    unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T {
+        mem::transmute(traitobject::data_mut(self))
+    }
+}
+
+impl Clone for Box<HeaderFormat + Send + Sync> {
+    #[inline]
+    fn clone(&self) -> Box<HeaderFormat + Send + Sync> {
+        self.clone_box()
+    }
+}
+
+#[inline]
+fn header_name<T: Header>() -> &'static str {
+    <T as Header>::header_name()
+}
+
+/// A map of header fields on requests and responses.
+#[derive(Clone)]
+pub struct Headers {
+    //data: HashMap<HeaderName, Item>
+    data: VecMap<HeaderName, Item>,
+}
+
+impl Headers {
+
+    /// Creates a new, empty headers map.
+    pub fn new() -> Headers {
+        Headers {
+            data: VecMap::new()
+        }
+    }
+
+    #[doc(hidden)]
+    pub fn from_raw(raw: &[httparse::Header]) -> ::Result<Headers> {
+        let mut headers = Headers::new();
+        for header in raw {
+            trace!("raw header: {:?}={:?}", header.name, &header.value[..]);
+            let name = UniCase(CowStr(Cow::Owned(header.name.to_owned())));
+            let mut item = match headers.data.entry(name) {
+                Entry::Vacant(entry) => entry.insert(Item::new_raw(vec![])),
+                Entry::Occupied(entry) => entry.into_mut()
+            };
+            let trim = header.value.iter().rev().take_while(|&&x| x == b' ').count();
+            let value = &header.value[.. header.value.len() - trim];
+            item.raw_mut().push(value.to_vec());
+        }
+        Ok(headers)
+    }
+
+    /// Set a header field to the corresponding value.
+    ///
+    /// The field is determined by the type of the value being set.
+    pub fn set<H: Header + HeaderFormat>(&mut self, value: H) {
+        trace!("Headers.set( {:?}, {:?} )", header_name::<H>(), value);
+        self.data.insert(UniCase(CowStr(Cow::Borrowed(header_name::<H>()))),
+                         Item::new_typed(Box::new(value)));
+    }
+
+    /// Access the raw value of a header.
+    ///
+    /// Prefer to use the typed getters instead.
+    ///
+    /// Example:
+    ///
+    /// ```
+    /// # use hyper::header::Headers;
+    /// # let mut headers = Headers::new();
+    /// let raw_content_type = headers.get_raw("content-type");
+    /// ```
+    pub fn get_raw(&self, name: &str) -> Option<&[Vec<u8>]> {
+        self.data
+            .get(&UniCase(CowStr(Cow::Borrowed(unsafe { mem::transmute::<&str, &str>(name) }))))
+            .map(Item::raw)
+    }
+
+    /// Set the raw value of a header, bypassing any typed headers.
+    ///
+    /// Note: This will completely replace any current value for this
+    /// header name.
+    ///
+    /// Example:
+    ///
+    /// ```
+    /// # use hyper::header::Headers;
+    /// # let mut headers = Headers::new();
+    /// headers.set_raw("content-length", vec![b"5".to_vec()]);
+    /// ```
+    pub fn set_raw<K: Into<Cow<'static, str>>>(&mut self, name: K,
+            value: Vec<Vec<u8>>) {
+        let name = name.into();
+        trace!("Headers.set_raw( {:?}, {:?} )", name, value);
+        self.data.insert(UniCase(CowStr(name)), Item::new_raw(value));
+    }
+
+    /// Append a value to raw value of this header.
+    ///
+    /// If a header already contains a value, this will add another line to it.
+    ///
+    /// If a header doesnot exist for this name, a new one will be created with
+    /// the value.
+    ///
+    /// Example:
+    ///
+    /// ```
+    /// # use hyper::header::Headers;
+    /// # let mut headers = Headers::new();
+    /// headers.append_raw("x-foo", b"bar".to_vec());
+    /// headers.append_raw("x-foo", b"quux".to_vec());
+    /// ```
+    pub fn append_raw<K: Into<Cow<'static, str>>>(&mut self, name: K, value: Vec<u8>) {
+        let name = name.into();
+        trace!("Headers.append_raw( {:?}, {:?} )", name, value);
+        let name = UniCase(CowStr(name));
+        if let Some(item) = self.data.get_mut(&name) {
+            item.raw_mut().push(value);
+            return;
+        }
+        self.data.insert(name, Item::new_raw(vec![value]));
+    }
+
+    /// Remove a header set by set_raw
+    pub fn remove_raw(&mut self, name: &str) {
+        trace!("Headers.remove_raw( {:?} )", name);
+        self.data.remove(
+            &UniCase(CowStr(Cow::Borrowed(unsafe { mem::transmute::<&str, &str>(name) })))
+        );
+    }
+
+    /// Get a reference to the header field's value, if it exists.
+    pub fn get<H: Header + HeaderFormat>(&self) -> Option<&H> {
+        self.data.get(&UniCase(CowStr(Cow::Borrowed(header_name::<H>()))))
+        .and_then(Item::typed::<H>)
+    }
+
+    /// Get a mutable reference to the header field's value, if it exists.
+    pub fn get_mut<H: Header + HeaderFormat>(&mut self) -> Option<&mut H> {
+        self.data.get_mut(&UniCase(CowStr(Cow::Borrowed(header_name::<H>()))))
+        .and_then(Item::typed_mut::<H>)
+    }
+
+    /// Returns a boolean of whether a certain header is in the map.
+    ///
+    /// Example:
+    ///
+    /// ```
+    /// # use hyper::header::Headers;
+    /// # use hyper::header::ContentType;
+    /// # let mut headers = Headers::new();
+    /// let has_type = headers.has::<ContentType>();
+    /// ```
+    pub fn has<H: Header + HeaderFormat>(&self) -> bool {
+        self.data.contains_key(&UniCase(CowStr(Cow::Borrowed(header_name::<H>()))))
+    }
+
+    /// Removes a header from the map, if one existed.
+    /// Returns true if a header has been removed.
+    pub fn remove<H: Header + HeaderFormat>(&mut self) -> bool {
+        trace!("Headers.remove( {:?} )", header_name::<H>());
+        self.data.remove(&UniCase(CowStr(Cow::Borrowed(header_name::<H>())))).is_some()
+    }
+
+    /// Returns an iterator over the header fields.
+    pub fn iter(&self) -> HeadersItems {
+        HeadersItems {
+            inner: self.data.iter()
+        }
+    }
+
+    /// Returns the number of headers in the map.
+    pub fn len(&self) -> usize {
+        self.data.len()
+    }
+
+    /// Remove all headers from the map.
+    pub fn clear(&mut self) {
+        self.data.clear()
+    }
+}
+
+impl PartialEq for Headers {
+    fn eq(&self, other: &Headers) -> bool {
+        if self.len() != other.len() {
+            return false;
+        }
+
+        for header in self.iter() {
+            match other.get_raw(header.name()) {
+                Some(val) if val == self.get_raw(header.name()).unwrap() => {},
+                _ => { return false; }
+            }
+        }
+        true
+    }
+}
+
+impl fmt::Display for Headers {
+   fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        for header in self.iter() {
+            try!(fmt::Display::fmt(&header, f));
+        }
+        Ok(())
+    }
+}
+
+impl fmt::Debug for Headers {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(f.write_str("Headers { "));
+        for header in self.iter() {
+            try!(write!(f, "{:?}, ", header));
+        }
+        try!(f.write_str("}"));
+        Ok(())
+    }
+}
+
+/// An `Iterator` over the fields in a `Headers` map.
+pub struct HeadersItems<'a> {
+    inner: ::std::slice::Iter<'a, (HeaderName, Item)>
+}
+
+impl<'a> Iterator for HeadersItems<'a> {
+    type Item = HeaderView<'a>;
+
+    fn next(&mut self) -> Option<HeaderView<'a>> {
+        self.inner.next().map(|&(ref k, ref v)| HeaderView(k, v))
+    }
+}
+
+/// Returned with the `HeadersItems` iterator.
+pub struct HeaderView<'a>(&'a HeaderName, &'a Item);
+
+impl<'a> HeaderView<'a> {
+    /// Check if a HeaderView is a certain Header.
+    #[inline]
+    pub fn is<H: Header>(&self) -> bool {
+        UniCase(CowStr(Cow::Borrowed(header_name::<H>()))) == *self.0
+    }
+
+    /// Get the Header name as a slice.
+    #[inline]
+    pub fn name(&self) -> &'a str {
+        self.0.as_ref()
+    }
+
+    /// Cast the value to a certain Header type.
+    #[inline]
+    pub fn value<H: Header + HeaderFormat>(&self) -> Option<&'a H> {
+        self.1.typed::<H>()
+    }
+
+    /// Get just the header value as a String.
+    ///
+    /// This will join multiple values of this header with a `, `.
+    ///
+    /// **Warning:** This may not be the format that should be used to send
+    /// a Request or Response.
+    #[inline]
+    pub fn value_string(&self) -> String {
+        ValueString(self.1).to_string()
+    }
+}
+
+impl<'a> fmt::Display for HeaderView<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.1.write_h1(&mut MultilineFormatter(Multi::Line(&self.0, f)))
+    }
+}
+
+impl<'a> fmt::Debug for HeaderView<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl<'a> Extend<HeaderView<'a>> for Headers {
+    fn extend<I: IntoIterator<Item=HeaderView<'a>>>(&mut self, iter: I) {
+        for header in iter {
+            self.data.insert((*header.0).clone(), (*header.1).clone());
+        }
+    }
+}
+
+impl<'a> FromIterator<HeaderView<'a>> for Headers {
+    fn from_iter<I: IntoIterator<Item=HeaderView<'a>>>(iter: I) -> Headers {
+        let mut headers = Headers::new();
+        headers.extend(iter);
+        headers
+    }
+}
+
+deprecated! {
+    #[deprecated(note="The semantics of formatting a HeaderFormat directly are not clear")]
+    impl<'a> fmt::Display for &'a (HeaderFormat + Send + Sync) {
+        #[inline]
+        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+            let mut multi = MultilineFormatter(Multi::Join(true, f));
+            self.fmt_multi_header(&mut multi)
+        }
+    }
+}
+
+/// A wrapper around any Header with a Display impl that calls fmt_header.
+///
+/// This can be used like so: `format!("{}", HeaderFormatter(&header))` to
+/// get the 'value string' representation of this Header.
+///
+/// Note: This may not necessarily be the value written to stream, such
+/// as with the SetCookie header.
+deprecated! {
+    #[deprecated(note="The semantics of formatting a HeaderFormat directly are not clear")]
+    pub struct HeaderFormatter<'a, H: HeaderFormat>(pub &'a H);
+}
+
+#[allow(deprecated)]
+impl<'a, H: HeaderFormat> fmt::Display for HeaderFormatter<'a, H> {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let mut multi = MultilineFormatter(Multi::Join(true, f));
+        self.0.fmt_multi_header(&mut multi)
+    }
+}
+
+#[allow(deprecated)]
+impl<'a, H: HeaderFormat> fmt::Debug for HeaderFormatter<'a, H> {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+#[derive(Clone, Hash, Eq, PartialEq, PartialOrd, Ord)]
+struct CowStr(Cow<'static, str>);
+
+impl Deref for CowStr {
+    type Target = Cow<'static, str>;
+
+    fn deref(&self) -> &Cow<'static, str> {
+        &self.0
+    }
+}
+
+impl fmt::Debug for CowStr {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Debug::fmt(&self.0, f)
+    }
+}
+
+impl fmt::Display for CowStr {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self.0, f)
+    }
+}
+
+impl DerefMut for CowStr {
+    fn deref_mut(&mut self) -> &mut Cow<'static, str> {
+        &mut self.0
+    }
+}
+
+impl AsRef<str> for CowStr {
+    fn as_ref(&self) -> &str {
+        self
+    }
+}
+
+
+#[cfg(test)]
+mod tests {
+    use std::fmt;
+    use mime::Mime;
+    use mime::TopLevel::Text;
+    use mime::SubLevel::Plain;
+    use super::{Headers, Header, HeaderFormat, ContentLength, ContentType,
+                Accept, Host, qitem};
+    use httparse;
+
+    #[cfg(feature = "nightly")]
+    use test::Bencher;
+
+    // Slice.position_elem was unstable
+    fn index_of(slice: &[u8], byte: u8) -> Option<usize> {
+        for (index, &b) in slice.iter().enumerate() {
+            if b == byte {
+                return Some(index);
+            }
+        }
+        None
+    }
+
+    macro_rules! raw {
+        ($($line:expr),*) => ({
+            [$({
+                let line = $line;
+                let pos = index_of(line, b':').expect("raw splits on ':', not found");
+                httparse::Header {
+                    name: ::std::str::from_utf8(&line[..pos]).unwrap(),
+                    value: &line[pos + 2..]
+                }
+            }),*]
+        })
+    }
+
+    #[test]
+    fn test_from_raw() {
+        let headers = Headers::from_raw(&raw!(b"Content-Length: 10")).unwrap();
+        assert_eq!(headers.get(), Some(&ContentLength(10)));
+    }
+
+    #[test]
+    fn test_content_type() {
+        let content_type = Header::parse_header([b"text/plain".to_vec()].as_ref());
+        assert_eq!(content_type.ok(), Some(ContentType(Mime(Text, Plain, vec![]))));
+    }
+
+    #[test]
+    fn test_accept() {
+        let text_plain = qitem(Mime(Text, Plain, vec![]));
+        let application_vendor = "application/vnd.github.v3.full+json; q=0.5".parse().unwrap();
+
+        let accept = Header::parse_header([b"text/plain".to_vec()].as_ref());
+        assert_eq!(accept.ok(), Some(Accept(vec![text_plain.clone()])));
+
+        let bytevec = [b"application/vnd.github.v3.full+json; q=0.5, text/plain".to_vec()];
+        let accept = Header::parse_header(bytevec.as_ref());
+        assert_eq!(accept.ok(), Some(Accept(vec![application_vendor, text_plain])));
+    }
+
+    #[derive(Clone, PartialEq, Debug)]
+    struct CrazyLength(Option<bool>, usize);
+
+    impl Header for CrazyLength {
+        fn header_name() -> &'static str {
+            "content-length"
+        }
+        fn parse_header(raw: &[Vec<u8>]) -> ::Result<CrazyLength> {
+            use std::str::from_utf8;
+            use std::str::FromStr;
+
+            if raw.len() != 1 {
+                return Err(::Error::Header);
+            }
+            // we JUST checked that raw.len() == 1, so raw[0] WILL exist.
+            match match from_utf8(unsafe { &raw.get_unchecked(0)[..] }) {
+                Ok(s) => FromStr::from_str(s).ok(),
+                Err(_) => None
+            }.map(|u| CrazyLength(Some(false), u)) {
+                Some(x) => Ok(x),
+                None => Err(::Error::Header),
+            }
+        }
+    }
+
+    impl HeaderFormat for CrazyLength {
+        fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
+            let CrazyLength(ref opt, ref value) = *self;
+            write!(f, "{:?}, {:?}", opt, value)
+        }
+    }
+
+    #[test]
+    fn test_different_structs_for_same_header() {
+        let headers = Headers::from_raw(&raw!(b"Content-Length: 10")).unwrap();
+        assert_eq!(headers.get::<ContentLength>(), Some(&ContentLength(10)));
+        assert_eq!(headers.get::<CrazyLength>(), Some(&CrazyLength(Some(false), 10)));
+    }
+
+    #[test]
+    fn test_trailing_whitespace() {
+        let headers = Headers::from_raw(&raw!(b"Content-Length: 10   ")).unwrap();
+        assert_eq!(headers.get::<ContentLength>(), Some(&ContentLength(10)));
+    }
+
+    #[test]
+    fn test_multiple_reads() {
+        let headers = Headers::from_raw(&raw!(b"Content-Length: 10")).unwrap();
+        let ContentLength(one) = *headers.get::<ContentLength>().unwrap();
+        let ContentLength(two) = *headers.get::<ContentLength>().unwrap();
+        assert_eq!(one, two);
+    }
+
+    #[test]
+    fn test_different_reads() {
+        let headers = Headers::from_raw(
+            &raw!(b"Content-Length: 10", b"Content-Type: text/plain")).unwrap();
+        let ContentLength(_) = *headers.get::<ContentLength>().unwrap();
+        let ContentType(_) = *headers.get::<ContentType>().unwrap();
+    }
+
+    #[test]
+    fn test_get_mutable() {
+        let mut headers = Headers::from_raw(&raw!(b"Content-Length: 10")).unwrap();
+        *headers.get_mut::<ContentLength>().unwrap() = ContentLength(20);
+        assert_eq!(headers.get_raw("content-length").unwrap(), &[b"20".to_vec()][..]);
+        assert_eq!(*headers.get::<ContentLength>().unwrap(), ContentLength(20));
+    }
+
+    #[test]
+    fn test_headers_fmt() {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(15));
+        headers.set(Host { hostname: "foo.bar".to_owned(), port: None });
+
+        let s = headers.to_string();
+        assert!(s.contains("Host: foo.bar\r\n"));
+        assert!(s.contains("Content-Length: 15\r\n"));
+    }
+
+    #[test]
+    fn test_headers_fmt_raw() {
+        let mut headers = Headers::from_raw(&raw!(b"Content-Length: 10")).unwrap();
+        headers.set_raw("x-foo", vec![b"foo".to_vec(), b"bar".to_vec()]);
+        let s = headers.to_string();
+        assert_eq!(s, "Content-Length: 10\r\nx-foo: foo\r\nx-foo: bar\r\n");
+    }
+
+    #[test]
+    fn test_set_raw() {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(10));
+        headers.set_raw("content-LENGTH", vec![b"20".to_vec()]);
+        assert_eq!(headers.get_raw("Content-length").unwrap(), &[b"20".to_vec()][..]);
+        assert_eq!(headers.get(), Some(&ContentLength(20)));
+    }
+
+    #[test]
+    fn test_append_raw() {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(10));
+        headers.append_raw("content-LENGTH", b"20".to_vec());
+        assert_eq!(headers.get_raw("Content-length").unwrap(), &[b"10".to_vec(), b"20".to_vec()][..]);
+        headers.append_raw("x-foo", b"bar".to_vec());
+        assert_eq!(headers.get_raw("x-foo"), Some(&[b"bar".to_vec()][..]));
+    }
+
+    #[test]
+    fn test_remove_raw() {
+        let mut headers = Headers::new();
+        headers.set_raw("content-LENGTH", vec![b"20".to_vec()]);
+        headers.remove_raw("content-LENGTH");
+        assert_eq!(headers.get_raw("Content-length"), None);
+    }
+
+    #[test]
+    fn test_len() {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(10));
+        assert_eq!(headers.len(), 1);
+        headers.set(ContentType(Mime(Text, Plain, vec![])));
+        assert_eq!(headers.len(), 2);
+        // Redundant, should not increase count.
+        headers.set(ContentLength(20));
+        assert_eq!(headers.len(), 2);
+    }
+
+    #[test]
+    fn test_clear() {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(10));
+        headers.set(ContentType(Mime(Text, Plain, vec![])));
+        assert_eq!(headers.len(), 2);
+        headers.clear();
+        assert_eq!(headers.len(), 0);
+    }
+
+    #[test]
+    fn test_iter() {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(11));
+        for header in headers.iter() {
+            assert!(header.is::<ContentLength>());
+            assert_eq!(header.name(), <ContentLength as Header>::header_name());
+            assert_eq!(header.value(), Some(&ContentLength(11)));
+            assert_eq!(header.value_string(), "11".to_owned());
+        }
+    }
+
+    #[test]
+    fn test_header_view_value_string() {
+        let mut headers = Headers::new();
+        headers.set_raw("foo", vec![b"one".to_vec(), b"two".to_vec()]);
+        for header in headers.iter() {
+            assert_eq!(header.name(), "foo");
+            assert_eq!(header.value_string(), "one, two");
+        }
+    }
+
+    #[test]
+    fn test_eq() {
+        let mut headers1 = Headers::new();
+        let mut headers2 = Headers::new();
+
+        assert_eq!(headers1, headers2);
+
+        headers1.set(ContentLength(11));
+        headers2.set(Host {hostname: "foo.bar".to_owned(), port: None});
+        assert!(headers1 != headers2);
+
+        headers1 = Headers::new();
+        headers2 = Headers::new();
+
+        headers1.set(ContentLength(11));
+        headers2.set(ContentLength(11));
+        assert_eq!(headers1, headers2);
+
+        headers1.set(ContentLength(10));
+        assert!(headers1 != headers2);
+
+        headers1 = Headers::new();
+        headers2 = Headers::new();
+
+        headers1.set(Host { hostname: "foo.bar".to_owned(), port: None });
+        headers1.set(ContentLength(11));
+        headers2.set(ContentLength(11));
+        assert!(headers1 != headers2);
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_new(b: &mut Bencher) {
+        b.iter(|| {
+            let mut h = Headers::new();
+            h.set(ContentLength(11));
+            h
+        })
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_from_raw(b: &mut Bencher) {
+        let raw = raw!(b"Content-Length: 10");
+        b.iter(|| Headers::from_raw(&raw).unwrap())
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_get(b: &mut Bencher) {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(11));
+        b.iter(|| assert_eq!(headers.get::<ContentLength>(), Some(&ContentLength(11))))
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_get_miss(b: &mut Bencher) {
+        let headers = Headers::new();
+        b.iter(|| assert!(headers.get::<ContentLength>().is_none()))
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_set(b: &mut Bencher) {
+        let mut headers = Headers::new();
+        b.iter(|| headers.set(ContentLength(12)))
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_has(b: &mut Bencher) {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(11));
+        b.iter(|| assert!(headers.has::<ContentLength>()))
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_view_is(b: &mut Bencher) {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(11));
+        let mut iter = headers.iter();
+        let view = iter.next().unwrap();
+        b.iter(|| assert!(view.is::<ContentLength>()))
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_headers_fmt(b: &mut Bencher) {
+        let mut headers = Headers::new();
+        headers.set(ContentLength(11));
+        b.iter(|| headers.to_string())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/parsing.rs
@@ -0,0 +1,224 @@
+//! Utility functions for Header implementations.
+
+use language_tags::LanguageTag;
+use std::str;
+use std::str::FromStr;
+use std::fmt::{self, Display};
+use url::percent_encoding;
+
+use header::shared::Charset;
+
+/// Reads a single raw string when parsing a header.
+pub fn from_one_raw_str<T: str::FromStr>(raw: &[Vec<u8>]) -> ::Result<T> {
+    if raw.len() != 1 || unsafe { raw.get_unchecked(0) } == b"" { return Err(::Error::Header) }
+    // we JUST checked that raw.len() == 1, so raw[0] WILL exist.
+    from_raw_str(& unsafe { raw.get_unchecked(0) })
+}
+
+/// Reads a raw string into a value.
+pub fn from_raw_str<T: str::FromStr>(raw: &[u8]) -> ::Result<T> {
+    let s = try!(str::from_utf8(raw));
+    T::from_str(s).or(Err(::Error::Header))
+}
+
+/// Reads a comma-delimited raw header into a Vec.
+#[inline]
+pub fn from_comma_delimited<T: str::FromStr, S: AsRef<[u8]>>(raw: &[S]) -> ::Result<Vec<T>> {
+    let mut result = Vec::new();
+    for s in raw {
+        let s = try!(str::from_utf8(s.as_ref()));
+        result.extend(s.split(',')
+                      .filter_map(|x| match x.trim() {
+                          "" => None,
+                          y => Some(y)
+                      })
+                      .filter_map(|x| x.parse().ok()))
+    }
+    Ok(result)
+}
+
+/// Format an array into a comma-delimited string.
+pub fn fmt_comma_delimited<T: Display>(f: &mut fmt::Formatter, parts: &[T]) -> fmt::Result {
+    for (i, part) in parts.iter().enumerate() {
+        if i != 0 {
+            try!(f.write_str(", "));
+        }
+        try!(Display::fmt(part, f));
+    }
+    Ok(())
+}
+
+/// An extended header parameter value (i.e., tagged with a character set and optionally,
+/// a language), as defined in [RFC 5987](https://tools.ietf.org/html/rfc5987#section-3.2).
+#[derive(Clone, Debug, PartialEq)]
+pub struct ExtendedValue {
+    /// The character set that is used to encode the `value` to a string.
+    pub charset: Charset,
+    /// The human language details of the `value`, if available.
+    pub language_tag: Option<LanguageTag>,
+    /// The parameter value, as expressed in octets.
+    pub value: Vec<u8>,
+}
+
+/// Parses extended header parameter values (`ext-value`), as defined in
+/// [RFC 5987](https://tools.ietf.org/html/rfc5987#section-3.2).
+///
+/// Extended values are denoted by parameter names that end with `*`.
+///
+/// ## ABNF
+/// ```plain
+/// ext-value     = charset  "'" [ language ] "'" value-chars
+///               ; like RFC 2231's <extended-initial-value>
+///               ; (see [RFC2231], Section 7)
+///
+/// charset       = "UTF-8" / "ISO-8859-1" / mime-charset
+///
+/// mime-charset  = 1*mime-charsetc
+/// mime-charsetc = ALPHA / DIGIT
+///               / "!" / "#" / "$" / "%" / "&"
+///               / "+" / "-" / "^" / "_" / "`"
+///               / "{" / "}" / "~"
+///               ; as <mime-charset> in Section 2.3 of [RFC2978]
+///               ; except that the single quote is not included
+///               ; SHOULD be registered in the IANA charset registry
+///
+/// language      = <Language-Tag, defined in [RFC5646], Section 2.1>
+///
+/// value-chars   = *( pct-encoded / attr-char )
+///
+/// pct-encoded   = "%" HEXDIG HEXDIG
+///               ; see [RFC3986], Section 2.1
+///
+/// attr-char     = ALPHA / DIGIT
+///               / "!" / "#" / "$" / "&" / "+" / "-" / "."
+///               / "^" / "_" / "`" / "|" / "~"
+///               ; token except ( "*" / "'" / "%" )
+/// ```
+pub fn parse_extended_value(val: &str) -> ::Result<ExtendedValue> {
+
+    // Break into three pieces separated by the single-quote character
+    let mut parts = val.splitn(3,'\'');
+
+    // Interpret the first piece as a Charset
+    let charset: Charset = match parts.next() {
+        None => return Err(::Error::Header),
+        Some(n) => try!(FromStr::from_str(n)),
+    };
+
+    // Interpret the second piece as a language tag
+    let lang: Option<LanguageTag> = match parts.next() {
+        None => return Err(::Error::Header),
+        Some("") => None,
+        Some(s) => match s.parse() {
+            Ok(lt) => Some(lt),
+            Err(_) => return Err(::Error::Header),
+        }
+    };
+
+    // Interpret the third piece as a sequence of value characters
+    let value: Vec<u8> = match parts.next() {
+        None => return Err(::Error::Header),
+        Some(v) => percent_encoding::percent_decode(v.as_bytes()).collect(),
+    };
+
+    Ok(ExtendedValue {
+        charset: charset,
+        language_tag: lang,
+        value: value,
+    })
+}
+
+define_encode_set! {
+    /// This encode set is used for HTTP header values and is defined at
+    /// https://tools.ietf.org/html/rfc5987#section-3.2
+    pub HTTP_VALUE = [percent_encoding::SIMPLE_ENCODE_SET] | {
+        ' ', '"', '%', '\'', '(', ')', '*', ',', '/', ':', ';', '<', '-', '>', '?',
+        '[', '\\', ']', '{', '}'
+    }
+}
+
+impl Display for ExtendedValue {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let encoded_value =
+            percent_encoding::percent_encode(&self.value[..], HTTP_VALUE);
+        if let Some(ref lang) = self.language_tag {
+            write!(f, "{}'{}'{}", self.charset, lang, encoded_value)
+        } else {
+            write!(f, "{}''{}", self.charset, encoded_value)
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use header::shared::Charset;
+    use super::{ExtendedValue, parse_extended_value};
+
+    #[test]
+    fn test_parse_extended_value_with_encoding_and_language_tag() {
+        let expected_language_tag = langtag!(en);
+        // RFC 5987, Section 3.2.2
+        // Extended notation, using the Unicode character U+00A3 (POUND SIGN)
+        let result = parse_extended_value("iso-8859-1'en'%A3%20rates");
+        assert!(result.is_ok());
+        let extended_value = result.unwrap();
+        assert_eq!(Charset::Iso_8859_1, extended_value.charset);
+        assert!(extended_value.language_tag.is_some());
+        assert_eq!(expected_language_tag, extended_value.language_tag.unwrap());
+        assert_eq!(vec![163, b' ', b'r', b'a', b't', b'e', b's'], extended_value.value);
+    }
+
+    #[test]
+    fn test_parse_extended_value_with_encoding() {
+        // RFC 5987, Section 3.2.2
+        // Extended notation, using the Unicode characters U+00A3 (POUND SIGN)
+        // and U+20AC (EURO SIGN)
+        let result = parse_extended_value("UTF-8''%c2%a3%20and%20%e2%82%ac%20rates");
+        assert!(result.is_ok());
+        let extended_value = result.unwrap();
+        assert_eq!(Charset::Ext("UTF-8".to_string()), extended_value.charset);
+        assert!(extended_value.language_tag.is_none());
+        assert_eq!(vec![194, 163, b' ', b'a', b'n', b'd', b' ', 226, 130, 172, b' ', b'r', b'a', b't', b'e', b's'], extended_value.value);
+    }
+
+    #[test]
+    fn test_parse_extended_value_missing_language_tag_and_encoding() {
+        // From: https://greenbytes.de/tech/tc2231/#attwithfn2231quot2
+        let result = parse_extended_value("foo%20bar.html");
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn test_parse_extended_value_partially_formatted() {
+        let result = parse_extended_value("UTF-8'missing third part");
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn test_parse_extended_value_partially_formatted_blank() {
+        let result = parse_extended_value("blank second part'");
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn test_fmt_extended_value_with_encoding_and_language_tag() {
+        let extended_value = ExtendedValue {
+            charset: Charset::Iso_8859_1,
+            language_tag: Some("en".parse().expect("Could not parse language tag")),
+            value: vec![163, b' ', b'r', b'a', b't', b'e', b's'],
+        };
+        assert_eq!("ISO-8859-1'en'%A3%20rates", format!("{}", extended_value));
+    }
+
+    #[test]
+    fn test_fmt_extended_value_with_encoding() {
+        let extended_value = ExtendedValue {
+            charset: Charset::Ext("UTF-8".to_string()),
+            language_tag: None,
+            value: vec![194, 163, b' ', b'a', b'n', b'd', b' ', 226, 130, 172, b' ', b'r', b'a',
+                        b't', b'e', b's'],
+        };
+        assert_eq!("UTF-8''%C2%A3%20and%20%E2%82%AC%20rates",
+                   format!("{}", extended_value));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/shared/charset.rs
@@ -0,0 +1,151 @@
+use std::fmt::{self, Display};
+use std::str::FromStr;
+use std::ascii::AsciiExt;
+
+use self::Charset::*;
+
+/// A Mime charset.
+///
+/// The string representation is normalised to upper case.
+///
+/// See http://www.iana.org/assignments/character-sets/character-sets.xhtml
+#[derive(Clone,Debug,PartialEq)]
+#[allow(non_camel_case_types)]
+pub enum Charset{
+    /// US ASCII
+    Us_Ascii,
+    /// ISO-8859-1
+    Iso_8859_1,
+    /// ISO-8859-2
+    Iso_8859_2,
+    /// ISO-8859-3
+    Iso_8859_3,
+    /// ISO-8859-4
+    Iso_8859_4,
+    /// ISO-8859-5
+    Iso_8859_5,
+    /// ISO-8859-6
+    Iso_8859_6,
+    /// ISO-8859-7
+    Iso_8859_7,
+    /// ISO-8859-8
+    Iso_8859_8,
+    /// ISO-8859-9
+    Iso_8859_9,
+    /// ISO-8859-10
+    Iso_8859_10,
+    /// Shift_JIS
+    Shift_Jis,
+    /// EUC-JP
+    Euc_Jp,
+    /// ISO-2022-KR
+    Iso_2022_Kr,
+    /// EUC-KR
+    Euc_Kr,
+    /// ISO-2022-JP
+    Iso_2022_Jp,
+    /// ISO-2022-JP-2
+    Iso_2022_Jp_2,
+    /// ISO-8859-6-E
+    Iso_8859_6_E,
+    /// ISO-8859-6-I
+    Iso_8859_6_I,
+    /// ISO-8859-8-E
+    Iso_8859_8_E,
+    /// ISO-8859-8-I
+    Iso_8859_8_I,
+    /// GB2312
+    Gb2312,
+    /// Big5
+    Big5,
+    /// KOI8-R
+    Koi8_R,
+    /// An arbitrary charset specified as a string
+    Ext(String)
+}
+
+impl Charset {
+    fn name(&self) -> &str {
+        match *self {
+            Us_Ascii => "US-ASCII",
+            Iso_8859_1 => "ISO-8859-1",
+            Iso_8859_2 => "ISO-8859-2",
+            Iso_8859_3 => "ISO-8859-3",
+            Iso_8859_4 => "ISO-8859-4",
+            Iso_8859_5 => "ISO-8859-5",
+            Iso_8859_6 => "ISO-8859-6",
+            Iso_8859_7 => "ISO-8859-7",
+            Iso_8859_8 => "ISO-8859-8",
+            Iso_8859_9 => "ISO-8859-9",
+            Iso_8859_10 => "ISO-8859-10",
+            Shift_Jis => "Shift-JIS",
+            Euc_Jp => "EUC-JP",
+            Iso_2022_Kr => "ISO-2022-KR",
+            Euc_Kr => "EUC-KR",
+            Iso_2022_Jp => "ISO-2022-JP",
+            Iso_2022_Jp_2 => "ISO-2022-JP-2",
+            Iso_8859_6_E => "ISO-8859-6-E",
+            Iso_8859_6_I => "ISO-8859-6-I",
+            Iso_8859_8_E => "ISO-8859-8-E",
+            Iso_8859_8_I => "ISO-8859-8-I",
+            Gb2312 => "GB2312",
+            Big5 => "5",
+            Koi8_R => "KOI8-R",
+            Ext(ref s) => &s
+        }
+    }
+}
+
+impl Display for Charset {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(self.name())
+    }
+}
+
+impl FromStr for Charset {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<Charset> {
+        Ok(match s.to_ascii_uppercase().as_ref() {
+            "US-ASCII" => Us_Ascii,
+            "ISO-8859-1" => Iso_8859_1,
+            "ISO-8859-2" => Iso_8859_2,
+            "ISO-8859-3" => Iso_8859_3,
+            "ISO-8859-4" => Iso_8859_4,
+            "ISO-8859-5" => Iso_8859_5,
+            "ISO-8859-6" => Iso_8859_6,
+            "ISO-8859-7" => Iso_8859_7,
+            "ISO-8859-8" => Iso_8859_8,
+            "ISO-8859-9" => Iso_8859_9,
+            "ISO-8859-10" => Iso_8859_10,
+            "SHIFT-JIS" => Shift_Jis,
+            "EUC-JP" => Euc_Jp,
+            "ISO-2022-KR" => Iso_2022_Kr,
+            "EUC-KR" => Euc_Kr,
+            "ISO-2022-JP" => Iso_2022_Jp,
+            "ISO-2022-JP-2" => Iso_2022_Jp_2,
+            "ISO-8859-6-E" => Iso_8859_6_E,
+            "ISO-8859-6-I" => Iso_8859_6_I,
+            "ISO-8859-8-E" => Iso_8859_8_E,
+            "ISO-8859-8-I" => Iso_8859_8_I,
+            "GB2312" => Gb2312,
+            "5" => Big5,
+            "KOI8-R" => Koi8_R,
+            s => Ext(s.to_owned())
+        })
+    }
+}
+
+#[test]
+fn test_parse() {
+    assert_eq!(Us_Ascii,"us-ascii".parse().unwrap());
+    assert_eq!(Us_Ascii,"US-Ascii".parse().unwrap());
+    assert_eq!(Us_Ascii,"US-ASCII".parse().unwrap());
+    assert_eq!(Shift_Jis,"Shift-JIS".parse().unwrap());
+    assert_eq!(Ext("ABCD".to_owned()),"abcd".parse().unwrap());
+}
+
+#[test]
+fn test_display() {
+    assert_eq!("US-ASCII", format!("{}", Us_Ascii));
+    assert_eq!("ABCD", format!("{}", Ext("ABCD".to_owned())));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/shared/encoding.rs
@@ -0,0 +1,49 @@
+use std::fmt;
+use std::str;
+
+pub use self::Encoding::{Chunked, Gzip, Deflate, Compress, Identity, EncodingExt};
+
+/// A value to represent an encoding used in `Transfer-Encoding`
+/// or `Accept-Encoding` header.
+#[derive(Clone, PartialEq, Debug)]
+pub enum Encoding {
+    /// The `chunked` encoding.
+    Chunked,
+    /// The `gzip` encoding.
+    Gzip,
+    /// The `deflate` encoding.
+    Deflate,
+    /// The `compress` encoding.
+    Compress,
+    /// The `identity` encoding.
+    Identity,
+    /// Some other encoding that is less common, can be any String.
+    EncodingExt(String)
+}
+
+impl fmt::Display for Encoding {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match *self {
+            Chunked => "chunked",
+            Gzip => "gzip",
+            Deflate => "deflate",
+            Compress => "compress",
+            Identity => "identity",
+            EncodingExt(ref s) => s.as_ref()
+        })
+    }
+}
+
+impl str::FromStr for Encoding {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<Encoding> {
+        match s {
+            "chunked" => Ok(Chunked),
+            "deflate" => Ok(Deflate),
+            "gzip" => Ok(Gzip),
+            "compress" => Ok(Compress),
+            "identity" => Ok(Identity),
+            _ => Ok(EncodingExt(s.to_owned()))
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/shared/entity.rs
@@ -0,0 +1,215 @@
+use std::str::FromStr;
+use std::fmt::{self, Display};
+
+// check that each char in the slice is either:
+// 1. %x21, or
+// 2. in the range %x23 to %x7E, or
+// 3. in the range %x80 to %xFF
+fn check_slice_validity(slice: &str) -> bool {
+    slice.bytes().all(|c|
+        c == b'\x21' || (c >= b'\x23' && c <= b'\x7e') | (c >= b'\x80' && c <= b'\xff'))
+}
+
+/// An entity tag, defined in [RFC7232](https://tools.ietf.org/html/rfc7232#section-2.3)
+///
+/// An entity tag consists of a string enclosed by two literal double quotes.
+/// Preceding the first double quote is an optional weakness indicator,
+/// which always looks like `W/`. Examples for valid tags are `"xyzzy"` and `W/"xyzzy"`.
+///
+/// # ABNF
+/// ```plain
+/// entity-tag = [ weak ] opaque-tag
+/// weak       = %x57.2F ; "W/", case-sensitive
+/// opaque-tag = DQUOTE *etagc DQUOTE
+/// etagc      = %x21 / %x23-7E / obs-text
+///            ; VCHAR except double quotes, plus obs-text
+/// ```
+///
+/// # Comparison
+/// To check if two entity tags are equivalent in an application always use the `strong_eq` or
+/// `weak_eq` methods based on the context of the Tag. Only use `==` to check if two tags are
+/// identical.
+///
+/// The example below shows the results for a set of entity-tag pairs and
+/// both the weak and strong comparison function results:
+///
+/// | ETag 1  | ETag 2  | Strong Comparison | Weak Comparison |
+/// |---------|---------|-------------------|-----------------|
+/// | `W/"1"` | `W/"1"` | no match          | match           |
+/// | `W/"1"` | `W/"2"` | no match          | no match        |
+/// | `W/"1"` | `"1"`   | no match          | match           |
+/// | `"1"`   | `"1"`   | match             | match           |
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct EntityTag {
+    /// Weakness indicator for the tag
+    pub weak: bool,
+    /// The opaque string in between the DQUOTEs
+    tag: String
+}
+
+impl EntityTag {
+    /// Constructs a new EntityTag.
+    /// # Panics
+    /// If the tag contains invalid characters.
+    pub fn new(weak: bool, tag: String) -> EntityTag {
+        assert!(check_slice_validity(&tag), "Invalid tag: {:?}", tag);
+        EntityTag { weak: weak, tag: tag }
+    }
+
+    /// Constructs a new weak EntityTag.
+    /// # Panics
+    /// If the tag contains invalid characters.
+    pub fn weak(tag: String) -> EntityTag {
+        EntityTag::new(true, tag)
+    }
+
+    /// Constructs a new strong EntityTag.
+    /// # Panics
+    /// If the tag contains invalid characters.
+    pub fn strong(tag: String) -> EntityTag {
+        EntityTag::new(false, tag)
+    }
+
+    /// Get the tag.
+    pub fn tag(&self) -> &str {
+        self.tag.as_ref()
+    }
+
+    /// Set the tag.
+    /// # Panics
+    /// If the tag contains invalid characters.
+    pub fn set_tag(&mut self, tag: String) {
+        assert!(check_slice_validity(&tag), "Invalid tag: {:?}", tag);
+        self.tag = tag
+    }
+
+    /// For strong comparison two entity-tags are equivalent if both are not weak and their
+    /// opaque-tags match character-by-character.
+    pub fn strong_eq(&self, other: &EntityTag) -> bool {
+        !self.weak && !other.weak && self.tag == other.tag
+    }
+
+    /// For weak comparison two entity-tags are equivalent if their
+    /// opaque-tags match character-by-character, regardless of either or
+    /// both being tagged as "weak".
+    pub fn weak_eq(&self, other: &EntityTag) -> bool {
+        self.tag == other.tag
+    }
+
+    /// The inverse of `EntityTag.strong_eq()`.
+    pub fn strong_ne(&self, other: &EntityTag) -> bool {
+        !self.strong_eq(other)
+    }
+
+    /// The inverse of `EntityTag.weak_eq()`.
+    pub fn weak_ne(&self, other: &EntityTag) -> bool {
+        !self.weak_eq(other)
+    }
+}
+
+impl Display for EntityTag {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.weak {
+            write!(f, "W/\"{}\"", self.tag)
+        } else {
+            write!(f, "\"{}\"", self.tag)
+        }
+    }
+}
+
+impl FromStr for EntityTag {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<EntityTag> {
+        let length: usize = s.len();
+        let slice = &s[..];
+        // Early exits if it doesn't terminate in a DQUOTE.
+        if !slice.ends_with('"') {
+            return Err(::Error::Header);
+        }
+        // The etag is weak if its first char is not a DQUOTE.
+        if slice.starts_with('"') && check_slice_validity(&slice[1..length-1]) {
+            // No need to check if the last char is a DQUOTE,
+            // we already did that above.
+            return Ok(EntityTag { weak: false, tag: slice[1..length-1].to_owned() });
+        } else if slice.starts_with("W/\"") && check_slice_validity(&slice[3..length-1]) {
+            return Ok(EntityTag { weak: true, tag: slice[3..length-1].to_owned() });
+        }
+        Err(::Error::Header)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::EntityTag;
+
+    #[test]
+    fn test_etag_parse_success() {
+        // Expected success
+        assert_eq!("\"foobar\"".parse::<EntityTag>().unwrap(),
+            EntityTag::strong("foobar".to_owned()));
+        assert_eq!("\"\"".parse::<EntityTag>().unwrap(),
+            EntityTag::strong("".to_owned()));
+        assert_eq!("W/\"weaktag\"".parse::<EntityTag>().unwrap(),
+            EntityTag::weak("weaktag".to_owned()));
+        assert_eq!("W/\"\x65\x62\"".parse::<EntityTag>().unwrap(),
+            EntityTag::weak("\x65\x62".to_owned()));
+        assert_eq!("W/\"\"".parse::<EntityTag>().unwrap(), EntityTag::weak("".to_owned()));
+    }
+
+    #[test]
+    fn test_etag_parse_failures() {
+        // Expected failures
+        assert!("no-dquotes".parse::<EntityTag>().is_err());
+        assert!("w/\"the-first-w-is-case-sensitive\"".parse::<EntityTag>().is_err());
+        assert!("".parse::<EntityTag>().is_err());
+        assert!("\"unmatched-dquotes1".parse::<EntityTag>().is_err());
+        assert!("unmatched-dquotes2\"".parse::<EntityTag>().is_err());
+        assert!("matched-\"dquotes\"".parse::<EntityTag>().is_err());
+    }
+
+    #[test]
+    fn test_etag_fmt() {
+        assert_eq!(format!("{}", EntityTag::strong("foobar".to_owned())), "\"foobar\"");
+        assert_eq!(format!("{}", EntityTag::strong("".to_owned())), "\"\"");
+        assert_eq!(format!("{}", EntityTag::weak("weak-etag".to_owned())), "W/\"weak-etag\"");
+        assert_eq!(format!("{}", EntityTag::weak("\u{0065}".to_owned())), "W/\"\x65\"");
+        assert_eq!(format!("{}", EntityTag::weak("".to_owned())), "W/\"\"");
+    }
+
+    #[test]
+    fn test_cmp() {
+        // | ETag 1  | ETag 2  | Strong Comparison | Weak Comparison |
+        // |---------|---------|-------------------|-----------------|
+        // | `W/"1"` | `W/"1"` | no match          | match           |
+        // | `W/"1"` | `W/"2"` | no match          | no match        |
+        // | `W/"1"` | `"1"`   | no match          | match           |
+        // | `"1"`   | `"1"`   | match             | match           |
+        let mut etag1 = EntityTag::weak("1".to_owned());
+        let mut etag2 = EntityTag::weak("1".to_owned());
+        assert!(!etag1.strong_eq(&etag2));
+        assert!(etag1.weak_eq(&etag2));
+        assert!(etag1.strong_ne(&etag2));
+        assert!(!etag1.weak_ne(&etag2));
+
+        etag1 = EntityTag::weak("1".to_owned());
+        etag2 = EntityTag::weak("2".to_owned());
+        assert!(!etag1.strong_eq(&etag2));
+        assert!(!etag1.weak_eq(&etag2));
+        assert!(etag1.strong_ne(&etag2));
+        assert!(etag1.weak_ne(&etag2));
+
+        etag1 = EntityTag::weak("1".to_owned());
+        etag2 = EntityTag::strong("1".to_owned());
+        assert!(!etag1.strong_eq(&etag2));
+        assert!(etag1.weak_eq(&etag2));
+        assert!(etag1.strong_ne(&etag2));
+        assert!(!etag1.weak_ne(&etag2));
+
+        etag1 = EntityTag::strong("1".to_owned());
+        etag2 = EntityTag::strong("1".to_owned());
+        assert!(etag1.strong_eq(&etag2));
+        assert!(etag1.weak_eq(&etag2));
+        assert!(!etag1.strong_ne(&etag2));
+        assert!(!etag1.weak_ne(&etag2));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/shared/httpdate.rs
@@ -0,0 +1,91 @@
+use std::str::FromStr;
+use std::fmt::{self, Display};
+
+use time;
+
+/// A `time::Time` with HTTP formatting and parsing
+///
+//   Prior to 1995, there were three different formats commonly used by
+//   servers to communicate timestamps.  For compatibility with old
+//   implementations, all three are defined here.  The preferred format is
+//   a fixed-length and single-zone subset of the date and time
+//   specification used by the Internet Message Format [RFC5322].
+//
+//     HTTP-date    = IMF-fixdate / obs-date
+//
+//   An example of the preferred format is
+//
+//     Sun, 06 Nov 1994 08:49:37 GMT    ; IMF-fixdate
+//
+//   Examples of the two obsolete formats are
+//
+//     Sunday, 06-Nov-94 08:49:37 GMT   ; obsolete RFC 850 format
+//     Sun Nov  6 08:49:37 1994         ; ANSI C's asctime() format
+//
+//   A recipient that parses a timestamp value in an HTTP header field
+//   MUST accept all three HTTP-date formats.  When a sender generates a
+//   header field that contains one or more timestamps defined as
+//   HTTP-date, the sender MUST generate those timestamps in the
+//   IMF-fixdate format.
+#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct HttpDate(pub time::Tm);
+
+impl FromStr for HttpDate {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<HttpDate> {
+        match time::strptime(s, "%a, %d %b %Y %T %Z").or_else(|_| {
+            time::strptime(s, "%A, %d-%b-%y %T %Z")
+            }).or_else(|_| {
+                time::strptime(s, "%c")
+                }) {
+                    Ok(t) => Ok(HttpDate(t)),
+                    Err(_) => Err(::Error::Header),
+                    }
+    }
+}
+
+impl Display for HttpDate {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self.0.to_utc().rfc822(), f)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use time::Tm;
+    use super::HttpDate;
+
+    const NOV_07: HttpDate = HttpDate(Tm {
+        tm_nsec: 0,
+        tm_sec: 37,
+        tm_min: 48,
+        tm_hour: 8,
+        tm_mday: 7,
+        tm_mon: 10,
+        tm_year: 94,
+        tm_wday: 0,
+        tm_isdst: 0,
+        tm_yday: 0,
+        tm_utcoff: 0,
+    });
+
+    #[test]
+    fn test_imf_fixdate() {
+        assert_eq!("Sun, 07 Nov 1994 08:48:37 GMT".parse::<HttpDate>().unwrap(), NOV_07);
+    }
+
+    #[test]
+    fn test_rfc_850() {
+        assert_eq!("Sunday, 07-Nov-94 08:48:37 GMT".parse::<HttpDate>().unwrap(), NOV_07);
+    }
+
+    #[test]
+    fn test_asctime() {
+        assert_eq!("Sun Nov  7 08:48:37 1994".parse::<HttpDate>().unwrap(), NOV_07);
+    }
+
+    #[test]
+    fn test_no_date() {
+        assert!("this-is-no-date".parse::<HttpDate>().is_err());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/shared/mod.rs
@@ -0,0 +1,11 @@
+pub use self::charset::Charset;
+pub use self::encoding::Encoding;
+pub use self::entity::EntityTag;
+pub use self::httpdate::HttpDate;
+pub use self::quality_item::{Quality, QualityItem, qitem, q};
+
+mod charset;
+mod encoding;
+mod entity;
+mod httpdate;
+mod quality_item;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/header/shared/quality_item.rs
@@ -0,0 +1,215 @@
+use std::cmp;
+use std::default::Default;
+use std::fmt;
+use std::str;
+
+/// Represents a quality used in quality values.
+///
+/// Can be created with the `q` function.
+///
+/// # Implementation notes
+///
+/// The quality value is defined as a number between 0 and 1 with three decimal places. This means
+/// there are 1000 possible values. Since floating point numbers are not exact and the smallest
+/// floating point data type (`f32`) consumes four bytes, hyper uses an `u16` value to store the
+/// quality internally. For performance reasons you may set quality directly to a value between
+/// 0 and 1000 e.g. `Quality(532)` matches the quality `q=0.532`.
+///
+/// [RFC7231 Section 5.3.1](https://tools.ietf.org/html/rfc7231#section-5.3.1)
+/// gives more information on quality values in HTTP header fields.
+#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
+pub struct Quality(pub u16);
+
+impl fmt::Display for Quality {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.0 {
+            1000 => Ok(()),
+            0 => f.write_str("; q=0"),
+            x => write!(f, "; q=0.{}", format!("{:03}", x).trim_right_matches('0'))
+        }
+    }
+}
+
+impl Default for Quality {
+    fn default() -> Quality {
+        Quality(1000)
+    }
+}
+
+/// Represents an item with a quality value as defined in
+/// [RFC7231](https://tools.ietf.org/html/rfc7231#section-5.3.1).
+#[derive(Clone, PartialEq, Debug)]
+pub struct QualityItem<T> {
+    /// The actual contents of the field.
+    pub item: T,
+    /// The quality (client or server preference) for the value.
+    pub quality: Quality,
+}
+
+impl<T> QualityItem<T> {
+    /// Creates a new `QualityItem` from an item and a quality.
+    /// The item can be of any type.
+    /// The quality should be a value in the range [0, 1].
+    pub fn new(item: T, quality: Quality) -> QualityItem<T> {
+        QualityItem {
+            item: item,
+            quality: quality
+        }
+    }
+}
+
+impl<T: PartialEq> cmp::PartialOrd for QualityItem<T> {
+    fn partial_cmp(&self, other: &QualityItem<T>) -> Option<cmp::Ordering> {
+        self.quality.partial_cmp(&other.quality)
+    }
+}
+
+impl<T: fmt::Display> fmt::Display for QualityItem<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}{}", self.item, format!("{}", self.quality))
+    }
+}
+
+impl<T: str::FromStr> str::FromStr for QualityItem<T> {
+    type Err = ::Error;
+    fn from_str(s: &str) -> ::Result<QualityItem<T>> {
+        // Set defaults used if parsing fails.
+        let mut raw_item = s;
+        let mut quality = 1f32;
+
+        let parts: Vec<&str> = s.rsplitn(2, ';').map(|x| x.trim()).collect();
+        if parts.len() == 2 {
+            let start = &parts[0][0..2];
+            if start == "q=" || start == "Q=" {
+                let q_part = &parts[0][2..parts[0].len()];
+                if q_part.len() > 5 {
+                    return Err(::Error::Header);
+                }
+                match q_part.parse::<f32>() {
+                    Ok(q_value) => {
+                        if 0f32 <= q_value && q_value <= 1f32 {
+                            quality = q_value;
+                            raw_item = parts[1];
+                            } else {
+                                return Err(::Error::Header);
+                            }
+                        },
+                    Err(_) => return Err(::Error::Header),
+                }
+            }
+        }
+        match raw_item.parse::<T>() {
+            // we already checked above that the quality is within range
+            Ok(item) => Ok(QualityItem::new(item, from_f32(quality))),
+            Err(_) => Err(::Error::Header),
+        }
+    }
+}
+
+fn from_f32(f: f32) -> Quality {
+    // this function is only used internally. A check that `f` is within range
+    // should be done before calling this method. Just in case, this
+    // debug_assert should catch if we were forgetful
+    debug_assert!(f >= 0f32 && f <= 1f32, "q value must be between 0.0 and 1.0");
+    Quality((f * 1000f32) as u16)
+}
+
+/// Convinience function to wrap a value in a `QualityItem`
+/// Sets `q` to the default 1.0
+pub fn qitem<T>(item: T) -> QualityItem<T> {
+    QualityItem::new(item, Default::default())
+}
+
+/// Convenience function to create a `Quality` from a float.
+pub fn q(f: f32) -> Quality {
+    assert!(f >= 0f32 && f <= 1f32, "q value must be between 0.0 and 1.0");
+    from_f32(f)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use super::super::encoding::*;
+
+    #[test]
+    fn test_quality_item_show1() {
+        let x = qitem(Chunked);
+        assert_eq!(format!("{}", x), "chunked");
+    }
+    #[test]
+    fn test_quality_item_show2() {
+        let x = QualityItem::new(Chunked, Quality(1));
+        assert_eq!(format!("{}", x), "chunked; q=0.001");
+    }
+    #[test]
+    fn test_quality_item_show3() {
+        // Custom value
+        let x = QualityItem{
+            item: EncodingExt("identity".to_owned()),
+            quality: Quality(500),
+        };
+        assert_eq!(format!("{}", x), "identity; q=0.5");
+    }
+
+    #[test]
+    fn test_quality_item_from_str1() {
+        let x: ::Result<QualityItem<Encoding>> = "chunked".parse();
+        assert_eq!(x.unwrap(), QualityItem{ item: Chunked, quality: Quality(1000), });
+    }
+    #[test]
+    fn test_quality_item_from_str2() {
+        let x: ::Result<QualityItem<Encoding>> = "chunked; q=1".parse();
+        assert_eq!(x.unwrap(), QualityItem{ item: Chunked, quality: Quality(1000), });
+    }
+    #[test]
+    fn test_quality_item_from_str3() {
+        let x: ::Result<QualityItem<Encoding>> = "gzip; q=0.5".parse();
+        assert_eq!(x.unwrap(), QualityItem{ item: Gzip, quality: Quality(500), });
+    }
+    #[test]
+    fn test_quality_item_from_str4() {
+        let x: ::Result<QualityItem<Encoding>> = "gzip; q=0.273".parse();
+        assert_eq!(x.unwrap(), QualityItem{ item: Gzip, quality: Quality(273), });
+    }
+    #[test]
+    fn test_quality_item_from_str5() {
+        let x: ::Result<QualityItem<Encoding>> = "gzip; q=0.2739999".parse();
+        assert!(x.is_err());
+    }
+    #[test]
+    fn test_quality_item_from_str6() {
+        let x: ::Result<QualityItem<Encoding>> = "gzip; q=2".parse();
+        assert!(x.is_err());
+    }
+    #[test]
+    fn test_quality_item_ordering() {
+        let x: QualityItem<Encoding> = "gzip; q=0.5".parse().ok().unwrap();
+        let y: QualityItem<Encoding> = "gzip; q=0.273".parse().ok().unwrap();
+        let comparision_result: bool = x.gt(&y);
+        assert!(comparision_result)
+    }
+
+    #[test]
+    fn test_quality() {
+        assert_eq!(q(0.5), Quality(500));
+    }
+
+    #[test]
+    fn test_quality2() {
+        assert_eq!(format!("{}", q(0.0)), "; q=0");
+    }
+
+    #[test]
+    #[should_panic] // FIXME - 32-bit msvc unwinding broken
+    #[cfg_attr(all(target_arch="x86", target_env="msvc"), ignore)]
+    fn test_quality_invalid() {
+        q(-1.0);
+    }
+
+    #[test]
+    #[should_panic] // FIXME - 32-bit msvc unwinding broken
+    #[cfg_attr(all(target_arch="x86", target_env="msvc"), ignore)]
+    fn test_quality_invalid2() {
+        q(2.0);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/http/h1.rs
@@ -0,0 +1,1177 @@
+//! Adapts the HTTP/1.1 implementation into the `HttpMessage` API.
+use std::borrow::Cow;
+use std::cmp::min;
+use std::fmt;
+use std::io::{self, Write, BufWriter, BufRead, Read};
+use std::net::Shutdown;
+use std::time::Duration;
+
+use httparse;
+use url::Position as UrlPosition;
+
+use buffer::BufReader;
+use Error;
+use header::{Headers, ContentLength, TransferEncoding};
+use header::Encoding::Chunked;
+use method::{Method};
+use net::{NetworkConnector, NetworkStream};
+use status::StatusCode;
+use version::HttpVersion;
+use version::HttpVersion::{Http10, Http11};
+use uri::RequestUri;
+
+use self::HttpReader::{SizedReader, ChunkedReader, EofReader, EmptyReader};
+use self::HttpWriter::{ChunkedWriter, SizedWriter, EmptyWriter, ThroughWriter};
+
+use http::{
+    RawStatus,
+    Protocol,
+    HttpMessage,
+    RequestHead,
+    ResponseHead,
+};
+use header;
+use version;
+
+const MAX_INVALID_RESPONSE_BYTES: usize = 1024 * 128;
+
+#[derive(Debug)]
+struct Wrapper<T> {
+    obj: Option<T>,
+}
+
+impl<T> Wrapper<T> {
+    pub fn new(obj: T) -> Wrapper<T> {
+        Wrapper { obj: Some(obj) }
+    }
+
+    pub fn map_in_place<F>(&mut self, f: F) where F: FnOnce(T) -> T {
+        let obj = self.obj.take().unwrap();
+        let res = f(obj);
+        self.obj = Some(res);
+    }
+
+    pub fn into_inner(self) -> T { self.obj.unwrap() }
+    pub fn as_mut(&mut self) -> &mut T { self.obj.as_mut().unwrap() }
+    pub fn as_ref(&self) -> &T { self.obj.as_ref().unwrap() }
+}
+
+#[derive(Debug)]
+enum Stream {
+    Idle(Box<NetworkStream + Send>),
+    Writing(HttpWriter<BufWriter<Box<NetworkStream + Send>>>),
+    Reading(HttpReader<BufReader<Box<NetworkStream + Send>>>),
+}
+
+impl Stream {
+    fn writer_mut(&mut self) -> Option<&mut HttpWriter<BufWriter<Box<NetworkStream + Send>>>> {
+        match *self {
+            Stream::Writing(ref mut writer) => Some(writer),
+            _ => None,
+        }
+    }
+    fn reader_mut(&mut self) -> Option<&mut HttpReader<BufReader<Box<NetworkStream + Send>>>> {
+        match *self {
+            Stream::Reading(ref mut reader) => Some(reader),
+            _ => None,
+        }
+    }
+    fn reader_ref(&self) -> Option<&HttpReader<BufReader<Box<NetworkStream + Send>>>> {
+        match *self {
+            Stream::Reading(ref reader) => Some(reader),
+            _ => None,
+        }
+    }
+
+    fn new(stream: Box<NetworkStream + Send>) -> Stream {
+        Stream::Idle(stream)
+    }
+}
+
+/// An implementation of the `HttpMessage` trait for HTTP/1.1.
+#[derive(Debug)]
+pub struct Http11Message {
+    is_proxied: bool,
+    method: Option<Method>,
+    stream: Wrapper<Stream>,
+}
+
+impl Write for Http11Message {
+    #[inline]
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        match self.stream.as_mut().writer_mut() {
+            None => Err(io::Error::new(io::ErrorKind::Other,
+                                          "Not in a writable state")),
+            Some(ref mut writer) => writer.write(buf),
+        }
+    }
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        match self.stream.as_mut().writer_mut() {
+            None => Err(io::Error::new(io::ErrorKind::Other,
+                                          "Not in a writable state")),
+            Some(ref mut writer) => writer.flush(),
+        }
+    }
+}
+
+impl Read for Http11Message {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match self.stream.as_mut().reader_mut() {
+            None => Err(io::Error::new(io::ErrorKind::Other,
+                                          "Not in a readable state")),
+            Some(ref mut reader) => reader.read(buf),
+        }
+    }
+}
+
+impl HttpMessage for Http11Message {
+    fn set_outgoing(&mut self, mut head: RequestHead) -> ::Result<RequestHead> {
+        let mut res = Err(Error::from(io::Error::new(
+                            io::ErrorKind::Other,
+                            "")));
+        let mut method = None;
+        let is_proxied = self.is_proxied;
+        self.stream.map_in_place(|stream: Stream| -> Stream {
+            let stream = match stream {
+                Stream::Idle(stream) => stream,
+                _ => {
+                    res = Err(Error::from(io::Error::new(
+                                io::ErrorKind::Other,
+                                "Message not idle, cannot start new outgoing")));
+                    return stream;
+                },
+            };
+            let mut stream = BufWriter::new(stream);
+
+            {
+                let uri = if is_proxied {
+                    head.url.as_ref()
+                } else {
+                    &head.url[UrlPosition::BeforePath..UrlPosition::AfterQuery]
+                };
+
+                let version = version::HttpVersion::Http11;
+                debug!("request line: {:?} {:?} {:?}", head.method, uri, version);
+                match write!(&mut stream, "{} {} {}{}",
+                             head.method, uri, version, LINE_ENDING) {
+                                 Err(e) => {
+                                     res = Err(From::from(e));
+                                     // TODO What should we do if the BufWriter doesn't wanna
+                                     // relinquish the stream?
+                                     return Stream::Idle(stream.into_inner().ok().unwrap());
+                                 },
+                                 Ok(_) => {},
+                             };
+            }
+
+            let stream = {
+                let write_headers = |mut stream: BufWriter<Box<NetworkStream + Send>>, head: &RequestHead| {
+                    debug!("headers={:?}", head.headers);
+                    match write!(&mut stream, "{}{}", head.headers, LINE_ENDING) {
+                        Ok(_) => Ok(stream),
+                        Err(e) => {
+                            Err((e, stream.into_inner().unwrap()))
+                        }
+                    }
+                };
+                match head.method {
+                    Method::Get | Method::Head => {
+                        let writer = match write_headers(stream, &head) {
+                            Ok(w) => w,
+                            Err(e) => {
+                                res = Err(From::from(e.0));
+                                return Stream::Idle(e.1);
+                            }
+                        };
+                        EmptyWriter(writer)
+                    },
+                    _ => {
+                        let mut chunked = true;
+                        let mut len = 0;
+
+                        match head.headers.get::<header::ContentLength>() {
+                            Some(cl) => {
+                                chunked = false;
+                                len = **cl;
+                            },
+                            None => ()
+                        };
+
+                        // can't do in match above, thanks borrowck
+                        if chunked {
+                            let encodings = match head.headers.get_mut::<header::TransferEncoding>() {
+                                Some(encodings) => {
+                                    //TODO: check if chunked is already in encodings. use HashSet?
+                                    encodings.push(header::Encoding::Chunked);
+                                    false
+                                },
+                                None => true
+                            };
+
+                            if encodings {
+                                head.headers.set(
+                                    header::TransferEncoding(vec![header::Encoding::Chunked]))
+                            }
+                        }
+
+                        let stream = match write_headers(stream, &head) {
+                            Ok(s) => s,
+                            Err(e) => {
+                                res = Err(From::from(e.0));
+                                return Stream::Idle(e.1);
+                            },
+                        };
+
+                        if chunked {
+                            ChunkedWriter(stream)
+                        } else {
+                            SizedWriter(stream, len)
+                        }
+                    }
+                }
+            };
+
+            method = Some(head.method.clone());
+            res = Ok(head);
+            Stream::Writing(stream)
+        });
+
+        self.method = method;
+        res
+    }
+
+    fn get_incoming(&mut self) -> ::Result<ResponseHead> {
+        try!(self.flush_outgoing());
+        let method = self.method.take().unwrap_or(Method::Get);
+        let mut res = Err(From::from(
+                        io::Error::new(io::ErrorKind::Other,
+                        "Read already in progress")));
+        self.stream.map_in_place(|stream| {
+            let stream = match stream {
+                Stream::Idle(stream) => stream,
+                _ => {
+                    // The message was already in the reading state...
+                    // TODO Decide what happens in case we try to get a new incoming at that point
+                    res = Err(From::from(
+                            io::Error::new(io::ErrorKind::Other,
+                                           "Read already in progress")));
+                    return stream;
+                }
+            };
+
+            let expected_no_content = stream.previous_response_expected_no_content();
+            trace!("previous_response_expected_no_content = {}", expected_no_content);
+
+            let mut stream = BufReader::new(stream);
+
+            let mut invalid_bytes_read = 0;
+            let head;
+            loop {
+                head = match parse_response(&mut stream) {
+                    Ok(head) => head,
+                    Err(::Error::Version)
+                        if expected_no_content && invalid_bytes_read < MAX_INVALID_RESPONSE_BYTES => {
+                            trace!("expected_no_content, found content");
+                            invalid_bytes_read += 1;
+                            stream.consume(1);
+                            continue;
+                        }
+                    Err(e) => {
+                        res = Err(e);
+                        return Stream::Idle(stream.into_inner());
+                    }
+                };
+                break;
+            }
+
+            let raw_status = head.subject;
+            let headers = head.headers;
+
+            let is_empty = !should_have_response_body(&method, raw_status.0);
+            stream.get_mut().set_previous_response_expected_no_content(is_empty);
+            // According to https://tools.ietf.org/html/rfc7230#section-3.3.3
+            // 1. HEAD reponses, and Status 1xx, 204, and 304 cannot have a body.
+            // 2. Status 2xx to a CONNECT cannot have a body.
+            // 3. Transfer-Encoding: chunked has a chunked body.
+            // 4. If multiple differing Content-Length headers or invalid, close connection.
+            // 5. Content-Length header has a sized body.
+            // 6. Not Client.
+            // 7. Read till EOF.
+            let reader = if is_empty {
+                EmptyReader(stream)
+            } else {
+                if let Some(&TransferEncoding(ref codings)) = headers.get() {
+                    if codings.last() == Some(&Chunked) {
+                        ChunkedReader(stream, None)
+                    } else {
+                        trace!("not chuncked. read till eof");
+                        EofReader(stream)
+                    }
+                } else if let Some(&ContentLength(len)) =  headers.get() {
+                    SizedReader(stream, len)
+                } else if headers.has::<ContentLength>() {
+                    trace!("illegal Content-Length: {:?}", headers.get_raw("Content-Length"));
+                    res = Err(Error::Header);
+                    return Stream::Idle(stream.into_inner());
+                } else {
+                    trace!("neither Transfer-Encoding nor Content-Length");
+                    EofReader(stream)
+                }
+            };
+
+            trace!("Http11Message.reader = {:?}", reader);
+
+
+            res = Ok(ResponseHead {
+                headers: headers,
+                raw_status: raw_status,
+                version: head.version,
+            });
+
+            Stream::Reading(reader)
+        });
+        res
+    }
+
+    fn has_body(&self) -> bool {
+        match self.stream.as_ref().reader_ref() {
+            Some(&EmptyReader(..)) |
+            Some(&SizedReader(_, 0)) |
+            Some(&ChunkedReader(_, Some(0))) => false,
+            // specifically EofReader is always true
+            _ => true
+        }
+    }
+
+    #[inline]
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.get_ref().set_read_timeout(dur)
+    }
+
+    #[inline]
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.get_ref().set_write_timeout(dur)
+    }
+
+    #[inline]
+    fn close_connection(&mut self) -> ::Result<()> {
+        try!(self.get_mut().close(Shutdown::Both));
+        Ok(())
+    }
+
+    #[inline]
+    fn set_proxied(&mut self, val: bool) {
+        self.is_proxied = val;
+    }
+}
+
+impl Http11Message {
+    /// Consumes the `Http11Message` and returns the underlying `NetworkStream`.
+    pub fn into_inner(self) -> Box<NetworkStream + Send> {
+        match self.stream.into_inner() {
+            Stream::Idle(stream) => stream,
+            Stream::Writing(stream) => stream.into_inner().into_inner().unwrap(),
+            Stream::Reading(stream) => stream.into_inner().into_inner(),
+        }
+    }
+
+    /// Gets a borrowed reference to the underlying `NetworkStream`, regardless of the state of the
+    /// `Http11Message`.
+    pub fn get_ref(&self) -> &(NetworkStream + Send) {
+        match *self.stream.as_ref() {
+            Stream::Idle(ref stream) => &**stream,
+            Stream::Writing(ref stream) => &**stream.get_ref().get_ref(),
+            Stream::Reading(ref stream) => &**stream.get_ref().get_ref()
+        }
+    }
+
+    /// Gets a mutable reference to the underlying `NetworkStream`, regardless of the state of the
+    /// `Http11Message`.
+    pub fn get_mut(&mut self) -> &mut (NetworkStream + Send) {
+        match *self.stream.as_mut() {
+            Stream::Idle(ref mut stream) => &mut **stream,
+            Stream::Writing(ref mut stream) => &mut **stream.get_mut().get_mut(),
+            Stream::Reading(ref mut stream) => &mut **stream.get_mut().get_mut()
+        }
+    }
+
+    /// Creates a new `Http11Message` that will use the given `NetworkStream` for communicating to
+    /// the peer.
+    pub fn with_stream(stream: Box<NetworkStream + Send>) -> Http11Message {
+        Http11Message {
+            is_proxied: false,
+            method: None,
+            stream: Wrapper::new(Stream::new(stream)),
+        }
+    }
+
+    /// Flushes the current outgoing content and moves the stream into the `stream` property.
+    ///
+    /// TODO It might be sensible to lift this up to the `HttpMessage` trait itself...
+    pub fn flush_outgoing(&mut self) -> ::Result<()> {
+        let mut res = Ok(());
+        self.stream.map_in_place(|stream| {
+            let writer = match stream {
+                Stream::Writing(writer) => writer,
+                _ => {
+                    res = Ok(());
+                    return stream;
+                },
+            };
+            // end() already flushes
+            let raw = match writer.end() {
+                Ok(buf) => buf.into_inner().unwrap(),
+                Err(e) => {
+                    res = Err(From::from(e.0));
+                    return Stream::Writing(e.1);
+                }
+            };
+            Stream::Idle(raw)
+        });
+        res
+    }
+}
+
+/// The `Protocol` implementation provides HTTP/1.1 messages.
+pub struct Http11Protocol {
+    connector: Connector,
+}
+
+impl Protocol for Http11Protocol {
+    fn new_message(&self, host: &str, port: u16, scheme: &str) -> ::Result<Box<HttpMessage>> {
+        let stream = try!(self.connector.connect(host, port, scheme)).into();
+
+        Ok(Box::new(Http11Message::with_stream(stream)))
+    }
+}
+
+impl Http11Protocol {
+    /// Creates a new `Http11Protocol` instance that will use the given `NetworkConnector` for
+    /// establishing HTTP connections.
+    pub fn with_connector<C, S>(c: C) -> Http11Protocol
+            where C: NetworkConnector<Stream=S> + Send + Sync + 'static,
+                  S: NetworkStream + Send {
+        Http11Protocol {
+            connector: Connector(Box::new(ConnAdapter(c))),
+        }
+    }
+}
+
+struct ConnAdapter<C: NetworkConnector + Send + Sync>(C);
+
+impl<C: NetworkConnector<Stream=S> + Send + Sync, S: NetworkStream + Send>
+        NetworkConnector for ConnAdapter<C> {
+    type Stream = Box<NetworkStream + Send>;
+    #[inline]
+    fn connect(&self, host: &str, port: u16, scheme: &str)
+        -> ::Result<Box<NetworkStream + Send>> {
+        Ok(try!(self.0.connect(host, port, scheme)).into())
+    }
+}
+
+struct Connector(Box<NetworkConnector<Stream=Box<NetworkStream + Send>> + Send + Sync>);
+
+impl NetworkConnector for Connector {
+    type Stream = Box<NetworkStream + Send>;
+    #[inline]
+    fn connect(&self, host: &str, port: u16, scheme: &str)
+        -> ::Result<Box<NetworkStream + Send>> {
+        Ok(try!(self.0.connect(host, port, scheme)).into())
+    }
+}
+
+
+/// Readers to handle different Transfer-Encodings.
+///
+/// If a message body does not include a Transfer-Encoding, it *should*
+/// include a Content-Length header.
+pub enum HttpReader<R> {
+    /// A Reader used when a Content-Length header is passed with a positive integer.
+    SizedReader(R, u64),
+    /// A Reader used when Transfer-Encoding is `chunked`.
+    ChunkedReader(R, Option<u64>),
+    /// A Reader used for responses that don't indicate a length or chunked.
+    ///
+    /// Note: This should only used for `Response`s. It is illegal for a
+    /// `Request` to be made with both `Content-Length` and
+    /// `Transfer-Encoding: chunked` missing, as explained from the spec:
+    ///
+    /// > If a Transfer-Encoding header field is present in a response and
+    /// > the chunked transfer coding is not the final encoding, the
+    /// > message body length is determined by reading the connection until
+    /// > it is closed by the server.  If a Transfer-Encoding header field
+    /// > is present in a request and the chunked transfer coding is not
+    /// > the final encoding, the message body length cannot be determined
+    /// > reliably; the server MUST respond with the 400 (Bad Request)
+    /// > status code and then close the connection.
+    EofReader(R),
+    /// A Reader used for messages that should never have a body.
+    ///
+    /// See https://tools.ietf.org/html/rfc7230#section-3.3.3
+    EmptyReader(R),
+}
+
+impl<R: Read> HttpReader<R> {
+
+    /// Unwraps this HttpReader and returns the underlying Reader.
+    pub fn into_inner(self) -> R {
+        match self {
+            SizedReader(r, _) => r,
+            ChunkedReader(r, _) => r,
+            EofReader(r) => r,
+            EmptyReader(r) => r,
+        }
+    }
+
+    /// Gets a borrowed reference to the underlying Reader.
+    pub fn get_ref(&self) -> &R {
+        match *self {
+            SizedReader(ref r, _) => r,
+            ChunkedReader(ref r, _) => r,
+            EofReader(ref r) => r,
+            EmptyReader(ref r) => r,
+        }
+    }
+
+    /// Gets a mutable reference to the underlying Reader.
+    pub fn get_mut(&mut self) -> &mut R {
+        match *self {
+            SizedReader(ref mut r, _) => r,
+            ChunkedReader(ref mut r, _) => r,
+            EofReader(ref mut r) => r,
+            EmptyReader(ref mut r) => r,
+        }
+    }
+}
+
+impl<R> fmt::Debug for HttpReader<R> {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            SizedReader(_,rem) => write!(fmt, "SizedReader(remaining={:?})", rem),
+            ChunkedReader(_, None) => write!(fmt, "ChunkedReader(chunk_remaining=unknown)"),
+            ChunkedReader(_, Some(rem)) => write!(fmt, "ChunkedReader(chunk_remaining={:?})", rem),
+            EofReader(_) => write!(fmt, "EofReader"),
+            EmptyReader(_) => write!(fmt, "EmptyReader"),
+        }
+    }
+}
+
+impl<R: Read> Read for HttpReader<R> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        if buf.is_empty() {
+            return Ok(0);
+        }
+        match *self {
+            SizedReader(ref mut body, ref mut remaining) => {
+                trace!("Sized read, remaining={:?}", remaining);
+                if *remaining == 0 {
+                    Ok(0)
+                } else {
+                    let to_read = min(*remaining as usize, buf.len());
+                    let num = try!(body.read(&mut buf[..to_read])) as u64;
+                    trace!("Sized read: {}", num);
+                    if num > *remaining {
+                        *remaining = 0;
+                    } else if num == 0 {
+                        return Err(io::Error::new(io::ErrorKind::Other, "early eof"));
+                    } else {
+                        *remaining -= num;
+                    }
+                    Ok(num as usize)
+                }
+            },
+            ChunkedReader(ref mut body, ref mut opt_remaining) => {
+                let mut rem = match *opt_remaining {
+                    Some(ref rem) => *rem,
+                    // None means we don't know the size of the next chunk
+                    None => try!(read_chunk_size(body))
+                };
+                trace!("Chunked read, remaining={:?}", rem);
+
+                if rem == 0 {
+                    if opt_remaining.is_none() {
+                        try!(eat(body, LINE_ENDING.as_bytes()));
+                    }
+
+                    *opt_remaining = Some(0);
+
+                    // chunk of size 0 signals the end of the chunked stream
+                    // if the 0 digit was missing from the stream, it would
+                    // be an InvalidInput error instead.
+                    trace!("end of chunked");
+
+                    return Ok(0)
+                }
+
+                let to_read = min(rem as usize, buf.len());
+                let count = try!(body.read(&mut buf[..to_read])) as u64;
+
+                if count == 0 {
+                    *opt_remaining = Some(0);
+                    return Err(io::Error::new(io::ErrorKind::Other, "early eof"));
+                }
+
+                rem -= count;
+                *opt_remaining = if rem > 0 {
+                    Some(rem)
+                } else {
+                    try!(eat(body, LINE_ENDING.as_bytes()));
+                    None
+                };
+                Ok(count as usize)
+            },
+            EofReader(ref mut body) => {
+                let r = body.read(buf);
+                trace!("eofread: {:?}", r);
+                r
+            },
+            EmptyReader(_) => Ok(0)
+        }
+    }
+}
+
+fn eat<R: Read>(rdr: &mut R, bytes: &[u8]) -> io::Result<()> {
+    let mut buf = [0];
+    for &b in bytes.iter() {
+        match try!(rdr.read(&mut buf)) {
+            1 if buf[0] == b => (),
+            _ => return Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                          "Invalid characters found")),
+        }
+    }
+    Ok(())
+}
+
+/// Chunked chunks start with 1*HEXDIGIT, indicating the size of the chunk.
+fn read_chunk_size<R: Read>(rdr: &mut R) -> io::Result<u64> {
+    macro_rules! byte (
+        ($rdr:ident) => ({
+            let mut buf = [0];
+            match try!($rdr.read(&mut buf)) {
+                1 => buf[0],
+                _ => return Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                                  "Invalid chunk size line")),
+
+            }
+        })
+    );
+    let mut size = 0u64;
+    let radix = 16;
+    let mut in_ext = false;
+    let mut in_chunk_size = true;
+    loop {
+        match byte!(rdr) {
+            b@b'0'...b'9' if in_chunk_size => {
+                size *= radix;
+                size += (b - b'0') as u64;
+            },
+            b@b'a'...b'f' if in_chunk_size => {
+                size *= radix;
+                size += (b + 10 - b'a') as u64;
+            },
+            b@b'A'...b'F' if in_chunk_size => {
+                size *= radix;
+                size += (b + 10 - b'A') as u64;
+            },
+            CR => {
+                match byte!(rdr) {
+                    LF => break,
+                    _ => return Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                                  "Invalid chunk size line"))
+
+                }
+            },
+            // If we weren't in the extension yet, the ";" signals its start
+            b';' if !in_ext => {
+                in_ext = true;
+                in_chunk_size = false;
+            },
+            // "Linear white space" is ignored between the chunk size and the
+            // extension separator token (";") due to the "implied *LWS rule".
+            b'\t' | b' ' if !in_ext & !in_chunk_size => {},
+            // LWS can follow the chunk size, but no more digits can come
+            b'\t' | b' ' if in_chunk_size => in_chunk_size = false,
+            // We allow any arbitrary octet once we are in the extension, since
+            // they all get ignored anyway. According to the HTTP spec, valid
+            // extensions would have a more strict syntax:
+            //     (token ["=" (token | quoted-string)])
+            // but we gain nothing by rejecting an otherwise valid chunk size.
+            ext if in_ext => {
+                todo!("chunk extension byte={}", ext);
+            },
+            // Finally, if we aren't in the extension and we're reading any
+            // other octet, the chunk size line is invalid!
+            _ => {
+                return Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                         "Invalid chunk size line"));
+            }
+        }
+    }
+    trace!("chunk size={:?}", size);
+    Ok(size)
+}
+
+fn should_have_response_body(method: &Method, status: u16) -> bool {
+    trace!("should_have_response_body({:?}, {})", method, status);
+    match (method, status) {
+        (&Method::Head, _) |
+        (_, 100...199) |
+        (_, 204) |
+        (_, 304) |
+        (&Method::Connect, 200...299) => false,
+        _ => true
+    }
+}
+
+/// Writers to handle different Transfer-Encodings.
+pub enum HttpWriter<W: Write> {
+    /// A no-op Writer, used initially before Transfer-Encoding is determined.
+    ThroughWriter(W),
+    /// A Writer for when Transfer-Encoding includes `chunked`.
+    ChunkedWriter(W),
+    /// A Writer for when Content-Length is set.
+    ///
+    /// Enforces that the body is not longer than the Content-Length header.
+    SizedWriter(W, u64),
+    /// A writer that should not write any body.
+    EmptyWriter(W),
+}
+
+impl<W: Write> HttpWriter<W> {
+    /// Unwraps the HttpWriter and returns the underlying Writer.
+    #[inline]
+    pub fn into_inner(self) -> W {
+        match self {
+            ThroughWriter(w) => w,
+            ChunkedWriter(w) => w,
+            SizedWriter(w, _) => w,
+            EmptyWriter(w) => w,
+        }
+    }
+
+    /// Access the inner Writer.
+    #[inline]
+    pub fn get_ref(&self) -> &W {
+        match *self {
+            ThroughWriter(ref w) => w,
+            ChunkedWriter(ref w) => w,
+            SizedWriter(ref w, _) => w,
+            EmptyWriter(ref w) => w,
+        }
+    }
+
+    /// Access the inner Writer mutably.
+    ///
+    /// Warning: You should not write to this directly, as you can corrupt
+    /// the state.
+    #[inline]
+    pub fn get_mut(&mut self) -> &mut W {
+        match *self {
+            ThroughWriter(ref mut w) => w,
+            ChunkedWriter(ref mut w) => w,
+            SizedWriter(ref mut w, _) => w,
+            EmptyWriter(ref mut w) => w,
+        }
+    }
+
+    /// Ends the HttpWriter, and returns the underlying Writer.
+    ///
+    /// A final `write_all()` is called with an empty message, and then flushed.
+    /// The ChunkedWriter variant will use this to write the 0-sized last-chunk.
+    #[inline]
+    pub fn end(mut self) -> Result<W, EndError<W>> {
+        fn inner<W: Write>(w: &mut W) -> io::Result<()> {
+            try!(w.write(&[]));
+            w.flush()
+        }
+
+        match inner(&mut self) {
+            Ok(..) => Ok(self.into_inner()),
+            Err(e) => Err(EndError(e, self))
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct EndError<W: Write>(io::Error, HttpWriter<W>);
+
+impl<W: Write> From<EndError<W>> for io::Error {
+    fn from(e: EndError<W>) -> io::Error {
+        e.0
+    }
+}
+
+impl<W: Write> Write for HttpWriter<W> {
+    #[inline]
+    fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
+        match *self {
+            ThroughWriter(ref mut w) => w.write(msg),
+            ChunkedWriter(ref mut w) => {
+                let chunk_size = msg.len();
+                trace!("chunked write, size = {:?}", chunk_size);
+                try!(write!(w, "{:X}{}", chunk_size, LINE_ENDING));
+                try!(w.write_all(msg));
+                try!(w.write_all(LINE_ENDING.as_bytes()));
+                Ok(msg.len())
+            },
+            SizedWriter(ref mut w, ref mut remaining) => {
+                let len = msg.len() as u64;
+                if len > *remaining {
+                    let len = *remaining;
+                    *remaining = 0;
+                    try!(w.write_all(&msg[..len as usize]));
+                    Ok(len as usize)
+                } else {
+                    *remaining -= len;
+                    try!(w.write_all(msg));
+                    Ok(len as usize)
+                }
+            },
+            EmptyWriter(..) => {
+                if !msg.is_empty() {
+                    error!("Cannot include a body with this kind of message");
+                }
+                Ok(0)
+            }
+        }
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        match *self {
+            ThroughWriter(ref mut w) => w.flush(),
+            ChunkedWriter(ref mut w) => w.flush(),
+            SizedWriter(ref mut w, _) => w.flush(),
+            EmptyWriter(ref mut w) => w.flush(),
+        }
+    }
+}
+
+impl<W: Write> fmt::Debug for HttpWriter<W> {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            ThroughWriter(_) => write!(fmt, "ThroughWriter"),
+            ChunkedWriter(_) => write!(fmt, "ChunkedWriter"),
+            SizedWriter(_, rem) => write!(fmt, "SizedWriter(remaining={:?})", rem),
+            EmptyWriter(_) => write!(fmt, "EmptyWriter"),
+        }
+    }
+}
+
+const MAX_HEADERS: usize = 100;
+
+/// Parses a request into an Incoming message head.
+#[inline]
+pub fn parse_request<R: Read>(buf: &mut BufReader<R>) -> ::Result<Incoming<(Method, RequestUri)>> {
+    parse::<R, httparse::Request, (Method, RequestUri)>(buf)
+}
+
+/// Parses a response into an Incoming message head.
+#[inline]
+pub fn parse_response<R: Read>(buf: &mut BufReader<R>) -> ::Result<Incoming<RawStatus>> {
+    parse::<R, httparse::Response, RawStatus>(buf)
+}
+
+fn parse<R: Read, T: TryParse<Subject=I>, I>(rdr: &mut BufReader<R>) -> ::Result<Incoming<I>> {
+    loop {
+        match try!(try_parse::<R, T, I>(rdr)) {
+            httparse::Status::Complete((inc, len)) => {
+                rdr.consume(len);
+                return Ok(inc);
+            },
+            _partial => ()
+        }
+        match try!(rdr.read_into_buf()) {
+            0 if rdr.get_buf().is_empty() => {
+                return Err(Error::Io(io::Error::new(
+                    io::ErrorKind::ConnectionAborted,
+                    "Connection closed"
+                )))
+            },
+            0 => return Err(Error::TooLarge),
+            _ => ()
+        }
+    }
+}
+
+fn try_parse<R: Read, T: TryParse<Subject=I>, I>(rdr: &mut BufReader<R>) -> TryParseResult<I> {
+    let mut headers = [httparse::EMPTY_HEADER; MAX_HEADERS];
+    let buf = rdr.get_buf();
+    if buf.len() == 0 {
+        return Ok(httparse::Status::Partial);
+    }
+    trace!("try_parse({:?})", buf);
+    <T as TryParse>::try_parse(&mut headers, buf)
+}
+
+#[doc(hidden)]
+trait TryParse {
+    type Subject;
+    fn try_parse<'a>(headers: &'a mut [httparse::Header<'a>], buf: &'a [u8]) ->
+        TryParseResult<Self::Subject>;
+}
+
+type TryParseResult<T> = Result<httparse::Status<(Incoming<T>, usize)>, Error>;
+
+impl<'a> TryParse for httparse::Request<'a, 'a> {
+    type Subject = (Method, RequestUri);
+
+    fn try_parse<'b>(headers: &'b mut [httparse::Header<'b>], buf: &'b [u8]) ->
+            TryParseResult<(Method, RequestUri)> {
+        trace!("Request.try_parse([Header; {}], [u8; {}])", headers.len(), buf.len());
+        let mut req = httparse::Request::new(headers);
+        Ok(match try!(req.parse(buf)) {
+            httparse::Status::Complete(len) => {
+                trace!("Request.try_parse Complete({})", len);
+                httparse::Status::Complete((Incoming {
+                    version: if req.version.unwrap() == 1 { Http11 } else { Http10 },
+                    subject: (
+                        try!(req.method.unwrap().parse()),
+                        try!(req.path.unwrap().parse())
+                    ),
+                    headers: try!(Headers::from_raw(req.headers))
+                }, len))
+            },
+            httparse::Status::Partial => httparse::Status::Partial
+        })
+    }
+}
+
+impl<'a> TryParse for httparse::Response<'a, 'a> {
+    type Subject = RawStatus;
+
+    fn try_parse<'b>(headers: &'b mut [httparse::Header<'b>], buf: &'b [u8]) ->
+            TryParseResult<RawStatus> {
+        trace!("Response.try_parse([Header; {}], [u8; {}])", headers.len(), buf.len());
+        let mut res = httparse::Response::new(headers);
+        Ok(match try!(res.parse(buf)) {
+            httparse::Status::Complete(len) => {
+                trace!("Response.try_parse Complete({})", len);
+                let code = res.code.unwrap();
+                let reason = match StatusCode::from_u16(code).canonical_reason() {
+                    Some(reason) if reason == res.reason.unwrap() => Cow::Borrowed(reason),
+                    _ => Cow::Owned(res.reason.unwrap().to_owned())
+                };
+                httparse::Status::Complete((Incoming {
+                    version: if res.version.unwrap() == 1 { Http11 } else { Http10 },
+                    subject: RawStatus(code, reason),
+                    headers: try!(Headers::from_raw(res.headers))
+                }, len))
+            },
+            httparse::Status::Partial => httparse::Status::Partial
+        })
+    }
+}
+
+/// An Incoming Message head. Includes request/status line, and headers.
+#[derive(Debug)]
+pub struct Incoming<S> {
+    /// HTTP version of the message.
+    pub version: HttpVersion,
+    /// Subject (request line or status line) of Incoming message.
+    pub subject: S,
+    /// Headers of the Incoming message.
+    pub headers: Headers
+}
+
+/// The `\r` byte.
+pub const CR: u8 = b'\r';
+/// The `\n` byte.
+pub const LF: u8 = b'\n';
+/// The bytes `\r\n`.
+pub const LINE_ENDING: &'static str = "\r\n";
+
+#[cfg(test)]
+mod tests {
+    use std::error::Error;
+    use std::io::{self, Read, Write};
+
+
+    use buffer::BufReader;
+    use mock::MockStream;
+    use http::HttpMessage;
+
+    use super::{read_chunk_size, parse_request, parse_response, Http11Message};
+
+    #[test]
+    fn test_write_chunked() {
+        use std::str::from_utf8;
+        let mut w = super::HttpWriter::ChunkedWriter(Vec::new());
+        w.write_all(b"foo bar").unwrap();
+        w.write_all(b"baz quux herp").unwrap();
+        let buf = w.end().unwrap();
+        let s = from_utf8(buf.as_ref()).unwrap();
+        assert_eq!(s, "7\r\nfoo bar\r\nD\r\nbaz quux herp\r\n0\r\n\r\n");
+    }
+
+    #[test]
+    fn test_write_sized() {
+        use std::str::from_utf8;
+        let mut w = super::HttpWriter::SizedWriter(Vec::new(), 8);
+        w.write_all(b"foo bar").unwrap();
+        assert_eq!(w.write(b"baz").unwrap(), 1);
+
+        let buf = w.end().unwrap();
+        let s = from_utf8(buf.as_ref()).unwrap();
+        assert_eq!(s, "foo barb");
+    }
+
+    #[test]
+    fn test_read_chunk_size() {
+        fn read(s: &str, result: u64) {
+            assert_eq!(read_chunk_size(&mut s.as_bytes()).unwrap(), result);
+        }
+
+        fn read_err(s: &str) {
+            assert_eq!(read_chunk_size(&mut s.as_bytes()).unwrap_err().kind(),
+                io::ErrorKind::InvalidInput);
+        }
+
+        read("1\r\n", 1);
+        read("01\r\n", 1);
+        read("0\r\n", 0);
+        read("00\r\n", 0);
+        read("A\r\n", 10);
+        read("a\r\n", 10);
+        read("Ff\r\n", 255);
+        read("Ff   \r\n", 255);
+        // Missing LF or CRLF
+        read_err("F\rF");
+        read_err("F");
+        // Invalid hex digit
+        read_err("X\r\n");
+        read_err("1X\r\n");
+        read_err("-\r\n");
+        read_err("-1\r\n");
+        // Acceptable (if not fully valid) extensions do not influence the size
+        read("1;extension\r\n", 1);
+        read("a;ext name=value\r\n", 10);
+        read("1;extension;extension2\r\n", 1);
+        read("1;;;  ;\r\n", 1);
+        read("2; extension...\r\n", 2);
+        read("3   ; extension=123\r\n", 3);
+        read("3   ;\r\n", 3);
+        read("3   ;   \r\n", 3);
+        // Invalid extensions cause an error
+        read_err("1 invalid extension\r\n");
+        read_err("1 A\r\n");
+        read_err("1;no CRLF");
+    }
+
+    #[test]
+    fn test_read_sized_early_eof() {
+        let mut r = super::HttpReader::SizedReader(MockStream::with_input(b"foo bar"), 10);
+        let mut buf = [0u8; 10];
+        assert_eq!(r.read(&mut buf).unwrap(), 7);
+        let e = r.read(&mut buf).unwrap_err();
+        assert_eq!(e.kind(), io::ErrorKind::Other);
+        assert_eq!(e.description(), "early eof");
+    }
+
+    #[test]
+    fn test_read_chunked_early_eof() {
+        let mut r = super::HttpReader::ChunkedReader(MockStream::with_input(b"\
+            9\r\n\
+            foo bar\
+        "), None);
+
+        let mut buf = [0u8; 10];
+        assert_eq!(r.read(&mut buf).unwrap(), 7);
+        let e = r.read(&mut buf).unwrap_err();
+        assert_eq!(e.kind(), io::ErrorKind::Other);
+        assert_eq!(e.description(), "early eof");
+    }
+
+    #[test]
+    fn test_read_sized_zero_len_buf() {
+        let mut r = super::HttpReader::SizedReader(MockStream::with_input(b"foo bar"), 7);
+        let mut buf = [0u8; 0];
+        assert_eq!(r.read(&mut buf).unwrap(), 0);
+    }
+
+    #[test]
+    fn test_read_chunked_zero_len_buf() {
+        let mut r = super::HttpReader::ChunkedReader(MockStream::with_input(b"\
+            7\r\n\
+            foo bar\
+            0\r\n\r\n\
+        "), None);
+
+        let mut buf = [0u8; 0];
+        assert_eq!(r.read(&mut buf).unwrap(), 0);
+    }
+
+    #[test]
+    fn test_read_chunked_fully_consumes() {
+        let mut r = super::HttpReader::ChunkedReader(MockStream::with_input(b"0\r\n\r\n"), None);
+        let mut buf = [0; 1];
+        assert_eq!(r.read(&mut buf).unwrap(), 0);
+        assert_eq!(r.read(&mut buf).unwrap(), 0);
+
+        match r {
+            super::HttpReader::ChunkedReader(mut r, _) => assert_eq!(r.read(&mut buf).unwrap(), 0),
+            _ => unreachable!(),
+        }
+    }
+
+    #[test]
+    fn test_message_get_incoming_invalid_content_length() {
+        let raw = MockStream::with_input(
+            b"HTTP/1.1 200 OK\r\nContent-Length: asdf\r\n\r\n");
+        let mut msg = Http11Message::with_stream(Box::new(raw));
+        assert!(msg.get_incoming().is_err());
+        assert!(msg.close_connection().is_ok());
+    }
+
+    #[test]
+    fn test_parse_incoming() {
+        let mut raw = MockStream::with_input(b"GET /echo HTTP/1.1\r\nHost: hyper.rs\r\n\r\n");
+        let mut buf = BufReader::new(&mut raw);
+        parse_request(&mut buf).unwrap();
+    }
+
+    #[test]
+    fn test_parse_raw_status() {
+        let mut raw = MockStream::with_input(b"HTTP/1.1 200 OK\r\n\r\n");
+        let mut buf = BufReader::new(&mut raw);
+        let res = parse_response(&mut buf).unwrap();
+
+        assert_eq!(res.subject.1, "OK");
+
+        let mut raw = MockStream::with_input(b"HTTP/1.1 200 Howdy\r\n\r\n");
+        let mut buf = BufReader::new(&mut raw);
+        let res = parse_response(&mut buf).unwrap();
+
+        assert_eq!(res.subject.1, "Howdy");
+    }
+
+
+    #[test]
+    fn test_parse_tcp_closed() {
+        use std::io::ErrorKind;
+        use error::Error;
+
+        let mut empty = MockStream::new();
+        let mut buf = BufReader::new(&mut empty);
+        match parse_request(&mut buf) {
+            Err(Error::Io(ref e)) if e.kind() == ErrorKind::ConnectionAborted => (),
+            other => panic!("unexpected result: {:?}", other)
+        }
+    }
+
+    #[cfg(feature = "nightly")]
+    use test::Bencher;
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_parse_incoming(b: &mut Bencher) {
+        let mut raw = MockStream::with_input(b"GET /echo HTTP/1.1\r\nHost: hyper.rs\r\n\r\n");
+        let mut buf = BufReader::new(&mut raw);
+        b.iter(|| {
+            parse_request(&mut buf).unwrap();
+            buf.get_mut().read.set_position(0);
+        });
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/http/message.rs
@@ -0,0 +1,133 @@
+//! Defines the `HttpMessage` trait that serves to encapsulate the operations of a single
+//! request-response cycle on any HTTP connection.
+
+use std::any::{Any, TypeId};
+use std::fmt::Debug;
+use std::io::{Read, Write};
+use std::mem;
+
+use std::io;
+use std::time::Duration;
+
+use typeable::Typeable;
+
+use header::Headers;
+use http::RawStatus;
+use url::Url;
+
+use method;
+use version;
+use traitobject;
+
+/// The trait provides an API for creating new `HttpMessage`s depending on the underlying HTTP
+/// protocol.
+pub trait Protocol {
+    /// Creates a fresh `HttpMessage` bound to the given host, based on the given protocol scheme.
+    fn new_message(&self, host: &str, port: u16, scheme: &str) -> ::Result<Box<HttpMessage>>;
+}
+
+/// Describes a request.
+#[derive(Clone, Debug)]
+pub struct RequestHead {
+    /// The headers of the request
+    pub headers: Headers,
+    /// The method of the request
+    pub method: method::Method,
+    /// The URL of the request
+    pub url: Url,
+}
+
+/// Describes a response.
+#[derive(Clone, Debug)]
+pub struct ResponseHead {
+    /// The headers of the reponse
+    pub headers: Headers,
+    /// The raw status line of the response
+    pub raw_status: RawStatus,
+    /// The HTTP/2 version which generated the response
+    pub version: version::HttpVersion,
+}
+
+/// The trait provides an API for sending an receiving HTTP messages.
+pub trait HttpMessage: Write + Read + Send + Any + Typeable + Debug {
+    /// Initiates a new outgoing request.
+    ///
+    /// Only the request's head is provided (in terms of the `RequestHead` struct).
+    ///
+    /// After this, the `HttpMessage` instance can be used as an `io::Write` in order to write the
+    /// body of the request.
+    fn set_outgoing(&mut self, head: RequestHead) -> ::Result<RequestHead>;
+    /// Obtains the incoming response and returns its head (i.e. the `ResponseHead` struct)
+    ///
+    /// After this, the `HttpMessage` instance can be used as an `io::Read` in order to read out
+    /// the response body.
+    fn get_incoming(&mut self) -> ::Result<ResponseHead>;
+    /// Set the read timeout duration for this message.
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()>;
+    /// Set the write timeout duration for this message.
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()>;
+    /// Closes the underlying HTTP connection.
+    fn close_connection(&mut self) -> ::Result<()>;
+    /// Returns whether the incoming message has a body.
+    fn has_body(&self) -> bool;
+    /// Called when the Client wishes to use a Proxy.
+    fn set_proxied(&mut self, val: bool) {
+        // default implementation so as to not be a breaking change.
+        warn!("default set_proxied({:?})", val);
+    }
+}
+
+impl HttpMessage {
+    unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
+        mem::transmute(traitobject::data(self))
+    }
+
+    unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T {
+        mem::transmute(traitobject::data_mut(self))
+    }
+
+    unsafe fn downcast_unchecked<T: 'static>(self: Box<HttpMessage>) -> Box<T>  {
+        let raw: *mut HttpMessage = mem::transmute(self);
+        mem::transmute(traitobject::data_mut(raw))
+    }
+}
+
+impl HttpMessage {
+    /// Is the underlying type in this trait object a T?
+    #[inline]
+    pub fn is<T: Any>(&self) -> bool {
+        (*self).get_type() == TypeId::of::<T>()
+    }
+
+    /// If the underlying type is T, get a reference to the contained data.
+    #[inline]
+    pub fn downcast_ref<T: Any>(&self) -> Option<&T> {
+        if self.is::<T>() {
+            Some(unsafe { self.downcast_ref_unchecked() })
+        } else {
+            None
+        }
+    }
+
+    /// If the underlying type is T, get a mutable reference to the contained
+    /// data.
+    #[inline]
+    pub fn downcast_mut<T: Any>(&mut self) -> Option<&mut T> {
+        if self.is::<T>() {
+            Some(unsafe { self.downcast_mut_unchecked() })
+        } else {
+            None
+        }
+    }
+
+    /// If the underlying type is T, extract it.
+    #[inline]
+    pub fn downcast<T: Any>(self: Box<HttpMessage>)
+            -> Result<Box<T>, Box<HttpMessage>> {
+        if self.is::<T>() {
+            Ok(unsafe { self.downcast_unchecked() })
+        } else {
+            Err(self)
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/http/mod.rs
@@ -0,0 +1,46 @@
+//! Pieces pertaining to the HTTP message protocol.
+use std::borrow::Cow;
+
+use header::Connection;
+use header::ConnectionOption::{KeepAlive, Close};
+use header::Headers;
+use version::HttpVersion;
+use version::HttpVersion::{Http10, Http11};
+
+
+pub use self::message::{HttpMessage, RequestHead, ResponseHead, Protocol};
+
+pub mod h1;
+pub mod message;
+
+/// The raw status code and reason-phrase.
+#[derive(Clone, PartialEq, Debug)]
+pub struct RawStatus(pub u16, pub Cow<'static, str>);
+
+/// Checks if a connection should be kept alive.
+#[inline]
+pub fn should_keep_alive(version: HttpVersion, headers: &Headers) -> bool {
+    trace!("should_keep_alive( {:?}, {:?} )", version, headers.get::<Connection>());
+    match (version, headers.get::<Connection>()) {
+        (Http10, None) => false,
+        (Http10, Some(conn)) if !conn.contains(&KeepAlive) => false,
+        (Http11, Some(conn)) if conn.contains(&Close)  => false,
+        _ => true
+    }
+}
+
+#[test]
+fn test_should_keep_alive() {
+    let mut headers = Headers::new();
+
+    assert!(!should_keep_alive(Http10, &headers));
+    assert!(should_keep_alive(Http11, &headers));
+
+    headers.set(Connection::close());
+    assert!(!should_keep_alive(Http10, &headers));
+    assert!(!should_keep_alive(Http11, &headers));
+
+    headers.set(Connection::keep_alive());
+    assert!(should_keep_alive(Http10, &headers));
+    assert!(should_keep_alive(Http11, &headers));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/lib.rs
@@ -0,0 +1,215 @@
+#![doc(html_root_url = "https://hyper.rs/hyper/v0.10.10/hyper")]
+#![cfg_attr(test, deny(missing_docs))]
+#![cfg_attr(test, deny(warnings))]
+#![cfg_attr(all(test, feature = "nightly"), feature(test))]
+
+//! # Hyper
+//!
+//! Hyper is a fast, modern HTTP implementation written in and for Rust. It
+//! is a low-level typesafe abstraction over raw HTTP, providing an elegant
+//! layer over "stringly-typed" HTTP.
+//!
+//! Hyper offers both a [Client](client/index.html) and a
+//! [Server](server/index.html) which can be used to drive complex web
+//! applications written entirely in Rust.
+//!
+//! ## Internal Design
+//!
+//! Hyper is designed as a relatively low-level wrapper over raw HTTP. It should
+//! allow the implementation of higher-level abstractions with as little pain as
+//! possible, and should not irrevocably hide any information from its users.
+//!
+//! ### Common Functionality
+//!
+//! Functionality and code shared between the Server and Client implementations
+//! can be found in `src` directly - this includes `NetworkStream`s, `Method`s,
+//! `StatusCode`, and so on.
+//!
+//! #### Methods
+//!
+//! Methods are represented as a single `enum` to remain as simple as possible.
+//! Extension Methods are represented as raw `String`s. A method's safety and
+//! idempotence can be accessed using the `safe` and `idempotent` methods.
+//!
+//! #### StatusCode
+//!
+//! Status codes are also represented as a single, exhaustive, `enum`. This
+//! representation is efficient, typesafe, and ergonomic as it allows the use of
+//! `match` to disambiguate known status codes.
+//!
+//! #### Headers
+//!
+//! Hyper's [header](header/index.html) representation is likely the most
+//! complex API exposed by Hyper.
+//!
+//! Hyper's headers are an abstraction over an internal `HashMap` and provides a
+//! typesafe API for interacting with headers that does not rely on the use of
+//! "string-typing."
+//!
+//! Each HTTP header in Hyper has an associated type and implementation of the
+//! `Header` trait, which defines an HTTP headers name as a string, how to parse
+//! that header, and how to format that header.
+//!
+//! Headers are then parsed from the string representation lazily when the typed
+//! representation of a header is requested and formatted back into their string
+//! representation when headers are written back to the client.
+//!
+//! #### NetworkStream and NetworkAcceptor
+//!
+//! These are found in `src/net.rs` and define the interface that acceptors and
+//! streams must fulfill for them to be used within Hyper. They are by and large
+//! internal tools and you should only need to mess around with them if you want to
+//! mock or replace `TcpStream` and `TcpAcceptor`.
+//!
+//! ### Server
+//!
+//! Server-specific functionality, such as `Request` and `Response`
+//! representations, are found in in `src/server`.
+//!
+//! #### Handler + Server
+//!
+//! A `Handler` in Hyper accepts a `Request` and `Response`. This is where
+//! user-code can handle each connection. The server accepts connections in a
+//! task pool with a customizable number of threads, and passes the Request /
+//! Response to the handler.
+//!
+//! #### Request
+//!
+//! An incoming HTTP Request is represented as a struct containing
+//! a `Reader` over a `NetworkStream`, which represents the body, headers, a remote
+//! address, an HTTP version, and a `Method` - relatively standard stuff.
+//!
+//! `Request` implements `Reader` itself, meaning that you can ergonomically get
+//! the body out of a `Request` using standard `Reader` methods and helpers.
+//!
+//! #### Response
+//!
+//! An outgoing HTTP Response is also represented as a struct containing a `Writer`
+//! over a `NetworkStream` which represents the Response body in addition to
+//! standard items such as the `StatusCode` and HTTP version. `Response`'s `Writer`
+//! implementation provides a streaming interface for sending data over to the
+//! client.
+//!
+//! One of the traditional problems with representing outgoing HTTP Responses is
+//! tracking the write-status of the Response - have we written the status-line,
+//! the headers, the body, etc.? Hyper tracks this information statically using the
+//! type system and prevents you, using the type system, from writing headers after
+//! you have started writing to the body or vice versa.
+//!
+//! Hyper does this through a phantom type parameter in the definition of Response,
+//! which tracks whether you are allowed to write to the headers or the body. This
+//! phantom type can have two values `Fresh` or `Streaming`, with `Fresh`
+//! indicating that you can write the headers and `Streaming` indicating that you
+//! may write to the body, but not the headers.
+//!
+//! ### Client
+//!
+//! Client-specific functionality, such as `Request` and `Response`
+//! representations, are found in `src/client`.
+//!
+//! #### Request
+//!
+//! An outgoing HTTP Request is represented as a struct containing a `Writer` over
+//! a `NetworkStream` which represents the Request body in addition to the standard
+//! information such as headers and the request method.
+//!
+//! Outgoing Requests track their write-status in almost exactly the same way as
+//! outgoing HTTP Responses do on the Server, so we will defer to the explanation
+//! in the documentation for server Response.
+//!
+//! Requests expose an efficient streaming interface instead of a builder pattern,
+//! but they also provide the needed interface for creating a builder pattern over
+//! the API exposed by core Hyper.
+//!
+//! #### Response
+//!
+//! Incoming HTTP Responses are represented as a struct containing a `Reader` over
+//! a `NetworkStream` and contain headers, a status, and an http version. They
+//! implement `Reader` and can be read to get the data out of a `Response`.
+//!
+
+extern crate base64;
+extern crate time;
+#[macro_use] extern crate url;
+extern crate unicase;
+extern crate httparse;
+extern crate num_cpus;
+extern crate traitobject;
+extern crate typeable;
+
+#[cfg_attr(test, macro_use)]
+extern crate language_tags;
+
+#[macro_use]
+extern crate mime as mime_crate;
+
+#[macro_use]
+extern crate log;
+
+#[cfg(all(test, feature = "nightly"))]
+extern crate test;
+
+
+pub use url::Url;
+pub use client::Client;
+pub use error::{Result, Error};
+pub use method::Method::{Get, Head, Post, Delete};
+pub use status::StatusCode::{Ok, BadRequest, NotFound};
+pub use server::Server;
+pub use language_tags::LanguageTag;
+
+macro_rules! todo(
+    ($($arg:tt)*) => (if cfg!(not(ndebug)) {
+        trace!("TODO: {:?}", format_args!($($arg)*))
+    })
+);
+
+macro_rules! inspect(
+    ($name:expr, $value:expr) => ({
+        let v = $value;
+        trace!("inspect: {:?} = {:?}", $name, v);
+        v
+    })
+);
+
+macro_rules! deprecated {
+    (#[$note:meta] $i:item) => (
+        #[cfg_attr(has_deprecated, $note)]
+        $i
+    );
+}
+
+#[cfg(test)]
+#[macro_use]
+mod mock;
+#[doc(hidden)]
+pub mod buffer;
+pub mod client;
+pub mod error;
+pub mod method;
+pub mod header;
+pub mod http;
+pub mod net;
+pub mod server;
+pub mod status;
+pub mod uri;
+pub mod version;
+
+/// Re-exporting the mime crate, for convenience.
+pub mod mime {
+    pub use mime_crate::*;
+}
+
+#[allow(unconditional_recursion)]
+fn _assert_send<T: Send>() {
+    _assert_send::<Client>();
+    _assert_send::<client::Request<net::Fresh>>();
+    _assert_send::<client::Response>();
+    _assert_send::<error::Error>();
+}
+
+#[allow(unconditional_recursion)]
+fn _assert_sync<T: Sync>() {
+    _assert_sync::<Client>();
+    _assert_sync::<error::Error>();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/method.rs
@@ -0,0 +1,183 @@
+//! The HTTP request method
+use std::fmt;
+use std::str::FromStr;
+use std::convert::AsRef;
+
+use error::Error;
+use self::Method::{Options, Get, Post, Put, Delete, Head, Trace, Connect, Patch,
+                   Extension};
+
+
+/// The Request Method (VERB)
+///
+/// Currently includes 8 variants representing the 8 methods defined in
+/// [RFC 7230](https://tools.ietf.org/html/rfc7231#section-4.1), plus PATCH,
+/// and an Extension variant for all extensions.
+///
+/// It may make sense to grow this to include all variants currently
+/// registered with IANA, if they are at all common to use.
+#[derive(Clone, PartialEq, Eq, Hash, Debug)]
+pub enum Method {
+    /// OPTIONS
+    Options,
+    /// GET
+    Get,
+    /// POST
+    Post,
+    /// PUT
+    Put,
+    /// DELETE
+    Delete,
+    /// HEAD
+    Head,
+    /// TRACE
+    Trace,
+    /// CONNECT
+    Connect,
+    /// PATCH
+    Patch,
+    /// Method extensions. An example would be `let m = Extension("FOO".to_string())`.
+    Extension(String)
+}
+
+impl AsRef<str> for Method {
+    fn as_ref(&self) -> &str {
+        match *self {
+            Options => "OPTIONS",
+            Get => "GET",
+            Post => "POST",
+            Put => "PUT",
+            Delete => "DELETE",
+            Head => "HEAD",
+            Trace => "TRACE",
+            Connect => "CONNECT",
+            Patch => "PATCH",
+            Extension(ref s) => s.as_ref()
+        }
+    }
+}
+
+impl Method {
+    /// Whether a method is considered "safe", meaning the request is
+    /// essentially read-only.
+    ///
+    /// See [the spec](https://tools.ietf.org/html/rfc7231#section-4.2.1)
+    /// for more words.
+    pub fn safe(&self) -> bool {
+        match *self {
+            Get | Head | Options | Trace => true,
+            _ => false
+        }
+    }
+
+    /// Whether a method is considered "idempotent", meaning the request has
+    /// the same result is executed multiple times.
+    ///
+    /// See [the spec](https://tools.ietf.org/html/rfc7231#section-4.2.2) for
+    /// more words.
+    pub fn idempotent(&self) -> bool {
+        if self.safe() {
+            true
+        } else {
+            match *self {
+                Put | Delete => true,
+                _ => false
+            }
+        }
+    }
+}
+
+impl FromStr for Method {
+    type Err = Error;
+    fn from_str(s: &str) -> Result<Method, Error> {
+        if s == "" {
+            Err(Error::Method)
+        } else {
+            Ok(match s {
+                "OPTIONS" => Options,
+                "GET" => Get,
+                "POST" => Post,
+                "PUT" => Put,
+                "DELETE" => Delete,
+                "HEAD" => Head,
+                "TRACE" => Trace,
+                "CONNECT" => Connect,
+                "PATCH" => Patch,
+                _ => Extension(s.to_owned())
+            })
+        }
+    }
+}
+
+impl fmt::Display for Method {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.write_str(match *self {
+            Options => "OPTIONS",
+            Get => "GET",
+            Post => "POST",
+            Put => "PUT",
+            Delete => "DELETE",
+            Head => "HEAD",
+            Trace => "TRACE",
+            Connect => "CONNECT",
+            Patch => "PATCH",
+            Extension(ref s) => s.as_ref()
+        })
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::collections::HashMap;
+    use std::str::FromStr;
+    use error::Error;
+    use super::Method;
+    use super::Method::{Get, Post, Put, Extension};
+
+    #[test]
+    fn test_safe() {
+        assert_eq!(true, Get.safe());
+        assert_eq!(false, Post.safe());
+    }
+
+    #[test]
+    fn test_idempotent() {
+        assert_eq!(true, Get.idempotent());
+        assert_eq!(true, Put.idempotent());
+        assert_eq!(false, Post.idempotent());
+    }
+
+    #[test]
+    fn test_from_str() {
+        assert_eq!(Get, FromStr::from_str("GET").unwrap());
+        assert_eq!(Extension("MOVE".to_owned()),
+                   FromStr::from_str("MOVE").unwrap());
+        let x: Result<Method, _> = FromStr::from_str("");
+        if let Err(Error::Method) = x {
+        } else {
+            panic!("An empty method is invalid!")
+        }
+    }
+
+    #[test]
+    fn test_fmt() {
+        assert_eq!("GET".to_owned(), format!("{}", Get));
+        assert_eq!("MOVE".to_owned(),
+                   format!("{}", Extension("MOVE".to_owned())));
+    }
+
+    #[test]
+    fn test_hashable() {
+        let mut counter: HashMap<Method,usize> = HashMap::new();
+        counter.insert(Get, 1);
+        assert_eq!(Some(&1), counter.get(&Get));
+    }
+
+    #[test]
+    fn test_as_str() {
+        assert_eq!(Get.as_ref(), "GET");
+        assert_eq!(Post.as_ref(), "POST");
+        assert_eq!(Put.as_ref(), "PUT");
+        assert_eq!(Extension("MOVE".to_owned()).as_ref(), "MOVE");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/mock.rs
@@ -0,0 +1,166 @@
+use std::io::{self, Read, Write, Cursor};
+use std::net::{SocketAddr, Shutdown};
+use std::time::Duration;
+use std::cell::Cell;
+
+use net::{NetworkStream, NetworkConnector, SslClient};
+
+#[derive(Clone, Debug)]
+pub struct MockStream {
+    pub read: Cursor<Vec<u8>>,
+    next_reads: Vec<Vec<u8>>,
+    pub write: Vec<u8>,
+    pub is_closed: bool,
+    pub error_on_write: bool,
+    pub error_on_read: bool,
+    pub read_timeout: Cell<Option<Duration>>,
+    pub write_timeout: Cell<Option<Duration>>,
+}
+
+impl PartialEq for MockStream {
+    fn eq(&self, other: &MockStream) -> bool {
+        self.read.get_ref() == other.read.get_ref() && self.write == other.write
+    }
+}
+
+impl MockStream {
+    pub fn new() -> MockStream {
+        MockStream::with_input(b"")
+    }
+
+    pub fn with_input(input: &[u8]) -> MockStream {
+        MockStream::with_responses(vec![input])
+    }
+
+    pub fn with_responses(mut responses: Vec<&[u8]>) -> MockStream {
+        MockStream {
+            read: Cursor::new(responses.remove(0).to_vec()),
+            next_reads: responses.into_iter().map(|arr| arr.to_vec()).collect(),
+            write: vec![],
+            is_closed: false,
+            error_on_write: false,
+            error_on_read: false,
+            read_timeout: Cell::new(None),
+            write_timeout: Cell::new(None),
+        }
+    }
+}
+
+impl Read for MockStream {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        if self.error_on_read {
+            Err(io::Error::new(io::ErrorKind::Other, "mock error"))
+        } else {
+            match self.read.read(buf) {
+                Ok(n) => {
+                    if self.read.position() as usize == self.read.get_ref().len() {
+                        if self.next_reads.len() > 0 {
+                            self.read = Cursor::new(self.next_reads.remove(0));
+                        }
+                    }
+                    Ok(n)
+                },
+                r => r
+            }
+        }
+    }
+}
+
+impl Write for MockStream {
+    fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
+        if self.error_on_write {
+            Err(io::Error::new(io::ErrorKind::Other, "mock error"))
+        } else {
+            Write::write(&mut self.write, msg)
+        }
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        Ok(())
+    }
+}
+
+impl NetworkStream for MockStream {
+    fn peer_addr(&mut self) -> io::Result<SocketAddr> {
+        Ok("127.0.0.1:1337".parse().unwrap())
+    }
+
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.read_timeout.set(dur);
+        Ok(())
+    }
+
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.write_timeout.set(dur);
+        Ok(())
+    }
+
+    fn close(&mut self, _how: Shutdown) -> io::Result<()> {
+        self.is_closed = true;
+        Ok(())
+    }
+}
+
+pub struct MockConnector;
+
+impl NetworkConnector for MockConnector {
+    type Stream = MockStream;
+
+    fn connect(&self, _host: &str, _port: u16, _scheme: &str) -> ::Result<MockStream> {
+        Ok(MockStream::new())
+    }
+}
+
+/// new connectors must be created if you wish to intercept requests.
+macro_rules! mock_connector (
+    ($name:ident {
+        $($url:expr => $res:expr)*
+    }) => (
+
+        struct $name;
+
+        impl $crate::net::NetworkConnector for $name {
+            type Stream = ::mock::MockStream;
+            fn connect(&self, host: &str, port: u16, scheme: &str)
+                    -> $crate::Result<::mock::MockStream> {
+                use std::collections::HashMap;
+                debug!("MockStream::connect({:?}, {:?}, {:?})", host, port, scheme);
+                let mut map = HashMap::new();
+                $(map.insert($url, $res);)*
+
+
+                let key = format!("{}://{}", scheme, host);
+                // ignore port for now
+                match map.get(&*key) {
+                    Some(&res) => Ok($crate::mock::MockStream::with_input(res.as_bytes())),
+                    None => panic!("{:?} doesn't know url {}", stringify!($name), key)
+                }
+            }
+        }
+
+    );
+
+    ($name:ident { $($response:expr),+ }) => (
+        struct $name;
+
+        impl $crate::net::NetworkConnector for $name {
+            type Stream = $crate::mock::MockStream;
+            fn connect(&self, _: &str, _: u16, _: &str)
+                    -> $crate::Result<$crate::mock::MockStream> {
+                Ok($crate::mock::MockStream::with_responses(vec![
+                    $($response),+
+                ]))
+            }
+        }
+    );
+);
+
+#[derive(Debug, Default)]
+pub struct MockSsl;
+
+impl<T: NetworkStream + Send + Clone> SslClient<T> for MockSsl {
+    type Stream = T;
+    fn wrap_client(&self, stream: T, _host: &str) -> ::Result<T> {
+        Ok(stream)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/net.rs
@@ -0,0 +1,638 @@
+//! A collection of traits abstracting over Listeners and Streams.
+use std::any::{Any, TypeId};
+use std::fmt;
+use std::io::{self, ErrorKind, Read, Write};
+use std::net::{SocketAddr, ToSocketAddrs, TcpStream, TcpListener, Shutdown};
+use std::mem;
+use std::sync::Arc;
+
+use std::time::Duration;
+
+use typeable::Typeable;
+use traitobject;
+
+/// The write-status indicating headers have not been written.
+pub enum Fresh {}
+
+/// The write-status indicating headers have been written.
+pub enum Streaming {}
+
+/// An abstraction to listen for connections on a certain port.
+pub trait NetworkListener: Clone {
+    /// The stream produced for each connection.
+    type Stream: NetworkStream + Send + Clone;
+
+    /// Returns an iterator of streams.
+    fn accept(&mut self) -> ::Result<Self::Stream>;
+
+    /// Get the address this Listener ended up listening on.
+    fn local_addr(&mut self) -> io::Result<SocketAddr>;
+
+    /// Returns an iterator over incoming connections.
+    fn incoming(&mut self) -> NetworkConnections<Self> {
+        NetworkConnections(self)
+    }
+
+    /// Sets the read timeout for all streams that are accepted
+    fn set_read_timeout(&mut self, _: Option<Duration>) {
+        // This default implementation is only here to prevent the addition of
+        // these methods from being a breaking change. They should be removed
+        // when the next breaking release is made.
+        warn!("Ignoring read timeout");
+    }
+
+    /// Sets the write timeout for all streams that are accepted
+    fn set_write_timeout(&mut self, _: Option<Duration>) {
+        // This default implementation is only here to prevent the addition of
+        // these methods from being a breaking change. They should be removed
+        // when the next breaking release is made.
+        warn!("Ignoring write timeout");
+    }
+}
+
+/// An iterator wrapper over a `NetworkAcceptor`.
+pub struct NetworkConnections<'a, N: NetworkListener + 'a>(&'a mut N);
+
+impl<'a, N: NetworkListener + 'a> Iterator for NetworkConnections<'a, N> {
+    type Item = ::Result<N::Stream>;
+    fn next(&mut self) -> Option<::Result<N::Stream>> {
+        Some(self.0.accept())
+    }
+}
+
+/// An abstraction over streams that a `Server` can utilize.
+pub trait NetworkStream: Read + Write + Any + Send + Typeable {
+    /// Get the remote address of the underlying connection.
+    fn peer_addr(&mut self) -> io::Result<SocketAddr>;
+
+    /// Set the maximum time to wait for a read to complete.
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()>;
+
+    /// Set the maximum time to wait for a write to complete.
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()>;
+
+    /// This will be called when Stream should no longer be kept alive.
+    #[inline]
+    fn close(&mut self, _how: Shutdown) -> io::Result<()> {
+        Ok(())
+    }
+
+    // Unsure about name and implementation...
+
+    #[doc(hidden)]
+    fn set_previous_response_expected_no_content(&mut self, _expected: bool) { }
+
+    #[doc(hidden)]
+    fn previous_response_expected_no_content(&self) -> bool {
+        false
+    }
+}
+
+/// A connector creates a NetworkStream.
+pub trait NetworkConnector {
+    /// Type of `Stream` to create
+    type Stream: Into<Box<NetworkStream + Send>>;
+
+    /// Connect to a remote address.
+    fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<Self::Stream>;
+}
+
+impl<T: NetworkStream + Send> From<T> for Box<NetworkStream + Send> {
+    fn from(s: T) -> Box<NetworkStream + Send> {
+        Box::new(s)
+    }
+}
+
+impl fmt::Debug for Box<NetworkStream + Send> {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.pad("Box<NetworkStream>")
+    }
+}
+
+impl NetworkStream {
+    unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
+        mem::transmute(traitobject::data(self))
+    }
+
+    unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T {
+        mem::transmute(traitobject::data_mut(self))
+    }
+
+    unsafe fn downcast_unchecked<T: 'static>(self: Box<NetworkStream>) -> Box<T>  {
+        let raw: *mut NetworkStream = mem::transmute(self);
+        mem::transmute(traitobject::data_mut(raw))
+    }
+}
+
+impl NetworkStream {
+    /// Is the underlying type in this trait object a `T`?
+    #[inline]
+    pub fn is<T: Any>(&self) -> bool {
+        (*self).get_type() == TypeId::of::<T>()
+    }
+
+    /// If the underlying type is `T`, get a reference to the contained data.
+    #[inline]
+    pub fn downcast_ref<T: Any>(&self) -> Option<&T> {
+        if self.is::<T>() {
+            Some(unsafe { self.downcast_ref_unchecked() })
+        } else {
+            None
+        }
+    }
+
+    /// If the underlying type is `T`, get a mutable reference to the contained
+    /// data.
+    #[inline]
+    pub fn downcast_mut<T: Any>(&mut self) -> Option<&mut T> {
+        if self.is::<T>() {
+            Some(unsafe { self.downcast_mut_unchecked() })
+        } else {
+            None
+        }
+    }
+
+    /// If the underlying type is `T`, extract it.
+    #[inline]
+    pub fn downcast<T: Any>(self: Box<NetworkStream>)
+            -> Result<Box<T>, Box<NetworkStream>> {
+        if self.is::<T>() {
+            Ok(unsafe { self.downcast_unchecked() })
+        } else {
+            Err(self)
+        }
+    }
+}
+
+impl NetworkStream + Send {
+    unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
+        mem::transmute(traitobject::data(self))
+    }
+
+    unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T {
+        mem::transmute(traitobject::data_mut(self))
+    }
+
+    unsafe fn downcast_unchecked<T: 'static>(self: Box<NetworkStream + Send>) -> Box<T>  {
+        let raw: *mut NetworkStream = mem::transmute(self);
+        mem::transmute(traitobject::data_mut(raw))
+    }
+}
+
+impl NetworkStream + Send {
+    /// Is the underlying type in this trait object a `T`?
+    #[inline]
+    pub fn is<T: Any>(&self) -> bool {
+        (*self).get_type() == TypeId::of::<T>()
+    }
+
+    /// If the underlying type is `T`, get a reference to the contained data.
+    #[inline]
+    pub fn downcast_ref<T: Any>(&self) -> Option<&T> {
+        if self.is::<T>() {
+            Some(unsafe { self.downcast_ref_unchecked() })
+        } else {
+            None
+        }
+    }
+
+    /// If the underlying type is `T`, get a mutable reference to the contained
+    /// data.
+    #[inline]
+    pub fn downcast_mut<T: Any>(&mut self) -> Option<&mut T> {
+        if self.is::<T>() {
+            Some(unsafe { self.downcast_mut_unchecked() })
+        } else {
+            None
+        }
+    }
+
+    /// If the underlying type is `T`, extract it.
+    #[inline]
+    pub fn downcast<T: Any>(self: Box<NetworkStream + Send>)
+            -> Result<Box<T>, Box<NetworkStream + Send>> {
+        if self.is::<T>() {
+            Ok(unsafe { self.downcast_unchecked() })
+        } else {
+            Err(self)
+        }
+    }
+}
+
+/// A `NetworkListener` for `HttpStream`s.
+#[derive(Clone)]
+pub struct HttpListener {
+    listener: Arc<TcpListener>,
+
+    read_timeout : Option<Duration>,
+    write_timeout: Option<Duration>,
+}
+
+impl From<TcpListener> for HttpListener {
+    fn from(listener: TcpListener) -> HttpListener {
+        HttpListener {
+            listener: Arc::new(listener),
+
+            read_timeout : None,
+            write_timeout: None,
+        }
+    }
+}
+
+impl HttpListener {
+    /// Start listening to an address over HTTP.
+    pub fn new<To: ToSocketAddrs>(addr: To) -> ::Result<HttpListener> {
+        Ok(HttpListener::from(try!(TcpListener::bind(addr))))
+    }
+}
+
+impl NetworkListener for HttpListener {
+    type Stream = HttpStream;
+
+    #[inline]
+    fn accept(&mut self) -> ::Result<HttpStream> {
+        let stream = HttpStream(try!(self.listener.accept()).0);
+        try!(stream.set_read_timeout(self.read_timeout));
+        try!(stream.set_write_timeout(self.write_timeout));
+        Ok(stream)
+    }
+
+    #[inline]
+    fn local_addr(&mut self) -> io::Result<SocketAddr> {
+        self.listener.local_addr()
+    }
+
+    fn set_read_timeout(&mut self, duration: Option<Duration>) {
+        self.read_timeout = duration;
+    }
+
+    fn set_write_timeout(&mut self, duration: Option<Duration>) {
+        self.write_timeout = duration;
+    }
+}
+
+#[cfg(windows)]
+impl ::std::os::windows::io::AsRawSocket for HttpListener {
+    fn as_raw_socket(&self) -> ::std::os::windows::io::RawSocket {
+        self.listener.as_raw_socket()
+    }
+}
+
+#[cfg(windows)]
+impl ::std::os::windows::io::FromRawSocket for HttpListener {
+    unsafe fn from_raw_socket(sock: ::std::os::windows::io::RawSocket) -> HttpListener {
+        HttpListener::from(TcpListener::from_raw_socket(sock))
+    }
+}
+
+#[cfg(unix)]
+impl ::std::os::unix::io::AsRawFd for HttpListener {
+    fn as_raw_fd(&self) -> ::std::os::unix::io::RawFd {
+        self.listener.as_raw_fd()
+    }
+}
+
+#[cfg(unix)]
+impl ::std::os::unix::io::FromRawFd for HttpListener {
+    unsafe fn from_raw_fd(fd: ::std::os::unix::io::RawFd) -> HttpListener {
+        HttpListener::from(TcpListener::from_raw_fd(fd))
+    }
+}
+
+/// A wrapper around a `TcpStream`.
+pub struct HttpStream(pub TcpStream);
+
+impl Clone for HttpStream {
+    #[inline]
+    fn clone(&self) -> HttpStream {
+        HttpStream(self.0.try_clone().unwrap())
+    }
+}
+
+impl fmt::Debug for HttpStream {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str("HttpStream(_)")
+    }
+}
+
+impl Read for HttpStream {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.0.read(buf)
+    }
+}
+
+impl Write for HttpStream {
+    #[inline]
+    fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
+        self.0.write(msg)
+    }
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        self.0.flush()
+    }
+}
+
+#[cfg(windows)]
+impl ::std::os::windows::io::AsRawSocket for HttpStream {
+    fn as_raw_socket(&self) -> ::std::os::windows::io::RawSocket {
+        self.0.as_raw_socket()
+    }
+}
+
+#[cfg(windows)]
+impl ::std::os::windows::io::FromRawSocket for HttpStream {
+    unsafe fn from_raw_socket(sock: ::std::os::windows::io::RawSocket) -> HttpStream {
+        HttpStream(TcpStream::from_raw_socket(sock))
+    }
+}
+
+#[cfg(unix)]
+impl ::std::os::unix::io::AsRawFd for HttpStream {
+    fn as_raw_fd(&self) -> ::std::os::unix::io::RawFd {
+        self.0.as_raw_fd()
+    }
+}
+
+#[cfg(unix)]
+impl ::std::os::unix::io::FromRawFd for HttpStream {
+    unsafe fn from_raw_fd(fd: ::std::os::unix::io::RawFd) -> HttpStream {
+        HttpStream(TcpStream::from_raw_fd(fd))
+    }
+}
+
+impl NetworkStream for HttpStream {
+    #[inline]
+    fn peer_addr(&mut self) -> io::Result<SocketAddr> {
+            self.0.peer_addr()
+    }
+
+    #[inline]
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.0.set_read_timeout(dur)
+    }
+
+    #[inline]
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        self.0.set_write_timeout(dur)
+    }
+
+    #[inline]
+    fn close(&mut self, how: Shutdown) -> io::Result<()> {
+        match self.0.shutdown(how) {
+            Ok(_) => Ok(()),
+            // see https://github.com/hyperium/hyper/issues/508
+            Err(ref e) if e.kind() == ErrorKind::NotConnected => Ok(()),
+            err => err
+        }
+    }
+}
+
+/// A connector that will produce HttpStreams.
+#[derive(Debug, Clone, Default)]
+pub struct HttpConnector;
+
+impl NetworkConnector for HttpConnector {
+    type Stream = HttpStream;
+
+    fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<HttpStream> {
+        let addr = &(host, port);
+        Ok(try!(match scheme {
+            "http" => {
+                debug!("http scheme");
+                Ok(HttpStream(try!(TcpStream::connect(addr))))
+            },
+            _ => {
+                Err(io::Error::new(io::ErrorKind::InvalidInput,
+                                "Invalid scheme for Http"))
+            }
+        }))
+    }
+}
+
+/// A closure as a connector used to generate `TcpStream`s per request
+///
+/// # Example
+///
+/// Basic example:
+///
+/// ```norun
+/// Client::with_connector(|addr: &str, port: u16, scheme: &str| {
+///     TcpStream::connect(&(addr, port))
+/// });
+/// ```
+///
+/// Example using `TcpBuilder` from the net2 crate if you want to configure your source socket:
+///
+/// ```norun
+/// Client::with_connector(|addr: &str, port: u16, scheme: &str| {
+///     let b = try!(TcpBuilder::new_v4());
+///     try!(b.bind("127.0.0.1:0"));
+///     b.connect(&(addr, port))
+/// });
+/// ```
+impl<F> NetworkConnector for F where F: Fn(&str, u16, &str) -> io::Result<TcpStream> {
+    type Stream = HttpStream;
+
+    fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<HttpStream> {
+        Ok(HttpStream(try!((*self)(host, port, scheme))))
+    }
+}
+
+/// An abstraction to allow any SSL implementation to be used with client-side HttpsStreams.
+pub trait SslClient<T: NetworkStream + Send + Clone = HttpStream> {
+    /// The protected stream.
+    type Stream: NetworkStream + Send + Clone;
+    /// Wrap a client stream with SSL.
+    fn wrap_client(&self, stream: T, host: &str) -> ::Result<Self::Stream>;
+}
+
+/// An abstraction to allow any SSL implementation to be used with server-side HttpsStreams.
+pub trait SslServer<T: NetworkStream + Send + Clone = HttpStream> {
+    /// The protected stream.
+    type Stream: NetworkStream + Send + Clone;
+    /// Wrap a server stream with SSL.
+    fn wrap_server(&self, stream: T) -> ::Result<Self::Stream>;
+}
+
+/// A stream over the HTTP protocol, possibly protected by SSL.
+#[derive(Debug, Clone)]
+pub enum HttpsStream<S: NetworkStream> {
+    /// A plain text stream.
+    Http(HttpStream),
+    /// A stream protected by SSL.
+    Https(S)
+}
+
+impl<S: NetworkStream> Read for HttpsStream<S> {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match *self {
+            HttpsStream::Http(ref mut s) => s.read(buf),
+            HttpsStream::Https(ref mut s) => s.read(buf)
+        }
+    }
+}
+
+impl<S: NetworkStream> Write for HttpsStream<S> {
+    #[inline]
+    fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
+        match *self {
+            HttpsStream::Http(ref mut s) => s.write(msg),
+            HttpsStream::Https(ref mut s) => s.write(msg)
+        }
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        match *self {
+            HttpsStream::Http(ref mut s) => s.flush(),
+            HttpsStream::Https(ref mut s) => s.flush()
+        }
+    }
+}
+
+impl<S: NetworkStream> NetworkStream for HttpsStream<S> {
+    #[inline]
+    fn peer_addr(&mut self) -> io::Result<SocketAddr> {
+        match *self {
+            HttpsStream::Http(ref mut s) => s.peer_addr(),
+            HttpsStream::Https(ref mut s) => s.peer_addr()
+        }
+    }
+
+    #[inline]
+    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        match *self {
+            HttpsStream::Http(ref inner) => inner.0.set_read_timeout(dur),
+            HttpsStream::Https(ref inner) => inner.set_read_timeout(dur)
+        }
+    }
+
+    #[inline]
+    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
+        match *self {
+            HttpsStream::Http(ref inner) => inner.0.set_write_timeout(dur),
+            HttpsStream::Https(ref inner) => inner.set_write_timeout(dur)
+        }
+    }
+
+    #[inline]
+    fn close(&mut self, how: Shutdown) -> io::Result<()> {
+        match *self {
+            HttpsStream::Http(ref mut s) => s.close(how),
+            HttpsStream::Https(ref mut s) => s.close(how)
+        }
+    }
+}
+
+/// A Http Listener over SSL.
+#[derive(Clone)]
+pub struct HttpsListener<S: SslServer> {
+    listener: HttpListener,
+    ssl: S,
+}
+
+impl<S: SslServer> HttpsListener<S> {
+    /// Start listening to an address over HTTPS.
+    pub fn new<To: ToSocketAddrs>(addr: To, ssl: S) -> ::Result<HttpsListener<S>> {
+        HttpListener::new(addr).map(|l| HttpsListener {
+            listener: l,
+            ssl: ssl
+        })
+    }
+
+    /// Construct an HttpsListener from a bound `TcpListener`.
+    pub fn with_listener(listener: HttpListener, ssl: S) -> HttpsListener<S> {
+        HttpsListener {
+            listener: listener,
+            ssl: ssl
+        }
+    }
+}
+
+impl<S: SslServer + Clone> NetworkListener for HttpsListener<S> {
+    type Stream = S::Stream;
+
+    #[inline]
+    fn accept(&mut self) -> ::Result<S::Stream> {
+        self.listener.accept().and_then(|s| self.ssl.wrap_server(s))
+    }
+
+    #[inline]
+    fn local_addr(&mut self) -> io::Result<SocketAddr> {
+        self.listener.local_addr()
+    }
+
+    fn set_read_timeout(&mut self, duration: Option<Duration>) {
+        self.listener.set_read_timeout(duration)
+    }
+
+    fn set_write_timeout(&mut self, duration: Option<Duration>) {
+        self.listener.set_write_timeout(duration)
+    }
+}
+
+/// A connector that can protect HTTP streams using SSL.
+#[derive(Debug, Default)]
+pub struct HttpsConnector<S: SslClient, C: NetworkConnector = HttpConnector> {
+    ssl: S,
+    connector: C,
+}
+
+impl<S: SslClient> HttpsConnector<S, HttpConnector> {
+    /// Create a new connector using the provided SSL implementation.
+    pub fn new(s: S) -> HttpsConnector<S, HttpConnector> {
+        HttpsConnector::with_connector(s, HttpConnector)
+    }
+}
+
+impl<S: SslClient, C: NetworkConnector> HttpsConnector<S, C> {
+    /// Create a new connector using the provided SSL implementation.
+    pub fn with_connector(s: S, connector: C) -> HttpsConnector<S, C> {
+        HttpsConnector { ssl: s, connector: connector }
+    }
+}
+
+impl<S: SslClient, C: NetworkConnector<Stream=HttpStream>> NetworkConnector for HttpsConnector<S, C> {
+    type Stream = HttpsStream<S::Stream>;
+
+    fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<Self::Stream> {
+        let stream = try!(self.connector.connect(host, port, "http"));
+        if scheme == "https" {
+            debug!("https scheme");
+            self.ssl.wrap_client(stream, host).map(HttpsStream::Https)
+        } else {
+            Ok(HttpsStream::Http(stream))
+        }
+    }
+}
+
+
+#[doc(hidden)]
+pub type DefaultConnector = HttpConnector;
+
+#[cfg(test)]
+mod tests {
+    use mock::MockStream;
+    use super::{NetworkStream};
+
+    #[test]
+    fn test_downcast_box_stream() {
+        // FIXME: Use Type ascription
+        let stream: Box<NetworkStream + Send> = Box::new(MockStream::new());
+
+        let mock = stream.downcast::<MockStream>().ok().unwrap();
+        assert_eq!(mock, Box::new(MockStream::new()));
+    }
+
+    #[test]
+    fn test_downcast_unchecked_box_stream() {
+        // FIXME: Use Type ascription
+        let stream: Box<NetworkStream + Send> = Box::new(MockStream::new());
+
+        let mock = unsafe { stream.downcast_unchecked::<MockStream>() };
+        assert_eq!(mock, Box::new(MockStream::new()));
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/server/listener.rs
@@ -0,0 +1,79 @@
+use std::sync::{Arc, mpsc};
+use std::thread;
+
+use net::NetworkListener;
+
+pub struct ListenerPool<A: NetworkListener> {
+    acceptor: A
+}
+
+impl<A: NetworkListener + Send + 'static> ListenerPool<A> {
+    /// Create a thread pool to manage the acceptor.
+    pub fn new(acceptor: A) -> ListenerPool<A> {
+        ListenerPool { acceptor: acceptor }
+    }
+
+    /// Runs the acceptor pool. Blocks until the acceptors are closed.
+    ///
+    /// ## Panics
+    ///
+    /// Panics if threads == 0.
+    pub fn accept<F>(self, work: F, threads: usize)
+        where F: Fn(A::Stream) + Send + Sync + 'static {
+        assert!(threads != 0, "Can't accept on 0 threads.");
+
+        let (super_tx, supervisor_rx) = mpsc::channel();
+
+        let work = Arc::new(work);
+
+        // Begin work.
+        for _ in 0..threads {
+            spawn_with(super_tx.clone(), work.clone(), self.acceptor.clone())
+        }
+
+        // Monitor for panics.
+        // FIXME(reem): This won't ever exit since we still have a super_tx handle.
+        for _ in supervisor_rx.iter() {
+            spawn_with(super_tx.clone(), work.clone(), self.acceptor.clone());
+        }
+    }
+}
+
+fn spawn_with<A, F>(supervisor: mpsc::Sender<()>, work: Arc<F>, mut acceptor: A)
+where A: NetworkListener + Send + 'static,
+      F: Fn(<A as NetworkListener>::Stream) + Send + Sync + 'static {
+    thread::spawn(move || {
+        let _sentinel = Sentinel::new(supervisor, ());
+
+        loop {
+            match acceptor.accept() {
+                Ok(stream) => work(stream),
+                Err(e) => {
+                    error!("Connection failed: {}", e);
+                }
+            }
+        }
+    });
+}
+
+struct Sentinel<T: Send + 'static> {
+    value: Option<T>,
+    supervisor: mpsc::Sender<T>,
+}
+
+impl<T: Send + 'static> Sentinel<T> {
+    fn new(channel: mpsc::Sender<T>, data: T) -> Sentinel<T> {
+        Sentinel {
+            value: Some(data),
+            supervisor: channel,
+        }
+    }
+}
+
+impl<T: Send + 'static> Drop for Sentinel<T> {
+    fn drop(&mut self) {
+        // Respawn ourselves
+        let _ = self.supervisor.send(self.value.take().unwrap());
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/server/mod.rs
@@ -0,0 +1,500 @@
+//! HTTP Server
+//!
+//! # Server
+//!
+//! A `Server` is created to listen on port, parse HTTP requests, and hand
+//! them off to a `Handler`. By default, the Server will listen across multiple
+//! threads, but that can be configured to a single thread if preferred.
+//!
+//! # Handling requests
+//!
+//! You must pass a `Handler` to the Server that will handle requests. There is
+//! a default implementation for `fn`s and closures, allowing you pass one of
+//! those easily.
+//!
+//!
+//! ```no_run
+//! use hyper::server::{Server, Request, Response};
+//!
+//! fn hello(req: Request, res: Response) {
+//!     // handle things here
+//! }
+//!
+//! Server::http("0.0.0.0:0").unwrap().handle(hello).unwrap();
+//! ```
+//!
+//! As with any trait, you can also define a struct and implement `Handler`
+//! directly on your own type, and pass that to the `Server` instead.
+//!
+//! ```no_run
+//! use std::sync::Mutex;
+//! use std::sync::mpsc::{channel, Sender};
+//! use hyper::server::{Handler, Server, Request, Response};
+//!
+//! struct SenderHandler {
+//!     sender: Mutex<Sender<&'static str>>
+//! }
+//!
+//! impl Handler for SenderHandler {
+//!     fn handle(&self, req: Request, res: Response) {
+//!         self.sender.lock().unwrap().send("start").unwrap();
+//!     }
+//! }
+//!
+//!
+//! let (tx, rx) = channel();
+//! Server::http("0.0.0.0:0").unwrap().handle(SenderHandler {
+//!     sender: Mutex::new(tx)
+//! }).unwrap();
+//! ```
+//!
+//! Since the `Server` will be listening on multiple threads, the `Handler`
+//! must implement `Sync`: any mutable state must be synchronized.
+//!
+//! ```no_run
+//! use std::sync::atomic::{AtomicUsize, Ordering};
+//! use hyper::server::{Server, Request, Response};
+//!
+//! let counter = AtomicUsize::new(0);
+//! Server::http("0.0.0.0:0").unwrap().handle(move |req: Request, res: Response| {
+//!     counter.fetch_add(1, Ordering::Relaxed);
+//! }).unwrap();
+//! ```
+//!
+//! # The `Request` and `Response` pair
+//!
+//! A `Handler` receives a pair of arguments, a `Request` and a `Response`. The
+//! `Request` includes access to the `method`, `uri`, and `headers` of the
+//! incoming HTTP request. It also implements `std::io::Read`, in order to
+//! read any body, such as with `POST` or `PUT` messages.
+//!
+//! Likewise, the `Response` includes ways to set the `status` and `headers`,
+//! and implements `std::io::Write` to allow writing the response body.
+//!
+//! ```no_run
+//! use std::io;
+//! use hyper::server::{Server, Request, Response};
+//! use hyper::status::StatusCode;
+//!
+//! Server::http("0.0.0.0:0").unwrap().handle(|mut req: Request, mut res: Response| {
+//!     match req.method {
+//!         hyper::Post => {
+//!             io::copy(&mut req, &mut res.start().unwrap()).unwrap();
+//!         },
+//!         _ => *res.status_mut() = StatusCode::MethodNotAllowed
+//!     }
+//! }).unwrap();
+//! ```
+//!
+//! ## An aside: Write Status
+//!
+//! The `Response` uses a phantom type parameter to determine its write status.
+//! What does that mean? In short, it ensures you never write a body before
+//! adding all headers, and never add a header after writing some of the body.
+//!
+//! This is often done in most implementations by include a boolean property
+//! on the response, such as `headers_written`, checking that each time the
+//! body has something to write, so as to make sure the headers are sent once,
+//! and only once. But this has 2 downsides:
+//!
+//! 1. You are typically never notified that your late header is doing nothing.
+//! 2. There's a runtime cost to checking on every write.
+//!
+//! Instead, hyper handles this statically, or at compile-time. A
+//! `Response<Fresh>` includes a `headers_mut()` method, allowing you add more
+//! headers. It also does not implement `Write`, so you can't accidentally
+//! write early. Once the "head" of the response is correct, you can "send" it
+//! out by calling `start` on the `Response<Fresh>`. This will return a new
+//! `Response<Streaming>` object, that no longer has `headers_mut()`, but does
+//! implement `Write`.
+use std::fmt;
+use std::io::{self, ErrorKind, BufWriter, Write};
+use std::net::{SocketAddr, ToSocketAddrs};
+use std::thread::{self, JoinHandle};
+use std::time::Duration;
+
+use num_cpus;
+
+pub use self::request::Request;
+pub use self::response::Response;
+
+pub use net::{Fresh, Streaming};
+
+use Error;
+use buffer::BufReader;
+use header::{Headers, Expect, Connection};
+use http;
+use method::Method;
+use net::{NetworkListener, NetworkStream, HttpListener, HttpsListener, SslServer};
+use status::StatusCode;
+use uri::RequestUri;
+use version::HttpVersion::Http11;
+
+use self::listener::ListenerPool;
+
+pub mod request;
+pub mod response;
+
+mod listener;
+
+/// A server can listen on a TCP socket.
+///
+/// Once listening, it will create a `Request`/`Response` pair for each
+/// incoming connection, and hand them to the provided handler.
+#[derive(Debug)]
+pub struct Server<L = HttpListener> {
+    listener: L,
+    timeouts: Timeouts,
+}
+
+#[derive(Clone, Copy, Debug)]
+struct Timeouts {
+    read: Option<Duration>,
+    keep_alive: Option<Duration>,
+}
+
+impl Default for Timeouts {
+    fn default() -> Timeouts {
+        Timeouts {
+            read: None,
+            keep_alive: Some(Duration::from_secs(5))
+        }
+    }
+}
+
+macro_rules! try_option(
+    ($e:expr) => {{
+        match $e {
+            Some(v) => v,
+            None => return None
+        }
+    }}
+);
+
+impl<L: NetworkListener> Server<L> {
+    /// Creates a new server with the provided handler.
+    #[inline]
+    pub fn new(listener: L) -> Server<L> {
+        Server {
+            listener: listener,
+            timeouts: Timeouts::default()
+        }
+    }
+
+    /// Controls keep-alive for this server.
+    ///
+    /// The timeout duration passed will be used to determine how long
+    /// to keep the connection alive before dropping it.
+    ///
+    /// Passing `None` will disable keep-alive.
+    ///
+    /// Default is enabled with a 5 second timeout.
+    #[inline]
+    pub fn keep_alive(&mut self, timeout: Option<Duration>) {
+        self.timeouts.keep_alive = timeout;
+    }
+
+    /// Sets the read timeout for all Request reads.
+    pub fn set_read_timeout(&mut self, dur: Option<Duration>) {
+        self.listener.set_read_timeout(dur);
+        self.timeouts.read = dur;
+    }
+
+    /// Sets the write timeout for all Response writes.
+    pub fn set_write_timeout(&mut self, dur: Option<Duration>) {
+        self.listener.set_write_timeout(dur);
+    }
+
+    /// Get the address that the server is listening on.
+    pub fn local_addr(&mut self) -> io::Result<SocketAddr> {
+        self.listener.local_addr()
+    }
+}
+
+impl Server<HttpListener> {
+    /// Creates a new server that will handle `HttpStream`s.
+    pub fn http<To: ToSocketAddrs>(addr: To) -> ::Result<Server<HttpListener>> {
+        HttpListener::new(addr).map(Server::new)
+    }
+}
+
+impl<S: SslServer + Clone + Send> Server<HttpsListener<S>> {
+    /// Creates a new server that will handle `HttpStream`s over SSL.
+    ///
+    /// You can use any SSL implementation, as long as implements `hyper::net::Ssl`.
+    pub fn https<A: ToSocketAddrs>(addr: A, ssl: S) -> ::Result<Server<HttpsListener<S>>> {
+        HttpsListener::new(addr, ssl).map(Server::new)
+    }
+}
+
+impl<L: NetworkListener + Send + 'static> Server<L> {
+    /// Binds to a socket and starts handling connections.
+    pub fn handle<H: Handler + 'static>(self, handler: H) -> ::Result<Listening> {
+        self.handle_threads(handler, num_cpus::get() * 5 / 4)
+    }
+
+    /// Binds to a socket and starts handling connections with the provided
+    /// number of threads.
+    pub fn handle_threads<H: Handler + 'static>(self, handler: H,
+            threads: usize) -> ::Result<Listening> {
+        handle(self, handler, threads)
+    }
+}
+
+fn handle<H, L>(mut server: Server<L>, handler: H, threads: usize) -> ::Result<Listening>
+where H: Handler + 'static, L: NetworkListener + Send + 'static {
+    let socket = try!(server.listener.local_addr());
+
+    debug!("threads = {:?}", threads);
+    let pool = ListenerPool::new(server.listener);
+    let worker = Worker::new(handler, server.timeouts);
+    let work = move |mut stream| worker.handle_connection(&mut stream);
+
+    let guard = thread::spawn(move || pool.accept(work, threads));
+
+    Ok(Listening {
+        _guard: Some(guard),
+        socket: socket,
+    })
+}
+
+struct Worker<H: Handler + 'static> {
+    handler: H,
+    timeouts: Timeouts,
+}
+
+impl<H: Handler + 'static> Worker<H> {
+    fn new(handler: H, timeouts: Timeouts) -> Worker<H> {
+        Worker {
+            handler: handler,
+            timeouts: timeouts,
+        }
+    }
+
+    fn handle_connection<S>(&self, mut stream: &mut S) where S: NetworkStream + Clone {
+        debug!("Incoming stream");
+
+        self.handler.on_connection_start();
+
+        let addr = match stream.peer_addr() {
+            Ok(addr) => addr,
+            Err(e) => {
+                error!("Peer Name error: {:?}", e);
+                return;
+            }
+        };
+
+        // FIXME: Use Type ascription
+        let stream_clone: &mut NetworkStream = &mut stream.clone();
+        let mut rdr = BufReader::new(stream_clone);
+        let mut wrt = BufWriter::new(stream);
+
+        while self.keep_alive_loop(&mut rdr, &mut wrt, addr) {
+            if let Err(e) = self.set_read_timeout(*rdr.get_ref(), self.timeouts.keep_alive) {
+                error!("set_read_timeout keep_alive {:?}", e);
+                break;
+            }
+        }
+
+        self.handler.on_connection_end();
+
+        debug!("keep_alive loop ending for {}", addr);
+    }
+
+    fn set_read_timeout(&self, s: &NetworkStream, timeout: Option<Duration>) -> io::Result<()> {
+        s.set_read_timeout(timeout)
+    }
+
+    fn keep_alive_loop<W: Write>(&self, mut rdr: &mut BufReader<&mut NetworkStream>,
+            wrt: &mut W, addr: SocketAddr) -> bool {
+        let req = match Request::new(rdr, addr) {
+            Ok(req) => req,
+            Err(Error::Io(ref e)) if e.kind() == ErrorKind::ConnectionAborted => {
+                trace!("tcp closed, cancelling keep-alive loop");
+                return false;
+            }
+            Err(Error::Io(e)) => {
+                debug!("ioerror in keepalive loop = {:?}", e);
+                return false;
+            }
+            Err(e) => {
+                //TODO: send a 400 response
+                error!("request error = {:?}", e);
+                return false;
+            }
+        };
+
+        if !self.handle_expect(&req, wrt) {
+            return false;
+        }
+
+        if let Err(e) = req.set_read_timeout(self.timeouts.read) {
+            error!("set_read_timeout {:?}", e);
+            return false;
+        }
+
+        let mut keep_alive = self.timeouts.keep_alive.is_some() &&
+            http::should_keep_alive(req.version, &req.headers);
+        let version = req.version;
+        let mut res_headers = Headers::new();
+        if !keep_alive {
+            res_headers.set(Connection::close());
+        }
+        {
+            let mut res = Response::new(wrt, &mut res_headers);
+            res.version = version;
+            self.handler.handle(req, res);
+        }
+
+        // if the request was keep-alive, we need to check that the server agrees
+        // if it wasn't, then the server cannot force it to be true anyways
+        if keep_alive {
+            keep_alive = http::should_keep_alive(version, &res_headers);
+        }
+
+        debug!("keep_alive = {:?} for {}", keep_alive, addr);
+        keep_alive
+    }
+
+    fn handle_expect<W: Write>(&self, req: &Request, wrt: &mut W) -> bool {
+         if req.version == Http11 && req.headers.get() == Some(&Expect::Continue) {
+            let status = self.handler.check_continue((&req.method, &req.uri, &req.headers));
+            match write!(wrt, "{} {}\r\n\r\n", Http11, status).and_then(|_| wrt.flush()) {
+                Ok(..) => (),
+                Err(e) => {
+                    error!("error writing 100-continue: {:?}", e);
+                    return false;
+                }
+            }
+
+            if status != StatusCode::Continue {
+                debug!("non-100 status ({}) for Expect 100 request", status);
+                return false;
+            }
+        }
+
+        true
+    }
+}
+
+/// A listening server, which can later be closed.
+pub struct Listening {
+    _guard: Option<JoinHandle<()>>,
+    /// The socket addresses that the server is bound to.
+    pub socket: SocketAddr,
+}
+
+impl fmt::Debug for Listening {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Listening {{ socket: {:?} }}", self.socket)
+    }
+}
+
+impl Drop for Listening {
+    fn drop(&mut self) {
+        let _ = self._guard.take().map(|g| g.join());
+    }
+}
+
+impl Listening {
+    /// Warning: This function doesn't work. The server remains listening after you called
+    /// it. See https://github.com/hyperium/hyper/issues/338 for more details.
+    ///
+    /// Stop the server from listening to its socket address.
+    pub fn close(&mut self) -> ::Result<()> {
+        let _ = self._guard.take();
+        debug!("closing server");
+        Ok(())
+    }
+}
+
+/// A handler that can handle incoming requests for a server.
+pub trait Handler: Sync + Send {
+    /// Receives a `Request`/`Response` pair, and should perform some action on them.
+    ///
+    /// This could reading from the request, and writing to the response.
+    fn handle<'a, 'k>(&'a self, Request<'a, 'k>, Response<'a, Fresh>);
+
+    /// Called when a Request includes a `Expect: 100-continue` header.
+    ///
+    /// By default, this will always immediately response with a `StatusCode::Continue`,
+    /// but can be overridden with custom behavior.
+    fn check_continue(&self, _: (&Method, &RequestUri, &Headers)) -> StatusCode {
+        StatusCode::Continue
+    }
+
+    /// This is run after a connection is received, on a per-connection basis (not a
+    /// per-request basis, as a connection with keep-alive may handle multiple
+    /// requests)
+    fn on_connection_start(&self) { }
+
+    /// This is run before a connection is closed, on a per-connection basis (not a
+    /// per-request basis, as a connection with keep-alive may handle multiple
+    /// requests)
+    fn on_connection_end(&self) { }
+}
+
+impl<F> Handler for F where F: Fn(Request, Response<Fresh>), F: Sync + Send {
+    fn handle<'a, 'k>(&'a self, req: Request<'a, 'k>, res: Response<'a, Fresh>) {
+        self(req, res)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use header::Headers;
+    use method::Method;
+    use mock::MockStream;
+    use status::StatusCode;
+    use uri::RequestUri;
+
+    use super::{Request, Response, Fresh, Handler, Worker};
+
+    #[test]
+    fn test_check_continue_default() {
+        let mut mock = MockStream::with_input(b"\
+            POST /upload HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Expect: 100-continue\r\n\
+            Content-Length: 10\r\n\
+            \r\n\
+            1234567890\
+        ");
+
+        fn handle(_: Request, res: Response<Fresh>) {
+            res.start().unwrap().end().unwrap();
+        }
+
+        Worker::new(handle, Default::default()).handle_connection(&mut mock);
+        let cont = b"HTTP/1.1 100 Continue\r\n\r\n";
+        assert_eq!(&mock.write[..cont.len()], cont);
+        let res = b"HTTP/1.1 200 OK\r\n";
+        assert_eq!(&mock.write[cont.len()..cont.len() + res.len()], res);
+    }
+
+    #[test]
+    fn test_check_continue_reject() {
+        struct Reject;
+        impl Handler for Reject {
+            fn handle<'a, 'k>(&'a self, _: Request<'a, 'k>, res: Response<'a, Fresh>) {
+                res.start().unwrap().end().unwrap();
+            }
+
+            fn check_continue(&self, _: (&Method, &RequestUri, &Headers)) -> StatusCode {
+                StatusCode::ExpectationFailed
+            }
+        }
+
+        let mut mock = MockStream::with_input(b"\
+            POST /upload HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Expect: 100-continue\r\n\
+            Content-Length: 10\r\n\
+            \r\n\
+            1234567890\
+        ");
+
+        Worker::new(Reject, Default::default()).handle_connection(&mut mock);
+        assert_eq!(mock.write, &b"HTTP/1.1 417 Expectation Failed\r\n\r\n"[..]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/server/request.rs
@@ -0,0 +1,307 @@
+//! Server Requests
+//!
+//! These are requests that a `hyper::Server` receives, and include its method,
+//! target URI, headers, and message body.
+use std::io::{self, Read};
+use std::net::SocketAddr;
+use std::time::Duration;
+
+use buffer::BufReader;
+use net::NetworkStream;
+use version::{HttpVersion};
+use method::Method;
+use header::{Headers, ContentLength, TransferEncoding};
+use http::h1::{self, Incoming, HttpReader};
+use http::h1::HttpReader::{SizedReader, ChunkedReader, EmptyReader};
+use uri::RequestUri;
+
+/// A request bundles several parts of an incoming `NetworkStream`, given to a `Handler`.
+pub struct Request<'a, 'b: 'a> {
+    /// The IP address of the remote connection.
+    pub remote_addr: SocketAddr,
+    /// The `Method`, such as `Get`, `Post`, etc.
+    pub method: Method,
+    /// The headers of the incoming request.
+    pub headers: Headers,
+    /// The target request-uri for this request.
+    pub uri: RequestUri,
+    /// The version of HTTP for this request.
+    pub version: HttpVersion,
+    body: HttpReader<&'a mut BufReader<&'b mut NetworkStream>>
+}
+
+
+impl<'a, 'b: 'a> Request<'a, 'b> {
+    /// Create a new Request, reading the StartLine and Headers so they are
+    /// immediately useful.
+    pub fn new(mut stream: &'a mut BufReader<&'b mut NetworkStream>, addr: SocketAddr)
+        -> ::Result<Request<'a, 'b>> {
+
+        let Incoming { version, subject: (method, uri), headers } = try!(h1::parse_request(stream));
+        debug!("Request Line: {:?} {:?} {:?}", method, uri, version);
+        debug!("{:?}", headers);
+
+        let body = if headers.has::<ContentLength>() {
+            match headers.get::<ContentLength>() {
+                Some(&ContentLength(len)) => SizedReader(stream, len),
+                None => unreachable!()
+            }
+        } else if headers.has::<TransferEncoding>() {
+            todo!("check for Transfer-Encoding: chunked");
+            ChunkedReader(stream, None)
+        } else {
+            EmptyReader(stream)
+        };
+
+        Ok(Request {
+            remote_addr: addr,
+            method: method,
+            uri: uri,
+            headers: headers,
+            version: version,
+            body: body
+        })
+    }
+
+    /// Set the read timeout of the underlying NetworkStream.
+    #[inline]
+    pub fn set_read_timeout(&self, timeout: Option<Duration>) -> io::Result<()> {
+        self.body.get_ref().get_ref().set_read_timeout(timeout)
+    }
+
+    /// Get a reference to the underlying `NetworkStream`.
+    #[inline]
+    pub fn downcast_ref<T: NetworkStream>(&self) -> Option<&T> {
+        self.body.get_ref().get_ref().downcast_ref()
+    }
+
+    /// Get a reference to the underlying Ssl stream, if connected
+    /// over HTTPS.
+    ///
+    /// This is actually just an alias for `downcast_ref`.
+    #[inline]
+    pub fn ssl<T: NetworkStream>(&self) -> Option<&T> {
+        self.downcast_ref()
+    }
+
+    /// Deconstruct a Request into its constituent parts.
+    #[inline]
+    pub fn deconstruct(self) -> (SocketAddr, Method, Headers,
+                                 RequestUri, HttpVersion,
+                                 HttpReader<&'a mut BufReader<&'b mut NetworkStream>>) {
+        (self.remote_addr, self.method, self.headers,
+         self.uri, self.version, self.body)
+    }
+}
+
+impl<'a, 'b> Read for Request<'a, 'b> {
+    #[inline]
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.body.read(buf)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use buffer::BufReader;
+    use header::{Host, TransferEncoding, Encoding};
+    use net::NetworkStream;
+    use mock::MockStream;
+    use super::Request;
+
+    use std::io::{self, Read};
+    use std::net::SocketAddr;
+
+    fn sock(s: &str) -> SocketAddr {
+        s.parse().unwrap()
+    }
+
+    fn read_to_string(mut req: Request) -> io::Result<String> {
+        let mut s = String::new();
+        try!(req.read_to_string(&mut s));
+        Ok(s)
+    }
+
+    #[test]
+    fn test_get_empty_body() {
+        let mut mock = MockStream::with_input(b"\
+            GET / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            \r\n\
+            I'm a bad request.\r\n\
+        ");
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+        assert_eq!(read_to_string(req).unwrap(), "".to_owned());
+    }
+
+    #[test]
+    fn test_get_with_body() {
+        let mut mock = MockStream::with_input(b"\
+            GET / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Content-Length: 19\r\n\
+            \r\n\
+            I'm a good request.\r\n\
+        ");
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+        assert_eq!(read_to_string(req).unwrap(), "I'm a good request.".to_owned());
+    }
+
+    #[test]
+    fn test_head_empty_body() {
+        let mut mock = MockStream::with_input(b"\
+            HEAD / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            \r\n\
+            I'm a bad request.\r\n\
+        ");
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+        assert_eq!(read_to_string(req).unwrap(), "".to_owned());
+    }
+
+    #[test]
+    fn test_post_empty_body() {
+        let mut mock = MockStream::with_input(b"\
+            POST / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            \r\n\
+            I'm a bad request.\r\n\
+        ");
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+        assert_eq!(read_to_string(req).unwrap(), "".to_owned());
+    }
+
+    #[test]
+    fn test_parse_chunked_request() {
+        let mut mock = MockStream::with_input(b"\
+            POST / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            1\r\n\
+            q\r\n\
+            2\r\n\
+            we\r\n\
+            2\r\n\
+            rt\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+
+        // The headers are correct?
+        match req.headers.get::<Host>() {
+            Some(host) => {
+                assert_eq!("example.domain", host.hostname);
+            },
+            None => panic!("Host header expected!"),
+        };
+        match req.headers.get::<TransferEncoding>() {
+            Some(encodings) => {
+                assert_eq!(1, encodings.len());
+                assert_eq!(Encoding::Chunked, encodings[0]);
+            }
+            None => panic!("Transfer-Encoding: chunked expected!"),
+        };
+        // The content is correctly read?
+        assert_eq!(read_to_string(req).unwrap(), "qwert".to_owned());
+    }
+
+    /// Tests that when a chunk size is not a valid radix-16 number, an error
+    /// is returned.
+    #[test]
+    fn test_invalid_chunk_size_not_hex_digit() {
+        let mut mock = MockStream::with_input(b"\
+            POST / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            X\r\n\
+            1\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+
+        assert!(read_to_string(req).is_err());
+    }
+
+    /// Tests that when a chunk size contains an invalid extension, an error is
+    /// returned.
+    #[test]
+    fn test_invalid_chunk_size_extension() {
+        let mut mock = MockStream::with_input(b"\
+            POST / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            1 this is an invalid extension\r\n\
+            1\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+
+        assert!(read_to_string(req).is_err());
+    }
+
+    /// Tests that when a valid extension that contains a digit is appended to
+    /// the chunk size, the chunk is correctly read.
+    #[test]
+    fn test_chunk_size_with_extension() {
+        let mut mock = MockStream::with_input(b"\
+            POST / HTTP/1.1\r\n\
+            Host: example.domain\r\n\
+            Transfer-Encoding: chunked\r\n\
+            \r\n\
+            1;this is an extension with a digit 1\r\n\
+            1\r\n\
+            0\r\n\
+            \r\n"
+        );
+
+        // FIXME: Use Type ascription
+        let mock: &mut NetworkStream = &mut mock;
+        let mut stream = BufReader::new(mock);
+
+        let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
+
+        assert_eq!(read_to_string(req).unwrap(), "1".to_owned());
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/server/response.rs
@@ -0,0 +1,432 @@
+//! Server Responses
+//!
+//! These are responses sent by a `hyper::Server` to clients, after
+//! receiving a request.
+use std::any::{Any, TypeId};
+use std::marker::PhantomData;
+use std::mem;
+use std::io::{self, Write};
+use std::ptr;
+use std::thread;
+
+use time::now_utc;
+
+use header;
+use http::h1::{LINE_ENDING, HttpWriter};
+use http::h1::HttpWriter::{ThroughWriter, ChunkedWriter, SizedWriter, EmptyWriter};
+use status;
+use net::{Fresh, Streaming};
+use version;
+
+
+/// The outgoing half for a Tcp connection, created by a `Server` and given to a `Handler`.
+///
+/// The default `StatusCode` for a `Response` is `200 OK`.
+///
+/// There is a `Drop` implementation for `Response` that will automatically
+/// write the head and flush the body, if the handler has not already done so,
+/// so that the server doesn't accidentally leave dangling requests.
+#[derive(Debug)]
+pub struct Response<'a, W: Any = Fresh> {
+    /// The HTTP version of this response.
+    pub version: version::HttpVersion,
+    // Stream the Response is writing to, not accessible through UnwrittenResponse
+    body: HttpWriter<&'a mut (Write + 'a)>,
+    // The status code for the request.
+    status: status::StatusCode,
+    // The outgoing headers on this response.
+    headers: &'a mut header::Headers,
+
+    _writing: PhantomData<W>
+}
+
+impl<'a, W: Any> Response<'a, W> {
+    /// The status of this response.
+    #[inline]
+    pub fn status(&self) -> status::StatusCode { self.status }
+
+    /// The headers of this response.
+    #[inline]
+    pub fn headers(&self) -> &header::Headers { &*self.headers }
+
+    /// Construct a Response from its constituent parts.
+    #[inline]
+    pub fn construct(version: version::HttpVersion,
+                     body: HttpWriter<&'a mut (Write + 'a)>,
+                     status: status::StatusCode,
+                     headers: &'a mut header::Headers) -> Response<'a, Fresh> {
+        Response {
+            status: status,
+            version: version,
+            body: body,
+            headers: headers,
+            _writing: PhantomData,
+        }
+    }
+
+    /// Deconstruct this Response into its constituent parts.
+    #[inline]
+    pub fn deconstruct(self) -> (version::HttpVersion, HttpWriter<&'a mut (Write + 'a)>,
+                                 status::StatusCode, &'a mut header::Headers) {
+        unsafe {
+            let parts = (
+                self.version,
+                ptr::read(&self.body),
+                self.status,
+                ptr::read(&self.headers)
+            );
+            mem::forget(self);
+            parts
+        }
+    }
+
+    fn write_head(&mut self) -> io::Result<Body> {
+        debug!("writing head: {:?} {:?}", self.version, self.status);
+        try!(write!(&mut self.body, "{} {}\r\n", self.version, self.status));
+
+        if !self.headers.has::<header::Date>() {
+            self.headers.set(header::Date(header::HttpDate(now_utc())));
+        }
+
+        let body_type = match self.status {
+            status::StatusCode::NoContent | status::StatusCode::NotModified => Body::Empty,
+            c if c.class() == status::StatusClass::Informational => Body::Empty,
+            _ => if let Some(cl) = self.headers.get::<header::ContentLength>() {
+                Body::Sized(**cl)
+            } else {
+                Body::Chunked
+            }
+        };
+
+        // can't do in match above, thanks borrowck
+        if body_type == Body::Chunked {
+            let encodings = match self.headers.get_mut::<header::TransferEncoding>() {
+                Some(&mut header::TransferEncoding(ref mut encodings)) => {
+                    //TODO: check if chunked is already in encodings. use HashSet?
+                    encodings.push(header::Encoding::Chunked);
+                    false
+                },
+                None => true
+            };
+
+            if encodings {
+                self.headers.set::<header::TransferEncoding>(
+                    header::TransferEncoding(vec![header::Encoding::Chunked]))
+            }
+        }
+
+
+        debug!("headers [\n{:?}]", self.headers);
+        try!(write!(&mut self.body, "{}", self.headers));
+        try!(write!(&mut self.body, "{}", LINE_ENDING));
+
+        Ok(body_type)
+    }
+}
+
+impl<'a> Response<'a, Fresh> {
+    /// Creates a new Response that can be used to write to a network stream.
+    #[inline]
+    pub fn new(stream: &'a mut (Write + 'a), headers: &'a mut header::Headers) ->
+            Response<'a, Fresh> {
+        Response {
+            status: status::StatusCode::Ok,
+            version: version::HttpVersion::Http11,
+            headers: headers,
+            body: ThroughWriter(stream),
+            _writing: PhantomData,
+        }
+    }
+
+    /// Writes the body and ends the response.
+    ///
+    /// This is a shortcut method for when you have a response with a fixed
+    /// size, and would only need a single `write` call normally.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # use hyper::server::Response;
+    /// fn handler(res: Response) {
+    ///     res.send(b"Hello World!").unwrap();
+    /// }
+    /// ```
+    ///
+    /// The above is the same, but shorter, than the longer:
+    ///
+    /// ```
+    /// # use hyper::server::Response;
+    /// use std::io::Write;
+    /// use hyper::header::ContentLength;
+    /// fn handler(mut res: Response) {
+    ///     let body = b"Hello World!";
+    ///     res.headers_mut().set(ContentLength(body.len() as u64));
+    ///     let mut res = res.start().unwrap();
+    ///     res.write_all(body).unwrap();
+    /// }
+    /// ```
+    #[inline]
+    pub fn send(mut self, body: &[u8]) -> io::Result<()> {
+        self.headers.set(header::ContentLength(body.len() as u64));
+        let mut stream = try!(self.start());
+        try!(stream.write_all(body));
+        stream.end()
+    }
+
+    /// Consume this Response<Fresh>, writing the Headers and Status and
+    /// creating a Response<Streaming>
+    pub fn start(mut self) -> io::Result<Response<'a, Streaming>> {
+        let body_type = try!(self.write_head());
+        let (version, body, status, headers) = self.deconstruct();
+        let stream = match body_type {
+            Body::Chunked => ChunkedWriter(body.into_inner()),
+            Body::Sized(len) => SizedWriter(body.into_inner(), len),
+            Body::Empty => EmptyWriter(body.into_inner()),
+        };
+
+        // "copy" to change the phantom type
+        Ok(Response {
+            version: version,
+            body: stream,
+            status: status,
+            headers: headers,
+            _writing: PhantomData,
+        })
+    }
+    /// Get a mutable reference to the status.
+    #[inline]
+    pub fn status_mut(&mut self) -> &mut status::StatusCode { &mut self.status }
+
+    /// Get a mutable reference to the Headers.
+    #[inline]
+    pub fn headers_mut(&mut self) -> &mut header::Headers { self.headers }
+}
+
+
+impl<'a> Response<'a, Streaming> {
+    /// Flushes all writing of a response to the client.
+    #[inline]
+    pub fn end(self) -> io::Result<()> {
+        trace!("ending");
+        let (_, body, _, _) = self.deconstruct();
+        try!(body.end());
+        Ok(())
+    }
+}
+
+impl<'a> Write for Response<'a, Streaming> {
+    #[inline]
+    fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
+        debug!("write {:?} bytes", msg.len());
+        self.body.write(msg)
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        self.body.flush()
+    }
+}
+
+#[derive(PartialEq)]
+enum Body {
+    Chunked,
+    Sized(u64),
+    Empty,
+}
+
+impl<'a, T: Any> Drop for Response<'a, T> {
+    fn drop(&mut self) {
+        if TypeId::of::<T>() == TypeId::of::<Fresh>() {
+            if thread::panicking() {
+                self.status = status::StatusCode::InternalServerError;
+            }
+
+            let mut body = match self.write_head() {
+                Ok(Body::Chunked) => ChunkedWriter(self.body.get_mut()),
+                Ok(Body::Sized(len)) => SizedWriter(self.body.get_mut(), len),
+                Ok(Body::Empty) => EmptyWriter(self.body.get_mut()),
+                Err(e) => {
+                    debug!("error dropping request: {:?}", e);
+                    return;
+                }
+            };
+            end(&mut body);
+        } else {
+            end(&mut self.body);
+        };
+
+
+        #[inline]
+        fn end<W: Write>(w: &mut W) {
+            match w.write(&[]) {
+                Ok(_) => match w.flush() {
+                    Ok(_) => debug!("drop successful"),
+                    Err(e) => debug!("error dropping request: {:?}", e)
+                },
+                Err(e) => debug!("error dropping request: {:?}", e)
+            }
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use header::Headers;
+    use mock::MockStream;
+    use super::Response;
+
+    macro_rules! lines {
+        ($s:ident = $($line:pat),+) => ({
+            let s = String::from_utf8($s.write).unwrap();
+            let mut lines = s.split_terminator("\r\n");
+
+            $(
+                match lines.next() {
+                    Some($line) => (),
+                    other => panic!("line mismatch: {:?} != {:?}", other, stringify!($line))
+                }
+            )+
+
+            assert_eq!(lines.next(), None);
+        })
+    }
+
+    #[test]
+    fn test_fresh_start() {
+        let mut headers = Headers::new();
+        let mut stream = MockStream::new();
+        {
+            let res = Response::new(&mut stream, &mut headers);
+            res.start().unwrap().deconstruct();
+        }
+
+        lines! { stream =
+            "HTTP/1.1 200 OK",
+            _date,
+            _transfer_encoding,
+            ""
+        }
+    }
+
+    #[test]
+    fn test_streaming_end() {
+        let mut headers = Headers::new();
+        let mut stream = MockStream::new();
+        {
+            let res = Response::new(&mut stream, &mut headers);
+            res.start().unwrap().end().unwrap();
+        }
+
+        lines! { stream =
+            "HTTP/1.1 200 OK",
+            _date,
+            _transfer_encoding,
+            "",
+            "0",
+            "" // empty zero body
+        }
+    }
+
+    #[test]
+    fn test_fresh_drop() {
+        use status::StatusCode;
+        let mut headers = Headers::new();
+        let mut stream = MockStream::new();
+        {
+            let mut res = Response::new(&mut stream, &mut headers);
+            *res.status_mut() = StatusCode::NotFound;
+        }
+
+        lines! { stream =
+            "HTTP/1.1 404 Not Found",
+            _date,
+            _transfer_encoding,
+            "",
+            "0",
+            "" // empty zero body
+        }
+    }
+
+    // x86 windows msvc does not support unwinding
+    // See https://github.com/rust-lang/rust/issues/25869
+    #[cfg(not(all(windows, target_arch="x86", target_env="msvc")))]
+    #[test]
+    fn test_fresh_drop_panicing() {
+        use std::thread;
+        use std::sync::{Arc, Mutex};
+
+        use status::StatusCode;
+
+        let stream = MockStream::new();
+        let stream = Arc::new(Mutex::new(stream));
+        let inner_stream = stream.clone();
+        let join_handle = thread::spawn(move || {
+            let mut headers = Headers::new();
+            let mut stream = inner_stream.lock().unwrap();
+            let mut res = Response::new(&mut *stream, &mut headers);
+            *res.status_mut() = StatusCode::NotFound;
+
+            panic!("inside")
+        });
+
+        assert!(join_handle.join().is_err());
+
+        let stream = match stream.lock() {
+            Err(poisoned) => poisoned.into_inner().clone(),
+            Ok(_) => unreachable!()
+        };
+
+        lines! { stream =
+            "HTTP/1.1 500 Internal Server Error",
+            _date,
+            _transfer_encoding,
+            "",
+            "0",
+            "" // empty zero body
+        }
+    }
+
+
+    #[test]
+    fn test_streaming_drop() {
+        use std::io::Write;
+        use status::StatusCode;
+        let mut headers = Headers::new();
+        let mut stream = MockStream::new();
+        {
+            let mut res = Response::new(&mut stream, &mut headers);
+            *res.status_mut() = StatusCode::NotFound;
+            let mut stream = res.start().unwrap();
+            stream.write_all(b"foo").unwrap();
+        }
+
+        lines! { stream =
+            "HTTP/1.1 404 Not Found",
+            _date,
+            _transfer_encoding,
+            "",
+            "3",
+            "foo",
+            "0",
+            "" // empty zero body
+        }
+    }
+
+    #[test]
+    fn test_no_content() {
+        use status::StatusCode;
+        let mut headers = Headers::new();
+        let mut stream = MockStream::new();
+        {
+            let mut res = Response::new(&mut stream, &mut headers);
+            *res.status_mut() = StatusCode::NoContent;
+            res.start().unwrap();
+        }
+
+        lines! { stream =
+            "HTTP/1.1 204 No Content",
+            _date,
+            ""
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/status.rs
@@ -0,0 +1,748 @@
+//! HTTP status codes
+use std::fmt;
+use std::cmp::Ordering;
+
+// shamelessly lifted from Teepee. I tried a few schemes, this really
+// does seem like the best. Improved scheme to support arbitrary status codes.
+
+/// An HTTP status code (`status-code` in RFC 7230 et al.).
+///
+/// This enum contains all common status codes and an Unregistered
+/// extension variant. It allows status codes in the range [0, 65535], as any
+/// `u16` integer may be used as a status code for XHR requests. It is
+/// recommended to only use values between [100, 599], since only these are
+/// defined as valid status codes with a status class by HTTP.
+///
+/// If you encounter a status code that you do not know how to deal with, you
+/// should treat it as the `x00` status code—e.g. for code 123, treat it as
+/// 100 (Continue). This can be achieved with
+/// `self.class().default_code()`:
+///
+/// ```rust
+/// # use hyper::status::StatusCode;
+/// let status = StatusCode::Unregistered(123);
+/// assert_eq!(status.class().default_code(), StatusCode::Continue);
+/// ```
+///
+/// IANA maintain the [Hypertext Transfer Protocol (HTTP) Status Code
+/// Registry](http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) which is
+/// the source for this enum (with one exception, 418 I'm a teapot, which is
+/// inexplicably not in the register).
+#[derive(Debug, Hash)]
+pub enum StatusCode {
+    /// 100 Continue
+    /// [[RFC7231, Section 6.2.1](https://tools.ietf.org/html/rfc7231#section-6.2.1)]
+    Continue,
+    /// 101 Switching Protocols
+    /// [[RFC7231, Section 6.2.2](https://tools.ietf.org/html/rfc7231#section-6.2.2)]
+    SwitchingProtocols,
+    /// 102 Processing
+    /// [[RFC2518](https://tools.ietf.org/html/rfc2518)]
+    Processing,
+
+    /// 200 OK
+    /// [[RFC7231, Section 6.3.1](https://tools.ietf.org/html/rfc7231#section-6.3.1)]
+    Ok,
+    /// 201 Created
+    /// [[RFC7231, Section 6.3.2](https://tools.ietf.org/html/rfc7231#section-6.3.2)]
+    Created,
+    /// 202 Accepted
+    /// [[RFC7231, Section 6.3.3](https://tools.ietf.org/html/rfc7231#section-6.3.3)]
+    Accepted,
+    /// 203 Non-Authoritative Information
+    /// [[RFC7231, Section 6.3.4](https://tools.ietf.org/html/rfc7231#section-6.3.4)]
+    NonAuthoritativeInformation,
+    /// 204 No Content
+    /// [[RFC7231, Section 6.3.5](https://tools.ietf.org/html/rfc7231#section-6.3.5)]
+    NoContent,
+    /// 205 Reset Content
+    /// [[RFC7231, Section 6.3.6](https://tools.ietf.org/html/rfc7231#section-6.3.6)]
+    ResetContent,
+    /// 206 Partial Content
+    /// [[RFC7233, Section 4.1](https://tools.ietf.org/html/rfc7233#section-4.1)]
+    PartialContent,
+    /// 207 Multi-Status
+    /// [[RFC4918](https://tools.ietf.org/html/rfc4918)]
+    MultiStatus,
+    /// 208 Already Reported
+    /// [[RFC5842](https://tools.ietf.org/html/rfc5842)]
+    AlreadyReported,
+
+    /// 226 IM Used
+    /// [[RFC3229](https://tools.ietf.org/html/rfc3229)]
+    ImUsed,
+
+    /// 300 Multiple Choices
+    /// [[RFC7231, Section 6.4.1](https://tools.ietf.org/html/rfc7231#section-6.4.1)]
+    MultipleChoices,
+    /// 301 Moved Permanently
+    /// [[RFC7231, Section 6.4.2](https://tools.ietf.org/html/rfc7231#section-6.4.2)]
+    MovedPermanently,
+    /// 302 Found
+    /// [[RFC7231, Section 6.4.3](https://tools.ietf.org/html/rfc7231#section-6.4.3)]
+    Found,
+    /// 303 See Other
+    /// [[RFC7231, Section 6.4.4](https://tools.ietf.org/html/rfc7231#section-6.4.4)]
+    SeeOther,
+    /// 304 Not Modified
+    /// [[RFC7232, Section 4.1](https://tools.ietf.org/html/rfc7232#section-4.1)]
+    NotModified,
+    /// 305 Use Proxy
+    /// [[RFC7231, Section 6.4.5](https://tools.ietf.org/html/rfc7231#section-6.4.5)]
+    UseProxy,
+    /// 307 Temporary Redirect
+    /// [[RFC7231, Section 6.4.7](https://tools.ietf.org/html/rfc7231#section-6.4.7)]
+    TemporaryRedirect,
+    /// 308 Permanent Redirect
+    /// [[RFC7238](https://tools.ietf.org/html/rfc7238)]
+    PermanentRedirect,
+
+    /// 400 Bad Request
+    /// [[RFC7231, Section 6.5.1](https://tools.ietf.org/html/rfc7231#section-6.5.1)]
+    BadRequest,
+    /// 401 Unauthorized
+    /// [[RFC7235, Section 3.1](https://tools.ietf.org/html/rfc7235#section-3.1)]
+    Unauthorized,
+    /// 402 Payment Required
+    /// [[RFC7231, Section 6.5.2](https://tools.ietf.org/html/rfc7231#section-6.5.2)]
+    PaymentRequired,
+    /// 403 Forbidden
+    /// [[RFC7231, Section 6.5.3](https://tools.ietf.org/html/rfc7231#section-6.5.3)]
+    Forbidden,
+    /// 404 Not Found
+    /// [[RFC7231, Section 6.5.4](https://tools.ietf.org/html/rfc7231#section-6.5.4)]
+    NotFound,
+    /// 405 Method Not Allowed
+    /// [[RFC7231, Section 6.5.5](https://tools.ietf.org/html/rfc7231#section-6.5.5)]
+    MethodNotAllowed,
+    /// 406 Not Acceptable
+    /// [[RFC7231, Section 6.5.6](https://tools.ietf.org/html/rfc7231#section-6.5.6)]
+    NotAcceptable,
+    /// 407 Proxy Authentication Required
+    /// [[RFC7235, Section 3.2](https://tools.ietf.org/html/rfc7235#section-3.2)]
+    ProxyAuthenticationRequired,
+    /// 408 Request Timeout
+    /// [[RFC7231, Section 6.5.7](https://tools.ietf.org/html/rfc7231#section-6.5.7)]
+    RequestTimeout,
+    /// 409 Conflict
+    /// [[RFC7231, Section 6.5.8](https://tools.ietf.org/html/rfc7231#section-6.5.8)]
+    Conflict,
+    /// 410 Gone
+    /// [[RFC7231, Section 6.5.9](https://tools.ietf.org/html/rfc7231#section-6.5.9)]
+    Gone,
+    /// 411 Length Required
+    /// [[RFC7231, Section 6.5.10](https://tools.ietf.org/html/rfc7231#section-6.5.10)]
+    LengthRequired,
+    /// 412 Precondition Failed
+    /// [[RFC7232, Section 4.2](https://tools.ietf.org/html/rfc7232#section-4.2)]
+    PreconditionFailed,
+    /// 413 Payload Too Large
+    /// [[RFC7231, Section 6.5.11](https://tools.ietf.org/html/rfc7231#section-6.5.11)]
+    PayloadTooLarge,
+    /// 414 URI Too Long
+    /// [[RFC7231, Section 6.5.12](https://tools.ietf.org/html/rfc7231#section-6.5.12)]
+    UriTooLong,
+    /// 415 Unsupported Media Type
+    /// [[RFC7231, Section 6.5.13](https://tools.ietf.org/html/rfc7231#section-6.5.13)]
+    UnsupportedMediaType,
+    /// 416 Range Not Satisfiable
+    /// [[RFC7233, Section 4.4](https://tools.ietf.org/html/rfc7233#section-4.4)]
+    RangeNotSatisfiable,
+    /// 417 Expectation Failed
+    /// [[RFC7231, Section 6.5.14](https://tools.ietf.org/html/rfc7231#section-6.5.14)]
+    ExpectationFailed,
+    /// 418 I'm a teapot
+    /// [curiously, not registered by IANA, but [RFC2324](https://tools.ietf.org/html/rfc2324)]
+    ImATeapot,
+
+    /// 421 Misdirected Request
+    /// [RFC7540, Section 9.1.2](http://tools.ietf.org/html/rfc7540#section-9.1.2)
+    MisdirectedRequest,
+    /// 422 Unprocessable Entity
+    /// [[RFC4918](https://tools.ietf.org/html/rfc4918)]
+    UnprocessableEntity,
+    /// 423 Locked
+    /// [[RFC4918](https://tools.ietf.org/html/rfc4918)]
+    Locked,
+    /// 424 Failed Dependency
+    /// [[RFC4918](https://tools.ietf.org/html/rfc4918)]
+    FailedDependency,
+
+    /// 426 Upgrade Required
+    /// [[RFC7231, Section 6.5.15](https://tools.ietf.org/html/rfc7231#section-6.5.15)]
+    UpgradeRequired,
+
+    /// 428 Precondition Required
+    /// [[RFC6585](https://tools.ietf.org/html/rfc6585)]
+    PreconditionRequired,
+    /// 429 Too Many Requests
+    /// [[RFC6585](https://tools.ietf.org/html/rfc6585)]
+    TooManyRequests,
+
+    /// 431 Request Header Fields Too Large
+    /// [[RFC6585](https://tools.ietf.org/html/rfc6585)]
+    RequestHeaderFieldsTooLarge,
+
+    /// 451 Unavailable For Legal Reasons
+    /// [[RFC7725](http://tools.ietf.org/html/rfc7725)]
+    UnavailableForLegalReasons,
+
+    /// 500 Internal Server Error
+    /// [[RFC7231, Section 6.6.1](https://tools.ietf.org/html/rfc7231#section-6.6.1)]
+    InternalServerError,
+    /// 501 Not Implemented
+    /// [[RFC7231, Section 6.6.2](https://tools.ietf.org/html/rfc7231#section-6.6.2)]
+    NotImplemented,
+    /// 502 Bad Gateway
+    /// [[RFC7231, Section 6.6.3](https://tools.ietf.org/html/rfc7231#section-6.6.3)]
+    BadGateway,
+    /// 503 Service Unavailable
+    /// [[RFC7231, Section 6.6.4](https://tools.ietf.org/html/rfc7231#section-6.6.4)]
+    ServiceUnavailable,
+    /// 504 Gateway Timeout
+    /// [[RFC7231, Section 6.6.5](https://tools.ietf.org/html/rfc7231#section-6.6.5)]
+    GatewayTimeout,
+    /// 505 HTTP Version Not Supported
+    /// [[RFC7231, Section 6.6.6](https://tools.ietf.org/html/rfc7231#section-6.6.6)]
+    HttpVersionNotSupported,
+    /// 506 Variant Also Negotiates
+    /// [[RFC2295](https://tools.ietf.org/html/rfc2295)]
+    VariantAlsoNegotiates,
+    /// 507 Insufficient Storage
+    /// [[RFC4918](https://tools.ietf.org/html/rfc4918)]
+    InsufficientStorage,
+    /// 508 Loop Detected
+    /// [[RFC5842](https://tools.ietf.org/html/rfc5842)]
+    LoopDetected,
+
+    /// 510 Not Extended
+    /// [[RFC2774](https://tools.ietf.org/html/rfc2774)]
+    NotExtended,
+    /// 511 Network Authentication Required
+    /// [[RFC6585](https://tools.ietf.org/html/rfc6585)]
+    NetworkAuthenticationRequired,
+
+    /// A status code not in the IANA HTTP status code registry or very well known
+    // `ImATeapot` is not registered.
+    Unregistered(u16),
+}
+
+impl StatusCode {
+
+    #[doc(hidden)]
+    pub fn from_u16(n: u16) -> StatusCode {
+        match n {
+            100 => StatusCode::Continue,
+            101 => StatusCode::SwitchingProtocols,
+            102 => StatusCode::Processing,
+            200 => StatusCode::Ok,
+            201 => StatusCode::Created,
+            202 => StatusCode::Accepted,
+            203 => StatusCode::NonAuthoritativeInformation,
+            204 => StatusCode::NoContent,
+            205 => StatusCode::ResetContent,
+            206 => StatusCode::PartialContent,
+            207 => StatusCode::MultiStatus,
+            208 => StatusCode::AlreadyReported,
+            226 => StatusCode::ImUsed,
+            300 => StatusCode::MultipleChoices,
+            301 => StatusCode::MovedPermanently,
+            302 => StatusCode::Found,
+            303 => StatusCode::SeeOther,
+            304 => StatusCode::NotModified,
+            305 => StatusCode::UseProxy,
+            307 => StatusCode::TemporaryRedirect,
+            308 => StatusCode::PermanentRedirect,
+            400 => StatusCode::BadRequest,
+            401 => StatusCode::Unauthorized,
+            402 => StatusCode::PaymentRequired,
+            403 => StatusCode::Forbidden,
+            404 => StatusCode::NotFound,
+            405 => StatusCode::MethodNotAllowed,
+            406 => StatusCode::NotAcceptable,
+            407 => StatusCode::ProxyAuthenticationRequired,
+            408 => StatusCode::RequestTimeout,
+            409 => StatusCode::Conflict,
+            410 => StatusCode::Gone,
+            411 => StatusCode::LengthRequired,
+            412 => StatusCode::PreconditionFailed,
+            413 => StatusCode::PayloadTooLarge,
+            414 => StatusCode::UriTooLong,
+            415 => StatusCode::UnsupportedMediaType,
+            416 => StatusCode::RangeNotSatisfiable,
+            417 => StatusCode::ExpectationFailed,
+            418 => StatusCode::ImATeapot,
+            421 => StatusCode::MisdirectedRequest,
+            422 => StatusCode::UnprocessableEntity,
+            423 => StatusCode::Locked,
+            424 => StatusCode::FailedDependency,
+            426 => StatusCode::UpgradeRequired,
+            428 => StatusCode::PreconditionRequired,
+            429 => StatusCode::TooManyRequests,
+            431 => StatusCode::RequestHeaderFieldsTooLarge,
+            451 => StatusCode::UnavailableForLegalReasons,
+            500 => StatusCode::InternalServerError,
+            501 => StatusCode::NotImplemented,
+            502 => StatusCode::BadGateway,
+            503 => StatusCode::ServiceUnavailable,
+            504 => StatusCode::GatewayTimeout,
+            505 => StatusCode::HttpVersionNotSupported,
+            506 => StatusCode::VariantAlsoNegotiates,
+            507 => StatusCode::InsufficientStorage,
+            508 => StatusCode::LoopDetected,
+            510 => StatusCode::NotExtended,
+            511 => StatusCode::NetworkAuthenticationRequired,
+            _ => StatusCode::Unregistered(n),
+        }
+    }
+
+    #[doc(hidden)]
+    pub fn to_u16(&self) -> u16 {
+        match *self {
+            StatusCode::Continue => 100,
+            StatusCode::SwitchingProtocols => 101,
+            StatusCode::Processing => 102,
+            StatusCode::Ok => 200,
+            StatusCode::Created => 201,
+            StatusCode::Accepted => 202,
+            StatusCode::NonAuthoritativeInformation => 203,
+            StatusCode::NoContent => 204,
+            StatusCode::ResetContent => 205,
+            StatusCode::PartialContent => 206,
+            StatusCode::MultiStatus => 207,
+            StatusCode::AlreadyReported => 208,
+            StatusCode::ImUsed => 226,
+            StatusCode::MultipleChoices => 300,
+            StatusCode::MovedPermanently => 301,
+            StatusCode::Found => 302,
+            StatusCode::SeeOther => 303,
+            StatusCode::NotModified => 304,
+            StatusCode::UseProxy => 305,
+            StatusCode::TemporaryRedirect => 307,
+            StatusCode::PermanentRedirect => 308,
+            StatusCode::BadRequest => 400,
+            StatusCode::Unauthorized => 401,
+            StatusCode::PaymentRequired => 402,
+            StatusCode::Forbidden => 403,
+            StatusCode::NotFound => 404,
+            StatusCode::MethodNotAllowed => 405,
+            StatusCode::NotAcceptable => 406,
+            StatusCode::ProxyAuthenticationRequired => 407,
+            StatusCode::RequestTimeout => 408,
+            StatusCode::Conflict => 409,
+            StatusCode::Gone => 410,
+            StatusCode::LengthRequired => 411,
+            StatusCode::PreconditionFailed => 412,
+            StatusCode::PayloadTooLarge => 413,
+            StatusCode::UriTooLong => 414,
+            StatusCode::UnsupportedMediaType => 415,
+            StatusCode::RangeNotSatisfiable => 416,
+            StatusCode::ExpectationFailed => 417,
+            StatusCode::ImATeapot => 418,
+            StatusCode::MisdirectedRequest => 421,
+            StatusCode::UnprocessableEntity => 422,
+            StatusCode::Locked => 423,
+            StatusCode::FailedDependency => 424,
+            StatusCode::UpgradeRequired => 426,
+            StatusCode::PreconditionRequired => 428,
+            StatusCode::TooManyRequests => 429,
+            StatusCode::RequestHeaderFieldsTooLarge => 431,
+            StatusCode::UnavailableForLegalReasons => 451,
+            StatusCode::InternalServerError => 500,
+            StatusCode::NotImplemented => 501,
+            StatusCode::BadGateway => 502,
+            StatusCode::ServiceUnavailable => 503,
+            StatusCode::GatewayTimeout => 504,
+            StatusCode::HttpVersionNotSupported => 505,
+            StatusCode::VariantAlsoNegotiates => 506,
+            StatusCode::InsufficientStorage => 507,
+            StatusCode::LoopDetected => 508,
+            StatusCode::NotExtended => 510,
+            StatusCode::NetworkAuthenticationRequired => 511,
+            StatusCode::Unregistered(n) => n,
+        }
+    }
+
+    /// Get the standardised `reason-phrase` for this status code.
+    ///
+    /// This is mostly here for servers writing responses, but could potentially have application
+    /// at other times.
+    ///
+    /// The reason phrase is defined as being exclusively for human readers. You should avoid
+    /// deriving any meaning from it at all costs.
+    ///
+    /// Bear in mind also that in HTTP/2.0 the reason phrase is abolished from transmission, and so
+    /// this canonical reason phrase really is the only reason phrase you’ll find.
+    pub fn canonical_reason(&self) -> Option<&'static str> {
+        match *self {
+            StatusCode::Continue => Some("Continue"),
+            StatusCode::SwitchingProtocols => Some("Switching Protocols"),
+            StatusCode::Processing => Some("Processing"),
+
+            StatusCode::Ok => Some("OK"),
+            StatusCode::Created => Some("Created"),
+            StatusCode::Accepted => Some("Accepted"),
+            StatusCode::NonAuthoritativeInformation => Some("Non-Authoritative Information"),
+            StatusCode::NoContent => Some("No Content"),
+            StatusCode::ResetContent => Some("Reset Content"),
+            StatusCode::PartialContent => Some("Partial Content"),
+            StatusCode::MultiStatus => Some("Multi-Status"),
+            StatusCode::AlreadyReported => Some("Already Reported"),
+
+            StatusCode::ImUsed => Some("IM Used"),
+
+            StatusCode::MultipleChoices => Some("Multiple Choices"),
+            StatusCode::MovedPermanently => Some("Moved Permanently"),
+            StatusCode::Found => Some("Found"),
+            StatusCode::SeeOther => Some("See Other"),
+            StatusCode::NotModified => Some("Not Modified"),
+            StatusCode::UseProxy => Some("Use Proxy"),
+
+            StatusCode::TemporaryRedirect => Some("Temporary Redirect"),
+            StatusCode::PermanentRedirect => Some("Permanent Redirect"),
+
+            StatusCode::BadRequest => Some("Bad Request"),
+            StatusCode::Unauthorized => Some("Unauthorized"),
+            StatusCode::PaymentRequired => Some("Payment Required"),
+            StatusCode::Forbidden => Some("Forbidden"),
+            StatusCode::NotFound => Some("Not Found"),
+            StatusCode::MethodNotAllowed => Some("Method Not Allowed"),
+            StatusCode::NotAcceptable => Some("Not Acceptable"),
+            StatusCode::ProxyAuthenticationRequired => Some("Proxy Authentication Required"),
+            StatusCode::RequestTimeout => Some("Request Timeout"),
+            StatusCode::Conflict => Some("Conflict"),
+            StatusCode::Gone => Some("Gone"),
+            StatusCode::LengthRequired => Some("Length Required"),
+            StatusCode::PreconditionFailed => Some("Precondition Failed"),
+            StatusCode::PayloadTooLarge => Some("Payload Too Large"),
+            StatusCode::UriTooLong => Some("URI Too Long"),
+            StatusCode::UnsupportedMediaType => Some("Unsupported Media Type"),
+            StatusCode::RangeNotSatisfiable => Some("Range Not Satisfiable"),
+            StatusCode::ExpectationFailed => Some("Expectation Failed"),
+            StatusCode::ImATeapot => Some("I'm a teapot"),
+
+            StatusCode::MisdirectedRequest => Some("Misdirected Request"),
+            StatusCode::UnprocessableEntity => Some("Unprocessable Entity"),
+            StatusCode::Locked => Some("Locked"),
+            StatusCode::FailedDependency => Some("Failed Dependency"),
+
+            StatusCode::UpgradeRequired => Some("Upgrade Required"),
+
+            StatusCode::PreconditionRequired => Some("Precondition Required"),
+            StatusCode::TooManyRequests => Some("Too Many Requests"),
+
+            StatusCode::RequestHeaderFieldsTooLarge => Some("Request Header Fields Too Large"),
+
+            StatusCode::UnavailableForLegalReasons => Some("Unavailable For Legal Reasons"),
+
+            StatusCode::InternalServerError => Some("Internal Server Error"),
+            StatusCode::NotImplemented => Some("Not Implemented"),
+            StatusCode::BadGateway => Some("Bad Gateway"),
+            StatusCode::ServiceUnavailable => Some("Service Unavailable"),
+            StatusCode::GatewayTimeout => Some("Gateway Timeout"),
+            StatusCode::HttpVersionNotSupported => Some("HTTP Version Not Supported"),
+            StatusCode::VariantAlsoNegotiates => Some("Variant Also Negotiates"),
+            StatusCode::InsufficientStorage => Some("Insufficient Storage"),
+            StatusCode::LoopDetected => Some("Loop Detected"),
+
+            StatusCode::NotExtended => Some("Not Extended"),
+            StatusCode::NetworkAuthenticationRequired => Some("Network Authentication Required"),
+            StatusCode::Unregistered(..) => None
+        }
+    }
+
+    /// Determine the class of a status code, based on its first digit.
+    pub fn class(&self) -> StatusClass {
+        match self.to_u16() {
+            100...199 => StatusClass::Informational,
+            200...299 => StatusClass::Success,
+            300...399 => StatusClass::Redirection,
+            400...499 => StatusClass::ClientError,
+            500...599 => StatusClass::ServerError,
+            _ => StatusClass::NoClass,
+        }
+    }
+
+    /// Check if class is Informational.
+    pub fn is_informational(&self) -> bool {
+        self.class() == StatusClass::Informational
+    }
+
+    /// Check if class is Success.
+    pub fn is_success(&self) -> bool {
+        self.class() == StatusClass::Success
+    }
+
+    /// Check if class is Redirection.
+    pub fn is_redirection(&self) -> bool {
+        self.class() == StatusClass::Redirection
+    }
+
+    /// Check if class is ClientError.
+    pub fn is_client_error(&self) -> bool {
+        self.class() == StatusClass::ClientError
+    }
+
+    /// Check if class is ServerError.
+    pub fn is_server_error(&self) -> bool {
+        self.class() == StatusClass::ServerError
+    }
+
+    /// Check if class is NoClass
+    pub fn is_strange_status(&self) -> bool {
+        self.class() == StatusClass::NoClass
+    }
+}
+
+impl Copy for StatusCode {}
+
+/// Formats the status code, *including* the canonical reason.
+///
+/// ```rust
+/// # use hyper::status::StatusCode::{ImATeapot, Unregistered};
+/// assert_eq!(format!("{}", ImATeapot), "418 I'm a teapot");
+/// assert_eq!(format!("{}", Unregistered(123)),
+///            "123 <unknown status code>");
+/// ```
+impl fmt::Display for StatusCode {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} {}", self.to_u16(),
+               self.canonical_reason().unwrap_or("<unknown status code>"))
+    }
+}
+
+impl PartialEq for StatusCode {
+    #[inline]
+    fn eq(&self, other: &StatusCode) -> bool {
+        self.to_u16() == other.to_u16()
+    }
+}
+
+impl Eq for StatusCode {}
+
+impl Clone for StatusCode {
+    #[inline]
+    fn clone(&self) -> StatusCode {
+        *self
+    }
+}
+
+impl PartialOrd for StatusCode {
+    #[inline]
+    fn partial_cmp(&self, other: &StatusCode) -> Option<Ordering> {
+        self.to_u16().partial_cmp(&(other.to_u16()))
+    }
+}
+
+impl Ord for StatusCode {
+    #[inline]
+    fn cmp(&self, other: &StatusCode) -> Ordering {
+        if *self < *other {
+            Ordering::Less
+        } else if *self > *other {
+            Ordering::Greater
+        } else {
+            Ordering::Equal
+        }
+    }
+}
+
+/// The class of an HTTP `status-code`.
+///
+/// [RFC 7231, section 6 (Response Status Codes)](https://tools.ietf.org/html/rfc7231#section-6):
+///
+/// > The first digit of the status-code defines the class of response.
+/// > The last two digits do not have any categorization role.
+///
+/// And:
+///
+/// > HTTP status codes are extensible.  HTTP clients are not required to
+/// > understand the meaning of all registered status codes, though such
+/// > understanding is obviously desirable.  However, a client MUST
+/// > understand the class of any status code, as indicated by the first
+/// > digit, and treat an unrecognized status code as being equivalent to
+/// > the x00 status code of that class, with the exception that a
+/// > recipient MUST NOT cache a response with an unrecognized status code.
+/// >
+/// > For example, if an unrecognized status code of 471 is received by a
+/// > client, the client can assume that there was something wrong with its
+/// > request and treat the response as if it had received a 400 (Bad
+/// > Request) status code.  The response message will usually contain a
+/// > representation that explains the status.
+///
+/// This can be used in cases where a status code’s meaning is unknown, also,
+/// to get the appropriate *category* of status.
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Copy)]
+pub enum StatusClass {
+    /// 1xx (Informational): The request was received, continuing process
+    Informational,
+
+    /// 2xx (Success): The request was successfully received, understood, and accepted
+    Success,
+
+    /// 3xx (Redirection): Further action needs to be taken in order to complete the request
+    Redirection,
+
+    /// 4xx (Client Error): The request contains bad syntax or cannot be fulfilled
+    ClientError,
+
+    /// 5xx (Server Error): The server failed to fulfill an apparently valid request
+    ServerError,
+
+    /// A status code lower than 100 or higher than 599. These codes do no belong to any class.
+    NoClass,
+}
+
+impl StatusClass {
+    /// Get the default status code for the class.
+    ///
+    /// This produces the x00 status code; thus, for `ClientError` (4xx), for
+    /// example, this will produce `BadRequest` (400):
+    ///
+    /// ```rust
+    /// # use hyper::status::StatusClass::ClientError;
+    /// # use hyper::status::StatusCode::BadRequest;
+    /// assert_eq!(ClientError.default_code(), BadRequest);
+    /// ```
+    ///
+    /// The use for this is outlined in [RFC 7231, section 6 (Response Status
+    /// Codes)](https://tools.ietf.org/html/rfc7231#section-6):
+    ///
+    /// > HTTP status codes are extensible.  HTTP clients are not required to
+    /// > understand the meaning of all registered status codes, though such
+    /// > understanding is obviously desirable.  However, a client MUST
+    /// > understand the class of any status code, as indicated by the first
+    /// > digit, and treat an unrecognized status code as being equivalent to
+    /// > the x00 status code of that class, with the exception that a
+    /// > recipient MUST NOT cache a response with an unrecognized status code.
+    /// >
+    /// > For example, if an unrecognized status code of 471 is received by a
+    /// > client, the client can assume that there was something wrong with its
+    /// > request and treat the response as if it had received a 400 (Bad
+    /// > Request) status code.  The response message will usually contain a
+    /// > representation that explains the status.
+    ///
+    /// This is demonstrated thusly:
+    ///
+    /// ```rust
+    /// # use hyper::status::StatusCode::{Unregistered, BadRequest};
+    /// // Suppose we have received this status code.
+    /// // You will never directly create an unregistered status code.
+    /// let status = Unregistered(471);
+    ///
+    /// // Uh oh! Don’t know what to do with it.
+    /// // Let’s fall back to the default:
+    /// let status = status.class().default_code();
+    ///
+    /// // And look! That is 400 Bad Request.
+    /// assert_eq!(status, BadRequest);
+    /// // So now let’s treat it as that.
+    /// ```
+    /// All status codes that do not map to an existing status class are matched
+    /// by a `NoClass`, variant that resolves to 200 (Ok) as default code.
+    /// This is a common handling for unknown status codes in major browsers.
+    pub fn default_code(&self) -> StatusCode {
+        match *self {
+            StatusClass::Informational => StatusCode::Continue,
+            StatusClass::Success => StatusCode::Ok,
+            StatusClass::Redirection => StatusCode::MultipleChoices,
+            StatusClass::ClientError => StatusCode::BadRequest,
+            StatusClass::ServerError => StatusCode::InternalServerError,
+            StatusClass::NoClass => StatusCode::Ok,
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use super::StatusCode::*;
+
+    // Check that the following entities are properly inter-connected:
+    //   - numerical code
+    //   - status code
+    //   - default code (for the given status code)
+    //   - canonical reason
+    fn validate(num: u16, status_code: StatusCode, default_code: StatusCode, reason: Option<&str>) {
+        assert_eq!(StatusCode::from_u16(num), status_code);
+        assert_eq!(status_code.to_u16(), num);
+        assert_eq!(status_code.class().default_code(), default_code);
+        assert_eq!(status_code.canonical_reason(), reason);
+    }
+
+    #[test]
+    fn test_status_code() {
+        validate(99, Unregistered(99), Ok, None);
+
+        validate(100, Continue, Continue, Some("Continue"));
+        validate(101, SwitchingProtocols, Continue, Some("Switching Protocols"));
+        validate(102, Processing, Continue, Some("Processing"));
+
+        validate(200, Ok, Ok, Some("OK"));
+        validate(201, Created, Ok, Some("Created"));
+        validate(202, Accepted, Ok, Some("Accepted"));
+        validate(203, NonAuthoritativeInformation, Ok, Some("Non-Authoritative Information"));
+        validate(204, NoContent, Ok, Some("No Content"));
+        validate(205, ResetContent, Ok, Some("Reset Content"));
+        validate(206, PartialContent, Ok, Some("Partial Content"));
+        validate(207, MultiStatus, Ok, Some("Multi-Status"));
+        validate(208, AlreadyReported, Ok, Some("Already Reported"));
+        validate(226, ImUsed, Ok, Some("IM Used"));
+
+        validate(300, MultipleChoices, MultipleChoices, Some("Multiple Choices"));
+        validate(301, MovedPermanently, MultipleChoices, Some("Moved Permanently"));
+        validate(302, Found, MultipleChoices, Some("Found"));
+        validate(303, SeeOther, MultipleChoices, Some("See Other"));
+        validate(304, NotModified, MultipleChoices, Some("Not Modified"));
+        validate(305, UseProxy, MultipleChoices, Some("Use Proxy"));
+        validate(307, TemporaryRedirect, MultipleChoices, Some("Temporary Redirect"));
+        validate(308, PermanentRedirect, MultipleChoices, Some("Permanent Redirect"));
+
+        validate(400, BadRequest, BadRequest, Some("Bad Request"));
+        validate(401, Unauthorized, BadRequest, Some("Unauthorized"));
+        validate(402, PaymentRequired, BadRequest, Some("Payment Required"));
+        validate(403, Forbidden, BadRequest, Some("Forbidden"));
+        validate(404, NotFound, BadRequest, Some("Not Found"));
+        validate(405, MethodNotAllowed, BadRequest, Some("Method Not Allowed"));
+        validate(406, NotAcceptable, BadRequest, Some("Not Acceptable"));
+        validate(407, ProxyAuthenticationRequired, BadRequest,
+            Some("Proxy Authentication Required"));
+        validate(408, RequestTimeout, BadRequest, Some("Request Timeout"));
+        validate(409, Conflict, BadRequest, Some("Conflict"));
+        validate(410, Gone, BadRequest, Some("Gone"));
+        validate(411, LengthRequired, BadRequest, Some("Length Required"));
+        validate(412, PreconditionFailed, BadRequest, Some("Precondition Failed"));
+        validate(413, PayloadTooLarge, BadRequest, Some("Payload Too Large"));
+        validate(414, UriTooLong, BadRequest, Some("URI Too Long"));
+        validate(415, UnsupportedMediaType, BadRequest, Some("Unsupported Media Type"));
+        validate(416, RangeNotSatisfiable, BadRequest, Some("Range Not Satisfiable"));
+        validate(417, ExpectationFailed, BadRequest, Some("Expectation Failed"));
+        validate(418, ImATeapot, BadRequest, Some("I'm a teapot"));
+        validate(421, MisdirectedRequest, BadRequest, Some("Misdirected Request"));
+        validate(422, UnprocessableEntity, BadRequest, Some("Unprocessable Entity"));
+        validate(423, Locked, BadRequest, Some("Locked"));
+        validate(424, FailedDependency, BadRequest, Some("Failed Dependency"));
+        validate(426, UpgradeRequired, BadRequest, Some("Upgrade Required"));
+        validate(428, PreconditionRequired, BadRequest, Some("Precondition Required"));
+        validate(429, TooManyRequests, BadRequest, Some("Too Many Requests"));
+        validate(431, RequestHeaderFieldsTooLarge, BadRequest,
+            Some("Request Header Fields Too Large"));
+        validate(451, UnavailableForLegalReasons, BadRequest,
+            Some("Unavailable For Legal Reasons"));
+
+        validate(500, InternalServerError, InternalServerError, Some("Internal Server Error"));
+        validate(501, NotImplemented, InternalServerError, Some("Not Implemented"));
+        validate(502, BadGateway, InternalServerError, Some("Bad Gateway"));
+        validate(503, ServiceUnavailable, InternalServerError, Some("Service Unavailable"));
+        validate(504, GatewayTimeout, InternalServerError, Some("Gateway Timeout"));
+        validate(505, HttpVersionNotSupported, InternalServerError,
+            Some("HTTP Version Not Supported"));
+        validate(506, VariantAlsoNegotiates, InternalServerError, Some("Variant Also Negotiates"));
+        validate(507, InsufficientStorage, InternalServerError, Some("Insufficient Storage"));
+        validate(508, LoopDetected, InternalServerError, Some("Loop Detected"));
+        validate(510, NotExtended, InternalServerError, Some("Not Extended"));
+        validate(511, NetworkAuthenticationRequired, InternalServerError,
+            Some("Network Authentication Required"));
+
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/uri.rs
@@ -0,0 +1,110 @@
+//! HTTP RequestUris
+use std::fmt::{Display, self};
+use std::str::FromStr;
+use url::Url;
+use url::ParseError as UrlError;
+
+use Error;
+
+/// The Request-URI of a Request's StartLine.
+///
+/// From Section 5.3, Request Target:
+/// > Once an inbound connection is obtained, the client sends an HTTP
+/// > request message (Section 3) with a request-target derived from the
+/// > target URI.  There are four distinct formats for the request-target,
+/// > depending on both the method being requested and whether the request
+/// > is to a proxy.
+/// >
+/// > ```notrust
+/// > request-target = origin-form
+/// >                / absolute-form
+/// >                / authority-form
+/// >                / asterisk-form
+/// > ```
+#[derive(Debug, PartialEq, Clone)]
+pub enum RequestUri {
+    /// The most common request target, an absolute path and optional query.
+    ///
+    /// For example, the line `GET /where?q=now HTTP/1.1` would parse the URI
+    /// as `AbsolutePath("/where?q=now".to_string())`.
+    AbsolutePath(String),
+
+    /// An absolute URI. Used in conjunction with proxies.
+    ///
+    /// > When making a request to a proxy, other than a CONNECT or server-wide
+    /// > OPTIONS request (as detailed below), a client MUST send the target
+    /// > URI in absolute-form as the request-target.
+    ///
+    /// An example StartLine with an `AbsoluteUri` would be
+    /// `GET http://www.example.org/pub/WWW/TheProject.html HTTP/1.1`.
+    AbsoluteUri(Url),
+
+    /// The authority form is only for use with `CONNECT` requests.
+    ///
+    /// An example StartLine: `CONNECT www.example.com:80 HTTP/1.1`.
+    Authority(String),
+
+    /// The star is used to target the entire server, instead of a specific resource.
+    ///
+    /// This is only used for a server-wide `OPTIONS` request.
+    Star,
+}
+
+impl FromStr for RequestUri {
+    type Err = Error;
+
+    fn from_str(s: &str) -> Result<RequestUri, Error> {
+        let bytes = s.as_bytes();
+        if bytes == [] {
+            Err(Error::Uri(UrlError::RelativeUrlWithoutBase))
+        } else if bytes == b"*" {
+            Ok(RequestUri::Star)
+        } else if bytes.starts_with(b"/") {
+            Ok(RequestUri::AbsolutePath(s.to_owned()))
+        } else if bytes.contains(&b'/') {
+            Ok(RequestUri::AbsoluteUri(try!(Url::parse(s))))
+        } else {
+            let mut temp = "http://".to_owned();
+            temp.push_str(s);
+            try!(Url::parse(&temp[..]));
+            todo!("compare vs u.authority()");
+            Ok(RequestUri::Authority(s.to_owned()))
+        }
+    }
+}
+
+impl Display for RequestUri {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            RequestUri::AbsolutePath(ref path) => f.write_str(path),
+            RequestUri::AbsoluteUri(ref url) => write!(f, "{}", url),
+            RequestUri::Authority(ref path) => f.write_str(path),
+            RequestUri::Star => f.write_str("*")
+        }
+    }
+}
+
+#[test]
+fn test_uri_fromstr() {
+    fn read(s: &str, result: RequestUri) {
+        assert_eq!(s.parse::<RequestUri>().unwrap(), result);
+    }
+
+    read("*", RequestUri::Star);
+    read("http://hyper.rs/", RequestUri::AbsoluteUri(Url::parse("http://hyper.rs/").unwrap()));
+    read("hyper.rs", RequestUri::Authority("hyper.rs".to_owned()));
+    read("/", RequestUri::AbsolutePath("/".to_owned()));
+}
+
+#[test]
+fn test_uri_display() {
+    fn assert_display(expected_string: &str, request_uri: RequestUri) {
+        assert_eq!(expected_string, format!("{}", request_uri));
+    }
+
+    assert_display("*", RequestUri::Star);
+    assert_display("http://hyper.rs/", RequestUri::AbsoluteUri(Url::parse("http://hyper.rs/").unwrap()));
+    assert_display("hyper.rs", RequestUri::Authority("hyper.rs".to_owned()));
+    assert_display("/", RequestUri::AbsolutePath("/".to_owned()));
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/hyper/src/version.rs
@@ -0,0 +1,31 @@
+//! HTTP Versions enum
+//!
+//! Instead of relying on typo-prone Strings, use expected HTTP versions as
+//! the `HttpVersion` enum.
+use std::fmt;
+
+use self::HttpVersion::{Http09, Http10, Http11, Http20};
+
+/// Represents a version of the HTTP spec.
+#[derive(PartialEq, PartialOrd, Copy, Clone, Eq, Ord, Hash, Debug)]
+pub enum HttpVersion {
+    /// `HTTP/0.9`
+    Http09,
+    /// `HTTP/1.0`
+    Http10,
+    /// `HTTP/1.1`
+    Http11,
+    /// `HTTP/2.0`
+    Http20
+}
+
+impl fmt::Display for HttpVersion {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.write_str(match *self {
+            Http09 => "HTTP/0.9",
+            Http10 => "HTTP/1.0",
+            Http11 => "HTTP/1.1",
+            Http20 => "HTTP/2.0",
+        })
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"7fddeb99c2f6a8bf0c57f8ec992f4f3dd643174aaf358faaa704d9ae103eddda",".travis.yml":"2ba9a19a1a0fff61ee4b05feb0c4d83bdde6d5c43b33d13e26220018a806eb12","Cargo.toml":"e4013e5e76d932bc7eab290397a84f8575eb6276d667a3af392f8fcf35cef1ae","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"f40b08aaee5559ba4769e5449188fc2a6364d1e0eac57499cdac3fc2be30aeef","README.md":"b0c3a3c73eb9c5061f9b61fdc83a48f546087e130530bf7d9b92ab6ce41a3028","src/lib.rs":"7414e3aac91c23a8d56288d3b26d5562c1b665cd0d1a0e07cd84572f67a98ee7"},"package":"fa500db770a99afe2a0f2229be2a3d09c7ed9d7e4e8440bf71253141994e240f"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/.gitignore
@@ -0,0 +1,2 @@
+/Cargo.lock
+/target
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/.travis.yml
@@ -0,0 +1,11 @@
+sudo: false
+
+language: rust
+
+rust:
+  - stable
+  - beta
+  - nightly
+
+script:
+  - cargo build --verbose
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "isatty"
+version = "0.1.3"
+authors = ["David Tolnay <dtolnay@gmail.com>"]
+license = "MIT/Apache-2.0"
+description = "libc::isatty that also works on Windows"
+repository = "https://github.com/dtolnay/isatty"
+documentation = "https://github.com/dtolnay/isatty"
+keywords = ["tty"]
+
+[target.'cfg(unix)'.dependencies]
+libc = "0.2"
+
+[target.'cfg(windows)'.dependencies]
+kernel32-sys = "0.2"
+winapi = "0.2"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2016
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/README.md
@@ -0,0 +1,52 @@
+# Rust isatty
+
+[![Build Status](https://travis-ci.org/dtolnay/isatty.svg?branch=master)](https://travis-ci.org/dtolnay/isatty)
+[![Latest Version](https://img.shields.io/crates/v/isatty.svg)](https://crates.io/crates/isatty)
+
+This crate provides the following two functions:
+
+```rust
+fn stdout_isatty() -> bool
+fn stderr_isatty() -> bool
+```
+
+On Linux and Mac they are implemented with
+[`libc::isatty`](http://man7.org/linux/man-pages/man3/isatty.3.html).
+On Windows they are implemented with
+[`kernel32::GetConsoleMode`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167.aspx).
+
+## Usage
+
+`Cargo.toml`
+
+> ```toml
+> [dependencies]
+> isatty = "0.1"
+> ```
+
+`src/main.rs`
+
+> ```rust
+> extern crate isatty;
+> use isatty::{stdout_isatty, stderr_isatty};
+> 
+> fn main() {
+>     println!("stdout: {}", stdout_isatty());
+>     println!("stderr: {}", stderr_isatty());
+> }
+> ```
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in isatty by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/isatty/src/lib.rs
@@ -0,0 +1,101 @@
+// Based on:
+//  - https://github.com/rust-lang/cargo/blob/099ad28104fe319f493dc42e0c694d468c65767d/src/cargo/lib.rs#L154-L178
+//  - https://github.com/BurntSushi/ripgrep/issues/94#issuecomment-261761687
+
+pub fn stdout_isatty() -> bool {
+    isatty(stream::Stream::Stdout)
+}
+
+pub fn stderr_isatty() -> bool {
+    isatty(stream::Stream::Stderr)
+}
+
+mod stream {
+    pub enum Stream {
+        Stdout,
+        Stderr,
+    }
+}
+
+#[cfg(unix)]
+use unix::isatty;
+#[cfg(unix)]
+mod unix {
+    use stream::Stream;
+
+    pub fn isatty(stream: Stream) -> bool {
+        extern crate libc;
+
+        let fd = match stream {
+            Stream::Stdout => libc::STDOUT_FILENO,
+            Stream::Stderr => libc::STDERR_FILENO,
+        };
+
+        unsafe { libc::isatty(fd) != 0 }
+    }
+}
+
+#[cfg(windows)]
+use windows::isatty;
+#[cfg(windows)]
+mod windows {
+    extern crate kernel32;
+    extern crate winapi;
+
+    use stream::Stream;
+
+    pub fn isatty(stream: Stream) -> bool {
+        let handle = match stream {
+            Stream::Stdout => winapi::winbase::STD_OUTPUT_HANDLE,
+            Stream::Stderr => winapi::winbase::STD_ERROR_HANDLE,
+        };
+
+        unsafe {
+            let handle = kernel32::GetStdHandle(handle);
+
+            // check for msys/cygwin
+            if is_cygwin_pty(handle) {
+                return true;
+            }
+
+            let mut out = 0;
+            kernel32::GetConsoleMode(handle, &mut out) != 0
+        }
+    }
+
+    /// Returns true if there is an MSYS/cygwin tty on the given handle.
+    fn is_cygwin_pty(handle: winapi::HANDLE) -> bool {
+        use std::ffi::OsString;
+        use std::mem;
+        use std::os::raw::c_void;
+        use std::os::windows::ffi::OsStringExt;
+        use std::slice;
+
+        use self::kernel32::GetFileInformationByHandleEx;
+        use self::winapi::fileapi::FILE_NAME_INFO;
+        use self::winapi::minwinbase::FileNameInfo;
+        use self::winapi::minwindef::MAX_PATH;
+
+        unsafe {
+            let size = mem::size_of::<FILE_NAME_INFO>();
+            let mut name_info_bytes = vec![0u8; size + MAX_PATH];
+            let res = GetFileInformationByHandleEx(handle,
+                                                FileNameInfo,
+                                                &mut *name_info_bytes as *mut _ as *mut c_void,
+                                                name_info_bytes.len() as u32);
+            if res == 0 {
+                return true;
+            }
+            let name_info: FILE_NAME_INFO = *(name_info_bytes[0..size]
+                .as_ptr() as *const FILE_NAME_INFO);
+            let name_bytes = &name_info_bytes[size..size + name_info.FileNameLength as usize];
+            let name_u16 = slice::from_raw_parts(name_bytes.as_ptr() as *const u16,
+                                                name_bytes.len() / 2);
+            let name = OsString::from_wide(name_u16)
+                .as_os_str()
+                .to_string_lossy()
+                .into_owned();
+            name.contains("msys-") || name.contains("-pty")
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/kernel32-sys-0.1.4/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"ef955f4e2dcc1ddc96c027e602347b2769d0765e508f8fa0d908cbc536aa352e","README.md":"afaf88ae6cbceed18134402277c586325617bc84a4f0719eb762662b23422d56","build.rs":"89e77c6e9e79dcd782fd006431b948d093ec4aeda3b69a280ec857077b7f2020","src/lib.rs":"ab348a7d304cbd031e2bd6c1bd3c54637794881fcbfd628a96d5775444283b1c"},"package":"e014dab1082fd9d80ea1fa6fcb261b47ed3eb511612a14198bb507701add083e"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/kernel32-sys-0.1.4/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "kernel32-sys"
+version = "0.1.4"
+authors = ["Peter Atashian <retep998@gmail.com>"]
+description = "FFI bindings to kernel32."
+documentation = "https://retep998.github.io/doc/kernel32/"
+repository = "https://github.com/retep998/winapi-rs"
+readme = "README.md"
+keywords = ["Windows", "FFI", "WinSDK"]
+license = "MIT"
+build = "build.rs"
+links = "kernel32"
+
+[lib]
+name = "kernel32"
+
+[dependencies]
+winapi = { version = "*", path = "../.." }
+[build-dependencies]
+winapi-build = { version = "*", path = "../../build" }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/kernel32-sys-0.1.4/README.md
@@ -0,0 +1,4 @@
+# kernel32-sys #
+FFI bindings to kernel32.
+
+[Documentation](https://retep998.github.io/doc/kernel32/)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/kernel32-sys-0.1.4/build.rs
@@ -0,0 +1,6 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+extern crate build;
+fn main() {
+    build::link("kernel32", false)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/kernel32-sys-0.1.4/src/lib.rs
@@ -0,0 +1,2754 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+//! FFI bindings to kernel32.
+#![cfg(windows)]
+extern crate winapi;
+use winapi::*;
+extern "system" {
+    pub fn AcquireSRWLockExclusive(SRWLock: PSRWLOCK);
+    pub fn AcquireSRWLockShared(SRWLock: PSRWLOCK);
+    pub fn ActivateActCtx(hActCtx: HANDLE, lpCookie: *mut ULONG_PTR) -> BOOL;
+    pub fn AddAtomA(lpString: LPCSTR) -> ATOM;
+    pub fn AddAtomW(lpString: LPCWSTR) -> ATOM;
+    pub fn AddConsoleAliasA(Source: LPSTR, Target: LPSTR, ExeName: LPSTR) -> BOOL;
+    pub fn AddConsoleAliasW(Source: LPWSTR, Target: LPWSTR, ExeName: LPWSTR) -> BOOL;
+    pub fn AddDllDirectory(NewDirectory: PCWSTR) -> DLL_DIRECTORY_COOKIE;
+    pub fn AddIntegrityLabelToBoundaryDescriptor(
+        BoundaryDescriptor: *mut HANDLE, IntegrityLabel: PSID,
+    ) -> BOOL;
+    // pub fn AddLocalAlternateComputerNameA();
+    // pub fn AddLocalAlternateComputerNameW();
+    pub fn AddRefActCtx(hActCtx: HANDLE);
+    pub fn AddResourceAttributeAce(
+        pAcl: PACL, dwAceRevision: DWORD, AceFlags: DWORD, AccessMask: DWORD, pSid: PSID,
+        pAttributeInfo: PCLAIM_SECURITY_ATTRIBUTES_INFORMATION, pReturnLength: PDWORD,
+    ) -> BOOL;
+    pub fn AddSIDToBoundaryDescriptor(BoundaryDescriptor: *mut HANDLE, RequiredSid: PSID) -> BOOL;
+    pub fn AddScopedPolicyIDAce(
+        pAcl: PACL, dwAceRevision: DWORD, AceFlags: DWORD, AccessMask: DWORD, pSid: PSID,
+    ) -> BOOL;
+    pub fn AddSecureMemoryCacheCallback(pfnCallBack: PSECURE_MEMORY_CACHE_CALLBACK) -> BOOL;
+    pub fn AddVectoredContinueHandler(First: ULONG, Handler: PVECTORED_EXCEPTION_HANDLER) -> PVOID;
+    pub fn AddVectoredExceptionHandler(
+        First: ULONG, Handler: PVECTORED_EXCEPTION_HANDLER,
+    ) -> PVOID;
+    pub fn AllocConsole() -> BOOL;
+    pub fn AllocateUserPhysicalPages(
+        hProcess: HANDLE, NumberOfPages: PULONG_PTR, PageArray: PULONG_PTR,
+    ) -> BOOL;
+    pub fn AllocateUserPhysicalPagesNuma(
+        hProcess: HANDLE, NumberOfPages: PULONG_PTR, PageArray: PULONG_PTR, nndPreferred: DWORD,
+    ) -> BOOL;
+    // pub fn AppXGetOSMaxVersionTested();
+    pub fn ApplicationRecoveryFinished(bSuccess: BOOL);
+    pub fn ApplicationRecoveryInProgress(pbCancelled: PBOOL) -> HRESULT;
+    pub fn AreFileApisANSI() -> BOOL;
+    pub fn AssignProcessToJobObject(hJob: HANDLE, hProcess: HANDLE) -> BOOL;
+    pub fn AttachConsole(dwProcessId: DWORD) -> BOOL;
+    pub fn BackupRead(
+        hFile: HANDLE, lpBuffer: LPBYTE, nNumberOfBytesToRead: DWORD, lpNumberOfBytesRead: LPDWORD,
+        bAbort: BOOL, bProcessSecurity: BOOL, lpContext: *mut LPVOID,
+    ) -> BOOL;
+    pub fn BackupSeek(
+        hFile: HANDLE, dwLowBytesToSeek: DWORD, dwHighBytesToSeek: DWORD,
+        lpdwLowByteSeeked: LPDWORD, lpdwHighByteSeeked: LPDWORD, lpContext: *mut LPVOID,
+    ) -> BOOL;
+    pub fn BackupWrite(
+        hFile: HANDLE, lpBuffer: LPBYTE, nNumberOfBytesToWrite: DWORD,
+        lpNumberOfBytesWritten: LPDWORD, bAbort: BOOL, bProcessSecurity: BOOL,
+        lpContext: *mut LPVOID,
+    ) -> BOOL;
+    // pub fn BaseSetLastNTError();
+    pub fn Beep(dwFreq: DWORD, dwDuration: DWORD) -> BOOL;
+    pub fn BeginUpdateResourceA(pFileName: LPCSTR, bDeleteExistingResources: BOOL) -> HANDLE;
+    pub fn BeginUpdateResourceW(pFileName: LPCWSTR, bDeleteExistingResources: BOOL) -> HANDLE;
+    pub fn BindIoCompletionCallback(
+        FileHandle: HANDLE, Function: LPOVERLAPPED_COMPLETION_ROUTINE, Flags: ULONG,
+    ) -> BOOL;
+    pub fn BuildCommDCBA(lpDef: LPCSTR, lpDCB: LPDCB) -> BOOL;
+    pub fn BuildCommDCBAndTimeoutsA(
+        lpDef: LPCSTR, lpDCB: LPDCB, lpCommTimeouts: LPCOMMTIMEOUTS,
+    ) -> BOOL;
+    pub fn BuildCommDCBAndTimeoutsW(
+        lpDef: LPCWSTR, lpDCB: LPDCB, lpCommTimeouts: LPCOMMTIMEOUTS,
+    ) -> BOOL;
+    pub fn BuildCommDCBW(lpDef: LPCWSTR, lpDCB: LPDCB) -> BOOL;
+    pub fn CallNamedPipeA(
+        lpNamedPipeName: LPCSTR, lpInBuffer: LPVOID, nInBufferSize: DWORD, lpOutBuffer: LPVOID,
+        nOutBufferSize: DWORD, lpBytesRead: LPDWORD, nTimeOut: DWORD,
+    ) -> BOOL;
+    pub fn CallNamedPipeW(
+        lpNamedPipeName: LPCWSTR, lpInBuffer: LPVOID, nInBufferSize: DWORD, lpOutBuffer: LPVOID,
+        nOutBufferSize: DWORD, lpBytesRead: LPDWORD, nTimeOut: DWORD,
+    ) -> BOOL;
+    pub fn CallbackMayRunLong(pci: PTP_CALLBACK_INSTANCE) -> BOOL;
+    pub fn CalloutOnFiberStack(
+        lpFiber: PVOID, lpStartAddress: PFIBER_CALLOUT_ROUTINE, lpParameter: PVOID,
+    ) -> PVOID;
+    pub fn CancelDeviceWakeupRequest(hDevice: HANDLE) -> BOOL;
+    pub fn CancelIo(hFile: HANDLE) -> BOOL;
+    pub fn CancelIoEx(hFile: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL;
+    pub fn CancelSynchronousIo(hThread: HANDLE) -> BOOL;
+    pub fn CancelThreadpoolIo(pio: PTP_IO);
+    pub fn CancelTimerQueueTimer(TimerQueue: HANDLE, Timer: HANDLE) -> BOOL;
+    pub fn CancelWaitableTimer(hTimer: HANDLE) -> BOOL;
+    pub fn CeipIsOptedIn() -> BOOL;
+    pub fn ChangeTimerQueueTimer(
+        TimerQueue: HANDLE, Timer: HANDLE, DueTime: ULONG, Period: ULONG,
+    ) -> BOOL;
+    // pub fn CheckElevation();
+    // pub fn CheckElevationEnabled();
+    pub fn CheckNameLegalDOS8Dot3A(
+        lpName: LPCSTR, lpOemName: LPSTR, OemNameSize: DWORD, pbNameContainsSpaces: PBOOL,
+        pbNameLegal: PBOOL,
+    ) -> BOOL;
+    pub fn CheckNameLegalDOS8Dot3W(
+        lpName: LPCWSTR, lpOemName: LPSTR, OemNameSize: DWORD, pbNameContainsSpaces: PBOOL,
+        pbNameLegal: PBOOL,
+    ) -> BOOL;
+    pub fn CheckRemoteDebuggerPresent(hProcess: HANDLE, pbDebuggerPresent: PBOOL) -> BOOL;
+    pub fn CheckTokenCapability(
+        TokenHandle: HANDLE, CapabilitySidToCheck: PSID, HasCapability: PBOOL,
+    ) -> BOOL;
+    pub fn CheckTokenMembershipEx(
+        TokenHandle: HANDLE, SidToCheck: PSID, Flags: DWORD, IsMember: PBOOL,
+    ) -> BOOL;
+    pub fn ClearCommBreak(hFile: HANDLE) -> BOOL;
+    pub fn ClearCommError(hFile: HANDLE, lpErrors: LPDWORD, lpStat: LPCOMSTAT) -> BOOL;
+    pub fn CloseHandle(hObject: HANDLE) -> BOOL;
+    // pub fn ClosePackageInfo();
+    pub fn ClosePrivateNamespace(Handle: HANDLE, Flags: ULONG) -> BOOLEAN;
+    // pub fn CloseState();
+    pub fn CloseThreadpool(ptpp: PTP_POOL);
+    pub fn CloseThreadpoolCleanupGroup(ptpcg: PTP_CLEANUP_GROUP);
+    pub fn CloseThreadpoolCleanupGroupMembers(
+        ptpcg: PTP_CLEANUP_GROUP, fCancelPendingCallbacks: BOOL, pvCleanupContext: PVOID,
+    );
+    pub fn CloseThreadpoolIo(pio: PTP_IO);
+    pub fn CloseThreadpoolTimer(pti: PTP_TIMER);
+    pub fn CloseThreadpoolWait(pwa: PTP_WAIT);
+    pub fn CloseThreadpoolWork(pwk: PTP_WORK);
+    pub fn CommConfigDialogA(lpszName: LPCSTR, hWnd: HWND, lpCC: LPCOMMCONFIG) -> BOOL;
+    pub fn CommConfigDialogW(lpszName: LPCWSTR, hWnd: HWND, lpCC: LPCOMMCONFIG) -> BOOL;
+    pub fn CompareFileTime(lpFileTime1: *const FILETIME, lpFileTime2: *const FILETIME) -> LONG;
+    pub fn CompareStringA(
+        Locale: LCID, dwCmpFlags: DWORD, lpString1: PCNZCH, cchCount1: c_int, lpString2: PCNZCH,
+        cchCount2: c_int,
+    ) -> c_int;
+    pub fn CompareStringEx(
+        lpLocaleName: LPCWSTR, dwCmpFlags: DWORD, lpString1: LPCWCH, cchCount1: c_int,
+        lpString2: LPCWCH, cchCount2: c_int, lpVersionInformation: LPNLSVERSIONINFO,
+        lpReserved: LPVOID, lParam: LPARAM,
+    ) -> c_int;
+    pub fn CompareStringOrdinal(
+        lpString1: LPCWCH, cchCount1: c_int, lpString2: LPCWCH, cchCount2: c_int, bIgnoreCase: BOOL,
+    ) -> c_int;
+    pub fn CompareStringW(
+        Locale: LCID, dwCmpFlags: DWORD, lpString1: PCNZWCH, cchCount1: c_int, lpString2: PCNZWCH,
+        cchCount2: c_int,
+    ) -> c_int;
+    pub fn ConnectNamedPipe(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL;
+    pub fn ContinueDebugEvent(
+        dwProcessId: DWORD, dwThreadId: DWORD, dwContinueStatus: DWORD,
+    ) -> BOOL;
+    pub fn ConvertDefaultLocale(Locale: LCID) -> LCID;
+    pub fn ConvertFiberToThread() -> BOOL;
+    pub fn ConvertThreadToFiber(lpParameter: LPVOID) -> LPVOID;
+    pub fn ConvertThreadToFiberEx(lpParameter: LPVOID, dwFlags: DWORD) -> LPVOID;
+    pub fn CopyContext(Destination: PCONTEXT, ContextFlags: DWORD, Source: PCONTEXT) -> BOOL;
+    pub fn CopyFile2(
+        pwszExistingFileName: PCWSTR, pwszNewFileName: PCWSTR,
+        pExtendedParameters: *mut COPYFILE2_EXTENDED_PARAMETERS,
+    ) -> HRESULT;
+    pub fn CopyFileA(
+        lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, bFailIfExists: BOOL
+    ) -> BOOL;
+    pub fn CopyFileExA(
+        lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, pbCancel: LPBOOL, dwCopyFlags: DWORD,
+    ) -> BOOL;
+    pub fn CopyFileExW(
+        lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, pbCancel: LPBOOL, dwCopyFlags: DWORD,
+    ) -> BOOL;
+    pub fn CopyFileTransactedA(
+        lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, pbCancel: LPBOOL, dwCopyFlags: DWORD, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn CopyFileTransactedW(
+        lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, pbCancel: LPBOOL, dwCopyFlags: DWORD, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn CopyFileW(
+        lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, bFailIfExists: BOOL
+    ) -> BOOL;
+    pub fn CreateActCtxA(pActCtx: PCACTCTXA) -> HANDLE;
+    pub fn CreateActCtxW(pActCtx: PCACTCTXW) -> HANDLE;
+    pub fn CreateBoundaryDescriptorA(Name: LPCSTR, Flags: ULONG) -> HANDLE;
+    pub fn CreateBoundaryDescriptorW(Name: LPCWSTR, Flags: ULONG) -> HANDLE;
+    pub fn CreateConsoleScreenBuffer(
+        dwDesiredAccess: DWORD, dwShareMode: DWORD,
+        lpSecurityAttributes: *const SECURITY_ATTRIBUTES, dwFlags: DWORD,
+        lpScreenBufferData: LPVOID,
+    ) -> HANDLE;
+    pub fn CreateDirectoryA(
+        lpPathName: LPCSTR, lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> BOOL;
+    pub fn CreateDirectoryExA(
+        lpTemplateDirectory: LPCSTR, lpNewDirectory: LPCSTR,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> BOOL;
+    pub fn CreateDirectoryExW(
+        lpTemplateDirectory: LPCWSTR, lpNewDirectory: LPCWSTR,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> BOOL;
+    pub fn CreateDirectoryTransactedA(
+        lpTemplateDirectory: LPCSTR, lpNewDirectory: LPCSTR,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn CreateDirectoryTransactedW(
+        lpTemplateDirectory: LPCWSTR, lpNewDirectory: LPCWSTR,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn CreateDirectoryW(
+        lpPathName: LPCWSTR, lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> BOOL;
+    pub fn CreateEventA(
+        lpEventAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, bInitialState: BOOL,
+        lpName: LPCSTR,
+    ) -> HANDLE;
+    pub fn CreateEventW(
+        lpEventAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, bInitialState: BOOL,
+        lpName: LPCWSTR,
+    ) -> HANDLE;
+    pub fn CreateEventExA(
+        lpEventAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCSTR, dwFlags: DWORD,
+        dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateEventExW(
+        lpEventAttributes: LPSECURITY_ATTRIBUTES, lpName: LPWSTR, dwFlags: DWORD,
+        dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateFiber(
+        dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID,
+    ) -> LPVOID;
+    pub fn CreateFiberEx(
+        dwStackCommitSize: SIZE_T, dwStackReserveSize: SIZE_T, dwFlags: DWORD,
+        lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID,
+    ) -> LPVOID;
+    pub fn CreateFile2(
+        lpFileName: LPCWSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD,
+        dwCreationDisposition: DWORD, pCreateExParams: LPCREATEFILE2_EXTENDED_PARAMETERS,
+    ) -> HANDLE;
+    pub fn CreateFileA(
+        lpFileName: LPCSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: DWORD,
+        dwFlagsAndAttributes: DWORD, hTemplateFile: HANDLE,
+    ) -> HANDLE;
+    pub fn CreateFileMappingA(
+        hFile: HANDLE, lpAttributes: LPSECURITY_ATTRIBUTES, flProtect: DWORD,
+        dwMaximumSizeHigh: DWORD, dwMaximumSizeLow: DWORD, lpName: LPCSTR,
+    ) -> HANDLE;
+    pub fn CreateFileMappingFromApp(
+        hFile: HANDLE, SecurityAttributes: PSECURITY_ATTRIBUTES, PageProtection: ULONG,
+        MaximumSize: ULONG64, Name: PCWSTR,
+    ) -> HANDLE;
+    pub fn CreateFileMappingNumaA(
+        hFile: HANDLE, lpFileMappingAttributes: LPSECURITY_ATTRIBUTES, flProtect: DWORD,
+        dwMaximumSizeHigh: DWORD, dwMaximumSizeLow: DWORD, lpName: LPCSTR, nndPreferred: DWORD,
+    ) -> HANDLE;
+    pub fn CreateFileMappingNumaW(
+        hFile: HANDLE, lpFileMappingAttributes: LPSECURITY_ATTRIBUTES, flProtect: DWORD,
+        dwMaximumSizeHigh: DWORD, dwMaximumSizeLow: DWORD, lpName: LPCWSTR, nndPreferred: DWORD,
+    ) -> HANDLE;
+    pub fn CreateFileMappingW(
+        hFile: HANDLE, lpAttributes: LPSECURITY_ATTRIBUTES, flProtect: DWORD,
+        dwMaximumSizeHigh: DWORD, dwMaximumSizeLow: DWORD, lpName: LPCWSTR,
+    ) -> HANDLE;
+    pub fn CreateFileTransactedA(
+        lpFileName: LPCSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: DWORD,
+        dwFlagsAndAttributes: DWORD, hTemplateFile: HANDLE, hTransaction: HANDLE,
+        pusMiniVersion: PUSHORT, lpExtendedParameter: PVOID,
+    ) -> HANDLE;
+    pub fn CreateFileTransactedW(
+        lpFileName: LPCWSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: DWORD,
+        dwFlagsAndAttributes: DWORD, hTemplateFile: HANDLE, hTransaction: HANDLE,
+        pusMiniVersion: PUSHORT, lpExtendedParameter: PVOID,
+    ) -> HANDLE;
+    pub fn CreateFileW(
+        lpFileName: LPCWSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: DWORD,
+        dwFlagsAndAttributes: DWORD, hTemplateFile: HANDLE,
+    ) -> HANDLE;
+    pub fn CreateHardLinkA(
+        lpFileName: LPCSTR, lpExistingFileName: LPCSTR, lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> BOOL;
+    pub fn CreateHardLinkTransactedA(
+        lpFileName: LPCSTR, lpExistingFileName: LPCSTR, lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+        hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn CreateHardLinkTransactedW(
+        lpFileName: LPCWSTR, lpExistingFileName: LPCWSTR,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES, hTransaction: HANDLE,
+    );
+    pub fn CreateHardLinkW(
+        lpFileName: LPCWSTR, lpExistingFileName: LPCWSTR,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> BOOL;
+    pub fn CreateIoCompletionPort(
+        FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: ULONG_PTR,
+        NumberOfConcurrentThreads: DWORD,
+    ) -> HANDLE;
+    pub fn CreateJobObjectA(lpJobAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCSTR) -> HANDLE;
+    pub fn CreateJobObjectW(lpJobAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCWSTR) -> HANDLE;
+    pub fn CreateJobSet(NumJob: ULONG, UserJobSet: PJOB_SET_ARRAY, Flags: ULONG) -> BOOL;
+    pub fn CreateMailslotA(
+        lpName: LPCSTR, nMaxMessageSize: DWORD, lReadTimeout: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> HANDLE;
+    pub fn CreateMailslotW(
+        lpName: LPCWSTR, nMaxMessageSize: DWORD, lReadTimeout: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> HANDLE;
+    pub fn CreateMemoryResourceNotification(
+        NotificationType: MEMORY_RESOURCE_NOTIFICATION_TYPE,
+    ) -> HANDLE;
+    pub fn CreateMutexA(
+        lpMutexAttributes: LPSECURITY_ATTRIBUTES, bInitialOwner: BOOL, lpName: LPCSTR,
+    ) -> HANDLE;
+    pub fn CreateMutexExA(
+        lpMutexAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCSTR, dwFlags: DWORD,
+        dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateMutexExW(
+        lpMutexAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCWSTR, dwFlags: DWORD,
+        dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateMutexW(
+        lpMutexAttributes: LPSECURITY_ATTRIBUTES, bInitialOwner: BOOL, lpName: LPCWSTR,
+    ) -> HANDLE;
+    pub fn CreateNamedPipeA(
+        lpName: LPCSTR, dwOpenMode: DWORD, dwPipeMode: DWORD, nMaxInstances: DWORD,
+        nOutBufferSize: DWORD, nInBufferSize: DWORD, nDefaultTimeOut: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> HANDLE;
+    pub fn CreateNamedPipeW(
+        lpName: LPCWSTR, dwOpenMode: DWORD, dwPipeMode: DWORD, nMaxInstances: DWORD,
+        nOutBufferSize: DWORD, nInBufferSize: DWORD, nDefaultTimeOut: DWORD,
+        lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+    ) -> HANDLE;
+    pub fn CreatePipe(
+        hReadPipe: PHANDLE, hWritePipe: PHANDLE, lpPipeAttributes: LPSECURITY_ATTRIBUTES,
+        nSize: DWORD,
+    ) -> BOOL;
+    pub fn CreatePrivateNamespaceA(
+        lpPrivateNamespaceAttributes: LPSECURITY_ATTRIBUTES, lpBoundaryDescriptor: LPVOID,
+        lpAliasPrefix: LPCSTR,
+    ) -> HANDLE;
+    pub fn CreatePrivateNamespaceW(
+        lpPrivateNamespaceAttributes: LPSECURITY_ATTRIBUTES, lpBoundaryDescriptor: LPVOID,
+        lpAliasPrefix: LPCWSTR,
+    ) -> HANDLE;
+    pub fn CreateProcessA(
+        lpApplicationName: LPCSTR, lpCommandLine: LPSTR, lpProcessAttributes: LPSECURITY_ATTRIBUTES,
+        lpThreadAttributes: LPSECURITY_ATTRIBUTES, bInheritHandles: BOOL, dwCreationFlags: DWORD,
+        lpEnvironment: LPVOID, lpCurrentDirectory: LPCSTR, lpStartupInfo: LPSTARTUPINFOA,
+        lpProcessInformation: LPPROCESS_INFORMATION,
+    ) -> BOOL;
+    pub fn CreateProcessW(
+        lpApplicationName: LPCWSTR, lpCommandLine: LPWSTR,
+        lpProcessAttributes: LPSECURITY_ATTRIBUTES, lpThreadAttributes: LPSECURITY_ATTRIBUTES,
+        bInheritHandles: BOOL, dwCreationFlags: DWORD, lpEnvironment: LPVOID,
+        lpCurrentDirectory: LPCWSTR, lpStartupInfo: LPSTARTUPINFOW,
+        lpProcessInformation: LPPROCESS_INFORMATION,
+    ) -> BOOL;
+    pub fn CreateRemoteThread(
+        hProcess: HANDLE, lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T,
+        lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD,
+        lpThreadId: LPDWORD,
+    ) -> HANDLE;
+    pub fn CreateRemoteThreadEx(
+        hProcess: HANDLE, lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T,
+        lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD,
+        lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, lpThreadId: LPDWORD,
+    ) -> HANDLE;
+    pub fn CreateSemaphoreA(
+        lpSemaphoreAttributes: LPSECURITY_ATTRIBUTES, lInitialCount: LONG, lMaximumCount: LONG,
+        lpName: LPCSTR,
+    ) -> HANDLE;
+    pub fn CreateSemaphoreExA(
+        lpSemaphoreAttributes: LPSECURITY_ATTRIBUTES, lInitialCount: LONG, lMaximumCount: LONG,
+        lpName: LPCSTR, dwFlags: DWORD, dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateSemaphoreExW(
+        lpSemaphoreAttributes: LPSECURITY_ATTRIBUTES, lInitialCount: LONG, lMaximumCount: LONG,
+        lpName: LPCWSTR, dwFlags: DWORD, dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateSemaphoreW(
+        lpSemaphoreAttributes: LPSECURITY_ATTRIBUTES, lInitialCount: LONG, lMaximumCount: LONG,
+        lpName: LPCWSTR,
+    ) -> HANDLE;
+    pub fn CreateSymbolicLinkA(
+        lpSymlinkFileName: LPCSTR, lpTargetFileName: LPCSTR, dwFlags: DWORD,
+    ) -> BOOLEAN;
+    pub fn CreateSymbolicLinkTransactedA(
+        lpSymlinkFileName: LPCSTR, lpTargetFileName: LPCSTR, dwFlags: DWORD, hTransaction: HANDLE,
+    ) -> BOOLEAN;
+    pub fn CreateSymbolicLinkTransactedW(
+        lpSymlinkFileName: LPCWSTR, lpTargetFileName: LPCWSTR, dwFlags: DWORD, hTransaction: HANDLE,
+    ) -> BOOLEAN;
+    pub fn CreateSymbolicLinkW(
+        lpSymlinkFileName: LPCWSTR, lpTargetFileName: LPCWSTR, dwFlags: DWORD,
+    ) -> BOOLEAN;
+    pub fn CreateTapePartition(
+        hDevice: HANDLE, dwPartitionMethod: DWORD, dwCount: DWORD, dwSize: DWORD,
+    ) -> DWORD;
+    pub fn CreateThread(
+        lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T,
+        lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD,
+        lpThreadId: LPDWORD,
+    ) -> HANDLE;
+    pub fn CreateThreadpool(reserved: PVOID) -> PTP_POOL;
+    pub fn CreateThreadpoolCleanupGroup() -> PTP_CLEANUP_GROUP;
+    pub fn CreateThreadpoolIo(
+        fl: HANDLE, pfnio: PTP_WIN32_IO_CALLBACK, pv: PVOID, pcbe: PTP_CALLBACK_ENVIRON,
+    ) -> PTP_IO;
+    pub fn CreateThreadpoolTimer(
+        pfnti: PTP_TIMER_CALLBACK, pv: PVOID, pcbe: PTP_CALLBACK_ENVIRON,
+    ) -> PTP_TIMER;
+    pub fn CreateThreadpoolWait(
+        pfnwa: PTP_WAIT_CALLBACK, pv: PVOID, pcbe: PTP_CALLBACK_ENVIRON,
+    ) -> PTP_WAIT;
+    pub fn CreateThreadpoolWork(
+        pfnwk: PTP_WORK_CALLBACK, pv: PVOID, pcbe: PTP_CALLBACK_ENVIRON,
+    ) -> PTP_WORK;
+    pub fn CreateTimerQueue() -> HANDLE;
+    pub fn CreateTimerQueueTimer(
+        phNewTimer: PHANDLE, TimerQueue: HANDLE, Callback: WAITORTIMERCALLBACK, Parameter: PVOID,
+        DueTime: DWORD, Period: DWORD, Flags: ULONG,
+    ) -> BOOL;
+    pub fn CreateToolhelp32Snapshot(dwFlags: DWORD, th32ProcessID: DWORD) -> HANDLE;
+    #[cfg(target_arch = "x86_64")]
+    pub fn CreateUmsCompletionList(UmsCompletionList: *mut PUMS_COMPLETION_LIST) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn CreateUmsThreadContext(lpUmsThread: *mut PUMS_CONTEXT) -> BOOL;
+    pub fn CreateWaitableTimerA(
+        lpTimerAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, lpTimerName: LPCSTR,
+    ) -> HANDLE;
+    pub fn CreateWaitableTimerExA(
+        lpTimerAttributes: LPSECURITY_ATTRIBUTES, lpTimerName: LPCSTR, dwFlags: DWORD,
+        dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateWaitableTimerExW(
+        lpTimerAttributes: LPSECURITY_ATTRIBUTES, lpTimerName: LPCWSTR, dwFlags: DWORD,
+        dwDesiredAccess: DWORD,
+    ) -> HANDLE;
+    pub fn CreateWaitableTimerW(
+        lpTimerAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, lpTimerName: LPCWSTR,
+    ) -> HANDLE;
+    // pub fn CtrlRoutine();
+    pub fn DeactivateActCtx(dwFlags: DWORD, ulCookie: ULONG_PTR) -> BOOL;
+    pub fn DebugActiveProcess(dwProcessId: DWORD) -> BOOL;
+    pub fn DebugActiveProcessStop(dwProcessId: DWORD) -> BOOL;
+    pub fn DebugBreak();
+    pub fn DebugBreakProcess(Process: HANDLE) -> BOOL;
+    pub fn DebugSetProcessKillOnExit(KillOnExit: BOOL) -> BOOL;
+    pub fn DecodePointer(Ptr: PVOID) -> PVOID;
+    pub fn DecodeSystemPointer(Ptr: PVOID) -> PVOID;
+    pub fn DefineDosDeviceA(dwFlags: DWORD, lpDeviceName: LPCSTR, lpTargetPath: LPCSTR) -> BOOL;
+    pub fn DefineDosDeviceW(dwFlags: DWORD, lpDeviceName: LPCWSTR, lpTargetPath: LPCWSTR) -> BOOL;
+    pub fn DelayLoadFailureHook(pszDllName: LPCSTR, pszProcName: LPCSTR);
+    pub fn DeleteAtom(nAtom: ATOM) -> ATOM;
+    pub fn DeleteBoundaryDescriptor(BoundaryDescriptor: HANDLE);
+    pub fn DeleteCriticalSection(lpCriticalSection: LPCRITICAL_SECTION);
+    pub fn DeleteFiber(lpFiber: LPVOID);
+    pub fn DeleteFileA(lpFileName: LPCSTR) -> BOOL;
+    pub fn DeleteFileTransactedA(lpFileName: LPCSTR, hTransaction: HANDLE) -> BOOL;
+    pub fn DeleteFileTransactedW(lpFileName: LPCWSTR, hTransaction: HANDLE) -> BOOL;
+    pub fn DeleteFileW(lpFileName: LPCWSTR) -> BOOL;
+    pub fn DeleteProcThreadAttributeList(lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST);
+    pub fn DeleteSynchronizationBarrier(lpBarrier: LPSYNCHRONIZATION_BARRIER) -> BOOL;
+    pub fn DeleteTimerQueue(TimerQueue: HANDLE) -> BOOL;
+    pub fn DeleteTimerQueueEx(TimerQueue: HANDLE, CompletionEvent: HANDLE) -> BOOL;
+    pub fn DeleteTimerQueueTimer(
+        TimerQueue: HANDLE, Timer: HANDLE, CompletionEvent: HANDLE,
+    ) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn DeleteUmsCompletionList(UmsCompletionList: PUMS_COMPLETION_LIST) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn DeleteUmsThreadContext(UmsThread: PUMS_CONTEXT) -> BOOL;
+    pub fn DeleteVolumeMountPointA(lpszVolumeMountPoint: LPCSTR) -> BOOL;
+    pub fn DeleteVolumeMountPointW(lpszVolumeMountPoint: LPCWSTR) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn DequeueUmsCompletionListItems(
+        UmsCompletionList: PUMS_COMPLETION_LIST, WaitTimeOut: DWORD,
+        UmsThreadList: *mut PUMS_CONTEXT,
+    ) -> BOOL;
+    pub fn DeviceIoControl(
+        hDevice: HANDLE, dwIoControlCode: DWORD, lpInBuffer: LPVOID, nInBufferSize: DWORD,
+        lpOutBuffer: LPVOID, nOutBufferSize: DWORD, lpBytesReturned: LPDWORD,
+        lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn DisableThreadLibraryCalls(hLibModule: HMODULE) -> BOOL;
+    pub fn DisableThreadProfiling(PerformanceDataHandle: HANDLE) -> DWORD;
+    pub fn DisassociateCurrentThreadFromCallback(pci: PTP_CALLBACK_INSTANCE);
+    pub fn DisconnectNamedPipe(hNamedPipe: HANDLE) -> BOOL;
+    pub fn DnsHostnameToComputerNameA(
+        Hostname: LPCSTR, ComputerName: LPCSTR, nSize: LPDWORD,
+    ) -> BOOL;
+    pub fn DnsHostnameToComputerNameExW(
+        Hostname: LPCWSTR, ComputerName: LPWSTR, nSize: LPDWORD,
+    ) -> BOOL;
+    pub fn DnsHostnameToComputerNameW(
+        Hostname: LPCWSTR, ComputerName: LPWSTR, nSize: LPDWORD,
+    ) -> BOOL;
+    pub fn DosDateTimeToFileTime(wFatDate: WORD, wFatTime: WORD, lpFileTime: LPFILETIME) -> BOOL;
+    // pub fn DosPathToSessionPathW();
+    pub fn DuplicateHandle(
+        hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, hTargetProcessHandle: HANDLE,
+        lpTargetHandle: LPHANDLE, dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwOptions: DWORD,
+    ) -> BOOL;
+    pub fn EnableThreadProfiling(
+        ThreadHandle: HANDLE, Flags: DWORD, HardwareCounters: DWORD64,
+        PerformanceDataHandle: *mut HANDLE,
+    ) -> BOOL;
+    pub fn EncodePointer(Ptr: PVOID) -> PVOID;
+    pub fn EncodeSystemPointer(Ptr: PVOID) -> PVOID;
+    pub fn EndUpdateResourceA(hUpdate: HANDLE, fDiscard: BOOL) -> BOOL;
+    pub fn EndUpdateResourceW(hUpdate: HANDLE, fDiscard: BOOL) -> BOOL;
+    pub fn EnterCriticalSection(lpCriticalSection: LPCRITICAL_SECTION);
+    pub fn EnterSynchronizationBarrier(
+        lpBarrier: LPSYNCHRONIZATION_BARRIER, dwFlags: DWORD,
+    ) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn EnterUmsSchedulingMode(SchedulerStartupInfo: PUMS_SCHEDULER_STARTUP_INFO) -> BOOL;
+    pub fn EnumCalendarInfoA(
+        lpCalInfoEnumProc: CALINFO_ENUMPROCA, Locale: LCID, Calendar: CALID, CalType: CALTYPE,
+    ) -> BOOL;
+    pub fn EnumCalendarInfoExA(
+        lpCalInfoEnumProcEx: CALINFO_ENUMPROCEXA, Locale: LCID, Calendar: CALID, CalType: CALTYPE,
+    ) -> BOOL;
+    pub fn EnumCalendarInfoExEx(
+        pCalInfoEnumProcExEx: CALINFO_ENUMPROCEXEX, lpLocaleName: LPCWSTR, Calendar: CALID,
+        lpReserved: LPCWSTR, CalType: CALTYPE, lParam: LPARAM,
+    ) -> BOOL;
+    pub fn EnumCalendarInfoExW(
+        lpCalInfoEnumProcEx: CALINFO_ENUMPROCEXW, Locale: LCID, Calendar: CALID, CalType: CALTYPE,
+    ) -> BOOL;
+    pub fn EnumCalendarInfoW(
+        lpCalInfoEnumProc: CALINFO_ENUMPROCW, Locale: LCID, Calendar: CALID, CalType: CALTYPE,
+    ) -> BOOL;
+    pub fn EnumDateFormatsA(
+        lpDateFmtEnumProc: DATEFMT_ENUMPROCA, Locale: LCID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn EnumDateFormatsExA(
+        lpDateFmtEnumProcEx: DATEFMT_ENUMPROCEXA, Locale: LCID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn EnumDateFormatsExEx(
+        lpDateFmtEnumProcExEx: DATEFMT_ENUMPROCEXEX, lpLocaleName: LPCWSTR, dwFlags: DWORD,
+        lParam: LPARAM,
+    ) -> BOOL;
+    pub fn EnumDateFormatsExW(
+        lpDateFmtEnumProcEx: DATEFMT_ENUMPROCEXW, Locale: LCID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn EnumDateFormatsW(
+        lpDateFmtEnumProc: DATEFMT_ENUMPROCW, Locale: LCID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn EnumLanguageGroupLocalesA(
+        lpLangGroupLocaleEnumProc: LANGGROUPLOCALE_ENUMPROCA, LanguageGroup: LGRPID, dwFlags: DWORD,
+        lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumLanguageGroupLocalesW(
+        lpLangGroupLocaleEnumProc: LANGGROUPLOCALE_ENUMPROCW, LanguageGroup: LGRPID, dwFlags: DWORD,
+        lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumResourceLanguagesA(
+        hModule: HMODULE, lpType: LPCSTR, lpName: LPCSTR, lpEnumFunc: ENUMRESLANGPROCA,
+        lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumResourceLanguagesExA(
+        hModule: HMODULE, lpType: LPCSTR, lpName: LPCSTR, lpEnumFunc: ENUMRESLANGPROCA,
+        lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID,
+    ) -> BOOL;
+    pub fn EnumResourceLanguagesExW(
+        hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW,
+        lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID,
+    ) -> BOOL;
+    pub fn EnumResourceLanguagesW(
+        hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW,
+        lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumResourceNamesA(
+        hModule: HMODULE, lpType: LPCSTR, lpEnumFunc: ENUMRESNAMEPROCA, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumResourceNamesExA(
+        hModule: HMODULE, lpType: LPCSTR, lpEnumFunc: ENUMRESNAMEPROCA, lParam: LONG_PTR,
+        dwFlags: DWORD, LangId: LANGID,
+    ) -> BOOL;
+    pub fn EnumResourceNamesExW(
+        hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR,
+        dwFlags: DWORD, LangId: LANGID,
+    ) -> BOOL;
+    pub fn EnumResourceNamesW(
+        hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumResourceTypesA(
+        hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCA, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumResourceTypesExA(
+        hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCA, lParam: LONG_PTR, dwFlags: DWORD,
+        LangId: LANGID,
+    ) -> BOOL;
+    pub fn EnumResourceTypesExW(
+        hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD,
+        LangId: LANGID,
+    ) -> BOOL;
+    pub fn EnumResourceTypesW(
+        hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumSystemCodePagesA(lpCodePageEnumProc: CODEPAGE_ENUMPROCA, dwFlags: DWORD) -> BOOL;
+    pub fn EnumSystemCodePagesW(lpCodePageEnumProc: CODEPAGE_ENUMPROCW, dwFlags: DWORD) -> BOOL;
+    pub fn EnumSystemFirmwareTables(
+        FirmwareTableProviderSignature: DWORD, pFirmwareTableEnumBuffer: PVOID, BufferSize: DWORD,
+    ) -> UINT;
+    pub fn EnumSystemGeoID(
+        GeoClass: GEOCLASS, ParentGeoId: GEOID, lpGeoEnumProc: GEO_ENUMPROC,
+    ) -> BOOL;
+    pub fn EnumSystemLanguageGroupsA(
+        lpLanguageGroupEnumProc: LANGUAGEGROUP_ENUMPROCA, dwFlags: DWORD, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumSystemLanguageGroupsW(
+        lpLanguageGroupEnumProc: LANGUAGEGROUP_ENUMPROCW, dwFlags: DWORD, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumSystemLocalesA(lpLocaleEnumProc: LOCALE_ENUMPROCA, dwFlags: DWORD) -> BOOL;
+    pub fn EnumSystemLocalesEx(
+        lpLocaleEnumProcEx: LOCALE_ENUMPROCEX, dwFlags: DWORD, lParam: LPARAM, lpReserved: LPVOID,
+    ) -> BOOL;
+    pub fn EnumSystemLocalesW(lpLocaleEnumProc: LOCALE_ENUMPROCW, dwFlags: DWORD) -> BOOL;
+    pub fn EnumTimeFormatsA(
+        lpTimeFmtEnumProc: TIMEFMT_ENUMPROCA, Locale: LCID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn EnumTimeFormatsEx(
+        lpTimeFmtEnumProcEx: TIMEFMT_ENUMPROCEX, lpLocaleName: LPCWSTR, dwFlags: DWORD,
+        lParam: LPARAM,
+    ) -> BOOL;
+    pub fn EnumTimeFormatsW(
+        lpTimeFmtEnumProc: TIMEFMT_ENUMPROCW, Locale: LCID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn EnumUILanguagesA(
+        lpUILanguageEnumProc: UILANGUAGE_ENUMPROCA, dwFlags: DWORD, lParam: LONG_PTR,
+    ) -> BOOL;
+    pub fn EnumUILanguagesW(
+        lpUILanguageEnumProc: UILANGUAGE_ENUMPROCW, dwFlags: DWORD, lParam: LONG_PTR,
+    ) -> BOOL;
+    // pub fn EnumerateLocalComputerNamesA();
+    // pub fn EnumerateLocalComputerNamesW();
+    pub fn EraseTape(hDevice: HANDLE, dwEraseType: DWORD, bImmediate: BOOL) -> DWORD;
+    pub fn EscapeCommFunction(hFile: HANDLE, dwFunc: DWORD) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn ExecuteUmsThread(UmsThread: PUMS_CONTEXT) -> BOOL;
+    pub fn ExitProcess(uExitCode: UINT);
+    pub fn ExitThread(hThread: HANDLE, lpExitCode: LPDWORD) -> BOOL;
+    pub fn ExpandEnvironmentStringsA(lpSrc: LPCSTR, lpDst: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn ExpandEnvironmentStringsW(lpSrc: LPCWSTR, lpDst: LPWSTR, nSize: DWORD) -> DWORD;
+    pub fn FatalAppExitA(uAction: UINT, lpMessageText: LPCSTR);
+    pub fn FatalAppExitW(uAction: UINT, lpMessageText: LPCWSTR);
+    pub fn FatalExit(ExitCode: c_int);
+    pub fn FileTimeToDosDateTime(
+        lpFileTime: *const FILETIME, lpFatDate: LPWORD, lpFatTime: LPWORD,
+    ) -> BOOL;
+    pub fn FileTimeToLocalFileTime(
+        lpFileTime: *const FILETIME, lpLocalFileTime: LPFILETIME,
+    ) -> BOOL;
+    pub fn FileTimeToSystemTime(
+        lpFileTime: *const FILETIME, lpSystemTime: LPSYSTEMTIME,
+    ) -> BOOL;
+    pub fn FillConsoleOutputAttribute(
+        hConsoleOutput: HANDLE, wAttribute: WORD, nLength: DWORD, dwWriteCoord: COORD,
+        lpNumberOfAttrsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn FillConsoleOutputCharacterA(
+        hConsoleOutput: HANDLE, cCharacter: CHAR, nLength: DWORD, dwWriteCoord: COORD,
+        lpNumberOfCharsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn FillConsoleOutputCharacterW(
+        hConsoleOutput: HANDLE, cCharacter: WCHAR, nLength: DWORD, dwWriteCoord: COORD,
+        lpNumberOfCharsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn FindActCtxSectionGuid(
+        dwFlags: DWORD, lpExtensionGuid: *const GUID, ulSectionId: ULONG, lpGuidToFind: *const GUID,
+        ReturnedData: PACTCTX_SECTION_KEYED_DATA,
+    ) -> BOOL;
+    pub fn FindActCtxSectionStringA(
+        dwFlags: DWORD, lpExtensionGuid: *const GUID, ulSectionId: ULONG, lpStringToFind: LPCSTR,
+        ReturnedData: PACTCTX_SECTION_KEYED_DATA,
+    ) -> BOOL;
+    pub fn FindActCtxSectionStringW(
+        dwFlags: DWORD, lpExtensionGuid: *const GUID, ulSectionId: ULONG, lpStringToFind: LPCWSTR,
+        ReturnedData: PACTCTX_SECTION_KEYED_DATA,
+    ) -> BOOL;
+    pub fn FindAtomA(lpString: LPCSTR) -> ATOM;
+    pub fn FindAtomW(lpString: LPCWSTR) -> ATOM;
+    pub fn FindClose(hFindFile: HANDLE) -> BOOL;
+    pub fn FindCloseChangeNotification(hChangeHandle: HANDLE) -> BOOL;
+    pub fn FindFirstChangeNotificationA(
+        lpPathName: LPCSTR, bWatchSubtree: BOOL, dwNotifyFilter: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstChangeNotificationW(
+        lpPathName: LPCWSTR, bWatchSubtree: BOOL, dwNotifyFilter: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstFileA(lpFileName: LPCSTR, lpFindFileData: LPWIN32_FIND_DATAA) -> HANDLE;
+    pub fn FindFirstFileExA(
+        lpFileName: LPCSTR, fInfoLevelId: FINDEX_INFO_LEVELS, lpFindFileData: LPVOID,
+        fSearchOp: FINDEX_SEARCH_OPS, lpSearchFilter: LPVOID, dwAdditionalFlags: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstFileExW(
+        lpFileName: LPCWSTR, fInfoLevelId: FINDEX_INFO_LEVELS, lpFindFileData: LPVOID,
+        fSearchOp: FINDEX_SEARCH_OPS, lpSearchFilter: LPVOID, dwAdditionalFlags: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstFileNameTransactedW(
+        lpFileName: LPCWSTR, dwFlags: DWORD, StringLength: LPDWORD, LinkName: PWSTR,
+        hTransaction: HANDLE,
+    ) -> HANDLE;
+    pub fn FindFirstFileNameW(
+        lpFileName: LPCWSTR, dwFlags: DWORD, StringLength: LPDWORD, LinkName: PWSTR,
+    ) -> HANDLE;
+    pub fn FindFirstFileTransactedA(
+        lpFileName: LPCSTR, fInfoLevelId: FINDEX_INFO_LEVELS, lpFindFileData: LPVOID,
+        fSearchOp: FINDEX_SEARCH_OPS, lpSearchFilter: LPVOID, dwAdditionalFlags: DWORD,
+        hTransaction: HANDLE,
+    ) -> HANDLE;
+    pub fn FindFirstFileTransactedW(
+        lpFileName: LPCWSTR, fInfoLevelId: FINDEX_INFO_LEVELS, lpFindFileData: LPVOID,
+        fSearchOp: FINDEX_SEARCH_OPS, lpSearchFilter: LPVOID, dwAdditionalFlags: DWORD,
+        hTransaction: HANDLE,
+    ) -> HANDLE;
+    pub fn FindFirstFileW(lpFileName: LPCWSTR, lpFindFileData: LPWIN32_FIND_DATAW) -> HANDLE;
+    pub fn FindFirstStreamTransactedW(
+        lpFileName: LPCWSTR, InfoLevel: STREAM_INFO_LEVELS, lpFindStreamData: LPVOID,
+        dwFlags: DWORD, hTransaction: HANDLE,
+    ) -> HANDLE;
+    pub fn FindFirstStreamW(
+        lpFileName: LPCWSTR, InfoLevel: STREAM_INFO_LEVELS, lpFindStreamData: LPVOID,
+        dwFlags: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstVolumeA(lpszVolumeName: LPSTR, cchBufferLength: DWORD) -> HANDLE;
+    pub fn FindFirstVolumeMountPointA(
+        lpszRootPathName: LPCSTR, lpszVolumeMountPoint: LPSTR, cchBufferLength: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstVolumeMountPointW(
+        lpszRootPathName: LPCWSTR, lpszVolumeMountPoint: LPWSTR, cchBufferLength: DWORD,
+    ) -> HANDLE;
+    pub fn FindFirstVolumeW(lpszVolumeName: LPWSTR, cchBufferLength: DWORD) -> HANDLE;
+    pub fn FindNLSString(
+        Locale: LCID, dwFindNLSStringFlags: DWORD, lpStringSource: LPCWSTR, cchSource: c_int,
+        lpStringValue: LPCWSTR, cchValue: c_int, pcchFound: LPINT,
+    ) -> c_int;
+    pub fn FindNLSStringEx(
+        lpLocaleName: LPCWSTR, dwFindNLSStringFlags: DWORD, lpStringSource: LPCWSTR,
+        cchSource: c_int, lpStringValue: LPCWSTR, cchValue: c_int, pcchFound: LPINT,
+        lpVersionInformation: LPNLSVERSIONINFO, lpReserved: LPVOID, sortHandle: LPARAM,
+    ) -> c_int;
+    pub fn FindNextChangeNotification(hChangeHandle: HANDLE) -> BOOL;
+    pub fn FindNextFileA(hFindFile: HANDLE, lpFindFileData: LPWIN32_FIND_DATAA) -> BOOL;
+    pub fn FindNextFileNameW(hFindStream: HANDLE, StringLength: LPDWORD, LinkName: PWSTR) -> BOOL;
+    pub fn FindNextFileW(hFindFile: HANDLE, lpFindFileData: LPWIN32_FIND_DATAW) -> BOOL;
+    pub fn FindNextStreamW(hFindStream: HANDLE, lpFindStreamData: LPVOID) -> BOOL;
+    pub fn FindNextVolumeA(
+        hFindVolume: HANDLE, lpszVolumeName: LPSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn FindNextVolumeMountPointA(
+        hFindVolumeMountPoint: HANDLE, lpszVolumeMountPoint: LPSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn FindNextVolumeMountPointW(
+        hFindVolumeMountPoint: HANDLE, lpszVolumeMountPoint: LPWSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn FindNextVolumeW(
+        hFindVolume: HANDLE, lpszVolumeName: LPWSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    // pub fn FindPackagesByPackageFamily();
+    pub fn FindResourceA(hModule: HMODULE, lpName: LPCSTR, lpType: LPCSTR) -> HRSRC;
+    pub fn FindResourceExA(
+        hModule: HMODULE, lpName: LPCSTR, lpType: LPCSTR, wLanguage: WORD,
+    ) -> HRSRC;
+    pub fn FindResourceExW(
+        hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR, wLanguage: WORD,
+    ) -> HRSRC;
+    pub fn FindResourceW(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC;
+    pub fn FindStringOrdinal(
+        dwFindStringOrdinalFlags: DWORD, lpStringSource: LPCWSTR, cchSource: c_int,
+        lpStringValue: LPCWSTR, cchValue: c_int, bIgnoreCase: BOOL,
+    ) -> c_int;
+    pub fn FindVolumeClose(hFindVolume: HANDLE) -> BOOL;
+    pub fn FindVolumeMountPointClose(hFindVolumeMountPoint: HANDLE) -> BOOL;
+    pub fn FlsAlloc(lpCallback: PFLS_CALLBACK_FUNCTION) -> DWORD;
+    pub fn FlsFree(dwFlsIndex: DWORD) -> BOOL;
+    pub fn FlsGetValue(dwFlsIndex: DWORD) -> PVOID;
+    pub fn FlsSetValue(dwFlsIndex: DWORD, lpFlsData: PVOID) -> BOOL;
+    pub fn FlushConsoleInputBuffer(hConsoleInput: HANDLE) -> BOOL;
+    pub fn FlushFileBuffers(hFile: HANDLE) -> BOOL;
+    pub fn FlushInstructionCache(hProcess: HANDLE, lpBaseAddress: LPCVOID, dwSize: SIZE_T) -> BOOL;
+    pub fn FlushProcessWriteBuffers();
+    pub fn FlushViewOfFile(lpBaseAddress: LPCVOID, dwNumberOfBytesToFlush: SIZE_T) -> BOOL;
+    pub fn FoldStringA(
+        dwMapFlags: DWORD, lpSrcStr: LPCSTR, cchSrc: c_int, lpDestStr: LPSTR, cchDest: c_int,
+    ) -> c_int;
+    pub fn FoldStringW(
+        dwMapFlags: DWORD, lpSrcStr: LPCWCH, cchSrc: c_int, lpDestStr: LPWSTR, cchDest: c_int,
+    ) -> c_int;
+    // pub fn FormatApplicationUserModelId();
+    pub fn FormatMessageA(
+        dwFlags: DWORD, lpSource: LPCVOID, dwMessageId: DWORD, dwLanguageId: DWORD,
+        lpBuffer: LPSTR, nSize: DWORD, Arguments: *mut va_list,
+    ) -> DWORD;
+    pub fn FormatMessageW(
+        dwFlags: DWORD, lpSource: LPCVOID, dwMessageId: DWORD, dwLanguageId: DWORD,
+        lpBuffer: LPWSTR, nSize: DWORD, Arguments: *mut va_list,
+    ) -> DWORD;
+    pub fn FreeConsole() -> BOOL;
+    pub fn FreeEnvironmentStringsA(penv: LPCH) -> BOOL;
+    pub fn FreeEnvironmentStringsW(penv: LPWCH) -> BOOL;
+    pub fn FreeLibrary(hLibModule: HMODULE) -> BOOL;
+    pub fn FreeLibraryAndExitThread(hLibModule: HMODULE, dwExitCode: DWORD);
+    pub fn FreeLibraryWhenCallbackReturns(pci: PTP_CALLBACK_INSTANCE, module: HMODULE);
+    pub fn FreeResource(hResData: HGLOBAL) -> BOOL;
+    pub fn FreeUserPhysicalPages(
+        hProcess: HANDLE, NumberOfPages: PULONG_PTR, PageArray: PULONG_PTR,
+    ) -> BOOL;
+    pub fn GenerateConsoleCtrlEvent(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL;
+    pub fn GetACP() -> UINT;
+    pub fn GetActiveProcessorCount(GroupNumber: WORD) -> DWORD;
+    pub fn GetActiveProcessorGroupCount() -> WORD;
+    pub fn GetAppContainerAce(
+        Acl: PACL, StartingAceIndex: DWORD, AppContainerAce: *mut PVOID,
+        AppContainerAceIndex: *mut DWORD,
+    ) -> BOOL;
+    pub fn GetAppContainerNamedObjectPath(
+        Token: HANDLE, AppContainerSid: PSID, ObjectPathLength: ULONG, ObjectPath: LPWSTR,
+        ReturnLength: PULONG,
+    ) -> BOOL;
+    pub fn GetApplicationRecoveryCallback(
+        hProcess: HANDLE, pRecoveryCallback: *mut APPLICATION_RECOVERY_CALLBACK,
+        ppvParameter: *mut PVOID, pdwPingInterval: PDWORD, pdwFlags: PDWORD,
+    ) -> HRESULT;
+    pub fn GetApplicationRestartSettings(
+        hProcess: HANDLE, pwzCommandline: PWSTR, pcchSize: PDWORD, pdwFlags: PDWORD,
+    ) -> HRESULT;
+    // pub fn GetApplicationUserModelId();
+    pub fn GetAtomNameA(nAtom: ATOM, lpBuffer: LPSTR, nSize: c_int) -> UINT;
+    pub fn GetAtomNameW(nAtom: ATOM, lpBuffer: LPWSTR, nSize: c_int) -> UINT;
+    pub fn GetBinaryTypeA(lpApplicationName: LPCSTR, lpBinaryType: LPDWORD) -> BOOL;
+    pub fn GetBinaryTypeW(lpApplicationName: LPCWSTR, lpBinaryType: LPDWORD) -> BOOL;
+    pub fn GetCPInfo(CodePage: UINT, lpCPInfo: LPCPINFO) -> BOOL;
+    pub fn GetCPInfoExA(CodePage: UINT, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXA) -> BOOL;
+    pub fn GetCPInfoExW(CodePage: UINT, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXW) -> BOOL;
+    pub fn GetCachedSigningLevel(
+        File: HANDLE, Flags: PULONG, SigningLevel: PULONG, Thumbprint: PUCHAR,
+        ThumbprintSize: PULONG, ThumbprintAlgorithm: PULONG,
+    ) -> BOOL;
+    pub fn GetCalendarInfoA(
+        Locale: LCID, Calendar: CALID, CalType: CALTYPE, lpCalData: LPSTR, cchData: c_int,
+        lpValue: LPDWORD,
+    ) -> c_int;
+    pub fn GetCalendarInfoEx(
+        lpLocaleName: LPCWSTR, Calendar: CALID, lpReserved: LPCWSTR, CalType: CALTYPE,
+        lpCalData: LPWSTR, cchData: c_int, lpValue: LPDWORD,
+    ) -> c_int;
+    pub fn GetCalendarInfoW(
+        Locale: LCID, Calendar: CALID, CalType: CALTYPE, lpCalData: LPWSTR, cchData: c_int,
+        lpValue: LPDWORD,
+    ) -> c_int;
+    pub fn GetCommConfig(hCommDev: HANDLE, lpCC: LPCOMMCONFIG, lpdwSize: LPDWORD) -> BOOL;
+    pub fn GetCommMask(hFile: HANDLE, lpEvtMask: LPDWORD) -> BOOL;
+    pub fn GetCommModemStatus(hFile: HANDLE, lpModemStat: LPDWORD) -> BOOL;
+    pub fn GetCommProperties(hFile: HANDLE, lpCommProp: LPCOMMPROP) -> BOOL;
+    pub fn GetCommState(hFile: HANDLE, lpDCB: LPDCB) -> BOOL;
+    pub fn GetCommTimeouts(hFile: HANDLE, lpCommTimeouts: LPCOMMTIMEOUTS) -> BOOL;
+    pub fn GetCommandLineA() -> LPSTR;
+    pub fn GetCommandLineW() -> LPWSTR;
+    pub fn GetCompressedFileSizeA(lpFileName: LPCSTR, lpFileSizeHigh: LPDWORD) -> DWORD;
+    pub fn GetCompressedFileSizeTransactedA(
+        lpFileName: LPCSTR, lpFileSizeHigh: LPDWORD, hTransaction: HANDLE,
+    ) -> DWORD;
+    pub fn GetCompressedFileSizeTransactedW(
+        lpFileName: LPCWSTR, lpFileSizeHigh: LPDWORD, hTransaction: HANDLE,
+    );
+    pub fn GetCompressedFileSizeW(lpFileName: LPCWSTR, lpFileSizeHigh: LPDWORD) -> DWORD;
+    pub fn GetComputerNameA(lpBuffer: LPSTR, nSize: LPDWORD) -> BOOL;
+    pub fn GetComputerNameExA(
+        NameType: COMPUTER_NAME_FORMAT, lpBuffer: LPSTR, nSize: LPDWORD,
+    ) -> BOOL;
+    pub fn GetComputerNameExW(
+        NameType: COMPUTER_NAME_FORMAT, lpBuffer: LPWSTR, nSize: LPDWORD,
+    ) -> BOOL;
+    pub fn GetComputerNameW(lpBuffer: LPWSTR, nSize: LPDWORD) -> BOOL;
+    pub fn GetConsoleAliasA(
+        Source: LPSTR, TargetBuffer: LPSTR, TargetBufferLength: DWORD, ExeName: LPSTR,
+    ) -> DWORD;
+    pub fn GetConsoleAliasExesA(ExeNameBuffer: LPSTR, ExeNameBufferLength: DWORD) -> DWORD;
+    pub fn GetConsoleAliasExesLengthA() -> DWORD;
+    pub fn GetConsoleAliasExesLengthW() -> DWORD;
+    pub fn GetConsoleAliasExesW(ExeNameBuffer: LPWSTR, ExeNameBufferLength: DWORD) -> DWORD;
+    pub fn GetConsoleAliasW(
+        Source: LPWSTR, TargetBuffer: LPWSTR, TargetBufferLength: DWORD, ExeName: LPWSTR,
+    ) -> DWORD;
+    pub fn GetConsoleAliasesA(
+        AliasBuffer: LPSTR, AliasBufferLength: DWORD, ExeName: LPSTR,
+    ) -> DWORD;
+    pub fn GetConsoleAliasesLengthA(ExeName: LPSTR) -> DWORD;
+    pub fn GetConsoleAliasesLengthW(ExeName: LPWSTR) -> DWORD;
+    pub fn GetConsoleAliasesW(
+        AliasBuffer: LPWSTR, AliasBufferLength: DWORD, ExeName: LPWSTR,
+    ) -> DWORD;
+    pub fn GetConsoleCP() -> UINT;
+    pub fn GetConsoleCursorInfo(
+        hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO,
+    ) -> BOOL;
+    pub fn GetConsoleDisplayMode(lpModeFlags: LPDWORD) -> BOOL;
+    pub fn GetConsoleFontSize(hConsoleOutput: HANDLE, nFont: DWORD) -> COORD;
+    pub fn GetConsoleHistoryInfo(lpConsoleHistoryInfo: PCONSOLE_HISTORY_INFO) -> BOOL;
+    pub fn GetConsoleMode(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL;
+    pub fn GetConsoleOriginalTitleA(lpConsoleTitle: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn GetConsoleOriginalTitleW(lpConsoleTitle: LPWSTR, nSize: DWORD) -> DWORD;
+    pub fn GetConsoleOutputCP() -> UINT;
+    pub fn GetConsoleProcessList(lpdwProcessList: LPDWORD, dwProcessCount: DWORD) -> DWORD;
+    pub fn GetConsoleScreenBufferInfo(
+        hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO,
+    ) -> BOOL;
+    pub fn GetConsoleScreenBufferInfoEx(
+        hConsoleOutput: HANDLE, lpConsoleScreenBufferInfoEx: PCONSOLE_SCREEN_BUFFER_INFOEX,
+    ) -> BOOL;
+    pub fn GetConsoleSelectionInfo(lpConsoleSelectionInfo: PCONSOLE_SELECTION_INFO) -> BOOL;
+    pub fn GetConsoleTitleA(lpConsoleTitle: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn GetConsoleTitleW(lpConsoleTitle: LPWSTR, nSize: DWORD) -> DWORD;
+    pub fn GetConsoleWindow() -> HWND;
+    pub fn GetCurrencyFormatA(
+        Locale: LCID, dwFlags: DWORD, lpValue: LPCSTR, lpFormat: *const CURRENCYFMTA,
+        lpCurrencyStr: LPSTR, cchCurrency: c_int,
+    ) -> c_int;
+    pub fn GetCurrencyFormatEx(
+        lpLocaleName: LPCWSTR, dwFlags: DWORD, lpValue: LPCWSTR, lpFormat: *const CURRENCYFMTW,
+        lpCurrencyStr: LPWSTR, cchCurrency: c_int,
+    ) -> c_int;
+    pub fn GetCurrencyFormatW(
+        Locale: LCID, dwFlags: DWORD, lpValue: LPCWSTR, lpFormat: *const CURRENCYFMTW,
+        lpCurrencyStr: LPWSTR, cchCurrency: c_int,
+    ) -> c_int;
+    pub fn GetCurrentActCtx(lphActCtx: *mut HANDLE) -> BOOL;
+    // pub fn GetCurrentApplicationUserModelId();
+    pub fn GetCurrentConsoleFont(
+        hConsoleOutput: HANDLE, bMaximumWindow: BOOL, lpConsoleCurrentFont: PCONSOLE_FONT_INFO,
+    ) -> BOOL;
+    pub fn GetCurrentConsoleFontEx(
+        hConsoleOutput: HANDLE, bMaximumWindow: BOOL, lpConsoleCurrentFontEx: PCONSOLE_FONT_INFOEX,
+    ) -> BOOL;
+    pub fn GetCurrentDirectoryA(nBufferLength: DWORD, lpBuffer: LPSTR) -> DWORD;
+    pub fn GetCurrentDirectoryW(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD;
+    // pub fn GetCurrentPackageFamilyName();
+    // pub fn GetCurrentPackageFullName();
+    // pub fn GetCurrentPackageId();
+    // pub fn GetCurrentPackageInfo();
+    // pub fn GetCurrentPackagePath();
+    pub fn GetCurrentProcess() -> HANDLE;
+    pub fn GetCurrentProcessId() -> DWORD;
+    pub fn GetCurrentProcessorNumber() -> DWORD;
+    pub fn GetCurrentProcessorNumberEx(ProcNumber: PPROCESSOR_NUMBER);
+    pub fn GetCurrentThread() -> HANDLE;
+    pub fn GetCurrentThreadId() -> DWORD;
+    pub fn GetCurrentThreadStackLimits(LowLimit: PULONG_PTR, HighLimit: PULONG_PTR);
+    #[cfg(target_arch = "x86_64")]
+    pub fn GetCurrentUmsThread() -> PUMS_CONTEXT;
+    pub fn GetDateFormatA(
+        Locale: LCID, dwFlags: DWORD, lpDate: *const SYSTEMTIME, lpFormat: LPCSTR, lpDateStr: LPSTR,
+        cchDate: c_int,
+    ) -> c_int;
+    pub fn GetDateFormatEx(
+        lpLocaleName: LPCWSTR, dwFlags: DWORD, lpDate: *const SYSTEMTIME, lpFormat: LPCWSTR,
+        lpDateStr: LPWSTR, cchDate: c_int, lpCalendar: LPCWSTR,
+    ) -> c_int;
+    pub fn GetDateFormatW(
+        Locale: LCID, dwFlags: DWORD, lpDate: *const SYSTEMTIME, lpFormat: LPCWSTR,
+        lpDateStr: LPWSTR, cchDate: c_int,
+    ) -> c_int;
+    pub fn GetDefaultCommConfigA(lpszName: LPCSTR, lpCC: LPCOMMCONFIG, lpdwSize: LPDWORD) -> BOOL;
+    pub fn GetDefaultCommConfigW(lpszName: LPCWSTR, lpCC: LPCOMMCONFIG, lpdwSize: LPDWORD) -> BOOL;
+    pub fn GetDevicePowerState(hDevice: HANDLE, pfOn: *mut BOOL) -> BOOL;
+    pub fn GetDiskFreeSpaceA(
+        lpRootPathName: LPCSTR, lpSectorsPerCluster: LPDWORD, lpBytesPerSector: LPDWORD,
+        lpNumberOfFreeClusters: LPDWORD, lpTotalNumberOfClusters: LPDWORD,
+    ) -> BOOL;
+    pub fn GetDiskFreeSpaceExA(
+        lpDirectoryName: LPCSTR, lpFreeBytesAvailableToCaller: PULARGE_INTEGER,
+        lpTotalNumberOfBytes: PULARGE_INTEGER, lpTotalNumberOfFreeBytes: PULARGE_INTEGER,
+    ) -> BOOL;
+    pub fn GetDiskFreeSpaceExW(
+        lpDirectoryName: LPCWSTR, lpFreeBytesAvailableToCaller: PULARGE_INTEGER,
+        lpTotalNumberOfBytes: PULARGE_INTEGER, lpTotalNumberOfFreeBytes: PULARGE_INTEGER,
+    ) -> BOOL;
+    pub fn GetDiskFreeSpaceW(
+        lpRootPathName: LPCWSTR, lpSectorsPerCluster: LPDWORD, lpBytesPerSector: LPDWORD,
+        lpNumberOfFreeClusters: LPDWORD, lpTotalNumberOfClusters: LPDWORD,
+    ) -> BOOL;
+    pub fn GetDllDirectoryA(nBufferLength: DWORD, lpBuffer: LPSTR) -> DWORD;
+    pub fn GetDllDirectoryW(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD;
+    pub fn GetDriveTypeA(lpRootPathName: LPCSTR) -> UINT;
+    pub fn GetDriveTypeW(lpRootPathName: LPCWSTR) -> UINT;
+    pub fn GetDurationFormat(
+        Locale: LCID, dwFlags: DWORD, lpDuration: *const SYSTEMTIME, ullDuration: ULONGLONG,
+        lpFormat: LPCWSTR, lpDurationStr: LPWSTR, cchDuration: c_int,
+    ) -> c_int;
+    pub fn GetDurationFormatEx(
+        lpLocaleName: LPCWSTR, dwFlags: DWORD, lpDuration: *const SYSTEMTIME,
+        ullDuration: ULONGLONG, lpFormat: LPCWSTR, lpDurationStr: LPWSTR, cchDuration: c_int,
+    ) -> c_int;
+    pub fn GetDynamicTimeZoneInformation(
+        pTimeZoneInformation: PDYNAMIC_TIME_ZONE_INFORMATION,
+    ) -> DWORD;
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    pub fn GetEnabledXStateFeatures() -> DWORD64;
+    pub fn GetEnvironmentStrings() -> LPCH;
+    pub fn GetEnvironmentStringsW() -> LPWCH;
+    pub fn GetEnvironmentVariableA(lpName: LPCSTR, lpBuffer: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn GetEnvironmentVariableW(lpName: LPCWSTR, lpBuffer: LPWSTR, nSize: DWORD) -> DWORD;
+    // pub fn GetEraNameCountedString();
+    pub fn GetErrorMode() -> UINT;
+    pub fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL;
+    pub fn GetExitCodeThread(hThread: HANDLE, lpExitCode: LPDWORD) -> BOOL;
+    pub fn GetFileAttributesA(lpFileName: LPCSTR) -> DWORD;
+    pub fn GetFileAttributesExA(
+        lpFileName: LPCSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID,
+    ) -> BOOL;
+    pub fn GetFileAttributesExW(
+        lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID,
+    ) -> BOOL;
+    pub fn GetFileAttributesTransactedA(
+        lpFileName: LPCSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID,
+        hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn GetFileAttributesTransactedW(
+        lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID,
+        hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn GetFileAttributesW(lpFileName: LPCWSTR) -> DWORD;
+    pub fn GetFileBandwidthReservation(
+        hFile: HANDLE, lpPeriodMilliseconds: LPDWORD, lpBytesPerPeriod: LPDWORD,
+        pDiscardable: LPBOOL, lpTransferSize: LPDWORD, lpNumOutstandingRequests: LPDWORD,
+    ) -> BOOL;
+    pub fn GetFileInformationByHandle(
+        hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION,
+    ) -> BOOL;
+    pub fn GetFileInformationByHandleEx(
+        hFile: HANDLE, FileInformationClass: FILE_INFO_BY_HANDLE_CLASS, lpFileInformation: LPVOID,
+        dwBufferSize: DWORD,
+    ) -> BOOL;
+    pub fn GetFileMUIInfo(
+        dwFlags: DWORD, pcwszFilePath: PCWSTR, pFileMUIInfo: PFILEMUIINFO,
+        pcbFileMUIInfo: *mut DWORD,
+    ) -> BOOL;
+    pub fn GetFileMUIPath(
+        dwFlags: DWORD, pcwszFilePath: PCWSTR, pwszLanguage: PWSTR, pcchLanguage: PULONG,
+        pwszFileMUIPath: PWSTR, pcchFileMUIPath: PULONG, pululEnumerator: ULONGLONG,
+    ) -> BOOL;
+    pub fn GetFileSize(hFile: HANDLE, lpFileSizeHigh: LPDWORD) -> DWORD;
+    pub fn GetFileSizeEx(hFile: HANDLE, lpFileSize: PLARGE_INTEGER) -> BOOL;
+    pub fn GetFileTime(
+        hFile: HANDLE, lpCreationTime: LPFILETIME, lpLastAccessTime: LPFILETIME,
+        lpLastWriteTime: LPFILETIME,
+    ) -> BOOL;
+    pub fn GetFileType(hFile: HANDLE) -> DWORD;
+    pub fn GetFinalPathNameByHandleA(
+        hFile: HANDLE, lpszFilePath: LPSTR, cchFilePath: DWORD, dwFlags: DWORD,
+    ) -> DWORD;
+    pub fn GetFinalPathNameByHandleW(
+        hFile: HANDLE, lpszFilePath: LPWSTR, cchFilePath: DWORD, dwFlags: DWORD,
+    ) -> DWORD;
+    pub fn GetFirmwareEnvironmentVariableA(
+        lpName: LPCSTR, lpGuid: LPCSTR, pBuffer: PVOID, nSize: DWORD,
+    ) -> DWORD;
+    pub fn GetFirmwareEnvironmentVariableExA(
+        lpName: LPCSTR, lpGuid: LPCSTR, pBuffer: PVOID, nSize: DWORD, pdwAttribubutes: PDWORD,
+    ) -> DWORD;
+    pub fn GetFirmwareEnvironmentVariableExW(
+        lpName: LPCWSTR, lpGuid: LPCWSTR, pBuffer: PVOID, nSize: DWORD, pdwAttribubutes: PDWORD,
+    ) -> DWORD;
+    pub fn GetFirmwareEnvironmentVariableW(
+        lpName: LPCWSTR, lpGuid: LPCWSTR, pBuffer: PVOID, nSize: DWORD,
+    ) -> DWORD;
+    pub fn GetFirmwareType(FirmwareType: PFIRMWARE_TYPE) -> BOOL;
+    pub fn GetFullPathNameA(
+        lpFileName: LPCSTR, nBufferLength: DWORD, lpBuffer: LPSTR, lpFilePart: *mut LPSTR,
+    ) -> DWORD;
+    pub fn GetFullPathNameTransactedA(
+        lpFileName: LPCSTR, nBufferLength: DWORD, lpBuffer: LPSTR, lpFilePart: *mut LPSTR,
+        hTransaction: HANDLE,
+    ) -> DWORD;
+    pub fn GetFullPathNameTransactedW(
+        lpFileName: LPCWSTR, nBufferLength: DWORD, lpBuffer: LPWSTR, lpFilePart: *mut LPWSTR,
+        hTransaction: HANDLE,
+    );
+    pub fn GetFullPathNameW(
+        lpFileName: LPCWSTR, nBufferLength: DWORD, lpBuffer: LPWSTR, lpFilePart: *mut LPWSTR,
+    ) -> DWORD;
+    pub fn GetGeoInfoA(
+        Location: GEOID, GeoType: GEOTYPE, lpGeoData: LPSTR, cchData: c_int, LangId: LANGID,
+    ) -> c_int;
+    pub fn GetGeoInfoW(
+        Location: GEOID, GeoType: GEOTYPE, lpGeoData: LPWSTR, cchData: c_int, LangId: LANGID,
+    ) -> c_int;
+    pub fn GetHandleInformation(hObject: HANDLE, lpdwFlags: LPDWORD) -> BOOL;
+    pub fn GetLargePageMinimum() -> SIZE_T;
+    pub fn GetLargestConsoleWindowSize(hConsoleOutput: HANDLE) -> COORD;
+    pub fn GetLastError() -> DWORD;
+    pub fn GetLocalTime(lpSystemTime: LPSYSTEMTIME);
+    pub fn GetLocaleInfoA(
+        Locale: LCID, LCType: LCTYPE, lpLCData: LPSTR, cchData: c_int,
+    ) -> c_int;
+    pub fn GetLocaleInfoEx(
+        lpLocaleName: LPCWSTR, LCType: LCTYPE, lpLCData: LPWSTR, cchData: c_int,
+    ) -> c_int;
+    pub fn GetLocaleInfoW(
+        Locale: LCID, LCType: LCTYPE, lpLCData: LPWSTR, cchData: c_int,
+    ) -> c_int;
+    pub fn GetLogicalDriveStringsA(nBufferLength: DWORD, lpBuffer: LPSTR) -> DWORD;
+    pub fn GetLogicalDriveStringsW(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD;
+    pub fn GetLogicalDrives() -> DWORD;
+    pub fn GetLogicalProcessorInformation(
+        Buffer: PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, ReturnedLength: PDWORD,
+    ) -> BOOL;
+    pub fn GetLogicalProcessorInformationEx(
+        RelationshipType: LOGICAL_PROCESSOR_RELATIONSHIP,
+        Buffer: PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
+        ReturnedLength: PDWORD,
+    ) -> BOOL;
+    pub fn GetLongPathNameA(lpszShortPath: LPCSTR, lpszLongPath: LPSTR, cchBuffer: DWORD) -> DWORD;
+    pub fn GetLongPathNameTransactedA(
+        lpszShortPath: LPCSTR, lpszLongPath: LPSTR, cchBuffer: DWORD, hTransaction: HANDLE,
+    ) -> DWORD;
+    pub fn GetLongPathNameTransactedW(
+        lpszShortPath: LPCWSTR, lpszLongPath: LPWSTR, cchBuffer: DWORD, hTransaction: HANDLE,
+    ) -> DWORD;
+    pub fn GetLongPathNameW(
+        lpszShortPath: LPCWSTR, lpszLongPath: LPWSTR, cchBuffer: DWORD,
+    ) -> DWORD;
+    pub fn GetMailslotInfo(
+        hMailslot: HANDLE, lpMaxMessageSize: LPDWORD, lpNextSize: LPDWORD, lpMessageCount: LPDWORD,
+        lpReadTimeout: LPDWORD,
+    ) -> BOOL;
+    pub fn GetMaximumProcessorCount(GroupNumber: WORD) -> DWORD;
+    pub fn GetMaximumProcessorGroupCount() -> WORD;
+    pub fn GetMemoryErrorHandlingCapabilities(Capabilities: PULONG) -> BOOL;
+    pub fn GetModuleFileNameA(
+        hModule: HMODULE, lpFilename: LPSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn GetModuleFileNameW(
+        hModule: HMODULE, lpFilename: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn GetModuleHandleA(lpModuleName: LPCSTR) -> HMODULE;
+    pub fn GetModuleHandleExA(
+        dwFlags: DWORD, lpModuleName: LPCSTR, phModule: *mut HMODULE,
+    ) -> BOOL;
+    pub fn GetModuleHandleExW(
+        dwFlags: DWORD, lpModuleName: LPCWSTR, phModule: *mut HMODULE,
+    ) -> BOOL;
+    pub fn GetModuleHandleW(lpModuleName: LPCWSTR) -> HMODULE;
+    pub fn GetNLSVersion(
+        Function: NLS_FUNCTION, Locale: LCID, lpVersionInformation: LPNLSVERSIONINFO,
+    ) -> BOOL;
+    pub fn GetNLSVersionEx(
+        function: NLS_FUNCTION, lpLocaleName: LPCWSTR, lpVersionInformation: LPNLSVERSIONINFOEX,
+    ) -> BOOL;
+    // pub fn GetNamedPipeAttribute();
+    pub fn GetNamedPipeClientComputerNameA(
+        Pipe: HANDLE, ClientComputerName: LPSTR, ClientComputerNameLength: ULONG,
+    ) -> BOOL;
+    pub fn GetNamedPipeClientComputerNameW(
+        Pipe: HANDLE, ClientComputerName: LPWSTR, ClientComputerNameLength: ULONG,
+    ) -> BOOL;
+    pub fn GetNamedPipeClientProcessId(Pipe: HANDLE, ClientProcessId: PULONG) -> BOOL;
+    pub fn GetNamedPipeClientSessionId(Pipe: HANDLE, ClientSessionId: PULONG) -> BOOL;
+    pub fn GetNamedPipeHandleStateA(
+        hNamedPipe: HANDLE, lpState: LPDWORD, lpCurInstances: LPDWORD,
+        lpMaxCollectionCount: LPDWORD, lpCollectDataTimeout: LPDWORD, lpUserName: LPSTR,
+        nMaxUserNameSize: DWORD,
+    ) -> BOOL;
+    pub fn GetNamedPipeHandleStateW(
+        hNamedPipe: HANDLE, lpState: LPDWORD, lpCurInstances: LPDWORD,
+        lpMaxCollectionCount: LPDWORD, lpCollectDataTimeout: LPDWORD, lpUserName: LPWSTR,
+        nMaxUserNameSize: DWORD,
+    ) -> BOOL;
+    pub fn GetNamedPipeInfo(
+        hNamedPipe: HANDLE, lpFlags: LPDWORD, lpOutBufferSize: LPDWORD, lpInBufferSize: LPDWORD,
+        lpMaxInstances: LPDWORD,
+    ) -> BOOL;
+    pub fn GetNamedPipeServerProcessId(Pipe: HANDLE, ServerProcessId: PULONG) -> BOOL;
+    pub fn GetNamedPipeServerSessionId(Pipe: HANDLE, ServerSessionId: PULONG) -> BOOL;
+    pub fn GetNativeSystemInfo(lpSystemInfo: LPSYSTEM_INFO);
+    #[cfg(target_arch = "x86_64")]
+    pub fn GetNextUmsListItem(UmsContext: PUMS_CONTEXT) -> PUMS_CONTEXT;
+    pub fn GetNumaAvailableMemoryNode(Node: UCHAR, AvailableBytes: PULONGLONG) -> BOOL;
+    pub fn GetNumaAvailableMemoryNodeEx(Node: USHORT, AvailableBytes: PULONGLONG) -> BOOL;
+    pub fn GetNumaHighestNodeNumber(HighestNodeNumber: PULONG) -> BOOL;
+    pub fn GetNumaNodeNumberFromHandle(hFile: HANDLE, NodeNumber: PUSHORT) -> BOOL;
+    pub fn GetNumaNodeProcessorMask(Node: UCHAR, ProcessorMask: PULONGLONG) -> BOOL;
+    pub fn GetNumaNodeProcessorMaskEx(Node: USHORT, ProcessorMask: PGROUP_AFFINITY) -> BOOL;
+    pub fn GetNumaProcessorNode(Processor: UCHAR, NodeNumber: PUCHAR) -> BOOL;
+    pub fn GetNumaProcessorNodeEx(Processor: PPROCESSOR_NUMBER, NodeNumber: PUSHORT) -> BOOL;
+    pub fn GetNumaProximityNode(ProximityId: ULONG, NodeNumber: PUCHAR) -> BOOL;
+    pub fn GetNumaProximityNodeEx(ProximityId: ULONG, NodeNumber: PUSHORT) -> BOOL;
+    pub fn GetNumberFormatA(
+        Locale: LCID, dwFlags: DWORD, lpValue: LPCSTR, lpFormat: *const NUMBERFMTA,
+        lpNumberStr: LPSTR, cchNumber: c_int,
+    ) -> c_int;
+    pub fn GetNumberFormatEx(
+        lpLocaleName: LPCWSTR, dwFlags: DWORD, lpValue: LPCWSTR, lpFormat: *const NUMBERFMTW,
+        lpNumberStr: LPWSTR, cchNumber: c_int,
+    ) -> c_int;
+    pub fn GetNumberFormatW(
+        Locale: LCID, dwFlags: DWORD, lpValue: LPCWSTR, lpFormat: *const NUMBERFMTW,
+        lpNumberStr: LPWSTR, cchNumber: c_int,
+    ) -> c_int;
+    pub fn GetNumberOfConsoleInputEvents(hConsoleInput: HANDLE, lpNumberOfEvents: LPDWORD) -> BOOL;
+    pub fn GetNumberOfConsoleMouseButtons(lpNumberOfMouseButtons: LPDWORD) -> BOOL;
+    pub fn GetOEMCP() -> UINT;
+    pub fn GetOverlappedResult(
+        hFile: HANDLE, lpOverlapped: LPOVERLAPPED, lpNumberOfBytesTransferred: LPDWORD, bWait: BOOL,
+    ) -> BOOL;
+    pub fn GetOverlappedResultEx(
+        hFile: HANDLE, lpOverlapped: LPOVERLAPPED, lpNumberOfBytesTransferred: LPDWORD,
+        dwMilliseconds: DWORD, bAlertable: BOOL,
+    ) -> BOOL;
+    // pub fn GetPackageApplicationIds();
+    // pub fn GetPackageFamilyName();
+    // pub fn GetPackageFullName();
+    // pub fn GetPackageId();
+    // pub fn GetPackageInfo();
+    // pub fn GetPackagePath();
+    // pub fn GetPackagePathByFullName();
+    // pub fn GetPackagesByPackageFamily();
+    pub fn GetPhysicallyInstalledSystemMemory(TotalMemoryInKilobytes: PULONGLONG) -> BOOL;
+    pub fn GetPriorityClass(hProcess: HANDLE) -> DWORD;
+    pub fn GetPrivateProfileIntA(
+        lpAppName: LPCSTR, lpKeyName: LPCSTR, nDefault: INT, lpFileName: LPCSTR,
+    ) -> UINT;
+    pub fn GetPrivateProfileIntW(
+        lpAppName: LPCWSTR, lpKeyName: LPCWSTR, nDefault: INT, lpFileName: LPCWSTR,
+    ) -> UINT;
+    pub fn GetPrivateProfileSectionA(
+        lpAppName: LPCSTR, lpReturnedString: LPSTR, nSize: DWORD, lpFileName: LPCSTR,
+    ) -> DWORD;
+    pub fn GetPrivateProfileSectionNamesA(
+        lpszReturnBuffer: LPSTR, nSize: DWORD, lpFileName: LPCSTR,
+    ) -> DWORD;
+    pub fn GetPrivateProfileSectionNamesW(
+        lpszReturnBuffer: LPWSTR, nSize: DWORD, lpFileName: LPCWSTR,
+    ) -> DWORD;
+    pub fn GetPrivateProfileSectionW(
+        lpAppName: LPCWSTR, lpReturnedString: LPWSTR, nSize: DWORD, lpFileName: LPCWSTR,
+    ) -> DWORD;
+    pub fn GetPrivateProfileStringA(
+        lpAppName: LPCSTR, lpKeyName: LPCSTR, lpDefault: LPCSTR, lpReturnedString: LPSTR,
+        nSize: DWORD, lpFileName: LPCSTR,
+    ) -> DWORD;
+    pub fn GetPrivateProfileStringW(
+        lpAppName: LPCWSTR, lpKeyName: LPCWSTR, lpDefault: LPCWSTR, lpReturnedString: LPWSTR,
+        nSize: DWORD, lpFileName: LPCWSTR,
+    ) -> DWORD;
+    pub fn GetPrivateProfileStructA(
+        lpszSection: LPCSTR, lpszKey: LPCSTR, lpStruct: LPVOID, uSizeStruct: UINT, szFile: LPCSTR,
+    ) -> BOOL;
+    pub fn GetPrivateProfileStructW(
+        lpszSection: LPCWSTR, lpszKey: LPCWSTR, lpStruct: LPVOID, uSizeStruct: UINT,
+        szFile: LPCWSTR,
+    ) -> BOOL;
+    pub fn GetProcAddress(hModule: HMODULE, lpProcName: LPCSTR) -> FARPROC;
+    pub fn GetProcessAffinityMask(
+        hProcess: HANDLE, lpProcessAffinityMask: PDWORD_PTR, lpSystemAffinityMask: PDWORD_PTR,
+    ) -> BOOL;
+    pub fn GetProcessDEPPolicy(hProcess: HANDLE, lpFlags: LPDWORD, lpPermanent: PBOOL) -> BOOL;
+    pub fn GetProcessGroupAffinity(
+        hProcess: HANDLE, GroupCount: PUSHORT, GroupArray: PUSHORT,
+    ) -> BOOL;
+    pub fn GetProcessHandleCount(hProcess: HANDLE, pdwHandleCount: PDWORD) -> BOOL;
+    pub fn GetProcessHeap() -> HANDLE;
+    pub fn GetProcessHeaps(NumberOfHeaps: DWORD, ProcessHeaps: PHANDLE) -> DWORD;
+    pub fn GetProcessId(Process: HANDLE) -> DWORD;
+    pub fn GetProcessIdOfThread(Thread: HANDLE) -> DWORD;
+    pub fn GetProcessInformation(
+        hProcess: HANDLE, ProcessInformationClass: PROCESS_INFORMATION_CLASS,
+        ProcessInformation: LPVOID, ProcessInformationSize: DWORD,
+    ) -> BOOL;
+    pub fn GetProcessIoCounters(hProcess: HANDLE, lpIoCounters: PIO_COUNTERS) -> BOOL;
+    pub fn GetProcessMitigationPolicy(
+        hProcess: HANDLE, MitigationPolicy: PROCESS_MITIGATION_POLICY, lpBuffer: LPVOID,
+        dwLength: SIZE_T,
+    ) -> BOOL;
+    pub fn GetProcessPreferredUILanguages(
+        dwFlags: DWORD, pulNumLanguages: PULONG, pwszLanguagesBuffer: PZZWSTR,
+        pcchLanguagesBuffer: PULONG,
+    ) -> BOOL;
+    pub fn GetProcessPriorityBoost(hProcess: HANDLE, pDisablePriorityBoost: PBOOL) -> BOOL;
+    pub fn GetProcessShutdownParameters(lpdwLevel: LPDWORD, lpdwFlags: LPDWORD) -> BOOL;
+    pub fn GetProcessTimes(
+        hProcess: HANDLE, lpCreationTime: LPFILETIME, lpExitTime: LPFILETIME,
+        lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME,
+    ) -> BOOL;
+    pub fn GetProcessVersion(ProcessId: DWORD) -> DWORD;
+    pub fn GetProcessWorkingSetSize(
+        hProcess: HANDLE, lpMinimumWorkingSetSize: PSIZE_T, lpMaximumWorkingSetSize: PSIZE_T,
+    ) -> BOOL;
+    pub fn GetProcessWorkingSetSizeEx(
+        hProcess: HANDLE, lpMinimumWorkingSetSize: PSIZE_T, lpMaximumWorkingSetSize: PSIZE_T,
+        Flags: PDWORD,
+    ) -> BOOL;
+    pub fn GetProcessorSystemCycleTime(
+        Group: USHORT, Buffer: PSYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION, ReturnedLength: PDWORD,
+    ) -> BOOL;
+    pub fn GetProductInfo(
+        dwOSMajorVersion: DWORD, dwOSMinorVersion: DWORD, dwSpMajorVersion: DWORD,
+        dwSpMinorVersion: DWORD, pdwReturnedProductType: PDWORD,
+    ) -> BOOL;
+    pub fn GetProfileIntA(lpAppName: LPCSTR, lpKeyName: LPCSTR, nDefault: INT) -> UINT;
+    pub fn GetProfileIntW(lpAppName: LPCWSTR, lpKeyName: LPCWSTR, nDefault: INT) -> UINT;
+    pub fn GetProfileSectionA(lpAppName: LPCSTR, lpReturnedString: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn GetProfileSectionW(lpAppName: LPCWSTR, lpReturnedString: LPWSTR, nSize: DWORD) -> DWORD;
+    pub fn GetProfileStringA(
+        lpAppName: LPCSTR, lpKeyName: LPCSTR, lpDefault: LPCSTR, lpReturnedString: LPSTR,
+        nSize: DWORD,
+    ) -> DWORD;
+    pub fn GetProfileStringW(
+        lpAppName: LPCWSTR, lpKeyName: LPCWSTR, lpDefault: LPCWSTR, lpReturnedString: LPWSTR,
+        nSize: DWORD,
+    ) -> DWORD;
+    pub fn GetQueuedCompletionStatus(
+        CompletionPort: HANDLE, lpNumberOfBytesTransferred: LPDWORD, lpCompletionKey: PULONG_PTR,
+        lpOverlapped: *mut LPOVERLAPPED, dwMilliseconds: DWORD,
+    ) -> BOOL;
+    pub fn GetQueuedCompletionStatusEx(
+        CompletionPort: HANDLE, lpCompletionPortEntries: LPOVERLAPPED_ENTRY, ulCount: ULONG,
+        ulNumEntriesRemoved: PULONG, dwMilliseconds: DWORD, fAlertable: BOOL,
+    ) -> BOOL;
+    pub fn GetShortPathNameA(
+        lpszLongPath: LPCSTR, lpszShortPath: LPSTR, cchBuffer: DWORD,
+    ) -> DWORD;
+    pub fn GetShortPathNameW(
+        lpszLongPath: LPCWSTR, lpszShortPath: LPWSTR, cchBuffer: DWORD,
+    ) -> DWORD;
+    // pub fn GetStagedPackagePathByFullName();
+    pub fn GetStartupInfoA(lpStartupInfo: LPSTARTUPINFOA);
+    pub fn GetStartupInfoW(lpStartupInfo: LPSTARTUPINFOW);
+    // pub fn GetStateFolder();
+    pub fn GetStdHandle(nStdHandle: DWORD) -> HANDLE;
+    pub fn GetStringScripts(
+        dwFlags: DWORD, lpString: LPCWSTR, cchString: c_int, lpScripts: LPWSTR, cchScripts: c_int,
+    ) -> c_int;
+    pub fn GetStringTypeA(
+        Locale: LCID, dwInfoType: DWORD, lpSrcStr: LPCSTR, cchSrc: c_int, lpCharType: LPWORD,
+    ) -> BOOL;
+    pub fn GetStringTypeExA(
+        Locale: LCID, dwInfoType: DWORD, lpSrcStr: LPCSTR, cchSrc: c_int, lpCharType: LPWORD,
+    ) -> BOOL;
+    pub fn GetStringTypeExW(
+        Locale: LCID, dwInfoType: DWORD, lpSrcStr: LPCWCH, cchSrc: c_int, lpCharType: LPWORD,
+    ) -> BOOL;
+    pub fn GetStringTypeW(
+        dwInfoType: DWORD, lpSrcStr: LPCWCH, cchSrc: c_int, lpCharType: LPWORD,
+    ) -> BOOL;
+    // pub fn GetSystemAppDataKey();
+    pub fn GetSystemDEPPolicy() -> DEP_SYSTEM_POLICY_TYPE;
+    pub fn GetSystemDefaultLCID() -> LCID;
+    pub fn GetSystemDefaultLangID() -> LANGID;
+    pub fn GetSystemDefaultLocaleName(lpLocaleName: LPWSTR, cchLocaleName: c_int) -> c_int;
+    pub fn GetSystemDefaultUILanguage() -> LANGID;
+    pub fn GetSystemDirectoryA(lpBuffer: LPSTR, uSize: UINT) -> UINT;
+    pub fn GetSystemDirectoryW(lpBuffer: LPWSTR, uSize: UINT) -> UINT;
+    pub fn GetSystemFileCacheSize(
+        lpMinimumFileCacheSize: PSIZE_T, lpMaximumFileCacheSize: PSIZE_T, lpFlags: PDWORD,
+    ) -> BOOL;
+    pub fn GetSystemFirmwareTable(
+        FirmwareTableProviderSignature: DWORD, FirmwareTableID: DWORD, pFirmwareTableBuffer: PVOID,
+        BufferSize: DWORD,
+    ) -> UINT;
+    pub fn GetSystemInfo(lpSystemInfo: LPSYSTEM_INFO);
+    pub fn GetSystemPowerStatus(lpSystemPowerStatus: LPSYSTEM_POWER_STATUS) -> BOOL;
+    pub fn GetSystemPreferredUILanguages(
+        dwFlags: DWORD, pulNumLanguages: PULONG, pwszLanguagesBuffer: PZZWSTR,
+        pcchLanguagesBuffer: PULONG,
+    ) -> BOOL;
+    pub fn GetSystemRegistryQuota(pdwQuotaAllowed: PDWORD, pdwQuotaUsed: PDWORD) -> BOOL;
+    pub fn GetSystemTime(lpSystemTime: LPSYSTEMTIME);
+    pub fn GetSystemTimeAdjustment(
+        lpTimeAdjustment: PDWORD, lpTimeIncrement: PDWORD, lpTimeAdjustmentDisabled: PBOOL,
+    ) -> BOOL;
+    pub fn GetSystemTimeAsFileTime(lpSystemTimeAsFileTime: LPFILETIME);
+    pub fn GetSystemTimePreciseAsFileTime(lpSystemTimeAsFileTime: LPFILETIME);
+    pub fn GetSystemTimes(
+        lpIdleTime: PFILETIME, lpKernelTime: PFILETIME, lpUserTime: PFILETIME,
+    ) -> BOOL;
+    pub fn GetSystemWindowsDirectoryA(lpBuffer: LPSTR, uSize: UINT) -> UINT;
+    pub fn GetSystemWindowsDirectoryW(lpBuffer: LPWSTR, uSize: UINT) -> UINT;
+    pub fn GetSystemWow64DirectoryA(lpBuffer: LPSTR, uSize: UINT) -> UINT;
+    pub fn GetSystemWow64DirectoryW(lpBuffer: LPWSTR, uSize: UINT) -> UINT;
+    pub fn GetTapeParameters(
+        hDevice: HANDLE, dwOperation: DWORD, lpdwSize: LPDWORD, lpTapeInformation: LPVOID
+    ) -> DWORD;
+    pub fn GetTapePosition(
+        hDevice: HANDLE, dwPositionType: DWORD, lpdwPartition: LPDWORD,
+        lpdwOffsetLow: LPDWORD, lpdwOffsetHigh: LPDWORD
+    ) -> DWORD;
+    pub fn GetTapeStatus(hDevice: HANDLE) -> DWORD;
+    pub fn GetTempFileNameA(
+        lpPathName: LPCSTR, lpPrefixString: LPCSTR, uUnique: UINT, lpTempFileName: LPSTR,
+    ) -> UINT;
+    pub fn GetTempFileNameW(
+        lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: UINT, lpTempFileName: LPWSTR,
+    ) -> UINT;
+    pub fn GetTempPathA(nBufferLength: DWORD, lpBuffer: LPSTR) -> DWORD;
+    pub fn GetTempPathW(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD;
+    pub fn GetThreadContext(hThread: HANDLE, lpContext: LPCONTEXT) -> BOOL;
+    pub fn GetThreadErrorMode() -> DWORD;
+    pub fn GetThreadGroupAffinity(hThread: HANDLE, GroupAffinity: PGROUP_AFFINITY) -> BOOL;
+    pub fn GetThreadIOPendingFlag(hThread: HANDLE, lpIOIsPending: PBOOL) -> BOOL;
+    pub fn GetThreadId(Thread: HANDLE) -> DWORD;
+    pub fn GetThreadIdealProcessorEx(hThread: HANDLE, lpIdealProcessor: PPROCESSOR_NUMBER) -> BOOL;
+    pub fn GetThreadInformation(
+        hThread: HANDLE, ThreadInformationClass: THREAD_INFORMATION_CLASS,
+        ThreadInformation: LPVOID, ThreadInformationSize: DWORD,
+    ) -> BOOL;
+    pub fn GetThreadLocale() -> LCID;
+    pub fn GetThreadPreferredUILanguages(
+        dwFlags: DWORD, pulNumLanguages: PULONG, pwszLanguagesBuffer: PZZWSTR,
+        pcchLanguagesBuffer: PULONG,
+    ) -> BOOL;
+    pub fn GetThreadPriority(hThread: HANDLE) -> c_int;
+    pub fn GetThreadPriorityBoost(hThread: HANDLE, pDisablePriorityBoost: PBOOL) -> BOOL;
+    pub fn GetThreadSelectorEntry(
+        hThread: HANDLE, dwSelector: DWORD, lpSelectorEntry: LPLDT_ENTRY,
+    ) -> BOOL;
+    pub fn GetThreadTimes(
+        hThread: HANDLE, lpCreationTime: LPFILETIME, lpExitTime: LPFILETIME,
+        lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME,
+    ) -> BOOL;
+    pub fn GetThreadUILanguage() -> LANGID;
+    pub fn GetTickCount() -> DWORD;
+    pub fn GetTickCount64() -> ULONGLONG;
+    pub fn GetTimeFormatA(
+        Locale: LCID, dwFlags: DWORD, lpTime: *const SYSTEMTIME, lpFormat: LPCSTR,
+        lpTimeStr: LPSTR, cchTime: c_int,
+    ) -> c_int;
+    pub fn GetTimeFormatEx(
+        lpLocaleName: LPCWSTR, dwFlags: DWORD, lpTime: *const SYSTEMTIME, lpFormat: LPCWSTR,
+        lpTimeStr: LPWSTR, cchTime: c_int,
+    ) -> c_int;
+    pub fn GetTimeFormatW(
+        Locale: LCID, dwFlags: DWORD, lpTime: *const SYSTEMTIME, lpFormat: LPCWSTR,
+        lpTimeStr: LPWSTR, cchTime: c_int,
+    ) -> c_int;
+    pub fn GetTimeZoneInformation(lpTimeZoneInformation: LPTIME_ZONE_INFORMATION) -> DWORD;
+    pub fn GetTimeZoneInformationForYear(
+        wYear: USHORT, pdtzi: PDYNAMIC_TIME_ZONE_INFORMATION, ptzi: LPTIME_ZONE_INFORMATION,
+    ) -> BOOL;
+    pub fn GetUILanguageInfo(
+        dwFlags: DWORD, pwmszLanguage: PCZZWSTR, pwszFallbackLanguages: PZZWSTR,
+        pcchFallbackLanguages: PDWORD, pAttributes: PDWORD,
+    ) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn GetUmsCompletionListEvent(
+        UmsCompletionList: PUMS_COMPLETION_LIST, UmsCompletionEvent: PHANDLE,
+    ) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn GetUmsSystemThreadInformation(
+        ThreadHandle: HANDLE, SystemThreadInfo: PUMS_SYSTEM_THREAD_INFORMATION,
+    ) -> BOOL;
+    pub fn GetUserDefaultLCID() -> LCID;
+    pub fn GetUserDefaultLangID() -> LANGID;
+    pub fn GetUserDefaultLocaleName(lpLocaleName: LPWSTR, cchLocaleName: c_int) -> c_int;
+    pub fn GetUserDefaultUILanguage() -> LANGID;
+    pub fn GetUserGeoID(GeoClass: GEOCLASS) -> GEOID;
+    pub fn GetUserPreferredUILanguages(
+        dwFlags: DWORD, pulNumLanguages: PULONG, pwszLanguagesBuffer: PZZWSTR,
+        pcchLanguagesBuffer: PULONG,
+    ) -> BOOL;
+    pub fn GetVersion() -> DWORD;
+    pub fn GetVersionExA(lpVersionInformation: LPOSVERSIONINFOA) -> BOOL;
+    pub fn GetVersionExW(lpVersionInformation: LPOSVERSIONINFOW) -> BOOL;
+    pub fn GetVolumeInformationA(
+        lpRootPathName: LPCSTR, lpVolumeNameBuffer: LPSTR, nVolumeNameSize: DWORD,
+        lpVolumeSerialNumber: LPDWORD, lpMaximumComponentLength: LPDWORD,
+        lpFileSystemFlags: LPDWORD, lpFileSystemNameBuffer: LPSTR, nFileSystemNameSize: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumeInformationByHandleW(
+        hFile: HANDLE, lpVolumeNameBuffer: LPWSTR, nVolumeNameSize: DWORD,
+        lpVolumeSerialNumber: LPDWORD, lpMaximumComponentLength: LPDWORD,
+        lpFileSystemFlags: LPDWORD, lpFileSystemNameBuffer: LPWSTR, nFileSystemNameSize: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumeInformationW(
+        lpRootPathName: LPCWSTR, lpVolumeNameBuffer: LPWSTR, nVolumeNameSize: DWORD,
+        lpVolumeSerialNumber: LPDWORD, lpMaximumComponentLength: LPDWORD,
+        lpFileSystemFlags: LPDWORD, lpFileSystemNameBuffer: LPWSTR, nFileSystemNameSize: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumeNameForVolumeMountPointA(
+        lpszVolumeMountPoint: LPCSTR, lpszVolumeName: LPSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumeNameForVolumeMountPointW(
+        lpszVolumeMountPoint: LPCWSTR, lpszVolumeName: LPWSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumePathNameA(
+        lpszFileName: LPCSTR, lpszVolumePathName: LPSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumePathNameW(
+        lpszFileName: LPCWSTR, lpszVolumePathName: LPWSTR, cchBufferLength: DWORD,
+    ) -> BOOL;
+    pub fn GetVolumePathNamesForVolumeNameA(
+        lpszVolumeName: LPCSTR, lpszVolumePathNames: LPCH, cchBufferLength: DWORD,
+        lpcchReturnLength: PDWORD,
+    ) -> BOOL;
+    pub fn GetVolumePathNamesForVolumeNameW(
+        lpszVolumeName: LPCWSTR, lpszVolumePathNames: LPWCH, cchBufferLength: DWORD,
+        lpcchReturnLength: PDWORD,
+    ) -> BOOL;
+    pub fn GetWindowsDirectoryA(lpBuffer: LPSTR, uSize: UINT) -> UINT;
+    pub fn GetWindowsDirectoryW(lpBuffer: LPWSTR, uSize: UINT) -> UINT;
+    pub fn GetWriteWatch(
+        dwFlags: DWORD, lpBaseAddress: PVOID, dwRegionSize: SIZE_T, lpAddresses: *mut PVOID,
+        lpdwCount: *mut ULONG_PTR, lpdwGranularity: LPDWORD,
+    ) -> UINT;
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    pub fn GetXStateFeaturesMask(Context: PCONTEXT, FeatureMask: PDWORD64) -> BOOL;
+    pub fn GlobalAddAtomA(lpString: LPCSTR) -> ATOM;
+    pub fn GlobalAddAtomExA(lpString: LPCSTR, Flags: DWORD) -> ATOM;
+    pub fn GlobalAddAtomExW(lpString: LPCWSTR, Flags: DWORD) -> ATOM;
+    pub fn GlobalAddAtomW(lpString: LPCWSTR) -> ATOM;
+    pub fn GlobalAlloc(uFlags: UINT, dwBytes: SIZE_T) -> HGLOBAL;
+    pub fn GlobalCompact(dwMinFree: DWORD) -> SIZE_T;
+    pub fn GlobalDeleteAtom(nAtom: ATOM) -> ATOM;
+    pub fn GlobalFindAtomA(lpString: LPCSTR) -> ATOM;
+    pub fn GlobalFindAtomW(lpString: LPCWSTR) -> ATOM;
+    pub fn GlobalFix(hMem: HGLOBAL);
+    pub fn GlobalFlags(hMem: HGLOBAL) -> UINT;
+    pub fn GlobalFree(hMem: HGLOBAL) -> HGLOBAL;
+    pub fn GlobalGetAtomNameA(nAtom: ATOM, lpBuffer: LPSTR, nSize: c_int) -> UINT;
+    pub fn GlobalGetAtomNameW(nAtom: ATOM, lpBuffer: LPWSTR, nSize: c_int) -> UINT;
+    pub fn GlobalHandle(pMem: LPCVOID) -> HGLOBAL;
+    pub fn GlobalLock(hMem: HGLOBAL) -> LPVOID;
+    pub fn GlobalMemoryStatus(lpBuffer: LPMEMORYSTATUS);
+    pub fn GlobalMemoryStatusEx(lpBuffer: LPMEMORYSTATUSEX) -> BOOL;
+    pub fn GlobalReAlloc(hMem: HGLOBAL, dwBytes: SIZE_T, uFlags: UINT) -> HGLOBAL;
+    pub fn GlobalSize(hMem: HGLOBAL) -> SIZE_T;
+    pub fn GlobalUnWire(hMem: HGLOBAL) -> BOOL;
+    pub fn GlobalUnfix(hMem: HGLOBAL);
+    pub fn GlobalUnlock(hMem: HGLOBAL) -> BOOL;
+    pub fn GlobalWire(hMem: HGLOBAL) -> LPVOID;
+    pub fn Heap32First(lphe: LPHEAPENTRY32, th32ProcessID: DWORD, th32HeapID: ULONG_PTR) -> BOOL;
+    pub fn Heap32ListFirst(hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL;
+    pub fn Heap32ListNext(hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL;
+    pub fn Heap32Next(lphe: LPHEAPENTRY32) -> BOOL;
+    pub fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID;
+    pub fn HeapCompact(hHeap: HANDLE, dwFlags: DWORD) -> SIZE_T;
+    pub fn HeapCreate(flOptions: DWORD, dwInitialSize: SIZE_T, dwMaximumSize: SIZE_T) -> HANDLE;
+    pub fn HeapDestroy(hHeap: HANDLE) -> BOOL;
+    pub fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL;
+    pub fn HeapLock(hHeap: HANDLE) -> BOOL;
+    pub fn HeapQueryInformation(
+        HeapHandle: HANDLE, HeapInformationClass: HEAP_INFORMATION_CLASS, HeapInformation: PVOID,
+        HeapInformationLength: SIZE_T, ReturnLength: PSIZE_T,
+    ) -> BOOL;
+    pub fn HeapReAlloc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID;
+    pub fn HeapSetInformation(
+        HeapHandle: HANDLE, HeapInformationClass: HEAP_INFORMATION_CLASS, HeapInformation: PVOID,
+        HeapInformationLength: SIZE_T,
+    ) -> BOOL;
+    pub fn HeapSize(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPCVOID) -> SIZE_T;
+    pub fn HeapSummary(hHeap: HANDLE, dwFlags: DWORD, lpSummary: LPHEAP_SUMMARY) -> BOOL;
+    pub fn HeapUnlock(hHeap: HANDLE) -> BOOL;
+    pub fn HeapValidate(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPCVOID) -> BOOL;
+    pub fn HeapWalk(hHeap: HANDLE, lpEntry: LPPROCESS_HEAP_ENTRY) -> BOOL;
+    pub fn InitAtomTable(nSize: DWORD) -> BOOL;
+    pub fn InitOnceBeginInitialize(
+        lpInitOnce: LPINIT_ONCE, dwFlags: DWORD, fPending: PBOOL, lpContext: *mut LPVOID,
+    ) -> BOOL;
+    pub fn InitOnceComplete(
+        lpInitOnce: LPINIT_ONCE, dwFlags: DWORD, lpContext: LPVOID,
+    ) -> BOOL;
+    pub fn InitOnceExecuteOnce(
+        InitOnce: PINIT_ONCE, InitFn: PINIT_ONCE_FN, Parameter: PVOID, Context: *mut LPVOID,
+    ) -> BOOL;
+    pub fn InitOnceInitialize(InitOnce: PINIT_ONCE);
+    pub fn InitializeConditionVariable(ConditionVariable: PCONDITION_VARIABLE);
+    pub fn InitializeContext(
+        Buffer: PVOID, ContextFlags: DWORD, Context: *mut PCONTEXT, ContextLength: PDWORD,
+    ) -> BOOL;
+    pub fn InitializeCriticalSection(lpCriticalSection: LPCRITICAL_SECTION);
+    pub fn InitializeCriticalSectionAndSpinCount(
+        lpCriticalSection: LPCRITICAL_SECTION, dwSpinCount: DWORD,
+    ) -> BOOL;
+    pub fn InitializeCriticalSectionEx(
+        lpCriticalSection: LPCRITICAL_SECTION, dwSpinCount: DWORD, Flags: DWORD,
+    ) -> BOOL;
+    pub fn InitializeProcThreadAttributeList(
+        lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwAttributeCount: DWORD, dwFlags: DWORD,
+        lpSize: PSIZE_T,
+    ) -> BOOL;
+    pub fn InitializeSListHead(ListHead: PSLIST_HEADER);
+    pub fn InitializeSRWLock(SRWLock: PSRWLOCK);
+    pub fn InitializeSynchronizationBarrier(
+        lpBarrier: LPSYNCHRONIZATION_BARRIER, lTotalThreads: LONG, lSpinCount: LONG,
+    ) -> BOOL;
+    pub fn InstallELAMCertificateInfo(ELAMFile: HANDLE) -> BOOL;
+    #[cfg(target_arch = "x86")]
+    pub fn InterlockedCompareExchange(
+        Destination: *mut LONG, ExChange: LONG, Comperand: LONG,
+    ) -> LONG;
+    #[cfg(target_arch = "x86")]
+    pub fn InterlockedCompareExchange64(
+        Destination: *mut LONG64, ExChange: LONG64, Comperand: LONG64,
+    ) -> LONG64;
+    #[cfg(target_arch = "x86")]
+    pub fn InterlockedDecrement(Addend: *mut LONG) -> LONG;
+    #[cfg(target_arch = "x86")]
+    pub fn InterlockedExchange(Target: *mut LONG, Value: LONG) -> LONG;
+    #[cfg(target_arch = "x86")]
+    pub fn InterlockedExchangeAdd(Addend: *mut LONG, Value: LONG) -> LONG;
+    pub fn InterlockedFlushSList(ListHead: PSLIST_HEADER) -> PSLIST_ENTRY;
+    #[cfg(target_arch = "x86")]
+    pub fn InterlockedIncrement(Addend: *mut LONG) -> LONG;
+    pub fn InterlockedPopEntrySList(ListHead: PSLIST_HEADER) -> PSLIST_ENTRY;
+    pub fn InterlockedPushEntrySList(
+        ListHead: PSLIST_HEADER, ListEntry: PSLIST_ENTRY,
+    ) -> PSLIST_ENTRY;
+    pub fn InterlockedPushListSListEx(
+        ListHead: PSLIST_HEADER, List: PSLIST_ENTRY, ListEnd: PSLIST_ENTRY, Count: ULONG,
+    ) -> PSLIST_ENTRY;
+    pub fn IsBadCodePtr(lpfn: FARPROC) -> BOOL;
+    pub fn IsBadHugeReadPtr(lp: *const VOID, ucb: UINT_PTR) -> BOOL;
+    pub fn IsBadHugeWritePtr(lp: LPVOID, ucb: UINT_PTR) -> BOOL;
+    pub fn IsBadReadPtr(lp: *const VOID, ucb: UINT_PTR) -> BOOL;
+    pub fn IsBadStringPtrA(lpsz: LPCSTR, ucchMax: UINT_PTR) -> BOOL;
+    pub fn IsBadStringPtrW(lpsz: LPCWSTR, ucchMax: UINT_PTR) -> BOOL;
+    pub fn IsBadWritePtr(lp: LPVOID, ucb: UINT_PTR) -> BOOL;
+    pub fn IsDBCSLeadByte(TestChar: BYTE) -> BOOL;
+    pub fn IsDBCSLeadByteEx(CodePage: UINT, TestChar: BYTE) -> BOOL;
+    pub fn IsDebuggerPresent() -> BOOL;
+    pub fn IsNLSDefinedString(
+        Function: NLS_FUNCTION, dwFlags: DWORD, lpVersionInformation: LPNLSVERSIONINFO,
+        lpString: LPCWSTR, cchStr: INT,
+    ) -> BOOL;
+    pub fn IsNativeVhdBoot(NativeVhdBoot: PBOOL) -> BOOL;
+    pub fn IsNormalizedString(NormForm: NORM_FORM, lpString: LPCWSTR, cwLength: c_int) -> BOOL;
+    pub fn IsProcessCritical(hProcess: HANDLE, Critical: PBOOL) -> BOOL;
+    pub fn IsProcessInJob(ProcessHandle: HANDLE, JobHandle: HANDLE, Result: PBOOL) -> BOOL;
+    pub fn IsProcessorFeaturePresent(ProcessorFeature: DWORD) -> BOOL;
+    pub fn IsSystemResumeAutomatic() -> BOOL;
+    pub fn IsThreadAFiber() -> BOOL;
+    pub fn IsThreadpoolTimerSet(pti: PTP_TIMER) -> BOOL;
+    pub fn IsValidCodePage(CodePage: UINT) -> BOOL;
+    pub fn IsValidLanguageGroup(LanguageGroup: LGRPID, dwFlags: DWORD) -> BOOL;
+    pub fn IsValidLocale(Locale: LCID, dwFlags: DWORD) -> BOOL;
+    pub fn IsValidLocaleName(lpLocaleName: LPCWSTR) -> BOOL;
+    pub fn IsValidNLSVersion(
+        function: NLS_FUNCTION, lpLocaleName: LPCWSTR, lpVersionInformation: LPNLSVERSIONINFOEX,
+    ) -> BOOL;
+    pub fn IsWow64Process(hProcess: HANDLE, Wow64Process: PBOOL) -> BOOL;
+    pub fn K32EmptyWorkingSet(hProcess: HANDLE) -> BOOL;
+    pub fn K32EnumDeviceDrivers(lpImageBase: *mut LPVOID, cb: DWORD, lpcbNeeded: LPDWORD) -> BOOL;
+    pub fn K32EnumPageFilesA(
+        pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKA, pContext: LPVOID,
+    ) -> BOOL;
+    pub fn K32EnumPageFilesW(
+        pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKW, pContext: LPVOID,
+    ) -> BOOL;
+    pub fn K32EnumProcessModules(
+        hProcess: HANDLE, lphModule: *mut HMODULE, cb: DWORD, lpcbNeeded: LPDWORD,
+    ) -> BOOL;
+    pub fn K32EnumProcessModulesEx(
+        hProcess: HANDLE, lphModule: *mut HMODULE, cb: DWORD, lpcbNeeded: LPDWORD,
+        dwFilterFlag: DWORD,
+    ) -> BOOL;
+    pub fn K32EnumProcesses(
+        lpidProcess: *mut DWORD, cb: DWORD, lpcbNeeded: LPDWORD,
+    ) -> BOOL;
+    pub fn K32GetDeviceDriverBaseNameA(ImageBase: LPVOID, lpFilename: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn K32GetDeviceDriverBaseNameW(
+        ImageBase: LPVOID, lpFilename: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetDeviceDriverFileNameA(ImageBase: LPVOID, lpFilename: LPSTR, nSize: DWORD) -> DWORD;
+    pub fn K32GetDeviceDriverFileNameW(
+        ImageBase: LPVOID, lpFilename: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetMappedFileNameA(
+        hProcess: HANDLE, lpv: LPVOID, lpFilename: LPSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetMappedFileNameW(
+        hProcess: HANDLE, lpv: LPVOID, lpFilename: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetModuleBaseNameA(
+        hProcess: HANDLE, hModule: HMODULE, lpBaseName: LPSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetModuleBaseNameW(
+        hProcess: HANDLE, hModule: HMODULE, lpBaseName: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetModuleFileNameExA(
+        hProcess: HANDLE, hModule: HMODULE, lpFilename: LPSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetModuleFileNameExW(
+        hProcess: HANDLE, hModule: HMODULE, lpFilename: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetModuleInformation(
+        hProcess: HANDLE, hModule: HMODULE, lpmodinfo: LPMODULEINFO, cb: DWORD,
+    ) -> BOOL;
+    pub fn K32GetPerformanceInfo(
+        pPerformanceInformation: PPERFORMANCE_INFORMATION, cb: DWORD,
+    ) -> BOOL;
+    pub fn K32GetProcessImageFileNameA(
+        hProcess: HANDLE, lpImageFileName: LPSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetProcessImageFileNameW(
+        hProcess: HANDLE, lpImageFileName: LPWSTR, nSize: DWORD,
+    ) -> DWORD;
+    pub fn K32GetProcessMemoryInfo(
+        Process: HANDLE, ppsmemCounters: PPROCESS_MEMORY_COUNTERS, cb: DWORD,
+    ) -> BOOL;
+    pub fn K32GetWsChanges(
+        hProcess: HANDLE, lpWatchInfo: PPSAPI_WS_WATCH_INFORMATION, cb: DWORD,
+    ) -> BOOL;
+    pub fn K32GetWsChangesEx(
+        hProcess: HANDLE, lpWatchInfoEx: PPSAPI_WS_WATCH_INFORMATION_EX, cb: DWORD,
+    ) -> BOOL;
+    pub fn K32InitializeProcessForWsWatch(hProcess: HANDLE) -> BOOL;
+    pub fn K32QueryWorkingSet(hProcess: HANDLE, pv: PVOID, cb: DWORD) -> BOOL;
+    pub fn K32QueryWorkingSetEx(hProcess: HANDLE, pv: PVOID, cb: DWORD) -> BOOL;
+    pub fn LCIDToLocaleName(Locale: LCID, lpName: LPWSTR, cchName: c_int, dwFlags: DWORD) -> c_int;
+    pub fn LCMapStringA(
+        Locale: LCID, dwMapFlags: DWORD, lpSrcStr: LPCSTR, cchSrc: c_int, lpDestStr: LPSTR,
+        cchDest: c_int,
+    ) -> c_int;
+    pub fn LCMapStringEx(
+        lpLocaleName: LPCWSTR, dwMapFlags: DWORD, lpSrcStr: LPCWSTR, cchSrc: c_int,
+        lpDestStr: LPWSTR, cchDest: c_int, lpVersionInformation: LPNLSVERSIONINFO,
+        lpReserved: LPVOID, sortHandle: LPARAM,
+    ) -> c_int;
+    pub fn LCMapStringW(
+        Locale: LCID, dwMapFlags: DWORD, lpSrcStr: LPCWSTR, cchSrc: c_int, lpDestStr: LPWSTR,
+        cchDest: c_int,
+    ) -> c_int;
+    pub fn LeaveCriticalSection(lpCriticalSection: LPCRITICAL_SECTION);
+    pub fn LeaveCriticalSectionWhenCallbackReturns(
+        pci: PTP_CALLBACK_INSTANCE, pcs: PCRITICAL_SECTION,
+    );
+    // pub fn LoadAppInitDlls();
+    pub fn LoadLibraryA(lpFileName: LPCSTR) -> HMODULE;
+    pub fn LoadLibraryExA(lpLibFileName: LPCSTR, hFile: HANDLE, dwFlags: DWORD) -> HMODULE;
+    pub fn LoadLibraryExW(lpLibFileName: LPCWSTR, hFile: HANDLE, dwFlags: DWORD) -> HMODULE;
+    pub fn LoadLibraryW(lpFileName: LPCWSTR) -> HMODULE;
+    pub fn LoadModule(lpModuleName: LPCSTR, lpParameterBlock: LPVOID) -> DWORD;
+    pub fn LoadPackagedLibrary(lpwLibFileName: LPCWSTR, Reserved: DWORD) -> HMODULE;
+    pub fn LoadResource(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL;
+    // pub fn LoadStringBaseExW();
+    // pub fn LoadStringBaseW();
+    pub fn LocalAlloc(uFlags: UINT, uBytes: SIZE_T) -> HLOCAL;
+    pub fn LocalCompact(uMinFree: UINT) -> SIZE_T;
+    pub fn LocalFileTimeToFileTime(
+        lpLocalFileTime: *const FILETIME, lpFileTime: LPFILETIME,
+    ) -> BOOL;
+    pub fn LocalFlags(hMem: HLOCAL) -> UINT;
+    pub fn LocalFree(hMem: HLOCAL) -> HLOCAL;
+    pub fn LocalHandle(pMem: LPCVOID) -> HLOCAL;
+    pub fn LocalLock(hMem: HLOCAL) -> LPVOID;
+    pub fn LocalReAlloc(hMem: HLOCAL, uBytes: SIZE_T, uFlags: UINT) -> HLOCAL;
+    pub fn LocalShrink(hMem: HLOCAL, cbNewSize: UINT) -> SIZE_T;
+    pub fn LocalSize(hMem: HLOCAL) -> SIZE_T;
+    pub fn LocalUnlock(hMem: HLOCAL) -> BOOL;
+    pub fn LocaleNameToLCID(lpName: LPCWSTR, dwFlags: DWORD) -> LCID;
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    pub fn LocateXStateFeature(Context: PCONTEXT, FeatureId: DWORD, Length: PDWORD) -> PVOID;
+    pub fn LockFile(
+        hFile: HANDLE, dwFileOffsetLow: DWORD, dwFileOffsetHigh: DWORD,
+        nNumberOfBytesToLockLow: DWORD, nNumberOfBytesToLockHigh: DWORD,
+    ) -> BOOL;
+    pub fn LockFileEx(
+        hFile: HANDLE, dwFlags: DWORD, dwReserved: DWORD, nNumberOfBytesToLockLow: DWORD,
+        nNumberOfBytesToLockHigh: DWORD, lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn LockResource(hResData: HGLOBAL) -> LPVOID;
+    pub fn MapUserPhysicalPages(
+        VirtualAddress: PVOID, NumberOfPages: ULONG_PTR, PageArray: PULONG_PTR,
+    ) -> BOOL;
+    pub fn MapUserPhysicalPagesScatter(
+        VirtualAddresses: *mut PVOID, NumberOfPages: ULONG_PTR, PageArray: PULONG_PTR,
+    ) -> BOOL;
+    pub fn MapViewOfFile(
+        hFileMappingObject: HANDLE, dwDesiredAccess: DWORD, dwFileOffsetHigh: DWORD,
+        dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T,
+    ) -> LPVOID;
+    pub fn MapViewOfFileEx(
+        hFileMappingObject: HANDLE, dwDesiredAccess: DWORD, dwFileOffsetHigh: DWORD,
+        dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T, lpBaseAddress: LPVOID,
+    ) -> LPVOID;
+    pub fn MapViewOfFileExNuma(
+        hFileMappingObject: HANDLE, dwDesiredAccess: DWORD, dwFileOffsetHigh: DWORD,
+        dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T, lpBaseAddress: LPVOID,
+        nndPreferred: DWORD,
+    ) -> LPVOID;
+    pub fn MapViewOfFileFromApp(
+        hFileMappingObject: HANDLE, DesiredAccess: DWORD, FileOffset: ULONG64,
+        NumberOfBytesToMap: SIZE_T,
+    ) -> PVOID;
+    pub fn Module32First(hSnapshot: HANDLE, lpme: LPMODULEENTRY32) -> BOOL;
+    pub fn Module32FirstW(hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL;
+    pub fn Module32Next(hSnapshot: HANDLE, lpme: LPMODULEENTRY32) -> BOOL;
+    pub fn Module32NextW(hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL;
+    pub fn MoveFileA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR) -> BOOL;
+    pub fn MoveFileExA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, dwFlags: DWORD) -> BOOL;
+    pub fn MoveFileExW(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, dwFlags: DWORD) -> BOOL;
+    pub fn MoveFileTransactedA(
+        lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, dwFlags: DWORD, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn MoveFileTransactedW(
+        lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, dwFlags: DWORD, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn MoveFileW(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR) -> BOOL;
+    pub fn MoveFileWithProgressA(
+        lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn MoveFileWithProgressW(
+        lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, lpProgressRoutine: LPPROGRESS_ROUTINE,
+        lpData: LPVOID, dwFlags: DWORD,
+    ) -> BOOL;
+    pub fn MulDiv(nNumber: c_int, nNumerator: c_int, nDenominator: c_int) -> c_int;
+    pub fn MultiByteToWideChar(
+        CodePage: UINT, dwFlags: DWORD, lpMultiByteStr: LPCCH, cbMultiByte: c_int,
+        lpWideCharStr: LPWSTR, cchWideChar: c_int,
+    ) -> c_int;
+    pub fn NeedCurrentDirectoryForExePathA(ExeName: LPCSTR) -> BOOL;
+    pub fn NeedCurrentDirectoryForExePathW(ExeName: LPCWSTR) -> BOOL;
+    pub fn NormalizeString(
+        NormForm: NORM_FORM, lpSrcString: LPCWSTR, cwSrcLength: c_int, lpDstString: LPWSTR,
+        cwDstLength: c_int,
+    ) -> c_int;
+    // pub fn NotifyMountMgr();
+    pub fn NotifyUILanguageChange(
+        dwFlags: DWORD, pcwstrNewLanguage: PCWSTR, pcwstrPreviousLanguage: PCWSTR,
+        dwReserved: DWORD, pdwStatusRtrn: PDWORD,
+    ) -> BOOL;
+    // pub fn OOBEComplete();
+    pub fn OpenEventA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE;
+    pub fn OpenEventW(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE;
+    pub fn OpenFile(lpFileName: LPCSTR, lpReOpenBuff: LPOFSTRUCT, uStyle: UINT) -> HFILE;
+    pub fn OpenFileById(
+        hVolumeHint: HANDLE, lpFileId: LPFILE_ID_DESCRIPTOR, dwDesiredAccess: DWORD,
+        dwShareMode: DWORD, lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
+        dwFlagsAndAttributes: DWORD,
+    ) -> HANDLE;
+    pub fn OpenFileMappingA(
+        dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCSTR,
+    ) -> HANDLE;
+    pub fn OpenFileMappingW(
+        dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR,
+    ) -> HANDLE;
+    pub fn OpenJobObjectA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE;
+    pub fn OpenJobObjectW(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE;
+    pub fn OpenMutexA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE;
+    pub fn OpenMutexW(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE;
+    // pub fn OpenPackageInfoByFullName();
+    pub fn OpenPrivateNamespaceA(lpBoundaryDescriptor: LPVOID, lpAliasPrefix: LPCSTR) -> HANDLE;
+    pub fn OpenPrivateNamespaceW(lpBoundaryDescriptor: LPVOID, lpAliasPrefix: LPCWSTR) -> HANDLE;
+    pub fn OpenProcess(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE;
+    pub fn OpenSemaphoreA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE;
+    pub fn OpenSemaphoreW(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE;
+    // pub fn OpenState();
+    // pub fn OpenStateExplicit();
+    pub fn OpenThread(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD) -> HANDLE;
+    pub fn OpenWaitableTimerA(
+        dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpTimerName: LPCSTR,
+    ) -> HANDLE;
+    pub fn OpenWaitableTimerW(
+        dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpTimerName: LPCWSTR,
+    ) -> HANDLE;
+    pub fn OutputDebugStringA(lpOutputString: LPCSTR);
+    pub fn OutputDebugStringW(lpOutputString: LPCWSTR);
+    // pub fn PackageFamilyNameFromFullName();
+    // pub fn PackageFamilyNameFromId();
+    // pub fn PackageFullNameFromId();
+    // pub fn PackageIdFromFullName();
+    // pub fn PackageNameAndPublisherIdFromFamilyName();
+    // pub fn ParseApplicationUserModelId();
+    pub fn PeekConsoleInputA(
+        hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD,
+        lpNumberOfEventsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn PeekConsoleInputW(
+        hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD,
+        lpNumberOfEventsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn PeekNamedPipe(
+        hNamedPipe: HANDLE, lpBuffer: LPVOID, nBufferSize: DWORD, lpBytesRead: LPDWORD,
+        lpTotalBytesAvail: LPDWORD, lpBytesLeftThisMessage: LPDWORD,
+    ) -> BOOL;
+    pub fn PostQueuedCompletionStatus(
+        CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: ULONG_PTR,
+        lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn PowerClearRequest(PowerRequest: HANDLE, RequestType: POWER_REQUEST_TYPE) -> BOOL;
+    pub fn PowerCreateRequest(Context: PREASON_CONTEXT) -> HANDLE;
+    pub fn PowerSetRequest(PowerRequest: HANDLE, RequestType: POWER_REQUEST_TYPE) -> BOOL;
+    pub fn PrefetchVirtualMemory(
+        hProcess: HANDLE, NumberOfEntries: ULONG_PTR, VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY,
+        Flags: ULONG,
+    ) -> BOOL;
+    pub fn PrepareTape(hDevice: HANDLE, dwOperation: DWORD, bImmediate: BOOL) -> DWORD;
+    pub fn Process32First(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32) -> BOOL;
+    pub fn Process32FirstW(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL;
+    pub fn Process32Next(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32) -> BOOL;
+    pub fn Process32NextW(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL;
+    pub fn ProcessIdToSessionId(dwProcessId: DWORD, pSessionId: *mut DWORD) -> BOOL;
+    pub fn PssCaptureSnapshot(
+        ProcessHandle: HANDLE, CaptureFlags: PSS_CAPTURE_FLAGS, ThreadContextFlags: DWORD,
+        SnapshotHandle: *mut HPSS,
+    ) -> DWORD;
+    pub fn PssDuplicateSnapshot(
+        SourceProcessHandle: HANDLE, SnapshotHandle: HPSS, TargetProcessHandle: HANDLE,
+        TargetSnapshotHandle: *mut HPSS, Flags: PSS_DUPLICATE_FLAGS,
+    ) -> DWORD;
+    pub fn PssFreeSnapshot(ProcessHandle: HANDLE, SnapshotHandle: HPSS) -> DWORD;
+    pub fn PssQuerySnapshot(
+        SnapshotHandle: HPSS, InformationClass: PSS_QUERY_INFORMATION_CLASS, Buffer: *mut c_void,
+        BufferLength: DWORD,
+    ) -> DWORD;
+    pub fn PssWalkMarkerCreate(
+        Allocator: *const PSS_ALLOCATOR, WalkMarkerHandle: *mut HPSSWALK,
+    ) -> DWORD;
+    pub fn PssWalkMarkerFree(WalkMarkerHandle: HPSSWALK) -> DWORD;
+    pub fn PssWalkMarkerGetPosition(WalkMarkerHandle: HPSSWALK, Position: *mut ULONG_PTR) -> DWORD;
+    // pub fn PssWalkMarkerRewind();
+    // pub fn PssWalkMarkerSeek();
+    pub fn PssWalkMarkerSeekToBeginning(WalkMarkerHandle: HPSSWALK) -> DWORD;
+    pub fn PssWalkMarkerSetPosition(WalkMarkerHandle: HPSSWALK, Position: ULONG_PTR) -> DWORD;
+    // pub fn PssWalkMarkerTell();
+    pub fn PssWalkSnapshot(
+        SnapshotHandle: HPSS, InformationClass: PSS_WALK_INFORMATION_CLASS,
+        WalkMarkerHandle: HPSSWALK, Buffer: *mut c_void, BufferLength: DWORD,
+    ) -> DWORD;
+    pub fn PulseEvent(hEvent: HANDLE) -> BOOL;
+    pub fn PurgeComm(hFile: HANDLE, dwFlags: DWORD) -> BOOL;
+    pub fn QueryActCtxSettingsW(
+        dwFlags: DWORD, hActCtx: HANDLE, settingsNameSpace: PCWSTR, settingName: PCWSTR,
+        pvBuffer: PWSTR, dwBuffer: SIZE_T, pdwWrittenOrRequired: *mut SIZE_T,
+    ) -> BOOL;
+    pub fn QueryActCtxW(
+        dwFlags: DWORD, hActCtx: HANDLE, pvSubInstance: PVOID, ulInfoClass: ULONG, pvBuffer: PVOID,
+        cbBuffer: SIZE_T, pcbWrittenOrRequired: *mut SIZE_T,
+    ) -> BOOL;
+    pub fn QueryDepthSList(ListHead: PSLIST_HEADER) -> USHORT;
+    pub fn QueryDosDeviceA(lpDeviceName: LPCSTR, lpTargetPath: LPSTR, ucchMax: DWORD) -> DWORD;
+    pub fn QueryDosDeviceW(lpDeviceName: LPCWSTR, lpTargetPath: LPWSTR, ucchMax: DWORD) -> DWORD;
+    pub fn QueryFullProcessImageNameA(
+        hProcess: HANDLE, dwFlags: DWORD, lpExeName: LPSTR, lpdwSize: PDWORD,
+    ) -> BOOL;
+    pub fn QueryFullProcessImageNameW(
+        hProcess: HANDLE, dwFlags: DWORD, lpExeName: LPWSTR, lpdwSize: PDWORD,
+    ) -> BOOL;
+    pub fn QueryIdleProcessorCycleTime(
+        BufferLength: PULONG, ProcessorIdleCycleTime: PULONG64,
+    ) -> BOOL;
+    pub fn QueryIdleProcessorCycleTimeEx(
+        Group: USHORT, BufferLength: PULONG, ProcessorIdleCycleTime: PULONG64,
+    ) -> BOOL;
+    pub fn QueryInformationJobObject(
+        hJob: HANDLE, JobObjectInformationClass: JOBOBJECTINFOCLASS,
+        lpJobObjectInformation: LPVOID, cbJobObjectInformationLength: DWORD,
+        lpReturnLength: LPDWORD,
+    ) -> BOOL;
+    pub fn QueryMemoryResourceNotification(
+        ResourceNotificationHandle: HANDLE, ResourceState: PBOOL,
+    ) -> BOOL;
+    pub fn QueryPerformanceCounter(lpPerformanceCount: *mut LARGE_INTEGER) -> BOOL;
+    pub fn QueryPerformanceFrequency(lpFrequency: *mut LARGE_INTEGER) -> BOOL;
+    pub fn QueryProcessAffinityUpdateMode(hProcess: HANDLE, lpdwFlags: LPDWORD) -> BOOL;
+    pub fn QueryProcessCycleTime(ProcessHandle: HANDLE, CycleTime: PULONG64) -> BOOL;
+    pub fn QueryProtectedPolicy(PolicyGuid: LPCGUID, PolicyValue: PULONG_PTR) -> BOOL;
+    pub fn QueryThreadCycleTime(ThreadHandle: HANDLE, CycleTime: PULONG64) -> BOOL;
+    pub fn QueryThreadProfiling(ThreadHandle: HANDLE, Enabled: PBOOLEAN) -> DWORD;
+    pub fn QueryThreadpoolStackInformation(
+        ptpp: PTP_POOL, ptpsi: PTP_POOL_STACK_INFORMATION,
+    ) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn QueryUmsThreadInformation(
+        UmsThread: PUMS_CONTEXT, UmsThreadInfoClass: UMS_THREAD_INFO_CLASS,
+        UmsThreadInformation: PVOID, UmsThreadInformationLength: ULONG, ReturnLength: PULONG,
+    );
+    pub fn QueryUnbiasedInterruptTime(UnbiasedTime: PULONGLONG) -> BOOL;
+    pub fn QueueUserAPC(pfnAPC: PAPCFUNC, hThread: HANDLE, dwData: ULONG_PTR) -> DWORD;
+    pub fn QueueUserWorkItem(
+        Function: LPTHREAD_START_ROUTINE, Context: PVOID, Flags: ULONG,
+    ) -> BOOL;
+    pub fn RaiseException(
+        dwExceptionCode: DWORD, dwExceptionFlags: DWORD, nNumberOfArguments: DWORD,
+        lpArguments: *const ULONG_PTR,
+    );
+    pub fn RaiseFailFastException(
+        pExceptionRecord: PEXCEPTION_RECORD, pContextRecord: PCONTEXT, dwFlags: DWORD,
+    );
+    pub fn ReOpenFile(
+        hOriginalFile: HANDLE, dwDesiredAccess: DWORD, dwShareMode: DWORD, dwFlags: DWORD,
+    ) -> HANDLE;
+    pub fn ReadConsoleA(
+        hConsoleInput: HANDLE, lpBuffer: LPVOID, nNumberOfCharsToRead: DWORD,
+        lpNumberOfCharsRead: LPDWORD, pInputControl: PCONSOLE_READCONSOLE_CONTROL,
+    ) -> BOOL;
+    pub fn ReadConsoleInputA(
+        hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD,
+        lpNumberOfEventsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn ReadConsoleInputW(
+        hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD,
+        lpNumberOfEventsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn ReadConsoleOutputA(
+        hConsoleOutput: HANDLE, lpBuffer: PCHAR_INFO, dwBufferSize: COORD, dwBufferCoord: COORD,
+        lpReadRegion: PSMALL_RECT,
+    ) -> BOOL;
+    pub fn ReadConsoleOutputAttribute(
+        hConsoleOutput: HANDLE, lpAttribute: LPWORD, nLength: DWORD, dwReadCoord: COORD,
+        lpNumberOfAttrsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn ReadConsoleOutputCharacterA(
+        hConsoleOutput: HANDLE, lpCharacter: LPSTR, nLength: DWORD, dwReadCoord: COORD,
+        lpNumberOfCharsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn ReadConsoleOutputCharacterW(
+        hConsoleOutput: HANDLE, lpCharacter: LPWSTR, nLength: DWORD, dwReadCoord: COORD,
+        lpNumberOfCharsRead: LPDWORD,
+    ) -> BOOL;
+    pub fn ReadConsoleOutputW(
+        hConsoleOutput: HANDLE, lpBuffer: PCHAR_INFO, dwBufferSize: COORD, dwBufferCoord: COORD,
+        lpReadRegion: PSMALL_RECT,
+    ) -> BOOL;
+    pub fn ReadConsoleW(
+        hConsoleInput: HANDLE, lpBuffer: LPVOID, nNumberOfCharsToRead: DWORD,
+        lpNumberOfCharsRead: LPDWORD, pInputControl: PCONSOLE_READCONSOLE_CONTROL,
+    ) -> BOOL;
+    pub fn ReadDirectoryChangesW(
+        hDirectory: HANDLE, lpBuffer: LPVOID, nBufferLength: DWORD, bWatchSubtree: BOOL,
+        dwNotifyFilter: DWORD, lpBytesReturned: LPDWORD, lpOverlapped: LPOVERLAPPED,
+        lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
+    ) -> BOOL;
+    pub fn ReadFile(
+        hFile: HANDLE, lpBuffer: LPVOID, nNumberOfBytesToRead: DWORD, lpNumberOfBytesRead: LPDWORD,
+        lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn ReadFileEx(
+        hFile: HANDLE, lpBuffer: LPVOID, nNumberOfBytesToRead: DWORD, lpOverlapped: LPOVERLAPPED,
+        lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
+    ) -> BOOL;
+    pub fn ReadFileScatter(
+        hFile: HANDLE, aSegmentArray: *mut FILE_SEGMENT_ELEMENT, nNumberOfBytesToRead: DWORD,
+        lpReserved: LPDWORD, lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn ReadProcessMemory(
+        hProcess: HANDLE, lpBaseAddress: LPCVOID, lpBuffer: LPVOID, nSize: SIZE_T,
+        lpNumberOfBytesRead: *mut SIZE_T,
+    ) -> BOOL;
+    pub fn ReadThreadProfilingData(
+        PerformanceDataHandle: HANDLE, Flags: DWORD, PerformanceData: PPERFORMANCE_DATA,
+    ) -> DWORD;
+    pub fn RegisterApplicationRecoveryCallback(
+        pRecoveyCallback: APPLICATION_RECOVERY_CALLBACK, pvParameter: PVOID, dwPingInterval: DWORD,
+        dwFlags: DWORD,
+    ) -> HRESULT;
+    pub fn RegisterApplicationRestart(pwzCommandline: PCWSTR, dwFlags: DWORD) -> HRESULT;
+    pub fn RegisterBadMemoryNotification(Callback: PBAD_MEMORY_CALLBACK_ROUTINE) -> PVOID;
+    // pub fn RegisterWaitForInputIdle();
+    pub fn RegisterWaitForSingleObject(
+        phNewWaitObject: PHANDLE, hObject: HANDLE, Callback: WAITORTIMERCALLBACK, Context: PVOID,
+        dwMilliseconds: ULONG, dwFlags: ULONG,
+    ) -> BOOL;
+    pub fn RegisterWaitForSingleObjectEx(
+        hObject: HANDLE, Callback: WAITORTIMERCALLBACK, Context: PVOID, dwMilliseconds: ULONG,
+        dwFlags: ULONG,
+    ) -> HANDLE;
+    // pub fn RegisterWaitUntilOOBECompleted();
+    pub fn ReleaseActCtx(hActCtx: HANDLE);
+    pub fn ReleaseMutex(hMutex: HANDLE) -> BOOL;
+    pub fn ReleaseMutexWhenCallbackReturns(pci: PTP_CALLBACK_INSTANCE, mutex: HANDLE);
+    pub fn ReleaseSRWLockExclusive(SRWLock: PSRWLOCK);
+    pub fn ReleaseSRWLockShared(SRWLock: PSRWLOCK);
+    pub fn ReleaseSemaphore(
+        hSemaphore: HANDLE, lReleaseCount: LONG, lpPreviousCount: LPLONG,
+    ) -> BOOL;
+    pub fn ReleaseSemaphoreWhenCallbackReturns(
+        pci: PTP_CALLBACK_INSTANCE, sem: HANDLE, crel: DWORD,
+    );
+    pub fn RemoveDirectoryA(lpPathName: LPCSTR) -> BOOL;
+    pub fn RemoveDirectoryTransactedA(lpPathName: LPCSTR, hTransaction: HANDLE) -> BOOL;
+    pub fn RemoveDirectoryTransactedW(lpPathName: LPCWSTR, hTransaction: HANDLE) -> BOOL;
+    pub fn RemoveDirectoryW(lpPathName: LPCWSTR) -> BOOL;
+    pub fn RemoveDllDirectory(Cookie: DLL_DIRECTORY_COOKIE) -> BOOL;
+    // pub fn RemoveLocalAlternateComputerNameA();
+    // pub fn RemoveLocalAlternateComputerNameW();
+    pub fn RemoveSecureMemoryCacheCallback(pfnCallBack: PSECURE_MEMORY_CACHE_CALLBACK) -> BOOL;
+    pub fn RemoveVectoredContinueHandler(Handle: PVOID) -> ULONG;
+    pub fn RemoveVectoredExceptionHandler(Handle: PVOID) -> ULONG;
+    pub fn ReplaceFileA(
+        lpReplacedFileName: LPCSTR, lpReplacementFileName: LPCSTR, lpBackupFileName: LPCSTR,
+        dwReplaceFlags: DWORD, lpExclude: LPVOID, lpReserved: LPVOID,
+    );
+    pub fn ReplaceFileW(
+        lpReplacedFileName: LPCWSTR, lpReplacementFileName: LPCWSTR, lpBackupFileName: LPCWSTR,
+        dwReplaceFlags: DWORD, lpExclude: LPVOID, lpReserved: LPVOID,
+    );
+    pub fn ReplacePartitionUnit(
+        TargetPartition: PWSTR, SparePartition: PWSTR, Flags: ULONG,
+    ) -> BOOL;
+    pub fn RequestDeviceWakeup(hDevice: HANDLE) -> BOOL;
+    pub fn RequestWakeupLatency(latency: LATENCY_TIME) -> BOOL;
+    pub fn ResetEvent(hEvent: HANDLE) -> BOOL;
+    pub fn ResetWriteWatch(lpBaseAddress: LPVOID, dwRegionSize: SIZE_T) -> UINT;
+    // pub fn ResolveDelayLoadedAPI();
+    // pub fn ResolveDelayLoadsFromDll();
+    pub fn ResolveLocaleName(
+        lpNameToResolve: LPCWSTR, lpLocaleName: LPWSTR, cchLocaleName: c_int,
+    ) -> c_int;
+    pub fn RestoreLastError(dwErrCode: DWORD);
+    pub fn ResumeThread(hThread: HANDLE) -> DWORD;
+    #[cfg(target_arch = "arm")]
+    pub fn RtlAddFunctionTable(
+        FunctionTable: PRUNTIME_FUNCTION, EntryCount: DWORD, BaseAddress: DWORD,
+    ) -> BOOLEAN;
+    #[cfg(target_arch = "x86_64")]
+    pub fn RtlAddFunctionTable(
+        FunctionTable: PRUNTIME_FUNCTION, EntryCount: DWORD, BaseAddress: DWORD64,
+    ) -> BOOLEAN;
+    pub fn RtlCaptureContext(ContextRecord: PCONTEXT);
+    pub fn RtlCaptureStackBackTrace(
+        FramesToSkip: DWORD, FramesToCapture: DWORD, BackTrace: *mut PVOID, BackTraceHash: PDWORD,
+    ) -> WORD;
+    // #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn RtlCompareMemory(Source1: *const VOID, Source2: *const VOID, Length: SIZE_T) -> SIZE_T;
+    // #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn RtlCopyMemory(Destination: PVOID, Source: *const VOID, Length: SIZE_T);
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn RtlDeleteFunctionTable(FunctionTable: PRUNTIME_FUNCTION) -> BOOLEAN;
+    // pub fn RtlFillMemory();
+    #[cfg(target_arch = "arm")]
+    pub fn RtlInstallFunctionTableCallback(
+        TableIdentifier: DWORD, BaseAddress: DWORD, Length: DWORD,
+        Callback: PGET_RUNTIME_FUNCTION_CALLBACK, Context: PVOID, OutOfProcessCallbackDll: PCWSTR,
+    ) -> BOOLEAN;
+    #[cfg(target_arch = "x86_64")]
+    pub fn RtlInstallFunctionTableCallback(
+        TableIdentifier: DWORD64, BaseAddress: DWORD64, Length: DWORD,
+        Callback: PGET_RUNTIME_FUNCTION_CALLBACK, Context: PVOID, OutOfProcessCallbackDll: PCWSTR,
+    ) -> BOOLEAN;
+    #[cfg(target_arch = "arm")]
+    pub fn RtlLookupFunctionEntry(
+        ControlPc: ULONG_PTR, ImageBase: PDWORD, HistoryTable: PUNWIND_HISTORY_TABLE,
+    ) -> PRUNTIME_FUNCTION;
+    #[cfg(target_arch = "x86_64")]
+    pub fn RtlLookupFunctionEntry(
+        ControlPc: DWORD64, ImageBase: PDWORD64, HistoryTable: PUNWIND_HISTORY_TABLE,
+    ) -> PRUNTIME_FUNCTION;
+    // pub fn RtlMoveMemory();
+    // #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn RtlPcToFileHeader(PcValue: PVOID, BaseOfImage: *mut PVOID) -> PVOID;
+    // #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    // pub fn RtlRaiseException();
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn RtlRestoreContext(ContextRecord: PCONTEXT, ExceptionRecord: *mut EXCEPTION_RECORD);
+    pub fn RtlUnwind(
+        TargetFrame: PVOID, TargetIp: PVOID, ExceptionRecord: PEXCEPTION_RECORD, ReturnValue: PVOID,
+    );
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn RtlUnwindEx(
+        TargetFrame: PVOID, TargetIp: PVOID, ExceptionRecord: PEXCEPTION_RECORD, ReturnValue: PVOID,
+        ContextRecord: PCONTEXT, HistoryTable: PUNWIND_HISTORY_TABLE,
+    );
+    #[cfg(target_arch = "arm")]
+    pub fn RtlVirtualUnwind(
+        HandlerType: DWORD, ImageBase: DWORD, ControlPc: DWORD, FunctionEntry: PRUNTIME_FUNCTION,
+        ContextRecord: PCONTEXT, HandlerData: *mut PVOID, EstablisherFrame: PDWORD,
+        ContextPointers: PKNONVOLATILE_CONTEXT_POINTERS,
+    ) -> PEXCEPTION_ROUTINE;
+    #[cfg(target_arch = "x86_64")]
+    pub fn RtlVirtualUnwind(
+        HandlerType: DWORD, ImageBase: DWORD64, ControlPc: DWORD64,
+        FunctionEntry: PRUNTIME_FUNCTION, ContextRecord: PCONTEXT, HandlerData: *mut PVOID,
+        EstablisherFrame: PDWORD64, ContextPointers: PKNONVOLATILE_CONTEXT_POINTERS,
+    ) -> PEXCEPTION_ROUTINE;
+    // pub fn RtlZeroMemory();
+    pub fn ScrollConsoleScreenBufferA(
+        hConsoleOutput: HANDLE, lpScrollRectangle: *const SMALL_RECT,
+        lpClipRectangle: *const SMALL_RECT, dwDestinationOrigin: COORD, lpFill: *const CHAR_INFO,
+    ) -> BOOL;
+    pub fn ScrollConsoleScreenBufferW(
+        hConsoleOutput: HANDLE, lpScrollRectangle: *const SMALL_RECT,
+        lpClipRectangle: *const SMALL_RECT, dwDestinationOrigin: COORD, lpFill: *const CHAR_INFO,
+    ) -> BOOL;
+    pub fn SearchPathA(
+        lpPath: LPCSTR, lpFileName: LPCSTR, lpExtension: LPCSTR, nBufferLength: DWORD,
+        lpBuffer: LPSTR, lpFilePart: *mut LPSTR,
+    ) -> DWORD;
+    pub fn SearchPathW(
+        lpPath: LPCWSTR, lpFileName: LPCWSTR, lpExtension: LPCWSTR, nBufferLength: DWORD,
+        lpBuffer: LPWSTR, lpFilePart: *mut LPWSTR,
+    ) -> DWORD;
+    pub fn SetCachedSigningLevel(
+        SourceFiles: PHANDLE, SourceFileCount: ULONG, Flags: ULONG, TargetFile: HANDLE,
+    ) -> BOOL;
+    pub fn SetCalendarInfoA(
+        Locale: LCID, Calendar: CALID, CalType: CALTYPE, lpCalData: LPCSTR,
+    ) -> BOOL;
+    pub fn SetCalendarInfoW(
+        Locale: LCID, Calendar: CALID, CalType: CALTYPE, lpCalData: LPCWSTR,
+    ) -> BOOL;
+    pub fn SetCommBreak(hFile: HANDLE) -> BOOL;
+    pub fn SetCommConfig(hCommDev: HANDLE, lpCC: LPCOMMCONFIG, dwSize: DWORD) -> BOOL;
+    pub fn SetCommMask(hFile: HANDLE, dwEvtMask: DWORD) -> BOOL;
+    pub fn SetCommState(hFile: HANDLE, lpDCB: LPDCB) -> BOOL;
+    pub fn SetCommTimeouts(hFile: HANDLE, lpCommTimeouts: LPCOMMTIMEOUTS) -> BOOL;
+    pub fn SetComputerNameA(lpComputerName: LPCSTR) -> BOOL;
+    pub fn SetComputerNameEx2W(
+        NameType: COMPUTER_NAME_FORMAT, Flags: DWORD, lpBuffer: LPCWSTR,
+    ) -> BOOL;
+    pub fn SetComputerNameExA(NameType: COMPUTER_NAME_FORMAT, lpBuffer: LPCSTR) -> BOOL;
+    pub fn SetComputerNameExW(NameType: COMPUTER_NAME_FORMAT, lpBuffer: LPCWSTR) -> BOOL;
+    pub fn SetComputerNameW(lpComputerName: LPCWSTR) -> BOOL;
+    pub fn SetConsoleActiveScreenBuffer(hConsoleOutput: HANDLE) -> BOOL;
+    pub fn SetConsoleCP(wCodePageID: UINT) -> BOOL;
+    pub fn SetConsoleCtrlHandler(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL;
+    // pub fn SetConsoleCursor();
+    pub fn SetConsoleCursorInfo(
+        hConsoleOutput: HANDLE, lpConsoleCursorInfo: *const CONSOLE_CURSOR_INFO,
+    ) -> BOOL;
+    pub fn SetConsoleCursorPosition(hConsoleOutput: HANDLE, dwCursorPosition: COORD) -> BOOL;
+    pub fn SetConsoleDisplayMode(
+        hConsoleOutput: HANDLE, dwFlags: DWORD, lpNewScreenBufferDimensions: PCOORD,
+    ) -> BOOL;
+    pub fn SetConsoleHistoryInfo(lpConsoleHistoryInfo: PCONSOLE_HISTORY_INFO) -> BOOL;
+    pub fn SetConsoleMode(hConsoleHandle: HANDLE, dwMode: DWORD) -> BOOL;
+    pub fn SetConsoleOutputCP(wCodePageID: UINT) -> BOOL;
+    pub fn SetConsoleScreenBufferInfoEx(
+        hConsoleOutput: HANDLE, lpConsoleScreenBufferInfoEx: PCONSOLE_SCREEN_BUFFER_INFOEX,
+    ) -> BOOL;
+    pub fn SetConsoleScreenBufferSize(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL;
+    pub fn SetConsoleTextAttribute(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL;
+    pub fn SetConsoleTitleA(lpConsoleTitle: LPCSTR) -> BOOL;
+    pub fn SetConsoleTitleW(lpConsoleTitle: LPCWSTR) -> BOOL;
+    pub fn SetConsoleWindowInfo(
+        hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: *const SMALL_RECT,
+    ) -> BOOL;
+    pub fn SetCriticalSectionSpinCount(
+        lpCriticalSection: LPCRITICAL_SECTION, dwSpinCount: DWORD,
+    ) -> DWORD;
+    pub fn SetCurrentConsoleFontEx(
+        hConsoleOutput: HANDLE, bMaximumWindow: BOOL, lpConsoleCurrentFontEx: PCONSOLE_FONT_INFOEX,
+    ) -> BOOL;
+    pub fn SetCurrentDirectoryA(lpPathName: LPCSTR) -> BOOL;
+    pub fn SetCurrentDirectoryW(lpPathName: LPCWSTR) -> BOOL;
+    pub fn SetDefaultCommConfigA(lpszName: LPCSTR, lpCC: LPCOMMCONFIG, dwSize: DWORD) -> BOOL;
+    pub fn SetDefaultCommConfigW(lpszName: LPCWSTR, lpCC: LPCOMMCONFIG, dwSize: DWORD) -> BOOL;
+    pub fn SetDefaultDllDirectories(DirectoryFlags: DWORD) -> BOOL;
+    pub fn SetDllDirectoryA(lpPathName: LPCSTR) -> BOOL;
+    pub fn SetDllDirectoryW(lpPathName: LPCWSTR) -> BOOL;
+    pub fn SetDynamicTimeZoneInformation(
+        lpTimeZoneInformation: *const DYNAMIC_TIME_ZONE_INFORMATION,
+    ) -> BOOL;
+    pub fn SetEndOfFile(hFile: HANDLE) -> BOOL;
+    pub fn SetEnvironmentStringsA(NewEnvironment: LPCH) -> BOOL;
+    pub fn SetEnvironmentStringsW(NewEnvironment: LPWCH) -> BOOL;
+    pub fn SetEnvironmentVariableA(lpName: LPCSTR, lpValue: LPCSTR) -> BOOL;
+    pub fn SetEnvironmentVariableW(lpName: LPCWSTR, lpValue: LPCWSTR) -> BOOL;
+    pub fn SetErrorMode(uMode: UINT) -> UINT;
+    pub fn SetEvent(hEvent: HANDLE) -> BOOL;
+    pub fn SetEventWhenCallbackReturns(pci: PTP_CALLBACK_INSTANCE, evt: HANDLE);
+    pub fn SetFileApisToANSI();
+    pub fn SetFileApisToOEM();
+    pub fn SetFileAttributesA(lpFileName: LPCSTR, dwFileAttributes: DWORD) -> BOOL;
+    pub fn SetFileAttributesTransactedA(
+        lpFileName: LPCSTR, dwFileAttributes: DWORD, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn SetFileAttributesTransactedW(
+        lpFileName: LPCWSTR, dwFileAttributes: DWORD, hTransaction: HANDLE,
+    ) -> BOOL;
+    pub fn SetFileAttributesW(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL;
+    pub fn SetFileBandwidthReservation(
+        hFile: HANDLE, nPeriodMilliseconds: DWORD, nBytesPerPeriod: DWORD, bDiscardable: BOOL,
+        lpTransferSize: LPDWORD, lpNumOutstandingRequests: LPDWORD,
+    ) -> BOOL;
+    pub fn SetFileCompletionNotificationModes(FileHandle: HANDLE, Flags: UCHAR) -> BOOL;
+    pub fn SetFileInformationByHandle(
+        hFile: HANDLE, FileInformationClass: FILE_INFO_BY_HANDLE_CLASS, lpFileInformation: LPVOID,
+        dwBufferSize: DWORD,
+    ) -> BOOL;
+    pub fn SetFileIoOverlappedRange(
+        FileHandle: HANDLE, OverlappedRangeStart: PUCHAR, Length: ULONG,
+    ) -> BOOL;
+    pub fn SetFilePointer(
+        hFile: HANDLE, lDistanceToMove: LONG, lpDistanceToMoveHigh: PLONG, dwMoveMethod: DWORD,
+    ) -> DWORD;
+    pub fn SetFilePointerEx(
+        hFile: HANDLE, liDistanceToMove: LARGE_INTEGER, lpNewFilePointer: PLARGE_INTEGER,
+        dwMoveMethod: DWORD,
+    ) -> BOOL;
+    pub fn SetFileShortNameA(hFile: HANDLE, lpShortName: LPCSTR) -> BOOL;
+    pub fn SetFileShortNameW(hFile: HANDLE, lpShortName: LPCWSTR) -> BOOL;
+    pub fn SetFileTime(
+        hFile: HANDLE, lpCreationTime: *const FILETIME, lpLastAccessTime: *const FILETIME,
+        lpLastWriteTime: *const FILETIME,
+    ) -> BOOL;
+    pub fn SetFileValidData(hFile: HANDLE, ValidDataLength: LONGLONG) -> BOOL;
+    pub fn SetFirmwareEnvironmentVariableA(
+        lpName: LPCSTR, lpGuid: LPCSTR, pValue: PVOID, nSize: DWORD,
+    ) -> BOOL;
+    pub fn SetFirmwareEnvironmentVariableExA(
+        lpName: LPCSTR, lpGuid: LPCSTR, pValue: PVOID, nSize: DWORD, dwAttributes: DWORD,
+    ) -> BOOL;
+    pub fn SetFirmwareEnvironmentVariableExW(
+        lpName: LPCWSTR, lpGuid: LPCWSTR, pValue: PVOID, nSize: DWORD, dwAttributes: DWORD,
+    ) -> BOOL;
+    pub fn SetFirmwareEnvironmentVariableW(
+        lpName: LPCWSTR, lpGuid: LPCWSTR, pValue: PVOID, nSize: DWORD,
+    ) -> BOOL;
+    pub fn SetHandleCount(uNumber: UINT) -> UINT;
+    pub fn SetHandleInformation(hObject: HANDLE, dwMask: DWORD, dwFlags: DWORD) -> BOOL;
+    pub fn SetInformationJobObject(
+        hJob: HANDLE, JobObjectInformationClass: JOBOBJECTINFOCLASS,
+        lpJobObjectInformation: LPVOID, cbJobObjectInformationLength: DWORD,
+    ) -> BOOL;
+    pub fn SetLastError(dwErrCode: DWORD);
+    // pub fn SetLocalPrimaryComputerNameA();
+    // pub fn SetLocalPrimaryComputerNameW();
+    pub fn SetLocalTime(lpSystemTime: *const SYSTEMTIME) -> BOOL;
+    pub fn SetLocaleInfoA(Locale: LCID, LCType: LCTYPE, lpLCData: LPCSTR) -> BOOL;
+    pub fn SetLocaleInfoW(Locale: LCID, LCType: LCTYPE, lpLCData: LPCWSTR) -> BOOL;
+    pub fn SetMailslotInfo(hMailslot: HANDLE, lReadTimeout: DWORD) -> BOOL;
+    pub fn SetMessageWaitingIndicator(hMsgIndicator: HANDLE, ulMsgCount: ULONG) -> BOOL;
+    pub fn SetNamedPipeAttribute(
+        Pipe: HANDLE, AttributeType: PIPE_ATTRIBUTE_TYPE, AttributeName: PSTR,
+        AttributeValue: PVOID, AttributeValueLength: SIZE_T,
+    ) -> BOOL;
+    pub fn SetNamedPipeHandleState(
+        hNamedPipe: HANDLE, lpMode: LPDWORD, lpMaxCollectionCount: LPDWORD,
+        lpCollectDataTimeout: LPDWORD,
+    ) -> BOOL;
+    pub fn SetPriorityClass(hProcess: HANDLE, dwPriorityClass: DWORD);
+    pub fn SetProcessAffinityMask(hProcess: HANDLE, dwProcessAffinityMask: DWORD) -> BOOL;
+    pub fn SetProcessAffinityUpdateMode(hProcess: HANDLE, dwFlags: DWORD) -> BOOL;
+    pub fn SetProcessDEPPolicy(dwFlags: DWORD) -> BOOL;
+    pub fn SetProcessInformation(
+        hProcess: HANDLE, ProcessInformationClass: PROCESS_INFORMATION_CLASS,
+        ProcessInformation: LPVOID, ProcessInformationSize: DWORD,
+    ) -> BOOL;
+    pub fn SetProcessMitigationPolicy(
+        MitigationPolicy: PROCESS_MITIGATION_POLICY, lpBuffer: PVOID, dwLength: SIZE_T,
+    ) -> BOOL;
+    pub fn SetProcessPreferredUILanguages(
+        dwFlags: DWORD, pwszLanguagesBuffer: PCZZWSTR, pulNumLanguages: PULONG,
+    ) -> BOOL;
+    pub fn SetProcessPriorityBoost(hProcess: HANDLE, bDisablePriorityBoost: BOOL) -> BOOL;
+    pub fn SetProcessShutdownParameters(dwLevel: DWORD, dwFlags: DWORD) -> BOOL;
+    pub fn SetProcessWorkingSetSize(
+        hProcess: HANDLE, dwMinimumWorkingSetSize: SIZE_T, dwMaximumWorkingSetSize: SIZE_T,
+    ) -> BOOL;
+    pub fn SetProcessWorkingSetSizeEx(
+        hProcess: HANDLE, dwMinimumWorkingSetSize: SIZE_T, dwMaximumWorkingSetSize: SIZE_T,
+        Flags: DWORD,
+    ) -> BOOL;
+    pub fn SetProtectedPolicy(
+        PolicyGuid: LPCGUID, PolicyValue: ULONG_PTR, OldPolicyValue: PULONG_PTR,
+    ) -> BOOL;
+    pub fn SetSearchPathMode(Flags: DWORD) -> BOOL;
+    pub fn SetStdHandle(nStdHandle: DWORD, hHandle: HANDLE) -> BOOL;
+    pub fn SetStdHandleEx(nStdHandle: DWORD, hHandle: HANDLE, phPrevValue: PHANDLE) -> BOOL;
+    pub fn SetSystemFileCacheSize(
+        MinimumFileCacheSize: SIZE_T, MaximumFileCacheSize: SIZE_T, Flags: DWORD,
+    ) -> BOOL;
+    pub fn SetSystemPowerState(fSuspend: BOOL, fForce: BOOL) -> BOOL;
+    pub fn SetSystemTime(lpSystemTime: *const SYSTEMTIME) -> BOOL;
+    pub fn SetSystemTimeAdjustment(dwTimeAdjustment: DWORD, bTimeAdjustmentDisabled: BOOL) -> BOOL;
+    pub fn SetTapeParameters(
+        hDevice: HANDLE, dwOperation: DWORD, lpTapeInformation: LPVOID,
+    ) -> DWORD;
+    pub fn SetTapePosition(
+        hDevice: HANDLE, dwPositionMethod: DWORD, dwPartition: DWORD, 
+        dwOffsetLow: DWORD, dwOffsetHigh: DWORD, bImmediate: BOOL
+    ) -> DWORD;
+    pub fn SetThreadAffinityMask(hThread: HANDLE, dwThreadAffinityMask: DWORD) -> DWORD_PTR;
+    pub fn SetThreadContext(hThread: HANDLE, lpContext: *const CONTEXT) -> BOOL;
+    pub fn SetThreadErrorMode(dwNewMode: DWORD, lpOldMode: LPDWORD) -> BOOL;
+    pub fn SetThreadExecutionState(esFlags: EXECUTION_STATE) -> EXECUTION_STATE;
+    pub fn SetThreadGroupAffinity(
+        hThread: HANDLE, GroupAffinity: *const GROUP_AFFINITY,
+        PreviousGroupAffinity: PGROUP_AFFINITY,
+    ) -> BOOL;
+    pub fn SetThreadIdealProcessor(hThread: HANDLE, dwIdealProcessor: DWORD) -> DWORD;
+    pub fn SetThreadIdealProcessorEx(
+        hThread: HANDLE, lpIdealProcessor: PPROCESSOR_NUMBER,
+        lpPreviousIdealProcessor: PPROCESSOR_NUMBER,
+    ) -> BOOL;
+    pub fn SetThreadInformation(
+        hThread: HANDLE, ThreadInformationClass: THREAD_INFORMATION_CLASS,
+        ThreadInformation: LPVOID, ThreadInformationSize: DWORD,
+    );
+    pub fn SetThreadLocale(Locale: LCID) -> BOOL;
+    pub fn SetThreadPreferredUILanguages(
+        dwFlags: DWORD, pwszLanguagesBuffer: PCZZWSTR, pulNumLanguages: PULONG,
+    ) -> BOOL;
+    pub fn SetThreadPriority(hThread: HANDLE, nPriority: c_int) -> BOOL;
+    pub fn SetThreadPriorityBoost(hThread: HANDLE, bDisablePriorityBoost: BOOL) -> BOOL;
+    pub fn SetThreadStackGuarantee(StackSizeInBytes: PULONG) -> BOOL;
+    pub fn SetThreadUILanguage(LangId: LANGID) -> LANGID;
+    pub fn SetThreadpoolStackInformation(
+        ptpp: PTP_POOL, ptpsi: PTP_POOL_STACK_INFORMATION,
+    ) -> BOOL;
+    pub fn SetThreadpoolThreadMaximum(ptpp: PTP_POOL, cthrdMost: DWORD);
+    pub fn SetThreadpoolThreadMinimum(ptpp: PTP_POOL, cthrdMic: DWORD);
+    pub fn SetThreadpoolTimer(
+        pti: PTP_TIMER, pftDueTime: PFILETIME, msPeriod: DWORD, msWindowLength: DWORD,
+    );
+    pub fn SetThreadpoolTimerEx(
+        pti: PTP_TIMER, pftDueTime: PFILETIME, msPeriod: DWORD, msWindowLength: DWORD,
+    ) -> BOOL;
+    pub fn SetThreadpoolWait(pwa: PTP_WAIT, h: HANDLE, pftTimeout: PFILETIME);
+    pub fn SetThreadpoolWaitEx(
+        pwa: PTP_WAIT, h: HANDLE, pftTimeout: PFILETIME, Reserved: PVOID,
+    ) -> BOOL;
+    pub fn SetTimeZoneInformation(lpTimeZoneInformation: *const TIME_ZONE_INFORMATION) -> BOOL;
+    pub fn SetTimerQueueTimer(
+        TimerQueue: HANDLE, Callback: WAITORTIMERCALLBACK, Parameter: PVOID, DueTime: DWORD,
+        Period: DWORD, PreferIo: BOOL,
+    ) -> HANDLE;
+    #[cfg(target_arch = "x86_64")]
+    pub fn SetUmsThreadInformation(
+        UmsThread: PUMS_CONTEXT, UmsThreadInfoClass: UMS_THREAD_INFO_CLASS,
+        UmsThreadInformation: PVOID, UmsThreadInformationLength: ULONG,
+    ) -> BOOL;
+    pub fn SetUnhandledExceptionFilter(
+        lpTopLevelExceptionFilter: LPTOP_LEVEL_EXCEPTION_FILTER,
+    ) -> LPTOP_LEVEL_EXCEPTION_FILTER;
+    pub fn SetUserGeoID(GeoId: GEOID) -> BOOL;
+    pub fn SetVolumeLabelA(lpRootPathName: LPCSTR, lpVolumeName: LPCSTR) -> BOOL;
+    pub fn SetVolumeLabelW(lpRootPathName: LPCWSTR, lpVolumeName: LPCWSTR) -> BOOL;
+    pub fn SetVolumeMountPointA(lpszVolumeMountPoint: LPCSTR, lpszVolumeName: LPCSTR) -> BOOL;
+    pub fn SetVolumeMountPointW(lpszVolumeMountPoint: LPCWSTR, lpszVolumeName: LPCWSTR) -> BOOL;
+    pub fn SetWaitableTimer(
+        hTimer: HANDLE, lpDueTime: *const LARGE_INTEGER, lPeriod: LONG,
+        pfnCompletionRoutine: PTIMERAPCROUTINE, lpArgToCompletionRoutine: LPVOID, fResume: BOOL,
+    ) -> BOOL;
+    pub fn SetWaitableTimerEx(
+        hTimer: HANDLE, lpDueTime: *const LARGE_INTEGER, lPeriod: LONG,
+        pfnCompletionRoutine: PTIMERAPCROUTINE, lpArgToCompletionRoutine: LPVOID,
+        WakeContext: PREASON_CONTEXT, TolerableDelay: ULONG,
+    ) -> BOOL;
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    pub fn SetXStateFeaturesMask(Context: PCONTEXT, FeatureMask: DWORD64) -> BOOL;
+    pub fn SetupComm(hFile: HANDLE, dwInQueue: DWORD, dwOutQueue: DWORD) -> BOOL;
+    pub fn SignalObjectAndWait(
+        hObjectToSignal: HANDLE, hObjectToWaitOn: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL,
+    ) -> DWORD;
+    pub fn SizeofResource(hModule: HMODULE, hResInfo: HRSRC) -> DWORD;
+    pub fn Sleep(dwMilliseconds: DWORD);
+    pub fn SleepConditionVariableCS(
+        ConditionVariable: PCONDITION_VARIABLE, CriticalSection: PCRITICAL_SECTION,
+        dwMilliseconds: DWORD,
+    ) -> BOOL;
+    pub fn SleepConditionVariableSRW(
+        ConditionVariable: PCONDITION_VARIABLE, SRWLock: PSRWLOCK, dwMilliseconds: DWORD,
+        Flags: ULONG,
+    ) -> BOOL;
+    pub fn SleepEx(dwMilliseconds: DWORD, bAlertable: BOOL) -> DWORD;
+    pub fn StartThreadpoolIo(pio: PTP_IO);
+    pub fn SubmitThreadpoolWork(pwk: PTP_WORK);
+    pub fn SuspendThread(hThread: HANDLE) -> DWORD;
+    pub fn SwitchToFiber(lpFiber: LPVOID);
+    pub fn SwitchToThread() -> BOOL;
+    pub fn SystemTimeToFileTime(lpSystemTime: *const SYSTEMTIME, lpFileTime: LPFILETIME) -> BOOL;
+    pub fn SystemTimeToTzSpecificLocalTime(
+        lpTimeZoneInformation: *const TIME_ZONE_INFORMATION, lpUniversalTime: *const SYSTEMTIME,
+        lpLocalTime: LPSYSTEMTIME,
+    ) -> BOOL;
+    pub fn SystemTimeToTzSpecificLocalTimeEx(
+        lpTimeZoneInformation: *const DYNAMIC_TIME_ZONE_INFORMATION,
+        lpUniversalTime: *const SYSTEMTIME, lpLocalTime: LPSYSTEMTIME,
+    ) -> BOOL;
+    pub fn TerminateJobObject(hJob: HANDLE, uExitCode: UINT) -> BOOL;
+    pub fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) -> BOOL;
+    pub fn TerminateThread(hThread: HANDLE, dwExitCode: DWORD) -> BOOL;
+    pub fn Thread32First(hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL;
+    pub fn Thread32Next(hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL;
+    pub fn TlsAlloc() -> DWORD;
+    pub fn TlsFree(dwTlsIndex: DWORD) -> BOOL;
+    pub fn TlsGetValue(dwTlsIndex: DWORD) -> LPVOID;
+    pub fn TlsSetValue(dwTlsIndex: DWORD, lpTlsValue: LPVOID) -> BOOL;
+    pub fn Toolhelp32ReadProcessMemory(th32ProcessID: DWORD, lpBaseAddress: LPCVOID,
+        lpBuffer: LPVOID, cbRead: SIZE_T, lpNumberOfBytesRead: *mut SIZE_T
+    ) -> BOOL;
+    pub fn TransactNamedPipe(
+        hNamedPipe: HANDLE, lpInBuffer: LPVOID, nInBufferSize: DWORD, lpOutBuffer: LPVOID,
+        nOutBufferSize: DWORD, lpBytesRead: LPDWORD, lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn TransmitCommChar(hFile: HANDLE, cChar: c_char) -> BOOL;
+    pub fn TryAcquireSRWLockExclusive(SRWLock: PSRWLOCK) -> BOOLEAN;
+    pub fn TryAcquireSRWLockShared(SRWLock: PSRWLOCK) -> BOOLEAN;
+    pub fn TryEnterCriticalSection(lpCriticalSection: LPCRITICAL_SECTION) -> BOOL;
+    pub fn TrySubmitThreadpoolCallback(
+        pfns: PTP_SIMPLE_CALLBACK, pv: PVOID, pcbe: PTP_CALLBACK_ENVIRON,
+    ) -> BOOL;
+    pub fn TzSpecificLocalTimeToSystemTime(
+        lpTimeZoneInformation: *const TIME_ZONE_INFORMATION, lpLocalTime: *const SYSTEMTIME,
+        lpUniversalTime: LPSYSTEMTIME,
+    ) -> BOOL;
+    pub fn TzSpecificLocalTimeToSystemTimeEx(
+        lpTimeZoneInformation: *const DYNAMIC_TIME_ZONE_INFORMATION,
+        lpLocalTime: *const SYSTEMTIME, lpUniversalTime: LPSYSTEMTIME,
+    ) -> BOOL;
+    #[cfg(target_arch = "x86_64")]
+    pub fn UmsThreadYield(SchedulerParam: PVOID) -> BOOL;
+    pub fn UnhandledExceptionFilter(ExceptionInfo: *mut EXCEPTION_POINTERS) -> LONG;
+    pub fn UnlockFile(
+        hFile: HANDLE, dwFileOffsetLow: DWORD, dwFileOffsetHigh: DWORD,
+        nNumberOfBytesToUnlockLow: DWORD, nNumberOfBytesToUnlockHigh: DWORD,
+    ) -> BOOL;
+    pub fn UnlockFileEx(
+        hFile: HANDLE, dwReserved: DWORD, nNumberOfBytesToUnlockLow: DWORD,
+        nNumberOfBytesToUnlockHigh: DWORD, lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn UnmapViewOfFile(lpBaseAddress: LPCVOID) -> BOOL;
+    pub fn UnregisterApplicationRecoveryCallback() -> HRESULT;
+    pub fn UnregisterApplicationRestart() -> HRESULT;
+    pub fn UnregisterBadMemoryNotification(RegistrationHandle: PVOID) -> BOOL;
+    pub fn UnregisterWait(WaitHandle: HANDLE) -> BOOL;
+    pub fn UnregisterWaitEx(WaitHandle: HANDLE, CompletionEvent: HANDLE) -> BOOL;
+    // pub fn UnregisterWaitUntilOOBECompleted();
+    pub fn UpdateProcThreadAttribute(
+        lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwFlags: DWORD, Attribute: DWORD_PTR,
+        lpValue: PVOID, cbSize: SIZE_T, lpPreviousValue: PVOID, lpReturnSize: PSIZE_T,
+    ) -> BOOL;
+    pub fn UpdateResourceA(
+        hUpdate: HANDLE, lpType: LPCSTR, lpName: LPCSTR, wLanguage: WORD, lpData: LPVOID, cb: DWORD,
+    ) -> BOOL;
+    pub fn UpdateResourceW(
+        hUpdate: HANDLE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: WORD, lpData: LPVOID,
+        cb: DWORD,
+    ) -> BOOL;
+    pub fn VerLanguageNameA(wLang: DWORD, szLang: LPSTR, cchLang: DWORD) -> DWORD;
+    pub fn VerLanguageNameW(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD;
+    pub fn VerSetConditionMask(
+        ConditionMask: ULONGLONG, TypeMask: DWORD, Condition: BYTE,
+    ) -> ULONGLONG;
+    pub fn VerifyScripts(
+        dwFlags: DWORD, lpLocaleScripts: LPCWSTR, cchLocaleScripts: c_int, lpTestScripts: LPCWSTR,
+        cchTestScripts: c_int,
+    ) -> BOOL;
+    pub fn VerifyVersionInfoA(
+        lpVersionInformation: LPOSVERSIONINFOEXA, dwTypeMask: DWORD, dwlConditionMask: DWORDLONG,
+    ) -> BOOL;
+    pub fn VerifyVersionInfoW(
+        lpVersionInformation: LPOSVERSIONINFOEXW, dwTypeMask: DWORD, dwlConditionMask: DWORDLONG,
+    ) -> BOOL;
+    pub fn VirtualAlloc(
+        lpAddress: LPVOID, dwSize: SIZE_T, flAllocationType: DWORD, flProtect: DWORD,
+    ) -> LPVOID;
+    pub fn VirtualAllocEx(
+        hProcess: HANDLE, lpAddress: LPVOID, dwSize: SIZE_T, flAllocationType: DWORD,
+        flProtect: DWORD,
+    ) -> LPVOID;
+    pub fn VirtualAllocExNuma(
+        hProcess: HANDLE, lpAddress: LPVOID, dwSize: SIZE_T, flAllocationType: DWORD,
+        flProtect: DWORD, nndPreferred: DWORD,
+    ) -> LPVOID;
+    pub fn VirtualFree(lpAddress: LPVOID, dwSize: SIZE_T, dwFreeType: DWORD) -> BOOL;
+    pub fn VirtualFreeEx(
+        hProcess: HANDLE, lpAddress: LPVOID, dwSize: SIZE_T, dwFreeType: DWORD,
+    ) -> BOOL;
+    pub fn VirtualLock(lpAddress: LPVOID, dwSize: SIZE_T) -> BOOL;
+    pub fn VirtualProtect(
+        lpAddress: LPVOID, dwSize: SIZE_T, flNewProtect: DWORD, lpflOldProtect: DWORD,
+    ) -> BOOL;
+    pub fn VirtualProtectEx(
+        hProcess: HANDLE, lpAddress: LPVOID, dwSize: SIZE_T, flNewProtect: DWORD,
+        lpflOldProtect: DWORD,
+    ) -> BOOL;
+    pub fn VirtualQuery(
+        lpAddress: LPCVOID, lpBuffer: PMEMORY_BASIC_INFORMATION, dwLength: SIZE_T,
+    ) -> SIZE_T;
+    pub fn VirtualQueryEx(
+        hProcess: HANDLE, lpAddress: LPCVOID, lpBuffer: PMEMORY_BASIC_INFORMATION, dwLength: SIZE_T,
+    ) -> SIZE_T;
+    pub fn VirtualUnlock(lpAddress: LPVOID, dwSize: SIZE_T) -> BOOL;
+    pub fn WTSGetActiveConsoleSessionId() -> DWORD;
+    pub fn WaitCommEvent(hFile: HANDLE, lpEvtMask: LPDWORD, lpOverlapped: LPOVERLAPPED) -> BOOL;
+    pub fn WaitForDebugEvent(lpDebugEvent: LPDEBUG_EVENT, dwMilliseconds: DWORD) -> BOOL;
+    pub fn WaitForMultipleObjects(
+        nCount: DWORD, lpHandles: *const HANDLE, bWaitAll: BOOL, dwMilliseconds: DWORD,
+    ) -> DWORD;
+    pub fn WaitForMultipleObjectsEx(
+        nCount: DWORD, lpHandles: *const HANDLE, bWaitAll: BOOL, dwMilliseconds: DWORD,
+        bAlertable: BOOL,
+    ) -> DWORD;
+    pub fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD;
+    pub fn WaitForSingleObjectEx(
+        hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL,
+    ) -> DWORD;
+    pub fn WaitForThreadpoolIoCallbacks(pio: PTP_IO, fCancelPendingCallbacks: BOOL);
+    pub fn WaitForThreadpoolTimerCallbacks(pti: PTP_TIMER, fCancelPendingCallbacks: BOOL);
+    pub fn WaitForThreadpoolWaitCallbacks(pwa: PTP_WAIT, fCancelPendingCallbacks: BOOL);
+    pub fn WaitForThreadpoolWorkCallbacks(pwk: PTP_WORK, fCancelPendingCallbacks: BOOL);
+    pub fn WaitNamedPipeA(lpNamedPipeName: LPCSTR, nTimeOut: DWORD) -> BOOL;
+    pub fn WaitNamedPipeW(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL;
+    pub fn WakeAllConditionVariable(ConditionVariable: PCONDITION_VARIABLE);
+    pub fn WakeConditionVariable(ConditionVariable: PCONDITION_VARIABLE);
+    pub fn WerGetFlags(hProcess: HANDLE, pdwFlags: PDWORD) -> HRESULT;
+    pub fn WerRegisterFile(
+        pwzFile: PCWSTR, regFileType: WER_REGISTER_FILE_TYPE, dwFlags: DWORD,
+    ) -> HRESULT;
+    pub fn WerRegisterMemoryBlock(pvAddress: PVOID, dwSize: DWORD) -> HRESULT;
+    pub fn WerRegisterRuntimeExceptionModule(
+        pwszOutOfProcessCallbackDll: PCWSTR, pContext: PVOID,
+    ) -> HRESULT;
+    pub fn WerSetFlags(dwFlags: DWORD) -> HRESULT;
+    pub fn WerUnregisterFile(pwzFilePath: PCWSTR) -> HRESULT;
+    pub fn WerUnregisterMemoryBlock(pvAddress: PVOID) -> HRESULT;
+    pub fn WerUnregisterRuntimeExceptionModule(
+        pwszOutOfProcessCallbackDll: PCWSTR, pContext: PVOID,
+    ) -> HRESULT;
+    // pub fn WerpInitiateRemoteRecovery();
+    pub fn WideCharToMultiByte(
+      CodePage: UINT, dwFlags: DWORD, lpWideCharStr: LPCWCH, cchWideChar: c_int,
+      lpMultiByteStr: LPSTR, cbMultiByte: c_int, lpDefaultChar: LPCCH, lpUsedDefaultChar: LPBOOL,
+    ) -> c_int;
+    pub fn WinExec(lpCmdLine: LPCSTR, uCmdShow: UINT) -> UINT;
+    pub fn Wow64DisableWow64FsRedirection(OldValue: *mut PVOID) -> BOOL;
+    pub fn Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: BOOLEAN) -> BOOLEAN;
+    pub fn Wow64GetThreadContext(hThread: HANDLE, lpContext: PWOW64_CONTEXT) -> BOOL;
+    pub fn Wow64GetThreadSelectorEntry(
+        hThread: HANDLE, dwSelector: DWORD, lpSelectorEntry: PWOW64_LDT_ENTRY,
+    ) -> BOOL;
+    pub fn Wow64RevertWow64FsRedirection(OlValue: PVOID) -> BOOL;
+    pub fn Wow64SetThreadContext(hThread: HANDLE, lpContext: *const WOW64_CONTEXT) -> BOOL;
+    pub fn Wow64SuspendThread(hThread: HANDLE) -> DWORD;
+    pub fn WriteConsoleA(
+        hConsoleOutput: HANDLE, lpBuffer: *const VOID, nNumberOfCharsToWrite: DWORD,
+        lpNumberOfCharsWritten: LPDWORD, lpReserved: LPVOID,
+    ) -> BOOL;
+    pub fn WriteConsoleInputA(
+        hConsoleInput: HANDLE, lpBuffer: *const INPUT_RECORD, nLength: DWORD,
+        lpNumberOfEventsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn WriteConsoleInputW(
+        hConsoleInput: HANDLE, lpBuffer: *const INPUT_RECORD, nLength: DWORD,
+        lpNumberOfEventsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn WriteConsoleOutputA(
+        hConsoleOutput: HANDLE, lpBuffer: *const CHAR_INFO, dwBufferSize: COORD,
+        dwBufferCoord: COORD, lpWriteRegion: PSMALL_RECT,
+    ) -> BOOL;
+    pub fn WriteConsoleOutputAttribute(
+        hConsoleOutput: HANDLE, lpAttribute: *const WORD, nLength: DWORD, dwWriteCoord: COORD,
+        lpNumberOfAttrsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn WriteConsoleOutputCharacterA(
+        hConsoleOutput: HANDLE, lpCharacter: LPCSTR, nLength: DWORD, dwWriteCoord: COORD,
+        lpNumberOfCharsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn WriteConsoleOutputCharacterW(
+        hConsoleOutput: HANDLE, lpCharacter: LPCWSTR, nLength: DWORD, dwWriteCoord: COORD,
+        lpNumberOfCharsWritten: LPDWORD,
+    ) -> BOOL;
+    pub fn WriteConsoleOutputW(
+        hConsoleOutput: HANDLE, lpBuffer: *const CHAR_INFO, dwBufferSize: COORD,
+        dwBufferCoord: COORD, lpWriteRegion: PSMALL_RECT,
+    ) -> BOOL;
+    pub fn WriteConsoleW(
+        hConsoleOutput: HANDLE, lpBuffer: *const VOID, nNumberOfCharsToWrite: DWORD,
+        lpNumberOfCharsWritten: LPDWORD, lpReserved: LPVOID,
+    ) -> BOOL;
+    pub fn WriteFile(
+        hFile: HANDLE, lpBuffer: LPCVOID, nNumberOfBytesToWrite: DWORD,
+        lpNumberOfBytesWritten: LPDWORD, lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn WriteFileEx(
+        hFile: HANDLE, lpBuffer: LPCVOID, nNumberOfBytesToWrite: DWORD, lpOverlapped: LPOVERLAPPED,
+        lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
+    ) -> BOOL;
+    pub fn WriteFileGather(
+        hFile: HANDLE, aSegmentArray: *mut FILE_SEGMENT_ELEMENT, nNumberOfBytesToWrite: DWORD,
+        lpReserved: LPDWORD, lpOverlapped: LPOVERLAPPED,
+    ) -> BOOL;
+    pub fn WritePrivateProfileSectionA(
+        lpAppName: LPCSTR, lpString: LPCSTR, lpFileName: LPCSTR,
+    ) -> BOOL;
+    pub fn WritePrivateProfileSectionW(
+        lpAppName: LPCWSTR, lpString: LPCWSTR, lpFileName: LPCWSTR,
+    ) -> BOOL;
+    pub fn WritePrivateProfileStringA(
+        lpAppName: LPCSTR, lpKeyName: LPCSTR, lpString: LPCSTR, lpFileName: LPCSTR,
+    ) -> BOOL;
+    pub fn WritePrivateProfileStringW(
+        lpAppName: LPCWSTR, lpKeyName: LPCWSTR, lpString: LPCWSTR, lpFileName: LPCWSTR,
+    ) -> BOOL;
+    pub fn WritePrivateProfileStructA(
+        lpszSection: LPCSTR, lpszKey: LPCSTR, lpStruct: LPVOID, uSizeStruct: UINT, szFile: LPCSTR,
+    ) -> BOOL;
+    pub fn WritePrivateProfileStructW(
+        lpszSection: LPCWSTR, lpszKey: LPCWSTR, lpStruct: LPVOID, uSizeStruct: UINT,
+        szFile: LPCWSTR,
+    ) -> BOOL;
+    pub fn WriteProcessMemory(
+        hProcess: HANDLE, lpBaseAddress: LPVOID, lpBuffer: LPCVOID, nSize: SIZE_T,
+        lpNumberOfBytesWritten: *mut SIZE_T,
+    ) -> BOOL;
+    pub fn WriteProfileSectionA(lpAppName: LPCSTR, lpString: LPCSTR) -> BOOL;
+    pub fn WriteProfileSectionW(lpAppName: LPCWSTR, lpString: LPCWSTR) -> BOOL;
+    pub fn WriteProfileStringA(lpAppName: LPCSTR, lpKeyName: LPCSTR, lpString: LPCSTR) -> BOOL;
+    pub fn WriteProfileStringW(lpAppName: LPCWSTR, lpKeyName: LPCWSTR, lpString: LPCWSTR) -> BOOL;
+    pub fn WriteTapemark(
+        hDevice: HANDLE, dwTapemarkType: DWORD, dwTapemarkCount: DWORD, bImmediate: BOOL,
+    ) -> DWORD;
+    pub fn ZombifyActCtx(hActCtx: HANDLE) -> BOOL;
+    pub fn _hread(hFile: HFILE, lpBuffer: LPVOID, lBytes: c_long) -> c_long;
+    pub fn _hwrite(hFile: HFILE, lpBuffer: LPCCH, lBytes: c_long) -> c_long;
+    pub fn _lclose(hFile: HFILE) -> HFILE;
+    pub fn _lcreat(lpPathName: LPCSTR, iAttrubute: c_int) -> HFILE;
+    pub fn _llseek(hFile: HFILE, lOffset: LONG, iOrigin: c_int) -> LONG;
+    pub fn _lopen(lpPathName: LPCSTR, iReadWrite: c_int) -> HFILE;
+    pub fn _lread(hFile: HFILE, lpBuffer: LPVOID, uBytes: UINT) -> UINT;
+    pub fn _lwrite(hFile: HFILE, lpBuffer: LPCCH, uBytes: UINT) -> UINT;
+    pub fn lstrcat(lpString1: LPSTR, lpString2: LPCSTR) -> LPSTR;
+    pub fn lstrcatA(lpString1: LPSTR, lpString2: LPCSTR) -> LPSTR;
+    pub fn lstrcatW(lpString1: LPWSTR, lpString2: LPCWSTR) -> LPSTR;
+    pub fn lstrcmp(lpString1: LPCSTR, lpString2: LPCSTR) -> c_int;
+    pub fn lstrcmpA(lpString1: LPCSTR, lpString2: LPCSTR) -> c_int;
+    pub fn lstrcmpW(lpString1: LPCWSTR, lpString2: LPCWSTR) -> c_int;
+    pub fn lstrcmpi(lpString1: LPCSTR, lpString2: LPCSTR) -> c_int;
+    pub fn lstrcmpiA(lpString1: LPCSTR, lpString2: LPCSTR) -> c_int;
+    pub fn lstrcmpiW(lpString1: LPCWSTR, lpString2: LPCWSTR) -> c_int;
+    pub fn lstrcpy(lpString1: LPSTR, lpString2: LPCSTR) -> LPSTR;
+    pub fn lstrcpyA(lpString1: LPSTR, lpString2: LPCSTR) -> LPSTR;
+    pub fn lstrcpyW(lpString1: LPWSTR, lpString2: LPCWSTR) -> LPSTR;
+    pub fn lstrcpyn(lpString1: LPSTR, lpString2: LPCSTR, iMaxLength: c_int) -> LPSTR;
+    pub fn lstrcpynA(lpString1: LPSTR, lpString2: LPCSTR, iMaxLength: c_int) -> LPSTR;
+    pub fn lstrcpynW(lpString1: LPWSTR, lpString2: LPCWSTR, iMaxLength: c_int) -> LPSTR;
+    pub fn lstrlen(lpString: LPCSTR) -> c_int;
+    pub fn lstrlenA(lpString: LPCSTR) -> c_int;
+    pub fn lstrlenW(lpString: LPCWSTR) -> c_int;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_lstrcmpW(String1: PCUWSTR, String2: PCUWSTR) -> c_int;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_lstrcmpiW(String1: PCUWSTR, String2: PCUWSTR) -> c_int;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_lstrlenW(String: LPCUWSTR) -> c_int;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_wcschr(String: PCUWSTR, Character: WCHAR) -> PUWSTR;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_wcscpy(Destination: PUWSTR, Source: PCUWSTR) -> PUWSTR;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_wcsicmp(String1: PCUWSTR, String2: PCUWSTR) -> c_int;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_wcslen(String: PCUWSTR) -> size_t;
+    #[cfg(any(target_arch = "arm", target_arch = "x86_64"))]
+    pub fn uaw_wcsrchr(String: PCUWSTR, Character: WCHAR) -> PUWSTR;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ktmw32-sys/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"1442e913a6cd577ee0da73a1358970f6fc360844728f095ad838e4347da7afc5","README.md":"56a791ac04a972cc90528050ff82ec3501fd85d0606b83f6ccc296a1b7a21ebd","build.rs":"6f983a988a7edd317bff79a55d4cdd82575b107fd3ec60c3005798b818d9d0b6","i686/libktmw32.a":"5bb899ead45cf0d4308a227a579e4d5f57e265843aacddf00b61e0461c7db34b","src/lib.rs":"95735cd6344b1012d16bc230ef111e93dbe32a26c1f672308b0409c28bd908e3","x86_64/libktmw32.a":"53f6463c2fec324db905c56f7b76afa86ae7802f6c2f2dae918d8ca0a603cdc2"},"package":"7f9313a869ff779ae08dd990b75a92dc06aa16d771f41305f7286649cd39a0ee"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ktmw32-sys/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "ktmw32-sys"
+version = "0.1.0"
+authors = ["Peter Atashian <retep998@gmail.com>"]
+description = "FFI bindings to ktmw32."
+documentation = "https://retep998.github.io/doc/ktmw32-sys/"
+repository = "https://github.com/retep998/winapi-rs"
+readme = "README.md"
+keywords = ["Windows", "FFI", "WinSDK"]
+license = "MIT"
+build = "build.rs"
+links = "ktmw32"
+
+[lib]
+name = "ktmw32"
+
+[dependencies]
+winapi = { version = "*", path = "../.." }
+[build-dependencies]
+winapi-build = { version = "*", path = "../../build" }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ktmw32-sys/README.md
@@ -0,0 +1,4 @@
+# ktmw32-sys #
+FFI bindings to ktmw32.
+
+[Documentation](https://retep998.github.io/doc/ktmw32-sys/)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ktmw32-sys/build.rs
@@ -0,0 +1,6 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+extern crate build;
+fn main() {
+    build::link("ktmw32", true)
+}
new file mode 100644
index 0000000000000000000000000000000000000000..404cf8748ed93ea9636e365930b34da45f127453
GIT binary patch
literal 35946
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
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ktmw32-sys/src/lib.rs
@@ -0,0 +1,55 @@
+// Copyright © 2015, Peter Atashian
+// Licensed under the MIT License <LICENSE.md>
+//! FFI bindings to ktmw32.
+#![cfg(windows)]
+extern crate winapi;
+use winapi::*;
+extern "system" {
+    // pub fn CommitComplete();
+    // pub fn CommitEnlistment();
+    pub fn CommitTransaction(TransactionHandle: HANDLE) -> BOOL;
+    // pub fn CommitTransactionAsync();
+    // pub fn CreateEnlistment();
+    // pub fn CreateResourceManager();
+    pub fn CreateTransaction(
+        lpTransactionAttributes: LPSECURITY_ATTRIBUTES, UOW: LPGUID, CreateOptions: DWORD,
+        IsolationLevel: DWORD, IsolationFlags: DWORD, Timeout: DWORD, Description: LPWSTR,
+    ) -> HANDLE;
+    // pub fn CreateTransactionManager();
+    // pub fn GetCurrentClockTransactionManager();
+    // pub fn GetEnlistmentId();
+    // pub fn GetEnlistmentRecoveryInformation();
+    // pub fn GetNotificationResourceManager();
+    // pub fn GetNotificationResourceManagerAsync();
+    // pub fn GetTransactionId();
+    // pub fn GetTransactionInformation();
+    // pub fn GetTransactionManagerId();
+    // pub fn OpenEnlistment();
+    // pub fn OpenResourceManager();
+    // pub fn OpenTransaction();
+    // pub fn OpenTransactionManager();
+    // pub fn OpenTransactionManagerById();
+    // pub fn PrepareComplete();
+    // pub fn PrepareEnlistment();
+    // pub fn PrePrepareComplete();
+    // pub fn PrePrepareEnlistment();
+    // pub fn PrivCreateTransaction();
+    // pub fn PrivIsLogWritableTransactionManager();
+    // pub fn PrivPropagationComplete();
+    // pub fn PrivPropagationFailed();
+    // pub fn PrivRegisterProtocolAddressInformation();
+    // pub fn ReadOnlyEnlistment();
+    // pub fn RecoverEnlistment();
+    // pub fn RecoverResourceManager();
+    // pub fn RecoverTransactionManager();
+    // pub fn RenameTransactionManager();
+    // pub fn RollbackComplete();
+    // pub fn RollbackEnlistment();
+    pub fn RollbackTransaction(TransactionHandle: HANDLE) -> BOOL;
+    // pub fn RollbackTransactionAsync();
+    // pub fn RollforwardTransactionManager();
+    // pub fn SetEnlistmentRecoveryInformation();
+    // pub fn SetResourceManagerCompletionPort();
+    // pub fn SetTransactionInformation();
+    // pub fn SinglePhaseReject();
+}
new file mode 100644
index 0000000000000000000000000000000000000000..cf3f58ce2530193871c387ecc94972a5ae605e48
GIT binary patch
literal 35614
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
new file mode 100644
--- /dev/null
+++ b/third_party/rust/language-tags/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"0e4e3b87c348cc5738de9bebdfcb070ac1ab2a93b81b77c074b030d9e27580c4","LICENSE":"e03e58ea9205f51989b7a50f450051b24e6516cc1f0b920222dcda992072be99","src/lib.rs":"0b839c7b379606a064a094b9973c31c634426c41719a1c0963ae8fae1676a987","tests/tests.rs":"cf9f805fdadee5e2f3c4e9e66e8184c3099f7e699d5e34b708849132f1b300ce"},"package":"a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/language-tags/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+name = "language-tags"
+version = "0.2.2"
+authors = ["Pyfisch <pyfisch@gmail.com>"]
+exclude = ["README.md", ".travis.yml", ".gitignore"]
+
+description = "Language tags for Rust"
+license = "MIT"
+repository = "https://github.com/pyfisch/rust-language-tags"
+documentation = "http://pyfisch.github.io/rust-language-tags/language_tags/"
+keywords = ["language", "internationalization", "translation", "http", "html"]
+
+[dependencies.heapsize]
+version = ">=0.2.2, <0.4"
+optional = true
+
+[dependencies.heapsize_plugin]
+version = "0.1.2"
+optional = true
+
+[features]
+heap_size = ["heapsize", "heapsize_plugin"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/language-tags/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015 Pyfisch
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/language-tags/src/lib.rs
@@ -0,0 +1,640 @@
+#![deny(missing_docs)]
+#![cfg_attr(test, deny(warnings))]
+#![cfg_attr(feature = "heap_size", feature(custom_derive, plugin))]
+#![cfg_attr(feature = "heap_size", plugin(heapsize_plugin))]
+
+//! Language tags can be used identify human languages, scripts e.g. Latin script, countries and
+//! other regions.
+//!
+//! Language tags are defined in [BCP47](http://tools.ietf.org/html/bcp47), an introduction is
+//! ["Language tags in HTML and XML"](http://www.w3.org/International/articles/language-tags/) by
+//! the W3C. They are commonly used in HTML and HTTP `Content-Language` and `Accept-Language`
+//! header fields.
+//!
+//! This package currently supports parsing (fully conformant parser), formatting and comparing
+//! language tags.
+//!
+//! # Examples
+//! Create a simple language tag representing the French language as spoken
+//! in Belgium and print it:
+//!
+//! ```rust
+//! use language_tags::LanguageTag;
+//! let mut langtag: LanguageTag = Default::default();
+//! langtag.language = Some("fr".to_owned());
+//! langtag.region = Some("BE".to_owned());
+//! assert_eq!(format!("{}", langtag), "fr-BE");
+//! ```
+//!
+//! Parse a tag representing a special type of English specified by private agreement:
+//!
+//! ```rust
+//! use language_tags::LanguageTag;
+//! let langtag: LanguageTag = "en-x-twain".parse().unwrap();
+//! assert_eq!(format!("{}", langtag.language.unwrap()), "en");
+//! assert_eq!(format!("{:?}", langtag.privateuse), "[\"twain\"]");
+//! ```
+//!
+//! You can check for equality, but more often you should test if two tags match.
+//!
+//! ```rust
+//! use language_tags::LanguageTag;
+//! let mut langtag_server: LanguageTag = Default::default();
+//! langtag_server.language = Some("de".to_owned());
+//! langtag_server.region = Some("AT".to_owned());
+//! let mut langtag_user: LanguageTag = Default::default();
+//! langtag_user.language = Some("de".to_owned());
+//! assert!(langtag_user.matches(&langtag_server));
+//! ```
+//!
+//! There is also the `langtag!` macro for creating language tags.
+
+#[cfg(feature = "heap_size")]
+extern crate heapsize;
+
+use std::ascii::AsciiExt;
+use std::cmp::Ordering;
+use std::collections::{BTreeMap, BTreeSet};
+use std::error::Error as ErrorTrait;
+use std::fmt::{self, Display};
+use std::iter::FromIterator;
+
+fn is_alphabetic(s: &str) -> bool {
+    s.chars().all(|x| x >= 'A' && x <= 'Z' || x >= 'a' && x <= 'z')
+}
+
+fn is_numeric(s: &str) -> bool {
+    s.chars().all(|x| x >= '0' && x <= '9')
+}
+
+fn is_alphanumeric_or_dash(s: &str) -> bool {
+    s.chars()
+     .all(|x| x >= 'A' && x <= 'Z' || x >= 'a' && x <= 'z' || x >= '0' && x <= '9' || x == '-')
+}
+
+/// Defines an Error type for langtags.
+///
+/// Errors occur mainly during parsing of language tags.
+#[derive(Debug, Eq, PartialEq)]
+pub enum Error {
+    /// The same extension subtag is only allowed once in a tag before the private use part.
+    DuplicateExtension,
+    /// If an extension subtag is present, it must not be empty.
+    EmptyExtension,
+    /// If the `x` subtag is present, it must not be empty.
+    EmptyPrivateUse,
+    /// The langtag contains a char that is not A-Z, a-z, 0-9 or the dash.
+    ForbiddenChar,
+    /// A subtag fails to parse, it does not match any other subtags.
+    InvalidSubtag,
+    /// The given language subtag is invalid.
+    InvalidLanguage,
+    /// A subtag may be eight characters in length at maximum.
+    SubtagTooLong,
+    /// At maximum three extlangs are allowed, but zero to one extlangs are preferred.
+    TooManyExtlangs,
+}
+
+impl ErrorTrait for Error {
+    fn description(&self) -> &str {
+        match *self {
+            Error::DuplicateExtension => "The same extension subtag is only allowed once in a tag",
+            Error::EmptyExtension => "If an extension subtag is present, it must not be empty",
+            Error::EmptyPrivateUse => "If the `x` subtag is present, it must not be empty",
+            Error::ForbiddenChar => "The langtag contains a char not allowed",
+            Error::InvalidSubtag => "A subtag fails to parse, it does not match any other subtags",
+            Error::InvalidLanguage => "The given language subtag is invalid",
+            Error::SubtagTooLong => "A subtag may be eight characters in length at maximum",
+            Error::TooManyExtlangs => "At maximum three extlangs are allowed",
+        }
+    }
+}
+
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(self.description())
+    }
+}
+
+/// Result type used for this library.
+pub type Result<T> = ::std::result::Result<T, Error>;
+
+/// Contains all grandfathered tags.
+pub const GRANDFATHERED: [(&'static str, Option<&'static str>); 26] = [("art-lojban", Some("jbo")),
+                                                                       ("cel-gaulish", None),
+                                                                       ("en-GB-oed",
+                                                                        Some("en-GB-oxendict")),
+                                                                       ("i-ami", Some("ami")),
+                                                                       ("i-bnn", Some("bnn")),
+                                                                       ("i-default", None),
+                                                                       ("i-enochian", None),
+                                                                       ("i-hak", Some("hak")),
+                                                                       ("i-klingon", Some("tlh")),
+                                                                       ("i-lux", Some("lb")),
+                                                                       ("i-mingo", None),
+                                                                       ("i-navajo", Some("nv")),
+                                                                       ("i-pwn", Some("pwn")),
+                                                                       ("i-tao", Some("tao")),
+                                                                       ("i-tay", Some("tay")),
+                                                                       ("i-tsu", Some("tsu")),
+                                                                       ("no-bok", Some("nb")),
+                                                                       ("no-nyn", Some("nn")),
+                                                                       ("sgn-BE-FR", Some("sfb")),
+                                                                       ("sgn-BE-NL", Some("vgt")),
+                                                                       ("sgn-CH-DE", Some("sgg")),
+                                                                       ("zh-guoyu", Some("cmn")),
+                                                                       ("zh-hakka", Some("hak")),
+                                                                       ("zh-min", None),
+                                                                       ("zh-min-nan", Some("nan")),
+                                                                       ("zh-xiang", Some("hsn"))];
+
+const DEPRECATED_LANGUAGE: [(&'static str, &'static str); 53] = [("in", "id"),
+                                                                 ("iw", "he"),
+                                                                 ("ji", "yi"),
+                                                                 ("jw", "jv"),
+                                                                 ("mo", "ro"),
+                                                                 ("aam", "aas"),
+                                                                 ("adp", "dz"),
+                                                                 ("aue", "ktz"),
+                                                                 ("ayx", "nun"),
+                                                                 ("bjd", "drl"),
+                                                                 ("ccq", "rki"),
+                                                                 ("cjr", "mom"),
+                                                                 ("cka", "cmr"),
+                                                                 ("cmk", "xch"),
+                                                                 ("drh", "khk"),
+                                                                 ("drw", "prs"),
+                                                                 ("gav", "dev"),
+                                                                 ("gfx", "vaj"),
+                                                                 ("gti", "nyc"),
+                                                                 ("hrr", "jal"),
+                                                                 ("ibi", "opa"),
+                                                                 ("ilw", "gal"),
+                                                                 ("kgh", "kml"),
+                                                                 ("koj", "kwv"),
+                                                                 ("kwq", "yam"),
+                                                                 ("kxe", "tvd"),
+                                                                 ("lii", "raq"),
+                                                                 ("lmm", "rmx"),
+                                                                 ("meg", "cir"),
+                                                                 ("mst", "mry"),
+                                                                 ("mwj", "vaj"),
+                                                                 ("myt", "mry"),
+                                                                 ("nnx", "ngv"),
+                                                                 ("oun", "vaj"),
+                                                                 ("pcr", "adx"),
+                                                                 ("pmu", "phr"),
+                                                                 ("ppr", "lcq"),
+                                                                 ("puz", "pub"),
+                                                                 ("sca", "hle"),
+                                                                 ("thx", "oyb"),
+                                                                 ("tie", "ras"),
+                                                                 ("tkk", "twm"),
+                                                                 ("tlw", "weo"),
+                                                                 ("tnf", "prs"),
+                                                                 ("tsf", "taj"),
+                                                                 ("uok", "ema"),
+                                                                 ("xia", "acn"),
+                                                                 ("xsj", "suj"),
+                                                                 ("ybd", "rki"),
+                                                                 ("yma", "lrr"),
+                                                                 ("ymt", "mtm"),
+                                                                 ("yos", "zom"),
+                                                                 ("yuu", "yug")];
+
+const DEPRECATED_REGION: [(&'static str, &'static str); 6] = [("BU", "MM"),
+                                                              ("DD", "DE"),
+                                                              ("FX", "FR"),
+                                                              ("TP", "TL"),
+                                                              ("YD", "YE"),
+                                                              ("ZR", "CD")];
+
+/// A language tag as described in [BCP47](http://tools.ietf.org/html/bcp47).
+///
+/// Language tags are used to help identify languages, whether spoken,
+/// written, signed, or otherwise signaled, for the purpose of
+/// communication.  This includes constructed and artificial languages
+/// but excludes languages not intended primarily for human
+/// communication, such as programming languages.
+#[derive(Debug, Default, Eq, Clone)]
+#[cfg_attr(feature = "heap_size", derive(HeapSizeOf))]
+pub struct LanguageTag {
+    /// Language subtags are used to indicate the language, ignoring all
+    /// other aspects such as script, region or spefic invariants.
+    pub language: Option<String>,
+    /// Extended language subtags are used to identify certain specially
+    /// selected languages that, for various historical and compatibility
+    /// reasons, are closely identified with or tagged using an existing
+    /// primary language subtag.
+    pub extlangs: Vec<String>,
+    /// Script subtags are used to indicate the script or writing system
+    /// variations that distinguish the written forms of a language or its
+    /// dialects.
+    pub script: Option<String>,
+    /// Region subtags are used to indicate linguistic variations associated
+    /// with or appropriate to a specific country, territory, or region.
+    /// Typically, a region subtag is used to indicate variations such as
+    /// regional dialects or usage, or region-specific spelling conventions.
+    /// It can also be used to indicate that content is expressed in a way
+    /// that is appropriate for use throughout a region, for instance,
+    /// Spanish content tailored to be useful throughout Latin America.
+    pub region: Option<String>,
+    /// Variant subtags are used to indicate additional, well-recognized
+    /// variations that define a language or its dialects that are not
+    /// covered by other available subtags.
+    pub variants: Vec<String>,
+    /// Extensions provide a mechanism for extending language tags for use in
+    /// various applications.  They are intended to identify information that
+    /// is commonly used in association with languages or language tags but
+    /// that is not part of language identification.
+    pub extensions: BTreeMap<u8, Vec<String>>,
+    /// Private use subtags are used to indicate distinctions in language
+    /// that are important in a given context by private agreement.
+    pub privateuse: Vec<String>,
+}
+
+impl LanguageTag {
+    /// Matches language tags. The first language acts as a language range, the second one is used
+    /// as a normal language tag. None fields in the language range are ignored. If the language
+    /// tag has more extlangs than the range these extlangs are ignored. Matches are
+    /// case-insensitive. `*` in language ranges are represented using `None` values. The language
+    /// range `*` that matches language tags is created by the default language tag:
+    /// `let wildcard: LanguageTag = Default::default();.`
+    ///
+    /// For example the range `en-GB` matches only `en-GB` and `en-Arab-GB` but not `en`.
+    /// The range `en` matches all language tags starting with `en` including `en`, `en-GB`,
+    /// `en-Arab` and `en-Arab-GB`.
+    ///
+    /// # Panics
+    /// If the language range has extensions or private use tags.
+    ///
+    /// # Examples
+    /// ```
+    /// # #[macro_use] extern crate language_tags;
+    /// # fn main() {
+    /// let range_italian = langtag!(it);
+    /// let tag_german = langtag!(de);
+    /// let tag_italian_switzerland = langtag!(it;;;CH);
+    /// assert!(!range_italian.matches(&tag_german));
+    /// assert!(range_italian.matches(&tag_italian_switzerland));
+    ///
+    /// let range_spanish_brazil = langtag!(es;;;BR);
+    /// let tag_spanish = langtag!(es);
+    /// assert!(!range_spanish_brazil.matches(&tag_spanish));
+    /// # }
+    /// ```
+    pub fn matches(&self, other: &LanguageTag) -> bool {
+        fn matches_option(a: &Option<String>, b: &Option<String>) -> bool {
+            match (a, b) {
+                (&Some(ref a), &Some(ref b)) => a.eq_ignore_ascii_case(b),
+                (&None, _) => true,
+                (_, &None) => false,
+            }
+        }
+        fn matches_vec(a: &[String], b: &[String]) -> bool {
+            a.iter().zip(b.iter()).all(|(x, y)| x.eq_ignore_ascii_case(y))
+        }
+        assert!(self.is_language_range());
+        matches_option(&self.language, &other.language) &&
+        matches_vec(&self.extlangs, &other.extlangs) &&
+        matches_option(&self.script, &other.script) &&
+        matches_option(&self.region, &other.region) &&
+        matches_vec(&self.variants, &other.variants)
+    }
+
+    /// Checks if it is a language range, meaning that there are no extension and privateuse tags.
+    pub fn is_language_range(&self) -> bool {
+        self.extensions.is_empty() && self.privateuse.is_empty()
+    }
+
+    /// Returns the canonical version of the language tag.
+    ///
+    /// It currently applies the following steps:
+    ///
+    /// * Grandfathered tags are replaced with the canonical version if possible.
+    /// * Extension languages are promoted to primary language.
+    /// * Deprecated languages are replaced with modern equivalents.
+    /// * Deprecated regions are replaced with new country names.
+    /// * The `heploc` variant is replaced with `alalc97`.
+    ///
+    /// The returned language tags may not be completly canonical and they are
+    /// not validated.
+    pub fn canonicalize(&self) -> LanguageTag {
+        if let Some(ref language) = self.language {
+            if let Some(&(_, Some(tag))) = GRANDFATHERED.iter().find(|&&(x, _)| {
+                x.eq_ignore_ascii_case(&language)
+            }) {
+                return tag.parse().expect("GRANDFATHERED list must contain only valid tags.");
+            }
+        }
+        let mut tag = self.clone();
+        if !self.extlangs.is_empty() {
+            tag.language = Some(self.extlangs[0].clone());
+            tag.extlangs = Vec::new();
+        }
+        if let Some(ref language) = self.language {
+            if let Some(&(_, l)) = DEPRECATED_LANGUAGE.iter().find(|&&(x, _)| {
+                x.eq_ignore_ascii_case(&language)
+            }) {
+                tag.language = Some(l.to_owned());
+            };
+        }
+        if let Some(ref region) = self.region {
+            if let Some(&(_, r)) = DEPRECATED_REGION.iter().find(|&&(x, _)| {
+                x.eq_ignore_ascii_case(&region)
+            }) {
+                tag.region = Some(r.to_owned());
+            };
+        }
+        tag.variants = self.variants
+                           .iter()
+                           .map(|variant| {
+                               if "heploc".eq_ignore_ascii_case(variant) {
+                                   "alalc97".to_owned()
+                               } else {
+                                   variant.clone()
+                               }
+                           })
+                           .collect();
+        tag
+    }
+}
+
+impl PartialEq for LanguageTag {
+    fn eq(&self, other: &LanguageTag) -> bool {
+        fn eq_option(a: &Option<String>, b: &Option<String>) -> bool {
+            match (a, b) {
+                (&Some(ref a), &Some(ref b)) => a.eq_ignore_ascii_case(b),
+                (&None, &None) => true,
+                _ => false,
+            }
+        }
+        fn eq_vec(a: &[String], b: &[String]) -> bool {
+            a.len() == b.len() && a.iter().zip(b.iter()).all(|(x, y)| x.eq_ignore_ascii_case(y))
+        }
+        eq_option(&self.language, &other.language) && eq_vec(&self.extlangs, &other.extlangs) &&
+        eq_option(&self.script, &other.script) &&
+        eq_option(&self.region, &other.region) && eq_vec(&self.variants, &other.variants) &&
+        BTreeSet::from_iter(&self.extensions) == BTreeSet::from_iter(&other.extensions) &&
+        self.extensions.keys().all(|a| eq_vec(&self.extensions[a], &other.extensions[a])) &&
+        eq_vec(&self.privateuse, &other.privateuse)
+    }
+}
+
+/// Handles normal tags.
+/// The parser has a position from 0 to 6. Bigger positions reepresent the ASCII codes of
+/// single character extensions
+/// language-extlangs-script-region-variant-extension-privateuse
+/// --- 0 -- -- 1 -- -- 2 - -- 3 - -- 4 -- --- x --- ---- 6 ---
+fn parse_language_tag(langtag: &mut LanguageTag, t: &str) -> Result<u8> {
+    let mut position: u8 = 0;
+    for subtag in t.split('-') {
+        if subtag.len() > 8 {
+            // All subtags have a maximum length of eight characters.
+            return Err(Error::SubtagTooLong);
+        }
+        if position == 6 {
+            langtag.privateuse.push(subtag.to_owned());
+        } else if subtag.eq_ignore_ascii_case("x") {
+            position = 6;
+        } else if position == 0 {
+            // Primary language
+            if subtag.len() < 2 || !is_alphabetic(subtag) {
+                return Err(Error::InvalidLanguage);
+            }
+            langtag.language = Some(subtag.to_owned());
+            if subtag.len() < 4 {
+                // extlangs are only allowed for short language tags
+                position = 1;
+            } else {
+                position = 2;
+            }
+        } else if position == 1 && subtag.len() == 3 && is_alphabetic(subtag) {
+            // extlangs
+            langtag.extlangs.push(subtag.to_owned());
+        } else if position <= 2 && subtag.len() == 4 && is_alphabetic(subtag) {
+            // Script
+            langtag.script = Some(subtag.to_owned());
+            position = 3;
+        } else if position <= 3 &&
+           (subtag.len() == 2 && is_alphabetic(subtag) || subtag.len() == 3 && is_numeric(subtag)) {
+            langtag.region = Some(subtag.to_owned());
+            position = 4;
+        } else if position <= 4 &&
+           (subtag.len() >= 5 && is_alphabetic(&subtag[0..1]) ||
+            subtag.len() >= 4 && is_numeric(&subtag[0..1])) {
+            // Variant
+            langtag.variants.push(subtag.to_owned());
+            position = 4;
+        } else if subtag.len() == 1 {
+            position = subtag.as_bytes()[0] as u8;
+            if langtag.extensions.contains_key(&position) {
+                return Err(Error::DuplicateExtension);
+            }
+            langtag.extensions.insert(position, Vec::new());
+        } else if position > 6 {
+            langtag.extensions
+                   .get_mut(&position)
+                   .expect("no entry found for key")
+                   .push(subtag.to_owned());
+        } else {
+            return Err(Error::InvalidSubtag);
+        }
+    }
+    Ok(position)
+}
+
+impl std::str::FromStr for LanguageTag {
+    type Err = Error;
+    fn from_str(s: &str) -> Result<Self> {
+        let t = s.trim();
+        if !is_alphanumeric_or_dash(t) {
+            return Err(Error::ForbiddenChar);
+        }
+        let mut langtag: LanguageTag = Default::default();
+        // Handle grandfathered tags
+        if let Some(&(tag, _)) = GRANDFATHERED.iter().find(|&&(x, _)| x.eq_ignore_ascii_case(t)) {
+            langtag.language = Some((*tag).to_owned());
+            return Ok(langtag);
+        }
+        let position = try!(parse_language_tag(&mut langtag, t));
+        if langtag.extensions.values().any(|x| x.is_empty()) {
+            // Extensions and privateuse must not be empty if present
+            return Err(Error::EmptyExtension);
+        }
+        if position == 6 && langtag.privateuse.is_empty() {
+            return Err(Error::EmptyPrivateUse);
+        }
+        if langtag.extlangs.len() > 2 {
+            // maximum 3 extlangs
+            return Err(Error::TooManyExtlangs);
+        }
+        Ok(langtag)
+    }
+}
+
+impl fmt::Display for LanguageTag {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fn cmp_ignore_ascii_case(a: &u8, b: &u8) -> Ordering {
+            fn byte_to_uppercase(x: u8) -> u8 {
+                if x > 96 {
+                    x - 32
+                } else {
+                    x
+                }
+            }
+            let x: u8 = byte_to_uppercase(*a);
+            let y: u8 = byte_to_uppercase(*b);
+            x.cmp(&y)
+        }
+        if let Some(ref x) = self.language {
+            try!(Display::fmt(&x.to_ascii_lowercase()[..], f))
+        }
+        for x in &self.extlangs {
+            try!(write!(f, "-{}", x.to_ascii_lowercase()));
+        }
+        if let Some(ref x) = self.script {
+            let y: String = x.chars()
+                             .enumerate()
+                             .map(|(i, c)| {
+                                 if i == 0 {
+                                     c.to_ascii_uppercase()
+                                 } else {
+                                     c.to_ascii_lowercase()
+                                 }
+                             })
+                             .collect();
+            try!(write!(f, "-{}", y));
+        }
+        if let Some(ref x) = self.region {
+            try!(write!(f, "-{}", x.to_ascii_uppercase()));
+        }
+        for x in &self.variants {
+            try!(write!(f, "-{}", x.to_ascii_lowercase()));
+        }
+        let mut extensions: Vec<(&u8, &Vec<String>)> = self.extensions.iter().collect();
+        extensions.sort_by(|&(a, _), &(b, _)| cmp_ignore_ascii_case(a, b));
+        for (raw_key, values) in extensions {
+            let mut key = String::new();
+            key.push(*raw_key as char);
+            try!(write!(f, "-{}", key));
+            for value in values {
+                try!(write!(f, "-{}", value));
+            }
+        }
+        if !self.privateuse.is_empty() {
+            if self.language.is_none() {
+                try!(f.write_str("x"));
+            } else {
+                try!(f.write_str("-x"));
+            }
+            for value in &self.privateuse {
+                try!(write!(f, "-{}", value));
+            }
+        }
+        Ok(())
+    }
+}
+
+#[macro_export]
+/// Utility for creating simple language tags.
+///
+/// The macro supports the language, exlang, script and region parts of language tags,
+/// they are separated by semicolons, omitted parts are denoted with mulitple semicolons.
+///
+/// # Examples
+/// * `it`: `langtag!(it)`
+/// * `it-LY`: `langtag!(it;;;LY)`
+/// * `it-Arab-LY`: `langtag!(it;;Arab;LY)`
+/// * `ar-afb`: `langtag!(ar;afb)`
+/// * `i-enochian`: `langtag!(i-enochian)`
+macro_rules! langtag {
+    ( $language:expr ) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: Vec::new(),
+            script: None,
+            region: None,
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;;;$region:expr ) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: Vec::new(),
+            script: None,
+            region: Some(stringify!($region).to_owned()),
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;;$script:expr ) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: Vec::new(),
+            script: Some(stringify!($script).to_owned()),
+            region: None,
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;;$script:expr;$region:expr ) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: Vec::new(),
+            script: Some(stringify!($script).to_owned()),
+            region: Some(stringify!($region).to_owned()),
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;$extlangs:expr) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: vec![stringify!($extlangs).to_owned()],
+            script: None,
+            region: None,
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;$extlangs:expr;$script:expr) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: vec![stringify!($extlangs).to_owned()],
+            script: Some(stringify!($script).to_owned()),
+            region: None,
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;$extlangs:expr;;$region:expr ) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: vec![stringify!($extlangs).to_owned()],
+            script: None,
+            region: Some(stringify!($region).to_owned()),
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+    ( $language:expr;$extlangs:expr;$script:expr;$region:expr ) => {
+        $crate::LanguageTag {
+            language: Some(stringify!($language).to_owned()),
+            extlangs: vec![stringify!($extlangs).to_owned()],
+            script: Some(stringify!($script).to_owned()),
+            region: Some(stringify!($region).to_owned()),
+            variants: Vec::new(),
+            extensions: ::std::collections::BTreeMap::new(),
+            privateuse: Vec::new(),
+        }
+    };
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/language-tags/tests/tests.rs
@@ -0,0 +1,580 @@
+#[macro_use]
+extern crate language_tags;
+
+use std::ascii::AsciiExt;
+use std::default::Default;
+use std::collections::BTreeMap;
+
+use language_tags::{Error, LanguageTag, Result};
+
+// All tests here may be completly nonsensical.
+
+#[test]
+fn test_lang_from_str() {
+    let a: LanguageTag = "de".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("de".to_owned());
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_extlang_from_str() {
+    let a: LanguageTag = "ar-afb".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("ar".to_owned());
+    b.extlangs = vec!["afb".to_owned()];
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_script_from_str() {
+    let a: LanguageTag = "ar-afb-Latn".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("ar".to_owned());
+    b.extlangs = vec!["afb".to_owned()];
+    b.script = Some("latn".to_owned());
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_region_from_str() {
+    let mut a: LanguageTag = "ar-DE".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("ar".to_owned());
+    b.region = Some("de".to_owned());
+    assert_eq!(a, b);
+
+    a = "ar-005".parse().unwrap();
+    b = Default::default();
+    b.language = Some("ar".to_owned());
+    b.region = Some("005".to_owned());
+    assert_eq!(a, b);
+
+    a = "ar-005".parse().unwrap();
+    b = Default::default();
+    b.language = Some("ar".to_owned());
+    b.region = Some("005".to_owned());
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_variant_from_str() {
+    let a: LanguageTag = "sl-IT-nedis".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("sl".parse().unwrap());
+    b.region = Some("it".parse().unwrap());
+    b.variants = vec!["nedis".parse().unwrap()];
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_invalid_from_str() {
+    assert_eq!("sl-07".parse::<LanguageTag>(), Err(Error::InvalidSubtag));
+}
+
+#[test]
+fn test_strange_case_from_str() {
+    // This is a perfectly valid language code
+    let a: LanguageTag = "SL-AFB-lATN-005-nEdis".parse().unwrap();
+    let b = LanguageTag {
+        language: Some("sl".to_owned()),
+        extlangs: vec!["afb".to_owned()],
+        script: Some("Latn".to_owned()),
+        region: Some("005".to_owned()),
+        variants: vec!["nedis".to_owned()],
+        extensions: BTreeMap::new(),
+        privateuse: Vec::new(),
+    };
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_fmt() {
+    let a: LanguageTag = "ar-arb-Latn-DE-nedis-foobar".parse().unwrap();
+    assert_eq!(format!("{}", a), "ar-arb-Latn-DE-nedis-foobar");
+    let b: LanguageTag = "ar-arb-latn-de-nedis-foobar".parse().unwrap();
+    assert_eq!(format!("{}", b), "ar-arb-Latn-DE-nedis-foobar");
+    let b: LanguageTag = "AR-ARB-LATN-DE-NEDIS-FOOBAR".parse().unwrap();
+    assert_eq!(format!("{}", b), "ar-arb-Latn-DE-nedis-foobar");
+    let b: LanguageTag = "xx-z-foo-a-bar-F-spam-b-eggs".parse().unwrap();
+    assert_eq!(format!("{}", b), "xx-a-bar-b-eggs-F-spam-z-foo");
+}
+
+#[test]
+fn test_match() {
+    let de_de: LanguageTag = "de-DE".parse().unwrap();
+    let de: LanguageTag = "de".parse().unwrap();
+    assert!(de.matches(&de_de));
+    assert!(!de_de.matches(&de));
+}
+
+#[test]
+fn test_match_all() {
+    let de_de: LanguageTag = "de-DE".parse().unwrap();
+    let crazy: LanguageTag = "GDJ-nHYa-bw-X-ke-rohH5GfS-LdJKsGVe".parse().unwrap();
+    let wildcard: LanguageTag = Default::default();
+    assert!(wildcard.matches(&de_de));
+    assert!(wildcard.matches(&crazy));
+}
+
+#[test]
+fn test_klingon() {
+    let a: LanguageTag = "i-klingon".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("i-klingon".to_owned());
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_private_use() {
+    let a: LanguageTag = "es-x-foobar-AT-007".parse().unwrap();
+    let mut b: LanguageTag = Default::default();
+    b.language = Some("es".to_owned());
+    b.privateuse = vec!["foobar".to_owned(), "AT".to_owned(), "007".to_owned()];
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_unicode() {
+    let x: Result<LanguageTag> = "zh-x-Üńìcødê".parse();
+    assert!(x.is_err());
+}
+
+#[test]
+fn test_format() {
+    let x: LanguageTag = "HkgnmerM-x-e5-zf-VdDjcpz-1V6".parse().unwrap();
+    assert!(format!("{}", x).eq_ignore_ascii_case("HkgnmerM-x-e5-zf-VdDjcpz-1V6"));
+    let y: LanguageTag = "MgxQa-ywEp-8lcW-7bvT-h-dP1Md-0h7-0Z3ir".parse().unwrap();
+    assert!(format!("{}", y).eq_ignore_ascii_case("MgxQa-ywEp-8lcW-7bvT-h-dP1Md-0h7-0Z3ir"));
+}
+
+#[test]
+fn test_cmp() {
+    assert_eq!(langtag!(dE;;AraB;lY), langtag!(DE;;aRaB;LY));
+    assert!(langtag!(dE;;AraB;lY).matches(&langtag!(DE;;aRaB;LY)));
+    let mut extensions = BTreeMap::new();
+    extensions.insert(75 /* K */, vec!["foo".to_owned(), "bar".to_owned()]);
+    extensions.insert(112 /* p */, vec!["spam".to_owned(), "eggs".to_owned()]);
+    let langtag = LanguageTag {
+        language: Some("it".to_owned()),
+        extlangs: Vec::new(),
+        script: None,
+        region: None,
+        variants: Vec::new(),
+        extensions: extensions,
+        privateuse: Vec::new(),
+    };
+    assert_eq!(langtag, langtag);
+}
+
+#[test]
+fn test_macro() {
+    let a1 = langtag!(it);
+    let a2 = LanguageTag {
+        language: Some("it".to_owned()),
+        extlangs: Vec::new(),
+        script: None,
+        region: None,
+        variants: Vec::new(),
+        extensions: BTreeMap::new(),
+        privateuse: Vec::new(),
+    };
+    assert_eq!(a1, a2);
+    let b1 = langtag!(it;;;LY);
+    let b2 = LanguageTag {
+        language: Some("it".to_owned()),
+        extlangs: Vec::new(),
+        script: None,
+        region: Some("LY".to_owned()),
+        variants: Vec::new(),
+        extensions: BTreeMap::new(),
+        privateuse: Vec::new(),
+    };
+    assert_eq!(b1, b2);
+    let c1 = langtag!(it;;Arab;LY);
+    let c2 = LanguageTag {
+        language: Some("it".to_owned()),
+        extlangs: Vec::new(),
+        script: Some("Arab".to_owned()),
+        region: Some("LY".to_owned()),
+        variants: Vec::new(),
+        extensions: BTreeMap::new(),
+        privateuse: Vec::new(),
+    };
+    assert_eq!(c1, c2);
+}
+
+#[test]
+fn test_private_tag() {
+    let mut tag: LanguageTag = Default::default();
+    tag.privateuse = vec!["foo".to_owned(), "bar".to_owned()];
+    assert_eq!(format!("{}", tag), "x-foo-bar");
+}
+
+#[test]
+fn test_grandfathered_tag() {
+    let tag_irregular: LanguageTag = "i-klingon".parse().unwrap();
+    assert_eq!(tag_irregular.language.unwrap(), "i-klingon");
+    let tag_regular: LanguageTag = "zh-hakka".parse().unwrap();
+    assert_eq!(tag_regular.language.unwrap(), "zh-hakka");
+}
+
+#[test]
+fn test_eq() {
+    let mut tag1: LanguageTag = Default::default();
+    tag1.language = Some("zh".to_owned());
+    let mut tag2: LanguageTag = Default::default();
+    tag2.language = Some("zh".to_owned());
+    tag2.script = Some("Latn".to_owned());
+    assert!(tag1 != tag2);
+}
+
+#[test]
+fn test_wellformed_tags() {
+    // Source: http://www.langtag.net/test-suites/well-formed-tags.txt
+    let tags = vec![
+        "fr ",
+        "fr-Latn",
+        "fr-fra", // Extended tag
+        "fr-Latn-FR",
+        "fr-Latn-419",
+        "fr-FR",
+        "ax-TZ", // Not in the registry, but well-formed
+        "fr-shadok", // Variant
+        "fr-y-myext-myext2",
+        "fra-Latn", // ISO 639 can be 3-letters
+        "fra",
+        "fra-FX",
+        "i-klingon", // grandfathered with singleton
+        "I-kLINgon", // tags are case-insensitive...
+        "no-bok", // grandfathered without singleton
+        "fr-Lat", // Extended",
+        "mn-Cyrl-MN",
+        "mN-cYrL-Mn",
+        "fr-Latn-CA",
+        "en-US",
+        "fr-Latn-CA",
+        "i-enochian", // Grand fathered
+        "x-fr-CH ",
+        "sr-Latn-CS",
+        "es-419",
+        "sl-nedis",
+        "de-CH-1996",
+        "de-Latg-1996",
+        "sl-IT-nedis",
+        "en-a-bbb-x-a-ccc",
+        "de-a-value",
+        "en-Latn-GB-boont-r-extended-sequence-x-private",
+        "en-x-US",
+        "az-Arab-x-AZE-derbend",
+        "es-Latn-CO-x-private",
+        "en-US-boont",
+        "ab-x-abc-x-abc", // anything goes after x
+        "ab-x-abc-a-a", // ditto",
+        "i-default", // grandfathered",
+        "i-klingon", // grandfathered",
+        "abcd-Latn", // Language of 4 chars reserved for future use
+        "AaBbCcDd-x-y-any-x", // Language of 5-8 chars, registered
+        "en",
+        "de-AT",
+        "es-419",
+        "de-CH-1901",
+        "sr-Cyrl",
+        "sr-Cyrl-CS",
+        "sl-Latn-IT-rozaj",
+        "en-US-x-twain",
+        "zh-cmn",
+        "zh-cmn-Hant",
+        "zh-cmn-Hant-HK",
+        "zh-gan",
+        "zh-yue-Hant-HK",
+        "xr-lxs-qut", // extlangS
+        "xr-lqt-qu", // extlang + region
+        "xr-p-lze", // Extension
+    ];
+    let failed: Vec<&str> = tags.iter()
+                                .filter(|x| x.parse::<LanguageTag>().is_err())
+                                .map(|&x| x)
+                                .collect();
+    println!("Number: { } Failed: {:?}", failed.len(), failed);
+    assert!(failed.is_empty());
+}
+
+#[test]
+fn test_broken_tags() {
+    // http://www.langtag.net/test-suites/broken-tags.txt
+    let tags = vec![
+        "f",
+        "f-Latn",
+        "fr-Latn-F",
+        "a-value",
+        "en-a-bbb-a-ccc", // 'a' appears twice
+        "tlh-a-b-foo",
+        "i-notexist", // grandfathered but not registered: always invalid
+        "abcdefghi-012345678",
+        "ab-abc-abc-abc-abc",
+        "ab-abcd-abc",
+        "ab-ab-abc",
+        "ab-123-abc",
+        "a-Hant-ZH",
+        "a1-Hant-ZH",
+        "ab-abcde-abc",
+        "ab-1abc-abc",
+        "ab-ab-abcd",
+        "ab-123-abcd",
+        "ab-abcde-abcd",
+        "ab-1abc-abcd",
+        "ab-a-b",
+        "ab-a-x",
+        "ab--ab",
+        "ab-abc-",
+        "-ab-abc",
+        "ab-c-abc-r-toto-c-abc  # 'c' appears twice ",
+        "abcd-efg",
+        "aabbccddE",
+    ];
+    let failed: Vec<(&str, Result<LanguageTag>)> = tags.iter()
+                                                       .map(|x| (*x, x.parse::<LanguageTag>()))
+                                                       .filter(|x| x.1.is_ok())
+                                                       .collect();
+    println!("Number: { } Failed: {:?}", failed.len(), failed);
+    assert!(failed.is_empty());
+}
+
+#[test]
+fn test_random_good_tags() {
+    // http://unicode.org/repos/cldr/trunk/tools/java/org/unicode/cldr/util/data/langtagTest.txt
+    let tags = vec!["zszLDm-sCVS-es-x-gn762vG-83-S-mlL",
+                    "IIJdFI-cfZv",
+                    "kbAxSgJ-685",
+                    "tbutP",
+                    "hDL-595",
+                    "dUf-iUjq-0hJ4P-5YkF-WD8fk",
+                    "FZAABA-FH",
+                    "xZ-lh-4QfM5z9J-1eG4-x-K-R6VPr2z",
+                    "Fyi",
+                    "SeI-DbaG",
+                    "ch-xwFn",
+                    "OeC-GPVI",
+                    "JLzvUSi",
+                    "Fxh-hLAs",
+                    "pKHzCP-sgaO-554",
+                    "eytqeW-hfgH-uQ",
+                    "ydn-zeOP-PR",
+                    "uoWmBM-yHCf-JE",
+                    "xwYem",
+                    "zie",
+                    "Re-wjSv-Ey-i-XE-E-JjWTEB8-f-DLSH-NVzLH-AtnFGWoH-SIDE",
+                    "Ri-063-c-u6v-ZfhkToTB-C-IFfmv-XT-j-rdyYFMhK-h-pY-D5-Oh6FqBhL-hcXt-v-WdpNx71-\
+                     K-c74m4-eBTT7-JdH7Q1Z",
+                    "ji",
+                    "IM-487",
+                    "EPZ-zwcB",
+                    "GauwEcwo",
+                    "kDEP",
+                    "FwDYt-TNvo",
+                    "ottqP-KLES-x-9-i9",
+                    "fcflR-grQQ",
+                    "TvFwdu-kYhs",
+                    "WE-336",
+                    "MgxQa-ywEp-8lcW-7bvT-h-dP1Md-0h7-0Z3ir-K-Srkm-kA-7LXM-Z-whb2MiO-2mNsvbLm-W3O\
+                     -4r-U-KceIxHdI-gvMVgUBV-2uRUni-J0-7C8yTK2",
+                    "Hyr-B-evMtVoB1-mtsVZf-vQMV-gM-I-rr-kvLzg-f-lAUK-Qb36Ne-Z-7eFzOD-mv6kKf-l-miZ\
+                     7U3-k-XDGtNQG",
+                    "ybrlCpzy",
+                    "PTow-w-cAQ51-8Xd6E-cumicgt-WpkZv3NY-q-ORYPRy-v-A4jL4A-iNEqQZZ-sjKn-W-N1F-pzy\
+                     c-xP5eWz-LmsCiCcZ",
+                    "ih-DlPR-PE",
+                    "Krf-362",
+                    "WzaD",
+                    "EPaOnB-gHHn",
+                    "XYta",
+                    "NZ-RgOO-tR",
+                    "at-FE",
+                    "Tpc-693",
+                    "YFp",
+                    "gRQrQULo",
+                    "pVomZ-585",
+                    "laSu-ZcAq-338",
+                    "gCW",
+                    "PydSwHRI-TYfF",
+                    "zKmWDD",
+                    "X-bCrL5RL",
+                    "HK",
+                    "YMKGcLY",
+                    "GDJ-nHYa-bw-X-ke-rohH5GfS-LdJKsGVe",
+                    "tfOxdau-yjge-489-a-oB-I8Csb-1ESaK1v-VFNz-N-FT-ZQyn-On2-I-hu-vaW3-jIQb-vg0U-h\
+                     Ul-h-dO6KuJqB-U-tde2L-P3gHUY-vnl5c-RyO-H-gK1-zDPu-VF1oeh8W-kGzzvBbW-yuAJZ",
+                    "LwDux",
+                    "Zl-072",
+                    "Ri-Ar",
+                    "vocMSwo-cJnr-288",
+                    "kUWq-gWfQ-794",
+                    "YyzqKL-273",
+                    "Xrw-ZHwH-841-9foT-ESSZF-6OqO-0knk-991U-9p3m-b-JhiV-0Kq7Y-h-cxphLb-cDlXUBOQ-X\
+                     -4Ti-jty94yPp",
+                    "en-GB-oed",
+                    "LEuZl-so",
+                    "HyvBvFi-cCAl-X-irMQA-Pzt-H",
+                    "uDbsrAA-304",
+                    "wTS",
+                    "IWXS",
+                    "XvDqNkSn-jRDR",
+                    "gX-Ycbb-iLphEks-AQ1aJ5",
+                    "FbSBz-VLcR-VL",
+                    "JYoVQOP-Iytp",
+                    "gDSoDGD-lq-v-7aFec-ag-k-Z4-0kgNxXC-7h",
+                    "Bjvoayy-029",
+                    "qSDJd",
+                    "qpbQov",
+                    "fYIll-516",
+                    "GfgLyfWE-EHtB",
+                    "Wc-ZMtk",
+                    "cgh-VEYK",
+                    "WRZs-AaFd-yQ",
+                    "eSb-CpsZ-788",
+                    "YVwFU",
+                    "JSsHiQhr-MpjT-381",
+                    "LuhtJIQi-JKYt",
+                    "vVTvS-RHcP",
+                    "SY",
+                    "fSf-EgvQfI-ktWoG-8X5z-63PW",
+                    "NOKcy",
+                    "OjJb-550",
+                    "KB",
+                    "qzKBv-zDKk-589",
+                    "Jr",
+                    "Acw-GPXf-088",
+                    "WAFSbos",
+                    "HkgnmerM-x-e5-zf-VdDjcpz-1V6",
+                    "UAfYflJU-uXDc-YV",
+                    "x-CHsHx-VDcOUAur-FqagDTx-H-V0e74R",
+                    "uZIAZ-Xmbh-pd"];
+    let failed: Vec<(&str, Result<LanguageTag>)> = tags.iter()
+                                                       .map(|x| (*x, x.parse::<LanguageTag>()))
+                                                       .filter(|x| x.1.is_err())
+                                                       .collect();
+    println!("Number: { } Failed: {:?}", failed.len(), failed);
+    assert!(failed.is_empty());
+}
+
+#[test]
+fn test_random_bad_tags() {
+    // http://unicode.org/repos/cldr/trunk/tools/java/org/unicode/cldr/util/data/langtagTest.txt
+    let tags = vec!["EdY-z_H791Xx6_m_kj",
+                    "qWt85_8S0-L_rbBDq0gl_m_O_zsAx_nRS",
+                    "VzyL2",
+                    "T_VFJq-L-0JWuH_u2_VW-hK-kbE",
+                    "u-t",
+                    "Q-f_ZVJXyc-doj_k-i",
+                    "JWB7gNa_K-5GB-25t_W-s-ZbGVwDu1-H3E",
+                    "b-2T-Qob_L-C9v_2CZxK86",
+                    "fQTpX_0_4Vg_L3L_g7VtALh2",
+                    "S-Z-E_J",
+                    "f6wsq-02_i-F",
+                    "9_GcUPq_G",
+                    "QjsIy_9-0-7_Dv2yPV09_D-JXWXM",
+                    "D_se-f-k",
+                    "ON47Wv1_2_W",
+                    "f-z-R_s-ha",
+                    "N3APeiw_195_Bx2-mM-pf-Z-Ip5lXWa-5r",
+                    "IRjxU-E_6kS_D_b1b_H",
+                    "NB-3-5-AyW_FQ-9hB-TrRJg3JV_3C",
+                    "yF-3a_V_FoJQAHeL_Z-Mc-u",
+                    "n_w_bbunOG_1-s-tJMT5je",
+                    "Q-AEWE_X",
+                    "57b1O_k_R6MU_sb",
+                    "hK_65J_i-o_SI-Y",
+                    "wB4B7u_5I2_I_NZPI",
+                    "J24Nb_q_d-zE",
+                    "v6-dHjJmvPS_IEb-x_A-O-i",
+                    "8_8_dl-ZgBr84u-P-E",
+                    "nIn-xD7EVhe_C",
+                    "5_N-6P_x7Of_Lo_6_YX_R",
+                    "0_46Oo0sZ-YNwiU8Wr_d-M-pg1OriV",
+                    "laiY-5",
+                    "K-8Mdd-j_ila0sSpo_aO8_J",
+                    "wNATtSL-Cp4_gPa_fD41_9z",
+                    "H_FGz5V8_n6rrcoz0_1O6d-kH-7-N",
+                    "wDOrnHU-odqJ_vWl",
+                    "gP_qO-I-jH",
+                    "h",
+                    "dJ0hX-o_csBykEhU-F",
+                    "L-Vf7_BV_eRJ5goSF_Kp",
+                    "y-oF-chnavU-H",
+                    "9FkG-8Q-8_v",
+                    "W_l_NDQqI-O_SFSAOVq",
+                    "kDG3fzXw",
+                    "t-nsSp-7-t-mUK2",
+                    "Yw-F",
+                    "1-S_3_l",
+                    "u-v_brn-Y",
+                    "4_ft_3ZPZC5lA_D",
+                    "n_dR-QodsqJnh_e",
+                    "Hwvt-bSwZwj_KL-hxg0m-3_hUG",
+                    "mQHzvcV-UL-o2O_1KhUJQo_G2_uryk3-a",
+                    "b-UTn33HF",
+                    "r-Ep-jY-aFM_N_H",
+                    "K-k-krEZ0gwD_k_ua-9dm3Oy-s_v",
+                    "XS_oS-p",
+                    "EIx_h-zf5",
+                    "p_z-0_i-omQCo3B",
+                    "1_q0N_jo_9",
+                    "0Ai-6-S",
+                    "L-LZEp_HtW",
+                    "Zj-A4JD_2A5Aj7_b-m3",
+                    "x",
+                    "p-qPuXQpp_d-jeKifB-c-7_G-X",
+                    "X94cvJ_A",
+                    "F2D25R_qk_W-w_Okf_kx",
+                    "rc-f",
+                    "D",
+                    "gD_WrDfxmF-wu-E-U4t",
+                    "Z_BN9O4_D9-D_0E_KnCwZF-84b-19",
+                    "T-8_g-u-0_E",
+                    "lXTtys9j_X_A_m-vtNiNMw_X_b-C6Nr",
+                    "V_Ps-4Y-S",
+                    "X5wGEA",
+                    "mIbHFf_ALu4_Jo1Z1",
+                    "ET-TacYx_c",
+                    "Z-Lm5cAP_ri88-d_q_fi8-x",
+                    "rTi2ah-4j_j_4AlxTs6m_8-g9zqncIf-N5",
+                    "FBaLB85_u-0NxhAy-ZU_9c",
+                    "x_j_l-5_aV95_s_tY_jp4",
+                    "PL768_D-m7jNWjfD-Nl_7qvb_bs_8_Vg",
+                    "9-yOc-gbh",
+                    "6DYxZ_SL-S_Ye",
+                    "ZCa-U-muib-6-d-f_oEh_O",
+                    "Qt-S-o8340F_f_aGax-c-jbV0gfK_p",
+                    "WE_SzOI_OGuoBDk-gDp",
+                    "cs-Y_9",
+                    "m1_uj",
+                    "Y-ob_PT",
+                    "li-B",
+                    "f-2-7-9m_f8den_J_T_d",
+                    "p-Os0dua-H_o-u",
+                    "L",
+                    "rby-w"];
+    let failed: Vec<(&str, Result<LanguageTag>)> = tags.iter()
+                                                       .map(|x| (*x, x.parse::<LanguageTag>()))
+                                                       .filter(|x| x.1.is_ok())
+                                                       .collect();
+    println!("Number: { } Failed: {:?}", failed.len(), failed);
+    assert!(failed.is_empty());
+}
+
+#[test]
+fn test_canonicalize() {
+    let langtag = langtag!(en;;;BU);
+    assert_eq!(langtag.canonicalize().to_string(), "en-MM");
+    let langtag = LanguageTag {
+        language: Some("sgn-BE-FR".to_owned()),
+        extlangs: vec![],
+        script: None,
+        region: None,
+        variants: vec![],
+        extensions: BTreeMap::new(),
+        privateuse: vec![],
+    };
+    assert_eq!(langtag.canonicalize().to_string(), "sfb");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"ee9afa8d5e10d088632b66c622d4451a826a4066e0e84052f40b9b3e82c6bec7",".travis.yml":"eea0007a95867df1d3c5b8701b893bfda2773c95f3cd2e4e44d159c4ef834cdd","Cargo.toml":"e50632bb46a33d96af38ec11201ea2371cab8992cae328fd20e3a6bc1e323f06","LICENSE":"79d26c3d855d83d92837c49a868339ec7c2ef7d2a19d7a779ebb4c30d160d90a","README.md":"932d081be16cf7b787400973604712c80b2bc119764c7b742c53cf093cd056fa","src/lib.rs":"0ee6b5a09c6781a9a420cc9ac66790a47b7303aea74093c26d6758a20c248917","src/liblib.so":"34037b491a9d4c55de6f630d47b43ea9ea384d8b915c5bae58495a0982d9f99f","tests/test.rs":"72d312e97491667dee4082d9880df23496d2cd8aa01ff2f9af22cdc6df2c8216"},"package":"cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/.gitignore
@@ -0,0 +1,4 @@
+target
+doc
+Cargo.lock
+.cargo
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/.travis.yml
@@ -0,0 +1,21 @@
+language: rust
+rust:
+- nightly
+- beta
+- stable
+before_script:
+- |
+  pip install 'travis-cargo<0.2' --user &&
+  export PATH=$HOME/.local/bin:$PATH
+script:
+- |
+  travis-cargo build &&
+  travis-cargo test &&
+  travis-cargo bench &&
+  travis-cargo --only stable doc
+after_success:
+- travis-cargo --only stable doc-upload
+env:
+  global:
+  - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
+  - secure: YXu24LptjeYirjWYjWGsMT2m3mB7LvQATE6TVo7VEUXv8GYoy2ORIHD83PeImxC93MmZ01QeUezRzuCW51ZcK92VnNSBttlF60SvIX18VsJrV92tsAhievFstqYQ+fB8DIuQ8noU0jPz7GpI+R9dlTRSImAqWOnVIghA+Wzz7Js=
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "lazy_static"
+version = "0.1.16"
+authors = ["Marvin Löbel <loebel.marvin@gmail.com>"]
+license = "MIT"
+
+description = "A macro for declaring lazily evaluated statics in Rust."
+readme = "README.md"
+documentation = "http://rust-lang-nursery.github.io/lazy-static.rs/lazy_static/index.html"
+
+repository = "https://github.com/rust-lang-nursery/lazy-static.rs"
+keywords = ["macro", "lazy", "static"]
+
+[features]
+nightly = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Marvin Löbel
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/README.md
@@ -0,0 +1,81 @@
+lazy-static.rs
+==============
+
+[![Travis-CI Status](https://travis-ci.org/rust-lang-nursery/lazy-static.rs.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/lazy-static.rs)
+
+A macro for declaring lazily evaluated statics in Rust.
+
+Using this macro, it is possible to have `static`s that require code to be
+executed at runtime in order to be initialized.
+This includes anything requiring heap allocations, like vectors or hash maps,
+as well as anything that requires function calls to be computed.
+
+# Syntax
+
+```rust
+lazy_static! {
+    [pub] static ref NAME_1: TYPE_1 = EXPR_1;
+    [pub] static ref NAME_2: TYPE_2 = EXPR_2;
+    ...
+    [pub] static ref NAME_N: TYPE_N = EXPR_N;
+}
+```
+
+# Semantic
+
+For a given `static ref NAME: TYPE = EXPR;`, the macro generates a
+unique type that implements `Deref<TYPE>` and stores it in a static with name `NAME`.
+
+On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
+can return a reference to the same object.
+
+Like regular `static mut`s, this macro only works for types that fulfill the `Sync`
+trait.
+
+# Getting Started
+
+[lazy-static.rs is available on crates.io](https://crates.io/crates/lazy_static).
+Add the following dependency to your Cargo manifest to get the latest version of the 0.1 branch:
+
+```toml
+[dependencies]
+lazy_static = "0.1.*"
+```
+
+To always get the latest version, add this git repository to your
+Cargo manifest:
+
+```toml
+[dependencies.lazy_static]
+git = "https://github.com/rust-lang-nursery/lazy-static.rs"
+```
+# Example
+
+Using the macro:
+
+```rust
+#[macro_use]
+extern crate lazy_static;
+
+use std::collections::HashMap;
+
+lazy_static! {
+    static ref HASHMAP: HashMap<u32, &'static str> = {
+        let mut m = HashMap::new();
+        m.insert(0, "foo");
+        m.insert(1, "bar");
+        m.insert(2, "baz");
+        m
+    };
+    static ref COUNT: usize = HASHMAP.len();
+    static ref NUMBER: u32 = times_two(21);
+}
+
+fn times_two(n: u32) -> u32 { n * 2 }
+
+fn main() {
+    println!("The map has {} entries.", *COUNT);
+    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
+    println!("An expensive calculation on a static results in: {}.", *NUMBER);
+}
+```
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/src/lib.rs
@@ -0,0 +1,157 @@
+/*!
+A macro for declaring lazily evaluated statics.
+
+Using this macro, it is possible to have `static`s that require code to be
+executed at runtime in order to be initialized.
+This includes anything requiring heap allocations, like vectors or hash maps,
+as well as anything that requires function calls to be computed.
+
+# Syntax
+
+```ignore
+lazy_static! {
+    [pub] static ref NAME_1: TYPE_1 = EXPR_1;
+    [pub] static ref NAME_2: TYPE_2 = EXPR_2;
+    ...
+    [pub] static ref NAME_N: TYPE_N = EXPR_N;
+}
+```
+
+Metadata (such as doc comments) is allowed on each ref.
+
+# Semantic
+
+For a given `static ref NAME: TYPE = EXPR;`, the macro generates a unique type that
+implements `Deref<TYPE>` and stores it in a static with name `NAME`. (Metadata ends up
+attaching to this type.)
+
+On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
+can return a reference to the same object.
+
+Like regular `static mut`s, this macro only works for types that fulfill the `Sync`
+trait.
+
+# Example
+
+Using the macro:
+
+```rust
+#[macro_use]
+extern crate lazy_static;
+
+use std::collections::HashMap;
+
+lazy_static! {
+    static ref HASHMAP: HashMap<u32, &'static str> = {
+        let mut m = HashMap::new();
+        m.insert(0, "foo");
+        m.insert(1, "bar");
+        m.insert(2, "baz");
+        m
+    };
+    static ref COUNT: usize = HASHMAP.len();
+    static ref NUMBER: u32 = times_two(21);
+}
+
+fn times_two(n: u32) -> u32 { n * 2 }
+
+fn main() {
+    println!("The map has {} entries.", *COUNT);
+    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
+    println!("A expensive calculation on a static results in: {}.", *NUMBER);
+}
+```
+
+# Implementation details
+
+The `Deref` implementation uses a hidden static variable that is guarded by a atomic check on each access. On stable Rust, the macro may need to allocate each static on the heap.
+
+*/
+
+#![cfg_attr(feature="nightly", feature(const_fn, core_intrinsics))]
+#![crate_type = "dylib"]
+
+#[macro_export]
+macro_rules! lazy_static {
+    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        lazy_static!(PRIV, $(#[$attr])* static ref $N : $T = $e; $($t)*);
+    };
+    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        lazy_static!(PUB, $(#[$attr])* static ref $N : $T = $e; $($t)*);
+    };
+    ($VIS:ident, $(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        lazy_static!(MAKE TY, $VIS, $(#[$attr])*, $N);
+        impl ::std::ops::Deref for $N {
+            type Target = $T;
+            fn deref<'a>(&'a self) -> &'a $T {
+                #[inline(always)]
+                fn __static_ref_initialize() -> $T { $e }
+
+                unsafe {
+                    use std::sync::{Once, ONCE_INIT};
+
+                    #[inline(always)]
+                    fn require_sync<T: Sync>(_: &T) { }
+
+                    #[inline(always)]
+                    #[cfg(feature="nightly")]
+                    unsafe fn __stability() -> &'static $T {
+                        use std::cell::UnsafeCell;
+
+                        struct SyncCell(UnsafeCell<Option<$T>>);
+                        unsafe impl Sync for SyncCell {}
+
+                        static DATA: SyncCell = SyncCell(UnsafeCell::new(None));
+                        static ONCE: Once = ONCE_INIT;
+                        ONCE.call_once(|| {
+                            *DATA.0.get() = Some(__static_ref_initialize());
+                        });
+                        match *DATA.0.get() {
+                            Some(ref x) => x,
+                            None => ::std::intrinsics::unreachable(),
+                        }
+                    }
+
+                    #[inline(always)]
+                    #[cfg(not(feature="nightly"))]
+                    unsafe fn __stability() -> &'static $T {
+                        use std::mem::transmute;
+                        use std::boxed::Box;
+
+                        static mut DATA: *const $T = 0 as *const $T;
+                        static mut ONCE: Once = ONCE_INIT;
+                        ONCE.call_once(|| {
+                            DATA = transmute::<Box<$T>, *const $T>(
+                                Box::new(__static_ref_initialize()));
+                        });
+                        &*DATA
+                    }
+
+                    let static_ref = __stability();
+                    require_sync(static_ref);
+                    static_ref
+                }
+            }
+        }
+        lazy_static!($($t)*);
+    };
+    (MAKE TY, PUB, $(#[$attr:meta])*, $N:ident) => {
+        #[allow(missing_copy_implementations)]
+        #[allow(non_camel_case_types)]
+        #[allow(dead_code)]
+        $(#[$attr])*
+        pub struct $N {__private_field: ()}
+        #[doc(hidden)]
+        pub static $N: $N = $N {__private_field: ()};
+    };
+    (MAKE TY, PRIV, $(#[$attr:meta])*, $N:ident) => {
+        #[allow(missing_copy_implementations)]
+        #[allow(non_camel_case_types)]
+        #[allow(dead_code)]
+        $(#[$attr])*
+        struct $N {__private_field: ()}
+        #[doc(hidden)]
+        static $N: $N = $N {__private_field: ()};
+    };
+    () => ()
+}
new file mode 100755
index 0000000000000000000000000000000000000000..cc69ddaf91a19920afb9747cfb0284537b744646
GIT binary patch
literal 1954792
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%0DBQ&P
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%0DpCMxM3<M4>xWfv`tl
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
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.1.16/tests/test.rs
@@ -0,0 +1,116 @@
+#![cfg_attr(feature="nightly", feature(const_fn, core_intrinsics))]
+
+#[macro_use]
+extern crate lazy_static;
+use std::collections::HashMap;
+
+lazy_static! {
+    /// Documentation!
+    pub static ref NUMBER: u32 = times_two(3);
+
+    static ref ARRAY_BOXES: [Box<u32>; 3] = [Box::new(1), Box::new(2), Box::new(3)];
+
+    /// More documentation!
+    #[allow(unused_variables)]
+    #[derive(Copy, Clone, Debug)]
+    pub static ref STRING: String = "hello".to_string();
+
+    static ref HASHMAP: HashMap<u32, &'static str> = {
+        let mut m = HashMap::new();
+        m.insert(0, "abc");
+        m.insert(1, "def");
+        m.insert(2, "ghi");
+        m
+    };
+
+    // This should not compile if the unsafe is removed.
+    static ref UNSAFE: u32 = unsafe {
+        std::mem::transmute::<i32, u32>(-1)
+    };
+
+    // This *should* triggger warn(dead_code) by design.
+    static ref UNUSED: () = ();
+
+}
+
+fn times_two(n: u32) -> u32 {
+    n * 2
+}
+
+#[test]
+fn test_basic() {
+    assert_eq!(&**STRING, "hello");
+    assert_eq!(*NUMBER, 6);
+    assert!(HASHMAP.get(&1).is_some());
+    assert!(HASHMAP.get(&3).is_none());
+    assert_eq!(&*ARRAY_BOXES, &[Box::new(1), Box::new(2), Box::new(3)]);
+    assert_eq!(*UNSAFE, std::u32::MAX);
+}
+
+#[test]
+fn test_repeat() {
+    assert_eq!(*NUMBER, 6);
+    assert_eq!(*NUMBER, 6);
+    assert_eq!(*NUMBER, 6);
+}
+
+#[test]
+fn test_meta() {
+    // this would not compile if STRING were not marked #[derive(Copy, Clone)]
+    let copy_of_string = STRING;
+    // just to make sure it was copied
+    assert!(&STRING as *const _ != &copy_of_string as *const _);
+
+    // this would not compile if STRING were not marked #[derive(Debug)]
+    assert_eq!(format!("{:?}", STRING), "STRING { __private_field: () }".to_string());
+}
+
+mod visibility {
+    lazy_static! {
+        pub static ref FOO: Box<u32> = Box::new(0);
+        static ref BAR: Box<u32> = Box::new(98);
+    }
+
+    #[test]
+    fn sub_test() {
+        assert_eq!(**FOO, 0);
+        assert_eq!(**BAR, 98);
+    }
+}
+
+#[test]
+fn test_visibility() {
+    assert_eq!(*visibility::FOO, Box::new(0));
+}
+
+// This should not cause a warning about a missing Copy implementation
+lazy_static! {
+    pub static ref VAR: i32 = { 0 };
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+struct X;
+struct Once(X);
+const ONCE_INIT: Once = Once(X);
+static DATA: X = X;
+static ONCE: X = X;
+fn require_sync() -> X { X }
+fn transmute() -> X { X }
+fn __static_ref_initialize() -> X { X }
+fn test(_: Vec<X>) -> X { X }
+
+// All these names should not be shadowed
+lazy_static! {
+    static ref ITEM_NAME_TEST: X = {
+        test(vec![X, Once(X).0, ONCE_INIT.0, DATA, ONCE,
+                  require_sync(), transmute(),
+                  // Except this, which will sadly be shadowed by internals:
+                  // __static_ref_initialize()
+                  ])
+    };
+}
+
+#[test]
+fn item_name_shadowing() {
+    assert_eq!(*ITEM_NAME_TEST, X);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"713aa1cac091a99e295194ca0dfd6d74028edbb02a0f5f627f3d3dfdf6437ee0","Cargo.toml":"cf9de6a21aa19f3f8c5e074625629f93f3f38cff8d57598e4287a554f10b1549","LICENSE":"df9cfd06d8a44d9a671eadd39ffd97f166481da015a30f45dfd27886209c5922","README.md":"706ee5777dbfea1255359f2dd3f905f7bb89282a528c9c14e38751e5e874fd5e","src/lib.rs":"9635770a9af281e355a538a5f629b9b338b9350c71cc2ec5f7c101794a3289f7"},"package":"9d69889cdc6336ed56b174514ce876c4c3dc564cc23dd872e7bca589bb2a36c8"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/.travis.yml
@@ -0,0 +1,3 @@
+language: rust
+rust: beta
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/Cargo.toml
@@ -0,0 +1,25 @@
+[package]
+
+name = "mime"
+version = "0.2.4"
+authors = ["Sean McArthur <sean.monstar@gmail.com>"]
+license = "MIT"
+description = "Strongly Typed Mimes"
+documentation = "http://hyperium.github.io/mime.rs"
+repository = "https://github.com/hyperium/mime.rs"
+keywords = ["mime", "media-extensions", "media-types"]
+
+[dependencies]
+log = "0.3"
+serde = { version = ">=0.7, <0.9", optional = true }
+
+[dev-dependencies]
+serde_json = ">=0.7, <0.9"
+
+[dependencies.heapsize]
+version = ">=0.2.0, <0.4"
+optional = true
+
+[features]
+heap_size = ["heapsize"]
+nightly = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2014 Sean McArthur
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/README.md
@@ -0,0 +1,11 @@
+# mime.rs
+
+[![Build Status](https://travis-ci.org/hyperium/mime.rs.svg?branch=master)](https://travis-ci.org/hyperium/mime.rs)
+
+Support MIME (Media Types) as strong types in Rust.
+
+[Documentation](http://hyperium.github.io/mime.rs)
+
+## License
+
+[MIT](./LICENSE)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mime/src/lib.rs
@@ -0,0 +1,632 @@
+//! # Mime
+//!
+//! Mime is now Media Type, technically, but `Mime` is more immediately
+//! understandable, so the main type here is `Mime`.
+//!
+//! ## What is Mime?
+//!
+//! Example mime string: `text/plain;charset=utf-8`
+//!
+//! ```rust
+//! # #[macro_use] extern crate mime;
+//! # fn main() {
+//! let plain_text: mime::Mime = "text/plain;charset=utf-8".parse().unwrap();
+//! assert_eq!(plain_text, mime!(Text/Plain; Charset=Utf8));
+//! # }
+//! ```
+
+#![doc(html_root_url = "https://hyperium.github.io/mime.rs")]
+#![cfg_attr(test, deny(warnings))]
+#![cfg_attr(all(feature = "nightly", test), feature(test))]
+
+#[macro_use]
+extern crate log;
+
+#[cfg(feature = "nightly")]
+#[cfg(test)]
+extern crate test;
+
+#[cfg(feature = "serde")]
+extern crate serde;
+
+#[cfg(feature = "serde")]
+#[cfg(test)]
+extern crate serde_json;
+
+#[cfg(feature = "heapsize")]
+extern crate heapsize;
+
+use std::ascii::AsciiExt;
+use std::fmt;
+use std::iter::Enumerate;
+use std::str::{FromStr, Chars};
+
+macro_rules! inspect(
+    ($s:expr, $t:expr) => ({
+        let t = $t;
+        trace!("inspect {}: {:?}", $s, t);
+        t
+    })
+);
+
+/// Mime, or Media Type. Encapsulates common registers types.
+///
+/// Consider that a traditional mime type contains a "top level type",
+/// a "sub level type", and 0-N "parameters". And they're all strings.
+/// Strings everywhere. Strings mean typos. Rust has type safety. We should
+/// use types!
+///
+/// So, Mime bundles together this data into types so the compiler can catch
+/// your typos.
+///
+/// This improves things so you use match without Strings:
+///
+/// ```rust
+/// use mime::{Mime, TopLevel, SubLevel};
+///
+/// let mime: Mime = "application/json".parse().unwrap();
+///
+/// match mime {
+///     Mime(TopLevel::Application, SubLevel::Json, _) => println!("matched json!"),
+///     _ => ()
+/// }
+/// ```
+#[derive(Clone, Debug, Eq, Hash, Ord, PartialOrd)]
+pub struct Mime<T: AsRef<[Param]> = Vec<Param>>(pub TopLevel, pub SubLevel, pub T);
+
+#[cfg(feature = "heapsize")]
+impl<T: AsRef<[Param]> + heapsize::HeapSizeOf> heapsize::HeapSizeOf for Mime<T> {
+    fn heap_size_of_children(&self) -> usize {
+        self.0.heap_size_of_children() +
+        self.1.heap_size_of_children() +
+        self.2.heap_size_of_children()
+    }
+}
+
+impl<LHS: AsRef<[Param]>, RHS: AsRef<[Param]>> PartialEq<Mime<RHS>> for Mime<LHS> {
+    fn eq(&self, other: &Mime<RHS>) -> bool {
+        self.0 == other.0 && self.1 == other.1 && self.2.as_ref() == other.2.as_ref()
+    }
+}
+
+/// Easily create a Mime without having to import so many enums.
+///
+/// # Example
+///
+/// ```
+/// # #[macro_use] extern crate mime;
+///
+/// # fn main() {
+/// let json = mime!(Application/Json);
+/// let plain = mime!(Text/Plain; Charset=Utf8);
+/// let text = mime!(Text/Html; Charset=("bar"), ("baz")=("quux"));
+/// let img = mime!(Image/_);
+/// # }
+/// ```
+#[macro_export]
+macro_rules! mime {
+    ($top:tt / $sub:tt) => (
+        mime!($top / $sub;)
+    );
+
+    ($top:tt / $sub:tt ; $($attr:tt = $val:tt),*) => (
+        $crate::Mime(
+            __mime__ident_or_ext!(TopLevel::$top),
+            __mime__ident_or_ext!(SubLevel::$sub),
+            vec![ $((__mime__ident_or_ext!(Attr::$attr), __mime__ident_or_ext!(Value::$val))),* ]
+        )
+    );
+}
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! __mime__ident_or_ext {
+    ($enoom:ident::_) => (
+        $crate::$enoom::Star
+    );
+    ($enoom:ident::($inner:expr)) => (
+        $crate::$enoom::Ext($inner.to_string())
+    );
+    ($enoom:ident::$var:ident) => (
+        $crate::$enoom::$var
+    )
+}
+
+macro_rules! enoom {
+    (pub enum $en:ident; $ext:ident; $($ty:ident, $text:expr;)*) => (
+
+        #[derive(Clone, Debug, Eq, Hash, Ord, PartialOrd)]
+        pub enum $en {
+            $($ty),*,
+            $ext(String)
+        }
+
+        impl $en {
+            pub fn as_str(&self) -> &str {
+                match *self {
+                    $($en::$ty => $text),*,
+                    $en::$ext(ref s) => &s
+                }
+            }
+        }
+
+        impl ::std::ops::Deref for $en {
+            type Target = str;
+            fn deref(&self) -> &str {
+                self.as_str()
+            }
+        }
+
+        impl PartialEq for $en {
+            fn eq(&self, other: &$en) -> bool {
+                match (self, other) {
+                    $( (&$en::$ty, &$en::$ty) => true ),*,
+                    (&$en::$ext(ref a), &$en::$ext(ref b)) => a == b,
+                    _ => self.as_str() == other.as_str()
+                }
+            }
+        }
+
+        impl PartialEq<String> for $en {
+            fn eq(&self, other: &String) -> bool {
+                self.as_str() == other
+            }
+        }
+
+        impl PartialEq<str> for $en {
+            fn eq(&self, other: &str) -> bool {
+                self.as_str() == other
+            }
+        }
+
+        impl<'a> PartialEq<&'a str> for $en {
+            fn eq(&self, other: &&'a str) -> bool {
+                self.as_str() == *other
+            }
+        }
+
+        impl PartialEq<$en> for String {
+            fn eq(&self, other: &$en) -> bool {
+                self == other.as_str()
+            }
+        }
+
+        impl PartialEq<$en> for str {
+            fn eq(&self, other: &$en) -> bool {
+                self == other.as_str()
+            }
+        }
+
+        impl<'a> PartialEq<$en> for &'a str {
+            fn eq(&self, other: &$en) -> bool {
+                *self == other.as_str()
+            }
+        }
+
+        impl fmt::Display for $en {
+            #[inline]
+            fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+                fmt.write_str(match *self {
+                    $($en::$ty => $text),*,
+                    $en::$ext(ref s) => s
+                })
+            }
+        }
+
+        impl FromStr for $en {
+            type Err = ();
+            fn from_str(s: &str) -> Result<$en, ()> {
+                Ok(match s {
+                    $(_s if _s == $text => $en::$ty),*,
+                    s => $en::$ext(inspect!(stringify!($ext), s).to_string())
+                })
+            }
+        }
+
+        #[cfg(feature = "heapsize")]
+        impl heapsize::HeapSizeOf for $en {
+            fn heap_size_of_children(&self) -> usize {
+                match *self {
+                    $en::$ext(ref ext) => ext.heap_size_of_children(),
+                    _ => 0,
+                }
+            }
+        }
+    )
+}
+
+enoom! {
+    pub enum TopLevel;
+    Ext;
+    Star, "*";
+    Text, "text";
+    Image, "image";
+    Audio, "audio";
+    Video, "video";
+    Application, "application";
+    Multipart, "multipart";
+    Message, "message";
+    Model, "model";
+}
+
+enoom! {
+    pub enum SubLevel;
+    Ext;
+    Star, "*";
+
+    // common text/*
+    Plain, "plain";
+    Html, "html";
+    Xml, "xml";
+    Javascript, "javascript";
+    Css, "css";
+    EventStream, "event-stream";
+
+    // common application/*
+    Json, "json";
+    WwwFormUrlEncoded, "x-www-form-urlencoded";
+    Msgpack, "msgpack";
+    OctetStream, "octet-stream";
+
+    // multipart/*
+    FormData, "form-data";
+
+    // common image/*
+    Png, "png";
+    Gif, "gif";
+    Bmp, "bmp";
+    Jpeg, "jpeg";
+
+    // audio/*
+    Mpeg, "mpeg";
+    Mp4, "mp4";
+    Ogg, "ogg";
+}
+
+enoom! {
+    pub enum Attr;
+    Ext;
+    Charset, "charset";
+    Boundary, "boundary";
+    Q, "q";
+}
+
+enoom! {
+    pub enum Value;
+    Ext;
+    Utf8, "utf-8";
+}
+
+pub type Param = (Attr, Value);
+
+impl<T: AsRef<[Param]>> fmt::Display for Mime<T> {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(fmt::Display::fmt(&self.0, f));
+        try!(f.write_str("/"));
+        try!(fmt::Display::fmt(&self.1, f));
+        for param in self.2.as_ref() {
+            try!(f.write_str("; "));
+            try!(fmt::Display::fmt(&param.0, f));
+            try!(f.write_str("="));
+            try!(fmt::Display::fmt(&param.1, f));
+        }
+        Ok(())
+    }
+}
+
+impl<P: AsRef<[Param]>> Mime<P> {
+    pub fn get_param<A: PartialEq<Attr>>(&self, attr: A) -> Option<&Value> {
+        self.2.as_ref().iter().find(|&&(ref name, _)| attr == *name).map(|&(_, ref value)| value)
+    }
+}
+
+impl FromStr for Mime {
+    type Err = ();
+    fn from_str(raw: &str) -> Result<Mime, ()> {
+        if raw == "*/*" {
+            return Ok(mime!(Star/Star));
+        }
+
+        let ascii = raw.to_ascii_lowercase(); // lifetimes :(
+        let len = ascii.len();
+        let mut iter = ascii.chars().enumerate();
+        let mut params = vec![];
+        // toplevel
+        let mut start;
+        let top;
+        loop {
+            match inspect!("top iter", iter.next()) {
+                Some((0, c)) if is_restricted_name_first_char(c) => (),
+                Some((i, c)) if i > 0 && is_restricted_name_char(c) => (),
+                Some((i, '/')) if i > 0 => match FromStr::from_str(&ascii[..i]) {
+                    Ok(t) => {
+                        top = t;
+                        start = i + 1;
+                        break;
+                    }
+                    Err(_) => return Err(())
+                },
+                _ => return Err(()) // EOF and no toplevel is no Mime
+            };
+
+        }
+
+        // sublevel
+        let sub;
+        let mut sub_star = false;
+        loop {
+            match inspect!("sub iter", iter.next()) {
+                Some((i, '*')) if i == start => {
+                    sub_star = true;
+                },
+                Some((i, c)) if i == start && is_restricted_name_first_char(c) => (),
+                Some((i, c)) if !sub_star && i > start && is_restricted_name_char(c) => (),
+                Some((i, ';')) if i > start => match FromStr::from_str(&ascii[start..i]) {
+                    Ok(s) => {
+                        sub = s;
+                        start = i + 1;
+                        break;
+                    }
+                    Err(_) => return Err(())
+                },
+                None => match FromStr::from_str(&ascii[start..]) {
+                    Ok(s) => return Ok(Mime(top, s, params)),
+                    Err(_) => return Err(())
+                },
+                _ => return Err(())
+            };
+        }
+
+        // params
+        debug!("starting params, len={}", len);
+        loop {
+            match inspect!("param", param_from_str(raw, &ascii, &mut iter, start)) {
+                Some((p, end)) => {
+                    params.push(p);
+                    start = end;
+                    if start >= len {
+                        break;
+                    }
+                }
+                None => break
+            }
+        }
+
+        Ok(Mime(top, sub, params))
+    }
+}
+
+#[cfg(feature = "serde")]
+impl serde::ser::Serialize for Mime {
+    fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
+        where S: serde::ser::Serializer
+    {
+        serializer.serialize_str(&*format!("{}",self))
+    }
+}
+
+#[cfg(feature = "serde")]
+impl serde::de::Deserialize for Mime {
+    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
+        where D: serde::de::Deserializer
+    {
+        let string: String = try!(serde::Deserialize::deserialize(deserializer));
+        let mime: Mime = match FromStr::from_str(&*string) {
+            Ok(mime) => mime,
+            Err(_) => return Err(serde::de::Error::custom("Invalid serialized mime")),
+        };
+        Ok(mime)
+    }
+}
+
+fn param_from_str(raw: &str, ascii: &str, iter: &mut Enumerate<Chars>, mut start: usize) -> Option<(Param, usize)> {
+    let attr;
+    debug!("param_from_str, start={}", start);
+    loop {
+        match inspect!("attr iter", iter.next()) {
+            Some((i, ' ')) if i == start => start = i + 1,
+            Some((i, c)) if i == start && is_restricted_name_first_char(c) => (),
+            Some((i, c)) if i > start && is_restricted_name_char(c) => (),
+            Some((i, '=')) if i > start => match FromStr::from_str(&ascii[start..i]) {
+                Ok(a) => {
+                    attr = inspect!("attr", a);
+                    start = i + 1;
+                    break;
+                },
+                Err(_) => return None
+            },
+            _ => return None
+        }
+    }
+
+    let value;
+    // values must be restrict-name-char or "anything goes"
+    let mut is_quoted = false;
+
+    {
+        let substr = |a,b| { if attr==Attr::Charset { &ascii[a..b] } else { &raw[a..b] } };
+        let endstr = |a| { if attr==Attr::Charset { &ascii[a..] } else { &raw[a..] } };
+        loop {
+            match inspect!("value iter", iter.next()) {
+                Some((i, '"')) if i == start => {
+                    debug!("quoted");
+                    is_quoted = true;
+                    start = i + 1;
+                },
+                Some((i, c)) if i == start && is_restricted_name_first_char(c) => (),
+                Some((i, '"')) if i > start && is_quoted => match FromStr::from_str(substr(start,i)) {
+                    Ok(v) => {
+                        value = v;
+                        start = i + 1;
+                        break;
+                    },
+                    Err(_) => return None
+                },
+                Some((i, c)) if i > start && is_quoted || is_restricted_name_char(c) => (),
+                Some((i, ';')) if i > start => match FromStr::from_str(substr(start,i)) {
+                    Ok(v) => {
+                        value = v;
+                        start = i + 1;
+                        break;
+                    },
+                    Err(_) => return None
+                },
+                None => match FromStr::from_str(endstr(start)) {
+                    Ok(v) => {
+                        value = v;
+                        start = raw.len();
+                        break;
+                    },
+                    Err(_) => return None
+                },
+
+                _ => return None
+            }
+        }
+    }
+
+    Some(((attr, value), start))
+}
+
+// From [RFC6838](http://tools.ietf.org/html/rfc6838#section-4.2):
+//
+// > All registered media types MUST be assigned top-level type and
+// > subtype names.  The combination of these names serves to uniquely
+// > identify the media type, and the subtype name facet (or the absence
+// > of one) identifies the registration tree.  Both top-level type and
+// > subtype names are case-insensitive.
+// >
+// > Type and subtype names MUST conform to the following ABNF:
+// >
+// >     type-name = restricted-name
+// >     subtype-name = restricted-name
+// >
+// >     restricted-name = restricted-name-first *126restricted-name-chars
+// >     restricted-name-first  = ALPHA / DIGIT
+// >     restricted-name-chars  = ALPHA / DIGIT / "!" / "#" /
+// >                              "$" / "&" / "-" / "^" / "_"
+// >     restricted-name-chars =/ "." ; Characters before first dot always
+// >                                  ; specify a facet name
+// >     restricted-name-chars =/ "+" ; Characters after last plus always
+// >                                  ; specify a structured syntax suffix
+//
+fn is_restricted_name_first_char(c: char) -> bool {
+    match c {
+        'a'...'z' |
+        '0'...'9' => true,
+        _ => false
+    }
+}
+
+fn is_restricted_name_char(c: char) -> bool {
+    if is_restricted_name_first_char(c) {
+        true
+    } else {
+        match c {
+            '!' |
+            '#' |
+            '$' |
+            '&' |
+            '-' |
+            '^' |
+            '.' |
+            '+' |
+            '_' => true,
+            _ => false
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::str::FromStr;
+    #[cfg(feature = "nightly")]
+    use test::Bencher;
+    use super::{Mime, Value, Attr};
+
+    #[test]
+    fn test_mime_show() {
+        let mime = mime!(Text/Plain);
+        assert_eq!(mime.to_string(), "text/plain".to_string());
+        let mime = mime!(Text/Plain; Charset=Utf8);
+        assert_eq!(mime.to_string(), "text/plain; charset=utf-8".to_string());
+    }
+
+    #[test]
+    fn test_mime_from_str() {
+        assert_eq!(Mime::from_str("text/plain").unwrap(), mime!(Text/Plain));
+        assert_eq!(Mime::from_str("TEXT/PLAIN").unwrap(), mime!(Text/Plain));
+        assert_eq!(Mime::from_str("text/plain; charset=utf-8").unwrap(), mime!(Text/Plain; Charset=Utf8));
+        assert_eq!(Mime::from_str("text/plain;charset=\"utf-8\"").unwrap(), mime!(Text/Plain; Charset=Utf8));
+        assert_eq!(Mime::from_str("text/plain; charset=utf-8; foo=bar").unwrap(),
+            mime!(Text/Plain; Charset=Utf8, ("foo")=("bar")));
+        assert_eq!("*/*".parse::<Mime>().unwrap(), mime!(Star/Star));
+        assert_eq!("image/*".parse::<Mime>().unwrap(), mime!(Image/Star));
+        assert_eq!("text/*; charset=utf-8".parse::<Mime>().unwrap(), mime!(Text/Star; Charset=Utf8));
+        assert!("*/png".parse::<Mime>().is_err());
+        assert!("*image/png".parse::<Mime>().is_err());
+        assert!("text/*plain".parse::<Mime>().is_err());
+    }
+
+    #[test]
+    fn test_case_sensitive_values() {
+        assert_eq!(Mime::from_str("multipart/form-data; boundary=ABCDEFG").unwrap(),
+                   mime!(Multipart/FormData; Boundary=("ABCDEFG")));
+        assert_eq!(Mime::from_str("multipart/form-data; charset=BASE64; boundary=ABCDEFG").unwrap(),
+                   mime!(Multipart/FormData; Charset=("base64"), Boundary=("ABCDEFG")));
+    }
+
+    #[test]
+    fn test_get_param() {
+        let mime = Mime::from_str("text/plain; charset=utf-8; foo=bar").unwrap();
+        assert_eq!(mime.get_param(Attr::Charset), Some(&Value::Utf8));
+        assert_eq!(mime.get_param("charset"), Some(&Value::Utf8));
+        assert_eq!(mime.get_param("foo").unwrap(), "bar");
+        assert_eq!(mime.get_param("baz"), None);
+    }
+
+    #[test]
+    fn test_value_as_str() {
+        assert_eq!(Value::Utf8.as_str(), "utf-8");
+    }
+
+    #[test]
+    fn test_value_eq_str() {
+        assert_eq!(Value::Utf8, "utf-8");
+        assert_eq!("utf-8", Value::Utf8);
+    }
+
+    #[cfg(feature = "serde")]
+    #[test]
+    fn test_serialize_deserialize() {
+        use serde_json;
+
+        let mime = Mime::from_str("text/plain; charset=utf-8; foo=bar").unwrap();
+        let serialized = serde_json::to_string(&mime).unwrap();
+        let deserialized: Mime = serde_json::from_str(&serialized).unwrap();
+        assert_eq!(mime, deserialized);
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_fmt(b: &mut Bencher) {
+        use std::fmt::Write;
+        let mime = mime!(Text/Plain; Charset=Utf8, ("foo")=("bar"));
+        b.bytes = mime.to_string().as_bytes().len() as u64;
+        let mut s = String::with_capacity(64);
+        b.iter(|| {
+            let _ = write!(s, "{}", mime);
+            ::test::black_box(&s);
+            unsafe { s.as_mut_vec().set_len(0); }
+        })
+    }
+
+    #[cfg(feature = "nightly")]
+    #[bench]
+    fn bench_from_str(b: &mut Bencher) {
+        let s = "text/plain; charset=utf-8; foo=bar";
+        b.bytes = s.as_bytes().len() as u64;
+        b.iter(|| s.parse::<Mime>())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/miniz-sys/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"ea9ad87421deb76d7d6ab5232ccf1f2265e813069c6ae8fbcef88aecab3657cc","build.rs":"03c1c5148146084a63e5104078ed29df8a201541e6c45522c5c79e600393f363","lib.rs":"6b4b534e78dee29b006f460245af34f54eefcc39c82740d27cbe9140072b9926","miniz.c":"b2e9875b20eff162e904a3fd8d692afd34fcc4fd83b6bfa57fec2e51329053ed"},"package":"28eaee17666671fa872e567547e8428e83308ebe5808cdf6a0e28397dbe2c726"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/miniz-sys/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+
+name = "miniz-sys"
+version = "0.1.9"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+links = "miniz"
+build = "build.rs"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/alexcrichton/flate2-rs"
+documentation = "https://docs.rs/miniz-sys"
+description = """
+Bindings to the miniz.c library.
+"""
+categories = ["external-ffi-bindings"]
+
+[lib]
+name = "miniz_sys"
+path = "lib.rs"
+
+[dependencies]
+libc = "0.2"
+
+[build-dependencies]
+gcc = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/miniz-sys/build.rs
@@ -0,0 +1,8 @@
+extern crate gcc;
+
+use std::env;
+
+fn main() {
+    gcc::compile_library("libminiz.a", &["miniz.c"]);
+    println!("cargo:root={}", env::var("OUT_DIR").unwrap());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/miniz-sys/lib.rs
@@ -0,0 +1,77 @@
+#![doc(html_root_url = "https://docs.rs/miniz-sys/0.1")]
+#![allow(bad_style)]
+
+extern crate libc;
+use libc::*;
+
+pub const MZ_NO_FLUSH: c_int = 0;
+pub const MZ_PARTIAL_FLUSH: c_int = 1;
+pub const MZ_SYNC_FLUSH: c_int = 2;
+pub const MZ_FULL_FLUSH: c_int = 3;
+pub const MZ_FINISH: c_int = 4;
+pub const MZ_BLOCK: c_int = 5;
+
+pub const MZ_OK: c_int = 0;
+pub const MZ_STREAM_END: c_int = 1;
+pub const MZ_NEED_DICT: c_int = 2;
+pub const MZ_ERRNO: c_int = -1;
+pub const MZ_STREAM_ERROR: c_int = -2;
+pub const MZ_DATA_ERROR: c_int = -3;
+pub const MZ_MEM_ERROR: c_int = -4;
+pub const MZ_BUF_ERROR: c_int = -5;
+pub const MZ_VERSION_ERROR: c_int = -6;
+pub const MZ_PARAM_ERROR: c_int = -10000;
+
+pub const MZ_DEFLATED: c_int = 8;
+pub const MZ_DEFAULT_WINDOW_BITS: c_int = 15;
+pub const MZ_DEFAULT_STRATEGY: c_int = 0;
+
+#[repr(C)]
+pub struct mz_stream {
+    pub next_in: *const u8,
+    pub avail_in: c_uint,
+    pub total_in: c_ulong,
+
+    pub next_out: *mut u8,
+    pub avail_out: c_uint,
+    pub total_out: c_ulong,
+
+    pub msg: *const c_char,
+    pub state: *mut mz_internal_state,
+
+    pub zalloc: Option<mz_alloc_func>,
+    pub zfree: Option<mz_free_func>,
+    pub opaque: *mut c_void,
+
+    pub data_type: c_int,
+    pub adler: c_ulong,
+    pub reserved: c_ulong,
+}
+
+pub enum mz_internal_state {}
+
+pub type mz_alloc_func = extern fn(*mut c_void,
+                                   size_t,
+                                   size_t) -> *mut c_void;
+pub type mz_free_func = extern fn(*mut c_void, *mut c_void);
+
+extern {
+    pub fn mz_deflateInit2(stream: *mut mz_stream,
+                           level: c_int,
+                           method: c_int,
+                           window_bits: c_int,
+                           mem_level: c_int,
+                           strategy: c_int)
+                           -> c_int;
+    pub fn mz_deflate(stream: *mut mz_stream, flush: c_int) -> c_int;
+    pub fn mz_deflateEnd(stream: *mut mz_stream) -> c_int;
+    pub fn mz_deflateReset(stream: *mut mz_stream) -> c_int;
+
+    pub fn mz_inflateInit2(stream: *mut mz_stream,
+                           window_bits: c_int)
+                           -> c_int;
+    pub fn mz_inflate(stream: *mut mz_stream, flush: c_int) -> c_int;
+    pub fn mz_inflateEnd(stream: *mut mz_stream) -> c_int;
+
+    pub fn mz_crc32(crc: c_ulong, ptr: *const u8, len: size_t) -> c_ulong;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/miniz-sys/miniz.c
@@ -0,0 +1,4986 @@
+/* miniz.c v1.16 beta r1 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing
+   See "unlicense" statement at the end of this file.
+   Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013
+   Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
+
+   Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define
+   MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros).
+
+   * Change History
+     10/19/13 v1.16 beta r1 - Two key inflator-only robustness and streaming related changes. Also merged in tdefl_compressor_alloc(), tdefl_compressor_free() helpers to make script bindings easier for rustyzip.
+       - The inflator coroutine func. is subtle and complex so I'm being cautious about this release. I would greatly appreciate any help with testing or any feedback.
+         I feel good about these changes, and they've been through several hours of automated testing, but they will probably not fix anything for the majority of prev. users so I'm
+         going to mark this release as beta for a few weeks and continue testing it at work/home on various things.
+       - The inflator in raw (non-zlib) mode is now usable on gzip or similiar data streams that have a bunch of bytes following the raw deflate data (problem discovered by rustyzip author williamw520).
+         This version should *never* read beyond the last byte of the raw deflate data independent of how many bytes you pass into the input buffer. This issue was caused by the various Huffman bitbuffer lookahead optimizations, and
+         would not be an issue if the caller knew and enforced the precise size of the raw compressed data *or* if the compressed data was in zlib format (i.e. always followed by the byte aligned zlib adler32).
+         So in other words, you can now call the inflator on deflate streams that are followed by arbitrary amounts of data and it's guaranteed that decompression will stop exactly on the last byte.
+       - The inflator now has a new failure status: TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS (-4). Previously, if the inflator was starved of bytes and could not make progress (because the input buffer was empty and the
+         caller did not set the TINFL_FLAG_HAS_MORE_INPUT flag - say on truncated or corrupted compressed data stream) it would append all 0's to the input and try to soldier on.
+         This is scary, because in the worst case, I believe it was possible for the prev. inflator to start outputting large amounts of literal data. If the caller didn't know when to stop accepting output
+         (because it didn't know how much uncompressed data was expected, or didn't enforce a sane maximum) it could continue forever. v1.16 cannot fall into this failure mode, instead it'll return
+         TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS immediately if it needs 1 or more bytes to make progress, the input buf is empty, and the caller has indicated that no more input is available. This is a "soft"
+         failure, so you can call the inflator again with more input and it will try to continue, or you can give up and fail. This could be very useful in network streaming scenarios.
+       - Added documentation to all the tinfl return status codes, fixed miniz_tester so it accepts double minus params for Linux, tweaked example1.c, added a simple "follower bytes" test to miniz_tester.cpp.
+     10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major release with Zip64 support (almost there!):
+       - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug
+        would only have occured in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place()
+        (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag).
+       - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size
+       - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries.
+         Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice).
+       - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes
+       - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed
+       - Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6.
+       - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti
+       - Merged MZ_FORCEINLINE fix from hdeanclark
+       - Fix <time.h> include before config #ifdef, thanks emil.brink
+       - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can
+        set it to 1 for real-time compression).
+       - Merged in some compiler fixes from paulharris's github repro.
+       - Retested this build under Windows (VS 2010, including static analysis), tcc  0.9.26, gcc v4.6 and clang v3.3.
+       - Added example6.c, which dumps an image of the mandelbrot set to a PNG file.
+       - Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.
+       - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled
+		 - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch
+     5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include <time.h> (thanks fermtect).
+     5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.
+       - Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files.
+       - Eliminated a bunch of warnings when compiling with GCC 32-bit/64.
+       - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly
+        "Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning).
+       - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64.
+       - Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test.
+       - Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives.
+       - Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)
+       - Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself).
+     4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's.
+      level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson <bruced@valvesoftware.com> for the feedback/bug report.
+     5/28/11 v1.11 - Added statement from unlicense.org
+     5/27/11 v1.10 - Substantial compressor optimizations:
+      - Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a
+      - Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86).
+      - Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types.
+      - Refactored the compression code for better readability and maintainability.
+      - Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large
+       drop in throughput on some files).
+     5/15/11 v1.09 - Initial stable release.
+
+   * Low-level Deflate/Inflate implementation notes:
+
+     Compression: Use the "tdefl" API's. The compressor supports raw, static, and dynamic blocks, lazy or
+     greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses
+     approximately as well as zlib.
+
+     Decompression: Use the "tinfl" API's. The entire decompressor is implemented as a single function
+     coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory
+     block large enough to hold the entire file.
+
+     The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation.
+
+   * zlib-style API notes:
+
+     miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in
+     zlib replacement in many apps:
+        The z_stream struct, optional memory allocation callbacks
+        deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound
+        inflateInit/inflateInit2/inflate/inflateEnd
+        compress, compress2, compressBound, uncompress
+        CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines.
+        Supports raw deflate streams or standard zlib streams with adler-32 checking.
+
+     Limitations:
+      The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries.
+      I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but
+      there are no guarantees that miniz.c pulls this off perfectly.
+
+   * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by
+     Alex Evans. Supports 1-4 bytes/pixel images.
+
+   * ZIP archive API notes:
+
+     The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to
+     get the job done with minimal fuss. There are simple API's to retrieve file information, read files from
+     existing archives, create new archives, append new files to existing archives, or clone archive data from
+     one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h),
+     or you can specify custom file read/write callbacks.
+
+     - Archive reading: Just call this function to read a single file from a disk archive:
+
+      void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name,
+        size_t *pSize, mz_uint zip_flags);
+
+     For more complex cases, use the "mz_zip_reader" functions. Upon opening an archive, the entire central
+     directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files.
+
+     - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file:
+
+     int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);
+
+     The locate operation can optionally check file comments too, which (as one example) can be used to identify
+     multiple versions of the same file in an archive. This function uses a simple linear search through the central
+     directory, so it's not very fast.
+
+     Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and
+     retrieve detailed info on each file by calling mz_zip_reader_file_stat().
+
+     - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer immediately writes compressed file data
+     to disk and builds an exact image of the central directory in memory. The central directory image is written
+     all at once at the end of the archive file when the archive is finalized.
+
+     The archive writer can optionally align each file's local header and file data to any power of 2 alignment,
+     which can be useful when the archive will be read from optical media. Also, the writer supports placing
+     arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still
+     readable by any ZIP tool.
+
+     - Archive appending: The simple way to add a single file to an archive is to call this function:
+
+      mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name,
+        const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);
+
+     The archive will be created if it doesn't already exist, otherwise it'll be appended to.
+     Note the appending is done in-place and is not an atomic operation, so if something goes wrong
+     during the operation it's possible the archive could be left without a central directory (although the local
+     file headers and file data will be fine, so the archive will be recoverable).
+
+     For more complex archive modification scenarios:
+     1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to
+     preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the
+     compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and
+     you're done. This is safe but requires a bunch of temporary disk space or heap memory.
+
+     2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(),
+     append new files as needed, then finalize the archive which will write an updated central directory to the
+     original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a
+     possibility that the archive's central directory could be lost with this method if anything goes wrong, though.
+
+     - ZIP archive support limitations:
+     No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files.
+     Requires streams capable of seeking.
+
+   * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the
+     below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it.
+
+   * Important: For best perf. be sure to customize the below macros for your target platform:
+     #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
+     #define MINIZ_LITTLE_ENDIAN 1
+     #define MINIZ_HAS_64BIT_REGISTERS 1
+
+   * On platforms using glibc, Be sure to "#define _LARGEFILE64_SOURCE 1" before including miniz.c to ensure miniz
+     uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be able to process large files
+     (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes).
+*/
+
+#ifndef MINIZ_HEADER_INCLUDED
+#define MINIZ_HEADER_INCLUDED
+
+#include <stdlib.h>
+
+// Defines to completely disable specific portions of miniz.c:
+// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl.
+
+// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O.
+//#define MINIZ_NO_STDIO
+
+// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or
+// get/set file times, and the C run-time funcs that get/set times won't be called.
+// The current downside is the times written to your archives will be from 1979.
+//#define MINIZ_NO_TIME
+
+// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's.
+//#define MINIZ_NO_ARCHIVE_APIS
+
+// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's.
+//#define MINIZ_NO_ARCHIVE_WRITING_APIS
+
+// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's.
+//#define MINIZ_NO_ZLIB_APIS
+
+// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib.
+//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES
+
+// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc.
+// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc
+// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user
+// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work.
+//#define MINIZ_NO_MALLOC
+
+#if defined(__TINYC__) && (defined(__linux) || defined(__linux__))
+  // TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux
+  #define MINIZ_NO_TIME
+#endif
+
+#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)
+  #include <time.h>
+#endif
+
+#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__)
+// MINIZ_X86_OR_X64_CPU is only used to help set the below macros.
+#define MINIZ_X86_OR_X64_CPU 1
+#endif
+
+#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU
+// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.
+#define MINIZ_LITTLE_ENDIAN 1
+#endif
+
+#if MINIZ_X86_OR_X64_CPU
+// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses.
+#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
+#endif
+
+#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__)
+// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions).
+#define MINIZ_HAS_64BIT_REGISTERS 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ------------------- zlib-style API Definitions.
+
+// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits!
+typedef unsigned long mz_ulong;
+
+// mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap.
+void mz_free(void *p);
+
+#define MZ_ADLER32_INIT (1)
+// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL.
+mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len);
+
+#define MZ_CRC32_INIT (0)
+// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL.
+mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len);
+
+// Compression strategies.
+enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 };
+
+// Method
+#define MZ_DEFLATED 8
+
+#ifndef MINIZ_NO_ZLIB_APIS
+
+// Heap allocation callbacks.
+// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long.
+typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size);
+typedef void (*mz_free_func)(void *opaque, void *address);
+typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size);
+
+// TODO: I can't encode "1.16" here, argh
+#define MZ_VERSION          "9.1.15"
+#define MZ_VERNUM           0x91F0
+#define MZ_VER_MAJOR        9
+#define MZ_VER_MINOR        1
+#define MZ_VER_REVISION     15
+#define MZ_VER_SUBREVISION  0
+
+// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs).
+enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 };
+
+// Return status codes. MZ_PARAM_ERROR is non-standard.
+enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 };
+
+// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL.
+enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 };
+
+// Window bits
+#define MZ_DEFAULT_WINDOW_BITS 15
+
+struct mz_internal_state;
+
+// Compression/decompression stream struct.
+typedef struct mz_stream_s
+{
+  const unsigned char *next_in;     // pointer to next byte to read
+  unsigned int avail_in;            // number of bytes available at next_in
+  mz_ulong total_in;                // total number of bytes consumed so far
+
+  unsigned char *next_out;          // pointer to next byte to write
+  unsigned int avail_out;           // number of bytes that can be written to next_out
+  mz_ulong total_out;               // total number of bytes produced so far
+
+  char *msg;                        // error msg (unused)
+  struct mz_internal_state *state;  // internal state, allocated by zalloc/zfree
+
+  mz_alloc_func zalloc;             // optional heap allocation function (defaults to malloc)
+  mz_free_func zfree;               // optional heap free function (defaults to free)
+  void *opaque;                     // heap alloc function user pointer
+
+  int data_type;                    // data_type (unused)
+  mz_ulong adler;                   // adler32 of the source or uncompressed data
+  mz_ulong reserved;                // not used
+} mz_stream;
+
+typedef mz_stream *mz_streamp;
+
+// Returns the version string of miniz.c.
+const char *mz_version(void);
+
+// mz_deflateInit() initializes a compressor with default options:
+// Parameters:
+//  pStream must point to an initialized mz_stream struct.
+//  level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION].
+//  level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio.
+//  (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.)
+// Return values:
+//  MZ_OK on success.
+//  MZ_STREAM_ERROR if the stream is bogus.
+//  MZ_PARAM_ERROR if the input parameters are bogus.
+//  MZ_MEM_ERROR on out of memory.
+int mz_deflateInit(mz_streamp pStream, int level);
+
+// mz_deflateInit2() is like mz_deflate(), except with more control:
+// Additional parameters:
+//   method must be MZ_DEFLATED
+//   window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer)
+//   mem_level must be between [1, 9] (it's checked but ignored by miniz.c)
+int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy);
+
+// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2().
+int mz_deflateReset(mz_streamp pStream);
+
+// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible.
+// Parameters:
+//   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.
+//   flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH.
+// Return values:
+//   MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full).
+//   MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore.
+//   MZ_STREAM_ERROR if the stream is bogus.
+//   MZ_PARAM_ERROR if one of the parameters is invalid.
+//   MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.)
+int mz_deflate(mz_streamp pStream, int flush);
+
+// mz_deflateEnd() deinitializes a compressor:
+// Return values:
+//  MZ_OK on success.
+//  MZ_STREAM_ERROR if the stream is bogus.
+int mz_deflateEnd(mz_streamp pStream);
+
+// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH.
+mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len);
+
+// Single-call compression functions mz_compress() and mz_compress2():
+// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure.
+int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);
+int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level);
+
+// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress().
+mz_ulong mz_compressBound(mz_ulong source_len);
+
+// Initializes a decompressor.
+int mz_inflateInit(mz_streamp pStream);
+
+// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer:
+// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate).
+int mz_inflateInit2(mz_streamp pStream, int window_bits);
+
+// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible.
+// Parameters:
+//   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.
+//   flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH.
+//   On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster).
+//   MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data.
+// Return values:
+//   MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full.
+//   MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified.
+//   MZ_STREAM_ERROR if the stream is bogus.
+//   MZ_DATA_ERROR if the deflate stream is invalid.
+//   MZ_PARAM_ERROR if one of the parameters is invalid.
+//   MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again
+//   with more input data, or with more room in the output buffer (except when using single call decompression, described above).
+int mz_inflate(mz_streamp pStream, int flush);
+
+// Deinitializes a decompressor.
+int mz_inflateEnd(mz_streamp pStream);
+
+// Single-call decompression.
+// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure.
+int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);
+
+// Returns a string description of the specified error code, or NULL if the error code is invalid.
+const char *mz_error(int err);
+
+// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports.
+// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project.
+#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
+  typedef unsigned char Byte;
+  typedef unsigned int uInt;
+  typedef mz_ulong uLong;
+  typedef Byte Bytef;
+  typedef uInt uIntf;
+  typedef char charf;
+  typedef int intf;
+  typedef void *voidpf;
+  typedef uLong uLongf;
+  typedef void *voidp;
+  typedef void *const voidpc;
+  #define Z_NULL                0
+  #define Z_NO_FLUSH            MZ_NO_FLUSH
+  #define Z_PARTIAL_FLUSH       MZ_PARTIAL_FLUSH
+  #define Z_SYNC_FLUSH          MZ_SYNC_FLUSH
+  #define Z_FULL_FLUSH          MZ_FULL_FLUSH
+  #define Z_FINISH              MZ_FINISH
+  #define Z_BLOCK               MZ_BLOCK
+  #define Z_OK                  MZ_OK
+  #define Z_STREAM_END          MZ_STREAM_END
+  #define Z_NEED_DICT           MZ_NEED_DICT
+  #define Z_ERRNO               MZ_ERRNO
+  #define Z_STREAM_ERROR        MZ_STREAM_ERROR
+  #define Z_DATA_ERROR          MZ_DATA_ERROR
+  #define Z_MEM_ERROR           MZ_MEM_ERROR
+  #define Z_BUF_ERROR           MZ_BUF_ERROR
+  #define Z_VERSION_ERROR       MZ_VERSION_ERROR
+  #define Z_PARAM_ERROR         MZ_PARAM_ERROR
+  #define Z_NO_COMPRESSION      MZ_NO_COMPRESSION
+  #define Z_BEST_SPEED          MZ_BEST_SPEED
+  #define Z_BEST_COMPRESSION    MZ_BEST_COMPRESSION
+  #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION
+  #define Z_DEFAULT_STRATEGY    MZ_DEFAULT_STRATEGY
+  #define Z_FILTERED            MZ_FILTERED
+  #define Z_HUFFMAN_ONLY        MZ_HUFFMAN_ONLY
+  #define Z_RLE                 MZ_RLE
+  #define Z_FIXED               MZ_FIXED
+  #define Z_DEFLATED            MZ_DEFLATED
+  #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS
+  #define alloc_func            mz_alloc_func
+  #define free_func             mz_free_func
+  #define internal_state        mz_internal_state
+  #define z_stream              mz_stream
+  #define deflateInit           mz_deflateInit
+  #define deflateInit2          mz_deflateInit2
+  #define deflateReset          mz_deflateReset
+  #define deflate               mz_deflate
+  #define deflateEnd            mz_deflateEnd
+  #define deflateBound          mz_deflateBound
+  #define compress              mz_compress
+  #define compress2             mz_compress2
+  #define compressBound         mz_compressBound
+  #define inflateInit           mz_inflateInit
+  #define inflateInit2          mz_inflateInit2
+  #define inflate               mz_inflate
+  #define inflateEnd            mz_inflateEnd
+  #define uncompress            mz_uncompress
+  #define crc32                 mz_crc32
+  #define adler32               mz_adler32
+  #define MAX_WBITS             15
+  #define MAX_MEM_LEVEL         9
+  #define zError                mz_error
+  #define ZLIB_VERSION          MZ_VERSION
+  #define ZLIB_VERNUM           MZ_VERNUM
+  #define ZLIB_VER_MAJOR        MZ_VER_MAJOR
+  #define ZLIB_VER_MINOR        MZ_VER_MINOR
+  #define ZLIB_VER_REVISION     MZ_VER_REVISION
+  #define ZLIB_VER_SUBREVISION  MZ_VER_SUBREVISION
+  #define zlibVersion           mz_version
+  #define zlib_version          mz_version()
+#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
+
+#endif // MINIZ_NO_ZLIB_APIS
+
+// ------------------- Types and macros
+
+typedef unsigned char mz_uint8;
+typedef signed short mz_int16;
+typedef unsigned short mz_uint16;
+typedef unsigned int mz_uint32;
+typedef unsigned int mz_uint;
+typedef long long mz_int64;
+typedef unsigned long long mz_uint64;
+typedef int mz_bool;
+
+#define MZ_FALSE (0)
+#define MZ_TRUE (1)
+
+// An attempt to work around MSVC's spammy "warning C4127: conditional expression is constant" message.
+#ifdef _MSC_VER
+   #define MZ_MACRO_END while (0, 0)
+#else
+   #define MZ_MACRO_END while (0)
+#endif
+
+// ------------------- ZIP archive reading/writing
+
+#ifndef MINIZ_NO_ARCHIVE_APIS
+
+enum
+{
+  MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024,
+  MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260,
+  MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256
+};
+
+typedef struct
+{
+  mz_uint32 m_file_index;
+  mz_uint32 m_central_dir_ofs;
+  mz_uint16 m_version_made_by;
+  mz_uint16 m_version_needed;
+  mz_uint16 m_bit_flag;
+  mz_uint16 m_method;
+#ifndef MINIZ_NO_TIME
+  time_t m_time;
+#endif
+  mz_uint32 m_crc32;
+  mz_uint64 m_comp_size;
+  mz_uint64 m_uncomp_size;
+  mz_uint16 m_internal_attr;
+  mz_uint32 m_external_attr;
+  mz_uint64 m_local_header_ofs;
+  mz_uint32 m_comment_size;
+  char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];
+  char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];
+} mz_zip_archive_file_stat;
+
+typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n);
+typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n);
+
+struct mz_zip_internal_state_tag;
+typedef struct mz_zip_internal_state_tag mz_zip_internal_state;
+
+typedef enum
+{
+  MZ_ZIP_MODE_INVALID = 0,
+  MZ_ZIP_MODE_READING = 1,
+  MZ_ZIP_MODE_WRITING = 2,
+  MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3
+} mz_zip_mode;
+
+typedef struct mz_zip_archive_tag
+{
+  mz_uint64 m_archive_size;
+  mz_uint64 m_central_directory_file_ofs;
+  mz_uint m_total_files;
+  mz_zip_mode m_zip_mode;
+
+  mz_uint m_file_offset_alignment;
+
+  mz_alloc_func m_pAlloc;
+  mz_free_func m_pFree;
+  mz_realloc_func m_pRealloc;
+  void *m_pAlloc_opaque;
+
+  mz_file_read_func m_pRead;
+  mz_file_write_func m_pWrite;
+  void *m_pIO_opaque;
+
+  mz_zip_internal_state *m_pState;
+
+} mz_zip_archive;
+
+typedef enum
+{
+  MZ_ZIP_FLAG_CASE_SENSITIVE                = 0x0100,
+  MZ_ZIP_FLAG_IGNORE_PATH                   = 0x0200,
+  MZ_ZIP_FLAG_COMPRESSED_DATA               = 0x0400,
+  MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800
+} mz_zip_flags;
+
+// ZIP archive reading
+
+// Inits a ZIP archive reader.
+// These functions read and validate the archive's central directory.
+mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags);
+mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags);
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags);
+#endif
+
+// Returns the total number of files in the archive.
+mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);
+
+// Returns detailed information about an archive file entry.
+mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat);
+
+// Determines if an archive file entry is a directory entry.
+mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index);
+mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index);
+
+// Retrieves the filename of an archive file entry.
+// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename.
+mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size);
+
+// Attempts to locates a file in the archive's central directory.
+// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH
+// Returns -1 if the file cannot be found.
+int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);
+
+// Extracts a archive file to a memory buffer using no memory allocation.
+mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);
+mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);
+
+// Extracts a archive file to a memory buffer.
+mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags);
+mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags);
+
+// Extracts a archive file to a dynamically allocated heap buffer.
+void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags);
+void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags);
+
+// Extracts a archive file using a callback function to output the file's data.
+mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);
+mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);
+
+#ifndef MINIZ_NO_STDIO
+// Extracts a archive file to a disk file and sets its last accessed and modified times.
+// This function only extracts files, not archive directory records.
+mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags);
+mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags);
+#endif
+
+// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used.
+mz_bool mz_zip_reader_end(mz_zip_archive *pZip);
+
+// ZIP archive writing
+
+#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+// Inits a ZIP archive writer.
+mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size);
+mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size);
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning);
+#endif
+
+// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive.
+// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called.
+// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it).
+// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL.
+// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before
+// the archive is finalized the file's central directory will be hosed.
+mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename);
+
+// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive.
+// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer.
+// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.
+mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags);
+mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32);
+
+#ifndef MINIZ_NO_STDIO
+// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive.
+// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.
+mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);
+#endif
+
+// Adds a file to an archive by fully cloning the data from another archive.
+// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields.
+mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index);
+
+// Finalizes the archive by writing the central directory records followed by the end of central directory record.
+// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end().
+// An archive must be manually finalized by calling this function for it to be valid.
+mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);
+mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize);
+
+// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used.
+// Note for the archive to be valid, it must have been finalized before ending.
+mz_bool mz_zip_writer_end(mz_zip_archive *pZip);
+
+// Misc. high-level helper functions:
+
+// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive.
+// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.
+mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);
+
+// Reads a single file from an archive into a heap block.
+// Returns NULL on failure.
+void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags);
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_APIS
+
+// ------------------- Low-level Decompression API Definitions
+
+// Decompression flags used by tinfl_decompress().
+// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream.
+// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input.
+// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB).
+// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes.
+enum
+{
+  TINFL_FLAG_PARSE_ZLIB_HEADER = 1,
+  TINFL_FLAG_HAS_MORE_INPUT = 2,
+  TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,
+  TINFL_FLAG_COMPUTE_ADLER32 = 8
+};
+
+// High level decompression functions:
+// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().
+// On entry:
+//  pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.
+// On return:
+//  Function returns a pointer to the decompressed data, or NULL on failure.
+//  *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.
+//  The caller must call mz_free() on the returned block when it's no longer needed.
+void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);
+
+// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.
+// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.
+#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))
+size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);
+
+// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer.
+// Returns 1 on success or 0 on failure.
+typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);
+int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
+
+struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;
+
+// Max size of LZ dictionary.
+#define TINFL_LZ_DICT_SIZE 32768
+
+// Return status.
+typedef enum
+{
+  // This flags indicates the inflator needs 1 or more input bytes to make forward progress, but the caller is indicating that no more are available. The compressed data
+  // is probably corrupted. If you call the inflator again with more bytes it'll try to continue processing the input but this is a BAD sign (either the data is corrupted or you called it incorrectly).
+  // If you call it again with no input you'll just get TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS again.
+  TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS = -4,
+
+  // This flag indicates that one or more of the input parameters was obviously bogus. (You can try calling it again, but if you get this error the calling code is wrong.)
+  TINFL_STATUS_BAD_PARAM = -3,
+
+  // This flags indicate the inflator is finished but the adler32 check of the uncompressed data didn't match. If you call it again it'll return TINFL_STATUS_DONE.
+  TINFL_STATUS_ADLER32_MISMATCH = -2,
+
+  // This flags indicate the inflator has somehow failed (bad code, corrupted input, etc.). If you call it again without resetting via tinfl_init() it it'll just keep on returning the same status failure code.
+  TINFL_STATUS_FAILED = -1,
+
+  // Any status code less than TINFL_STATUS_DONE must indicate a failure.
+
+  // This flag indicates the inflator has returned every byte of uncompressed data that it can, has consumed every byte that it needed, has successfully reached the end of the deflate stream, and
+  // if zlib headers and adler32 checking enabled that it has successfully checked the uncompressed data's adler32. If you call it again you'll just get TINFL_STATUS_DONE over and over again.
+  TINFL_STATUS_DONE = 0,
+
+  // This flag indicates the inflator MUST have more input data (even 1 byte) before it can make any more forward progress, or you need to clear the TINFL_FLAG_HAS_MORE_INPUT
+  // flag on the next call if you don't have any more source data. If the source data was somehow corrupted it's also possible (but unlikely) for the inflator to keep on demanding input to
+  // proceed, so be sure to properly set the TINFL_FLAG_HAS_MORE_INPUT flag.
+  TINFL_STATUS_NEEDS_MORE_INPUT = 1,
+
+  // This flag indicates the inflator definitely has 1 or more bytes of uncompressed data available, but it cannot write this data into the output buffer.
+  // Note if the source compressed data was corrupted it's possible for the inflator to return a lot of uncompressed data to the caller. I've been assuming you know how much uncompressed data to expect
+  // (either exact or worst case) and will stop calling the inflator and fail after receiving too much. In pure streaming scenarios where you have no idea how many bytes to expect this may not be possible
+  // so I may need to add some code to address this.
+  TINFL_STATUS_HAS_MORE_OUTPUT = 2
+
+} tinfl_status;
+
+// Initializes the decompressor to its initial state.
+#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
+#define tinfl_get_adler32(r) (r)->m_check_adler32
+
+// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability.
+// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output.
+tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);
+
+// Internal/private bits follow.
+enum
+{
+  TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,
+  TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS
+};
+
+typedef struct
+{
+  mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];
+  mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
+} tinfl_huff_table;
+
+#if MINIZ_HAS_64BIT_REGISTERS
+  #define TINFL_USE_64BIT_BITBUF 1
+#endif
+
+#if TINFL_USE_64BIT_BITBUF
+  typedef mz_uint64 tinfl_bit_buf_t;
+  #define TINFL_BITBUF_SIZE (64)
+#else
+  typedef mz_uint32 tinfl_bit_buf_t;
+  #define TINFL_BITBUF_SIZE (32)
+#endif
+
+struct tinfl_decompressor_tag
+{
+  mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];
+  tinfl_bit_buf_t m_bit_buf;
+  size_t m_dist_from_out_buf_start;
+  tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];
+  mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];
+};
+
+// ------------------- Low-level Compression API Definitions
+
+// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently).
+#define TDEFL_LESS_MEMORY 0
+
+// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search):
+// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression).
+enum
+{
+  TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF
+};
+
+// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data.
+// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers).
+// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing.
+// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory).
+// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1)
+// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled.
+// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables.
+// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks.
+// The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK).
+enum
+{
+  TDEFL_WRITE_ZLIB_HEADER             = 0x01000,
+  TDEFL_COMPUTE_ADLER32               = 0x02000,
+  TDEFL_GREEDY_PARSING_FLAG           = 0x04000,
+  TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000,
+  TDEFL_RLE_MATCHES                   = 0x10000,
+  TDEFL_FILTER_MATCHES                = 0x20000,
+  TDEFL_FORCE_ALL_STATIC_BLOCKS       = 0x40000,
+  TDEFL_FORCE_ALL_RAW_BLOCKS          = 0x80000
+};
+
+// High level compression functions:
+// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc().
+// On entry:
+//  pSrc_buf, src_buf_len: Pointer and size of source block to compress.
+//  flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression.
+// On return:
+//  Function returns a pointer to the compressed data, or NULL on failure.
+//  *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data.
+//  The caller must free() the returned block when it's no longer needed.
+void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);
+
+// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory.
+// Returns 0 on failure.
+size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);
+
+// Compresses an image to a compressed PNG file in memory.
+// On entry:
+//  pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. 
+//  The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory.
+//  level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL
+//  If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps).
+// On return:
+//  Function returns a pointer to the compressed data, or NULL on failure.
+//  *pLen_out will be set to the size of the PNG image file.
+//  The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed.
+void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip);
+void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out);
+
+// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time.
+typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);
+
+// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally.
+mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
+
+enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 };
+
+// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes).
+#if TDEFL_LESS_MEMORY
+enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS };
+#else
+enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS };
+#endif
+
+// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions.
+typedef enum
+{
+  TDEFL_STATUS_BAD_PARAM = -2,
+  TDEFL_STATUS_PUT_BUF_FAILED = -1,
+  TDEFL_STATUS_OKAY = 0,
+  TDEFL_STATUS_DONE = 1,
+} tdefl_status;
+
+// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums
+typedef enum
+{
+  TDEFL_NO_FLUSH = 0,
+  TDEFL_SYNC_FLUSH = 2,
+  TDEFL_FULL_FLUSH = 3,
+  TDEFL_FINISH = 4
+} tdefl_flush;
+
+// tdefl's compression state structure.
+typedef struct
+{
+  tdefl_put_buf_func_ptr m_pPut_buf_func;
+  void *m_pPut_buf_user;
+  mz_uint m_flags, m_max_probes[2];
+  int m_greedy_parsing;
+  mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size;
+  mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end;
+  mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer;
+  mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish;
+  tdefl_status m_prev_return_status;
+  const void *m_pIn_buf;
+  void *m_pOut_buf;
+  size_t *m_pIn_buf_size, *m_pOut_buf_size;
+  tdefl_flush m_flush;
+  const mz_uint8 *m_pSrc;
+  size_t m_src_buf_left, m_out_buf_ofs;
+  mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1];
+  mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];
+  mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];
+  mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];
+  mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE];
+  mz_uint16 m_next[TDEFL_LZ_DICT_SIZE];
+  mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE];
+  mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE];
+} tdefl_compressor;
+
+// Initializes the compressor.
+// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory.
+// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression.
+// If pBut_buf_func is NULL the user should always call the tdefl_compress() API.
+// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.)
+tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
+
+// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible.
+tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush);
+
+// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr.
+// tdefl_compress_buffer() always consumes the entire input buffer.
+tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush);
+
+tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d);
+mz_uint32 tdefl_get_adler32(tdefl_compressor *d);
+
+// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros.
+#ifndef MINIZ_NO_ZLIB_APIS
+// Create tdefl_compress() flags given zlib-style compression parameters.
+// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files)
+// window_bits may be -15 (raw deflate) or 15 (zlib)
+// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED
+mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy);
+#endif // #ifndef MINIZ_NO_ZLIB_APIS
+
+// Allocate the tdefl_compressor and tinfl_decompressor structures in C so that
+// non-C language bindings to tdefl_ and tinfl_ API don't need to worry about
+// structure size and allocation mechanism.
+tdefl_compressor *tdefl_compressor_alloc();
+void tdefl_compressor_free(tdefl_compressor *pComp);
+tinfl_decompressor *tinfl_decompressor_alloc();
+void tinfl_decompressor_free(tinfl_decompressor *pDecomp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MINIZ_HEADER_INCLUDED
+
+// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)
+
+#ifndef MINIZ_HEADER_FILE_ONLY
+
+typedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1];
+typedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1];
+typedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1];
+
+#include <string.h>
+#include <assert.h>
+
+#define MZ_ASSERT(x) assert(x)
+
+#ifdef MINIZ_NO_MALLOC
+  #define MZ_MALLOC(x) NULL
+  #define MZ_FREE(x) (void)x, ((void)0)
+  #define MZ_REALLOC(p, x) NULL
+#else
+  #define MZ_MALLOC(x) malloc(x)
+  #define MZ_FREE(x) free(x)
+  #define MZ_REALLOC(p, x) realloc(p, x)
+#endif
+
+#define MZ_MAX(a,b) (((a)>(b))?(a):(b))
+#define MZ_MIN(a,b) (((a)<(b))?(a):(b))
+#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+  #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
+  #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
+#else
+  #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
+  #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))
+#endif
+
+#ifdef _MSC_VER
+  #define MZ_FORCEINLINE __forceinline
+#elif defined(__GNUC__)
+  #define MZ_FORCEINLINE inline __attribute__((__always_inline__))
+#else
+  #define MZ_FORCEINLINE inline
+#endif
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+// ------------------- zlib-style API's
+
+mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len)
+{
+  mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552;
+  if (!ptr) return MZ_ADLER32_INIT;
+  while (buf_len) {
+    for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {
+      s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
+      s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
+    }
+    for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
+    s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
+  }
+  return (s2 << 16) + s1;
+}
+
+// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/
+mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len)
+{
+  static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
+    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c };
+  mz_uint32 crcu32 = (mz_uint32)crc;
+  if (!ptr) return MZ_CRC32_INIT;
+  crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; }
+  return ~crcu32;
+}
+
+void mz_free(void *p)
+{
+  MZ_FREE(p);
+}
+
+#ifndef MINIZ_NO_ZLIB_APIS
+
+static void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); }
+static void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); }
+static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); }
+
+const char *mz_version(void)
+{
+  return MZ_VERSION;
+}
+
+int mz_deflateInit(mz_streamp pStream, int level)
+{
+  return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY);
+}
+
+int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy)
+{
+  tdefl_compressor *pComp;
+  mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);
+
+  if (!pStream) return MZ_STREAM_ERROR;
+  if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR;
+
+  pStream->data_type = 0;
+  pStream->adler = MZ_ADLER32_INIT;
+  pStream->msg = NULL;
+  pStream->reserved = 0;
+  pStream->total_in = 0;
+  pStream->total_out = 0;
+  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;
+  if (!pStream->zfree) pStream->zfree = def_free_func;
+
+  pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor));
+  if (!pComp)
+    return MZ_MEM_ERROR;
+
+  pStream->state = (struct mz_internal_state *)pComp;
+
+  if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY)
+  {
+    mz_deflateEnd(pStream);
+    return MZ_PARAM_ERROR;
+  }
+
+  return MZ_OK;
+}
+
+int mz_deflateReset(mz_streamp pStream)
+{
+  if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR;
+  pStream->total_in = pStream->total_out = 0;
+  tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags);
+  return MZ_OK;
+}
+
+int mz_deflate(mz_streamp pStream, int flush)
+{
+  size_t in_bytes, out_bytes;
+  mz_ulong orig_total_in, orig_total_out;
+  int mz_status = MZ_OK;
+
+  if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR;
+  if (!pStream->avail_out) return MZ_BUF_ERROR;
+
+  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;
+
+  if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE)
+    return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR;
+
+  orig_total_in = pStream->total_in; orig_total_out = pStream->total_out;
+  for ( ; ; )
+  {
+    tdefl_status defl_status;
+    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;
+
+    defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush);
+    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;
+    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state);
+
+    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes;
+    pStream->total_out += (mz_uint)out_bytes;
+
+    if (defl_status < 0)
+    {
+      mz_status = MZ_STREAM_ERROR;
+      break;
+    }
+    else if (defl_status == TDEFL_STATUS_DONE)
+    {
+      mz_status = MZ_STREAM_END;
+      break;
+    }
+    else if (!pStream->avail_out)
+      break;
+    else if ((!pStream->avail_in) && (flush != MZ_FINISH))
+    {
+      if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out))
+        break;
+      return MZ_BUF_ERROR; // Can't make forward progress without some input.
+    }
+  }
+  return mz_status;
+}
+
+int mz_deflateEnd(mz_streamp pStream)
+{
+  if (!pStream) return MZ_STREAM_ERROR;
+  if (pStream->state)
+  {
+    pStream->zfree(pStream->opaque, pStream->state);
+    pStream->state = NULL;
+  }
+  return MZ_OK;
+}
+
+mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len)
+{
+  (void)pStream;
+  // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.)
+  return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);
+}
+
+int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level)
+{
+  int status;
+  mz_stream stream;
+  memset(&stream, 0, sizeof(stream));
+
+  // In case mz_ulong is 64-bits (argh I hate longs).
+  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;
+
+  stream.next_in = pSource;
+  stream.avail_in = (mz_uint32)source_len;
+  stream.next_out = pDest;
+  stream.avail_out = (mz_uint32)*pDest_len;
+
+  status = mz_deflateInit(&stream, level);
+  if (status != MZ_OK) return status;
+
+  status = mz_deflate(&stream, MZ_FINISH);
+  if (status != MZ_STREAM_END)
+  {
+    mz_deflateEnd(&stream);
+    return (status == MZ_OK) ? MZ_BUF_ERROR : status;
+  }
+
+  *pDest_len = stream.total_out;
+  return mz_deflateEnd(&stream);
+}
+
+int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
+{
+  return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION);
+}
+
+mz_ulong mz_compressBound(mz_ulong source_len)
+{
+  return mz_deflateBound(NULL, source_len);
+}
+
+typedef struct
+{
+  tinfl_decompressor m_decomp;
+  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits;
+  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];
+  tinfl_status m_last_status;
+} inflate_state;
+
+int mz_inflateInit2(mz_streamp pStream, int window_bits)
+{
+  inflate_state *pDecomp;
+  if (!pStream) return MZ_STREAM_ERROR;
+  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR;
+
+  pStream->data_type = 0;
+  pStream->adler = 0;
+  pStream->msg = NULL;
+  pStream->total_in = 0;
+  pStream->total_out = 0;
+  pStream->reserved = 0;
+  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;
+  if (!pStream->zfree) pStream->zfree = def_free_func;
+
+  pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state));
+  if (!pDecomp) return MZ_MEM_ERROR;
+
+  pStream->state = (struct mz_internal_state *)pDecomp;
+
+  tinfl_init(&pDecomp->m_decomp);
+  pDecomp->m_dict_ofs = 0;
+  pDecomp->m_dict_avail = 0;
+  pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;
+  pDecomp->m_first_call = 1;
+  pDecomp->m_has_flushed = 0;
+  pDecomp->m_window_bits = window_bits;
+
+  return MZ_OK;
+}
+
+int mz_inflateInit(mz_streamp pStream)
+{
+   return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS);
+}
+
+int mz_inflate(mz_streamp pStream, int flush)
+{
+  inflate_state* pState;
+  mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;
+  size_t in_bytes, out_bytes, orig_avail_in;
+  tinfl_status status;
+
+  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;
+  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;
+  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;
+
+  pState = (inflate_state*)pStream->state;
+  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;
+  orig_avail_in = pStream->avail_in;
+
+  first_call = pState->m_first_call; pState->m_first_call = 0;
+  if (pState->m_last_status < 0) return MZ_DATA_ERROR;
+
+  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;
+  pState->m_has_flushed |= (flush == MZ_FINISH);
+
+  if ((flush == MZ_FINISH) && (first_call))
+  {
+    // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file.
+    decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;
+    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;
+    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);
+    pState->m_last_status = status;
+    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes;
+    pStream->adler = tinfl_get_adler32(&pState->m_decomp);
+    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;
+
+    if (status < 0)
+      return MZ_DATA_ERROR;
+    else if (status != TINFL_STATUS_DONE)
+    {
+      pState->m_last_status = TINFL_STATUS_FAILED;
+      return MZ_BUF_ERROR;
+    }
+    return MZ_STREAM_END;
+  }
+  // flush != MZ_FINISH then we must assume there's more input.
+  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;
+
+  if (pState->m_dict_avail)
+  {
+    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
+    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
+    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;
+    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
+    return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
+  }
+
+  for ( ; ; )
+  {
+    in_bytes = pStream->avail_in;
+    out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;
+
+    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);
+    pState->m_last_status = status;
+
+    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;
+    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp);
+
+    pState->m_dict_avail = (mz_uint)out_bytes;
+
+    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
+    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
+    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;
+    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
+
+    if (status < 0)
+       return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well).
+    else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))
+      return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH.
+    else if (flush == MZ_FINISH)
+    {
+       // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH.
+       if (status == TINFL_STATUS_DONE)
+          return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;
+       // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong.
+       else if (!pStream->avail_out)
+          return MZ_BUF_ERROR;
+    }
+    else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail))
+      break;
+  }
+
+  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
+}
+
+int mz_inflateEnd(mz_streamp pStream)
+{
+  if (!pStream)
+    return MZ_STREAM_ERROR;
+  if (pStream->state)
+  {
+    pStream->zfree(pStream->opaque, pStream->state);
+    pStream->state = NULL;
+  }
+  return MZ_OK;
+}
+
+int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
+{
+  mz_stream stream;
+  int status;
+  memset(&stream, 0, sizeof(stream));
+
+  // In case mz_ulong is 64-bits (argh I hate longs).
+  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;
+
+  stream.next_in = pSource;
+  stream.avail_in = (mz_uint32)source_len;
+  stream.next_out = pDest;
+  stream.avail_out = (mz_uint32)*pDest_len;
+
+  status = mz_inflateInit(&stream);
+  if (status != MZ_OK)
+    return status;
+
+  status = mz_inflate(&stream, MZ_FINISH);
+  if (status != MZ_STREAM_END)
+  {
+    mz_inflateEnd(&stream);
+    return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status;
+  }
+  *pDest_len = stream.total_out;
+
+  return mz_inflateEnd(&stream);
+}
+
+const char *mz_error(int err)
+{
+  static struct { int m_err; const char *m_pDesc; } s_error_descs[] =
+  {
+    { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" },
+    { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" }
+  };
+  mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;
+  return NULL;
+}
+
+#endif //MINIZ_NO_ZLIB_APIS
+
+// ------------------- Low-level Decompression (completely independent from all compression API's)
+
+#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
+#define TINFL_MEMSET(p, c, l) memset(p, c, l)
+
+#define TINFL_CR_BEGIN switch(r->m_state) { case 0:
+#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
+#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
+#define TINFL_CR_FINISH }
+
+#define TINFL_GET_BYTE(state_index, c) do { \
+  while (pIn_buf_cur >= pIn_buf_end) { \
+    TINFL_CR_RETURN(state_index, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); \
+  } c = *pIn_buf_cur++; } MZ_MACRO_END
+
+#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))
+#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
+#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
+
+// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.
+// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a
+// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the
+// bit buffer contains >=15 bits (deflate's max. Huffman code size).
+#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
+  do { \
+    temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
+    if (temp >= 0) { \
+      code_len = temp >> 9; \
+      if ((code_len) && (num_bits >= code_len)) \
+      break; \
+    } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
+       code_len = TINFL_FAST_LOOKUP_BITS; \
+       do { \
+          temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
+       } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
+    } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
+  } while (num_bits < 15);
+
+// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read
+// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully
+// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32.
+// The slow path is only executed at the very end of the input buffer.
+// v1.16: The original macro handled the case at the very end of the passed-in input buffer, but we also need to handle the case where the user passes in 1+zillion bytes
+// following the deflate data and our non-conservative read-ahead path won't kick in here on this code. This is much trickier.
+#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
+  int temp; mz_uint code_len, c; \
+  if (num_bits < 15) { \
+    if ((pIn_buf_end - pIn_buf_cur) < 2) { \
+       TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
+    } else { \
+       bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \
+    } \
+  } \
+  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
+    code_len = temp >> 9, temp &= 511; \
+  else { \
+    code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
+  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
+
+tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
+{
+  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };
+  static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
+  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
+  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
+  static const int s_min_table_sizes[3] = { 257, 1, 4 };
+
+  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;
+  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
+  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
+  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
+
+  // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter).
+  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }
+
+  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;
+  TINFL_CR_BEGIN
+
+  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;
+  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
+  {
+    TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);
+    counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
+    if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));
+    if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
+  }
+
+  do
+  {
+    TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;
+    if (r->m_type == 0)
+    {
+      TINFL_SKIP_BITS(5, num_bits & 7);
+      for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }
+      if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }
+      while ((counter) && (num_bits))
+      {
+        TINFL_GET_BITS(51, dist, 8);
+        while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }
+        *pOut_buf_cur++ = (mz_uint8)dist;
+        counter--;
+      }
+      while (counter)
+      {
+        size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }
+        while (pIn_buf_cur >= pIn_buf_end)
+        {
+          TINFL_CR_RETURN(38, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS);
+        }
+        n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);
+        TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;
+      }
+    }
+    else if (r->m_type == 3)
+    {
+      TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);
+    }
+    else
+    {
+      if (r->m_type == 1)
+      {
+        mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;
+        r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
+        for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8;
+      }
+      else
+      {
+        for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }
+        MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }
+        r->m_table_sizes[2] = 19;
+      }
+      for ( ; (int)r->m_type >= 0; r->m_type--)
+      {
+        int tree_next, tree_cur; tinfl_huff_table *pTable;
+        mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);
+        for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;
+        used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
+        for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
+        if ((65536 != total) && (used_syms > 1))
+        {
+          TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);
+        }
+        for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
+        {
+          mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;
+          cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
+          if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }
+          if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
+          rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
+          for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
+          {
+            tree_cur -= ((rev_code >>= 1) & 1);
+            if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];
+          }
+          tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
+        }
+        if (r->m_type == 2)
+        {
+          for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )
+          {
+            mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }
+            if ((dist == 16) && (!counter))
+            {
+              TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);
+            }
+            num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16];
+            TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;
+          }
+          if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)
+          {
+            TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
+          }
+          TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
+        }
+      }
+      for ( ; ; )
+      {
+        mz_uint8 *pSrc;
+        for ( ; ; )
+        {
+          if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
+          {
+            TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
+            if (counter >= 256)
+              break;
+            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }
+            *pOut_buf_cur++ = (mz_uint8)counter;
+          }
+          else
+          {
+            int sym2; mz_uint code_len;
+#if TINFL_USE_64BIT_BITBUF
+            if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }
+#else
+            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
+#endif
+            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
+              code_len = sym2 >> 9;
+            else
+            {
+              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
+            }
+            counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
+            if (counter & 256)
+              break;
+
+#if !TINFL_USE_64BIT_BITBUF
+            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
+#endif
+            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
+              code_len = sym2 >> 9;
+            else
+            {
+              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
+            }
+            bit_buf >>= code_len; num_bits -= code_len;
+
+            pOut_buf_cur[0] = (mz_uint8)counter;
+            if (sym2 & 256)
+            {
+              pOut_buf_cur++;
+              counter = sym2;
+              break;
+            }
+            pOut_buf_cur[1] = (mz_uint8)sym2;
+            pOut_buf_cur += 2;
+          }
+        }
+        if ((counter &= 511) == 256) break;
+
+        num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
+        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
+
+        TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
+        num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
+        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
+
+        dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
+        if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
+        {
+          TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);
+        }
+
+        pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
+
+        if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)
+        {
+          while (counter--)
+          {
+            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }
+            *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
+          }
+          continue;
+        }
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
+        else if ((counter >= 9) && (counter <= dist))
+        {
+          const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
+          do
+          {
+            ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
+            ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
+            pOut_buf_cur += 8;
+          } while ((pSrc += 8) < pSrc_end);
+          if ((counter &= 7) < 3)
+          {
+            if (counter)
+            {
+              pOut_buf_cur[0] = pSrc[0];
+              if (counter > 1)
+                pOut_buf_cur[1] = pSrc[1];
+              pOut_buf_cur += counter;
+            }
+            continue;
+          }
+        }
+#endif
+        do
+        {
+          pOut_buf_cur[0] = pSrc[0];
+          pOut_buf_cur[1] = pSrc[1];
+          pOut_buf_cur[2] = pSrc[2];
+          pOut_buf_cur += 3; pSrc += 3;
+        } while ((int)(counter -= 3) > 2);
+        if ((int)counter > 0)
+        {
+          pOut_buf_cur[0] = pSrc[0];
+          if ((int)counter > 1)
+            pOut_buf_cur[1] = pSrc[1];
+          pOut_buf_cur += counter;
+        }
+      }
+    }
+  } while (!(r->m_final & 1));
+
+  // Ensure byte alignment and put back any bytes from the bitbuf if we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data.
+  // I'm being super conservative here. A number of simplifications can be made to the byte alignment part, and the Adler32 check shouldn't ever need to worry about reading from the bitbuf now.
+  TINFL_SKIP_BITS(32, num_bits & 7);
+  while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } bit_buf &= (tinfl_bit_buf_t)((1ULL << num_bits) - 1ULL);
+  MZ_ASSERT(!num_bits); // if this assert fires then we've read beyond the end of non-deflate/zlib streams with following data (such as gzip streams).
+
+  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
+  {
+    for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }
+  }
+  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);
+
+  TINFL_CR_FINISH
+
+common_exit:
+  // As long as we aren't telling the caller that we NEED more input to make forward progress:
+  // Put back any bytes from the bitbuf in case we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data.
+  // We need to be very careful here to NOT push back any bytes we definitely know we need to make forward progress, though, or we'll lock the caller up into an inf loop.
+  if ((status != TINFL_STATUS_NEEDS_MORE_INPUT) && (status != TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS)) { while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } }
+  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf & (tinfl_bit_buf_t)((1ULL << num_bits) - 1ULL); r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;
+  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
+  if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))
+  {
+    const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;
+    mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;
+    while (buf_len)
+    {
+      for (i = 0; i + 7 < block_len; i += 8, ptr += 8)
+      {
+        s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
+        s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
+      }
+      for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
+      s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
+    }
+    r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;
+  }
+  return status;
+}
+
+// Higher level helper functions.
+void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
+{
+  tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0;
+  *pOut_len = 0;
+  tinfl_init(&decomp);
+  for ( ; ; )
+  {
+    size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
+    tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size,
+      (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
+    if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT))
+    {
+      MZ_FREE(pBuf); *pOut_len = 0; return NULL;
+    }
+    src_buf_ofs += src_buf_size;
+    *pOut_len += dst_buf_size;
+    if (status == TINFL_STATUS_DONE) break;
+    new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;
+    pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);
+    if (!pNew_buf)
+    {
+      MZ_FREE(pBuf); *pOut_len = 0; return NULL;
+    }
+    pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;
+  }
+  return pBuf;
+}
+
+size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
+{
+  tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);
+  status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
+  return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;
+}
+
+int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
+{
+  int result = 0;
+  tinfl_decompressor decomp;
+  mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0;
+  if (!pDict)
+    return TINFL_STATUS_FAILED;
+  tinfl_init(&decomp);
+  for ( ; ; )
+  {
+    size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;
+    tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
+      (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
+    in_buf_ofs += in_buf_size;
+    if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
+      break;
+    if (status != TINFL_STATUS_HAS_MORE_OUTPUT)
+    {
+      result = (status == TINFL_STATUS_DONE);
+      break;
+    }
+    dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);
+  }
+  MZ_FREE(pDict);
+  *pIn_buf_size = in_buf_ofs;
+  return result;
+}
+
+// ------------------- Low-level Compression (independent from all decompression API's)
+
+// Purposely making these tables static for faster init and thread safety.
+static const mz_uint16 s_tdefl_len_sym[256] = {
+  257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272,
+  273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276,
+  277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,
+  279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,
+  281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,
+  282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,
+  283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,
+  284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 };
+
+static const mz_uint8 s_tdefl_len_extra[256] = {
+  0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 };
+
+static const mz_uint8 s_tdefl_small_dist_sym[512] = {
+  0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,
+  11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,
+  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,
+  14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
+  14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+  15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,
+  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 };
+
+static const mz_uint8 s_tdefl_small_dist_extra[512] = {
+  0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,
+  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+  7,7,7,7,7,7,7,7 };
+
+static const mz_uint8 s_tdefl_large_dist_sym[128] = {
+  0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,
+  26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,
+  28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 };
+
+static const mz_uint8 s_tdefl_large_dist_extra[128] = {
+  0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+  12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 };
+
+// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values.
+typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;
+static tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1)
+{
+  mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist);
+  for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; }
+  while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--;
+  for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8)
+  {
+    const mz_uint32* pHist = &hist[pass << 8];
+    mz_uint offsets[256], cur_ofs = 0;
+    for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; }
+    for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i];
+    { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; }
+  }
+  return pCur_syms;
+}
+
+// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.
+static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n)
+{
+  int root, leaf, next, avbl, used, dpth;
+  if (n==0) return; else if (n==1) { A[0].m_key = 1; return; }
+  A[0].m_key += A[1].m_key; root = 0; leaf = 2;
+  for (next=1; next < n-1; next++)
+  {
+    if (leaf>=n || A[root].m_key<A[leaf].m_key) { A[next].m_key = A[root].m_key; A[root++].m_key = (mz_uint16)next; } else A[next].m_key = A[leaf++].m_key;
+    if (leaf>=n || (root<next && A[root].m_key<A[leaf].m_key)) { A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); A[root++].m_key = (mz_uint16)next; } else A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key);
+  }
+  A[n-2].m_key = 0; for (next=n-3; next>=0; next--) A[next].m_key = A[A[next].m_key].m_key+1;
+  avbl = 1; used = dpth = 0; root = n-2; next = n-1;
+  while (avbl>0)
+  {
+    while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; }
+    while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; }
+    avbl = 2*used; dpth++; used = 0;
+  }
+}
+
+// Limits canonical Huffman code table's max code size.
+enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 };
+static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size)
+{
+  int i; mz_uint32 total = 0; if (code_list_len <= 1) return;
+  for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i];
+  for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i));
+  while (total != (1UL << max_code_size))
+  {
+    pNum_codes[max_code_size]--;
+    for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; }
+    total--;
+  }
+}
+
+static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table)
+{
+  int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes);
+  if (static_table)
+  {
+    for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++;
+  }
+  else
+  {
+    tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms;
+    int num_used_syms = 0;
+    const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0];
+    for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; }
+
+    pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);
+
+    for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++;
+
+    tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit);
+
+    MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);
+    for (i = 1, j = num_used_syms; i <= code_size_limit; i++)
+      for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);
+  }
+
+  next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1);
+
+  for (i = 0; i < table_len; i++)
+  {
+    mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue;
+    code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1);
+    d->m_huff_codes[table_num][i] = (mz_uint16)rev_code;
+  }
+}
+
+#define TDEFL_PUT_BITS(b, l) do { \
+  mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \
+  d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \
+  while (d->m_bits_in >= 8) { \
+    if (d->m_pOutput_buf < d->m_pOutput_buf_end) \
+      *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \
+      d->m_bit_buffer >>= 8; \
+      d->m_bits_in -= 8; \
+  } \
+} MZ_MACRO_END
+
+#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \
+  if (rle_repeat_count < 3) { \
+    d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \
+    while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \
+  } else { \
+    d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \
+} rle_repeat_count = 0; } }
+
+#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \
+  if (rle_z_count < 3) { \
+    d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \
+  } else if (rle_z_count <= 10) { \
+    d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \
+  } else { \
+    d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \
+} rle_z_count = 0; } }
+
+static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
+
+static void tdefl_start_dynamic_block(tdefl_compressor *d)
+{
+  int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index;
+  mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF;
+
+  d->m_huff_count[0][256] = 1;
+
+  tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE);
+  tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE);
+
+  for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break;
+  for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break;
+
+  memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes);
+  memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes);
+  total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0;
+
+  memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2);
+  for (i = 0; i < total_code_sizes_to_pack; i++)
+  {
+    mz_uint8 code_size = code_sizes_to_pack[i];
+    if (!code_size)
+    {
+      TDEFL_RLE_PREV_CODE_SIZE();
+      if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); }
+    }
+    else
+    {
+      TDEFL_RLE_ZERO_CODE_SIZE();
+      if (code_size != prev_code_size)
+      {
+        TDEFL_RLE_PREV_CODE_SIZE();
+        d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size;
+      }
+      else if (++rle_repeat_count == 6)
+      {
+        TDEFL_RLE_PREV_CODE_SIZE();
+      }
+    }
+    prev_code_size = code_size;
+  }
+  if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); }
+
+  tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE);
+
+  TDEFL_PUT_BITS(2, 2);
+
+  TDEFL_PUT_BITS(num_lit_codes - 257, 5);
+  TDEFL_PUT_BITS(num_dist_codes - 1, 5);
+
+  for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break;
+  num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4);
+  for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3);
+
+  for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; )
+  {
+    mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2);
+    TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]);
+    if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]);
+  }
+}
+
+static void tdefl_start_static_block(tdefl_compressor *d)
+{
+  mz_uint i;
+  mz_uint8 *p = &d->m_huff_code_sizes[0][0];
+
+  for (i = 0; i <= 143; ++i) *p++ = 8;
+  for ( ; i <= 255; ++i) *p++ = 9;
+  for ( ; i <= 279; ++i) *p++ = 7;
+  for ( ; i <= 287; ++i) *p++ = 8;
+
+  memset(d->m_huff_code_sizes[1], 5, 32);
+
+  tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE);
+  tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE);
+
+  TDEFL_PUT_BITS(1, 2);
+}
+
+static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS
+static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)
+{
+  mz_uint flags;
+  mz_uint8 *pLZ_codes;
+  mz_uint8 *pOutput_buf = d->m_pOutput_buf;
+  mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf;
+  mz_uint64 bit_buffer = d->m_bit_buffer;
+  mz_uint bits_in = d->m_bits_in;
+
+#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); }
+
+  flags = 1;
+  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1)
+  {
+    if (flags == 1)
+      flags = *pLZ_codes++ | 0x100;
+
+    if (flags & 1)
+    {
+      mz_uint s0, s1, n0, n1, sym, num_extra_bits;
+      mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3;
+
+      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+      TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);
+
+      // This sequence coaxes MSVC into using cmov's vs. jmp's.
+      s0 = s_tdefl_small_dist_sym[match_dist & 511];
+      n0 = s_tdefl_small_dist_extra[match_dist & 511];
+      s1 = s_tdefl_large_dist_sym[match_dist >> 8];
+      n1 = s_tdefl_large_dist_extra[match_dist >> 8];
+      sym = (match_dist < 512) ? s0 : s1;
+      num_extra_bits = (match_dist < 512) ? n0 : n1;
+
+      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);
+      TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);
+      TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
+    }
+    else
+    {
+      mz_uint lit = *pLZ_codes++;
+      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
+
+      if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))
+      {
+        flags >>= 1;
+        lit = *pLZ_codes++;
+        MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+        TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
+
+        if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))
+        {
+          flags >>= 1;
+          lit = *pLZ_codes++;
+          MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+          TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
+        }
+      }
+    }
+
+    if (pOutput_buf >= d->m_pOutput_buf_end)
+      return MZ_FALSE;
+
+    *(mz_uint64*)pOutput_buf = bit_buffer;
+    pOutput_buf += (bits_in >> 3);
+    bit_buffer >>= (bits_in & ~7);
+    bits_in &= 7;
+  }
+
+#undef TDEFL_PUT_BITS_FAST
+
+  d->m_pOutput_buf = pOutput_buf;
+  d->m_bits_in = 0;
+  d->m_bit_buffer = 0;
+
+  while (bits_in)
+  {
+    mz_uint32 n = MZ_MIN(bits_in, 16);
+    TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n);
+    bit_buffer >>= n;
+    bits_in -= n;
+  }
+
+  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);
+
+  return (d->m_pOutput_buf < d->m_pOutput_buf_end);
+}
+#else
+static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)
+{
+  mz_uint flags;
+  mz_uint8 *pLZ_codes;
+
+  flags = 1;
+  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1)
+  {
+    if (flags == 1)
+      flags = *pLZ_codes++ | 0x100;
+    if (flags & 1)
+    {
+      mz_uint sym, num_extra_bits;
+      mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3;
+
+      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+      TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+      TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);
+
+      if (match_dist < 512)
+      {
+        sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist];
+      }
+      else
+      {
+        sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];
+      }
+      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);
+      TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);
+      TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
+    }
+    else
+    {
+      mz_uint lit = *pLZ_codes++;
+      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+      TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
+    }
+  }
+
+  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);
+
+  return (d->m_pOutput_buf < d->m_pOutput_buf_end);
+}
+#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS
+
+static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block)
+{
+  if (static_block)
+    tdefl_start_static_block(d);
+  else
+    tdefl_start_dynamic_block(d);
+  return tdefl_compress_lz_codes(d);
+}
+
+static int tdefl_flush_block(tdefl_compressor *d, int flush)
+{
+  mz_uint saved_bit_buf, saved_bits_in;
+  mz_uint8 *pSaved_output_buf;
+  mz_bool comp_block_succeeded = MZ_FALSE;
+  int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;
+  mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf;
+
+  d->m_pOutput_buf = pOutput_buf_start;
+  d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16;
+
+  MZ_ASSERT(!d->m_output_flush_remaining);
+  d->m_output_flush_ofs = 0;
+  d->m_output_flush_remaining = 0;
+
+  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left);
+  d->m_pLZ_code_buf -= (d->m_num_flags_left == 8);
+
+  if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index))
+  {
+    TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8);
+  }
+
+  TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);
+
+  pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in;
+
+  if (!use_raw_block)
+    comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48));
+
+  // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead.
+  if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) &&
+       ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) )
+  {
+    mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;
+    TDEFL_PUT_BITS(0, 2);
+    if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }
+    for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF)
+    {
+      TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16);
+    }
+    for (i = 0; i < d->m_total_lz_bytes; ++i)
+    {
+      TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8);
+    }
+  }
+  // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes.
+  else if (!comp_block_succeeded)
+  {
+    d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;
+    tdefl_compress_block(d, MZ_TRUE);
+  }
+
+  if (flush)
+  {
+    if (flush == TDEFL_FINISH)
+    {
+      if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }
+      if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } }
+    }
+    else
+    {
+      mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); }
+    }
+  }
+
+  MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end);
+
+  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
+  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
+
+  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++;
+
+  if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0)
+  {
+    if (d->m_pPut_buf_func)
+    {
+      *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;
+      if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user))
+        return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED);
+    }
+    else if (pOutput_buf_start == d->m_output_buf)
+    {
+      int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs));
+      memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy);
+      d->m_out_buf_ofs += bytes_to_copy;
+      if ((n -= bytes_to_copy) != 0)
+      {
+        d->m_output_flush_ofs = bytes_to_copy;
+        d->m_output_flush_remaining = n;
+      }
+    }
+    else
+    {
+      d->m_out_buf_ofs += n;
+    }
+  }
+
+  return d->m_output_flush_remaining;
+}
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
+#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p)
+static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
+{
+  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;
+  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
+  const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q;
+  mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s);
+  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;
+  for ( ; ; )
+  {
+    for ( ; ; )
+    {
+      if (--num_probes_left == 0) return;
+      #define TDEFL_PROBE \
+        next_probe_pos = d->m_next[probe_pos]; \
+        if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \
+        probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
+        if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break;
+      TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;
+    }
+    if (!dist) break; q = (const mz_uint16*)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; p = s; probe_len = 32;
+    do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
+                   (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );
+    if (!probe_len)
+    {
+      *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break;
+    }
+    else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len)
+    {
+      *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break;
+      c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);
+    }
+  }
+}
+#else
+static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
+{
+  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;
+  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
+  const mz_uint8 *s = d->m_dict + pos, *p, *q;
+  mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1];
+  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;
+  for ( ; ; )
+  {
+    for ( ; ; )
+    {
+      if (--num_probes_left == 0) return;
+      #define TDEFL_PROBE \
+        next_probe_pos = d->m_next[probe_pos]; \
+        if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \
+        probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
+        if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break;
+      TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;
+    }
+    if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break;
+    if (probe_len > match_len)
+    {
+      *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return;
+      c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1];
+    }
+  }
+}
+#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+static mz_bool tdefl_compress_fast(tdefl_compressor *d)
+{
+  // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio.
+  mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left;
+  mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags;
+  mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;
+
+  while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size)))
+  {
+    const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;
+    mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;
+    mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size);
+    d->m_src_buf_left -= num_bytes_to_process;
+    lookahead_size += num_bytes_to_process;
+
+    while (num_bytes_to_process)
+    {
+      mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process);
+      memcpy(d->m_dict + dst_pos, d->m_pSrc, n);
+      if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
+        memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos));
+      d->m_pSrc += n;
+      dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK;
+      num_bytes_to_process -= n;
+    }
+
+    dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size);
+    if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break;
+
+    while (lookahead_size >= 4)
+    {
+      mz_uint cur_match_dist, cur_match_len = 1;
+      mz_uint8 *pCur_dict = d->m_dict + cur_pos;
+      mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF;
+      mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK;
+      mz_uint probe_pos = d->m_hash[hash];
+      d->m_hash[hash] = (mz_uint16)lookahead_pos;
+
+      if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram))
+      {
+        const mz_uint16 *p = (const mz_uint16 *)pCur_dict;
+        const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos);
+        mz_uint32 probe_len = 32;
+        do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
+          (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );
+        cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);
+        if (!probe_len)
+          cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;
+
+        if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)))
+        {
+          cur_match_len = 1;
+          *pLZ_code_buf++ = (mz_uint8)first_trigram;
+          *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
+          d->m_huff_count[0][(mz_uint8)first_trigram]++;
+        }
+        else
+        {
+          mz_uint32 s0, s1;
+          cur_match_len = MZ_MIN(cur_match_len, lookahead_size);
+
+          MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE));
+
+          cur_match_dist--;
+
+          pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN);
+          *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist;
+          pLZ_code_buf += 3;
+          *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80);
+
+          s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];
+          s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];
+          d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;
+
+          d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++;
+        }
+      }
+      else
+      {
+        *pLZ_code_buf++ = (mz_uint8)first_trigram;
+        *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
+        d->m_huff_count[0][(mz_uint8)first_trigram]++;
+      }
+
+      if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }
+
+      total_lz_bytes += cur_match_len;
+      lookahead_pos += cur_match_len;
+      dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE);
+      cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK;
+      MZ_ASSERT(lookahead_size >= cur_match_len);
+      lookahead_size -= cur_match_len;
+
+      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8])
+      {
+        int n;
+        d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;
+        d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;
+        if ((n = tdefl_flush_block(d, 0)) != 0)
+          return (n < 0) ? MZ_FALSE : MZ_TRUE;
+        total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;
+      }
+    }
+
+    while (lookahead_size)
+    {
+      mz_uint8 lit = d->m_dict[cur_pos];
+
+      total_lz_bytes++;
+      *pLZ_code_buf++ = lit;
+      *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
+      if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }
+
+      d->m_huff_count[0][lit]++;
+
+      lookahead_pos++;
+      dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE);
+      cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;
+      lookahead_size--;
+
+      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8])
+      {
+        int n;
+        d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;
+        d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;
+        if ((n = tdefl_flush_block(d, 0)) != 0)
+          return (n < 0) ? MZ_FALSE : MZ_TRUE;
+        total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;
+      }
+    }
+  }
+
+  d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;
+  d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;
+  return MZ_TRUE;
+}
+#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+
+static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit)
+{
+  d->m_total_lz_bytes++;
+  *d->m_pLZ_code_buf++ = lit;
+  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }
+  d->m_huff_count[0][lit]++;
+}
+
+static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist)
+{
+  mz_uint32 s0, s1;
+
+  MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE));
+
+  d->m_total_lz_bytes += match_len;
+
+  d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN);
+
+  match_dist -= 1;
+  d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF);
+  d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3;
+
+  *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }
+
+  s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];
+  d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++;
+
+  if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++;
+}
+
+static mz_bool tdefl_compress_normal(tdefl_compressor *d)
+{
+  const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left;
+  tdefl_flush flush = d->m_flush;
+
+  while ((src_buf_left) || ((flush) && (d->m_lookahead_size)))
+  {
+    mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;
+    // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN.
+    if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1))
+    {
+      mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;
+      mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];
+      mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);
+      const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;
+      src_buf_left -= num_bytes_to_process;
+      d->m_lookahead_size += num_bytes_to_process;
+      while (pSrc != pSrc_end)
+      {
+        mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;
+        hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);
+        d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);
+        dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++;
+      }
+    }
+    else
+    {
+      while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))
+      {
+        mz_uint8 c = *pSrc++;
+        mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;
+        src_buf_left--;
+        d->m_dict[dst_pos] = c;
+        if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
+          d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;
+        if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN)
+        {
+          mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2;
+          mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);
+          d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);
+        }
+      }
+    }
+    d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size);
+    if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))
+      break;
+
+    // Simple lazy/greedy parsing state machine.
+    len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;
+    if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS))
+    {
+      if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))
+      {
+        mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK];
+        cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; }
+        if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1;
+      }
+    }
+    else
+    {
+      tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len);
+    }
+    if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5)))
+    {
+      cur_match_dist = cur_match_len = 0;
+    }
+    if (d->m_saved_match_len)
+    {
+      if (cur_match_len > d->m_saved_match_len)
+      {
+        tdefl_record_literal(d, (mz_uint8)d->m_saved_lit);
+        if (cur_match_len >= 128)
+        {
+          tdefl_record_match(d, cur_match_len, cur_match_dist);
+          d->m_saved_match_len = 0; len_to_move = cur_match_len;
+        }
+        else
+        {
+          d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;
+        }
+      }
+      else
+      {
+        tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist);
+        len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0;
+      }
+    }
+    else if (!cur_match_dist)
+      tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]);
+    else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128))
+    {
+      tdefl_record_match(d, cur_match_len, cur_match_dist);
+      len_to_move = cur_match_len;
+    }
+    else
+    {
+      d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;
+    }
+    // Move the lookahead forward by len_to_move bytes.
+    d->m_lookahead_pos += len_to_move;
+    MZ_ASSERT(d->m_lookahead_size >= len_to_move);
+    d->m_lookahead_size -= len_to_move;
+    d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE);
+    // Check if it's time to flush the current LZ codes to the internal output buffer.
+    if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) ||
+         ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) )
+    {
+      int n;
+      d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;
+      if ((n = tdefl_flush_block(d, 0)) != 0)
+        return (n < 0) ? MZ_FALSE : MZ_TRUE;
+    }
+  }
+
+  d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;
+  return MZ_TRUE;
+}
+
+static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d)
+{
+  if (d->m_pIn_buf_size)
+  {
+    *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;
+  }
+
+  if (d->m_pOut_buf_size)
+  {
+    size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining);
+    memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n);
+    d->m_output_flush_ofs += (mz_uint)n;
+    d->m_output_flush_remaining -= (mz_uint)n;
+    d->m_out_buf_ofs += n;
+
+    *d->m_pOut_buf_size = d->m_out_buf_ofs;
+  }
+
+  return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY;
+}
+
+tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush)
+{
+  if (!d)
+  {
+    if (pIn_buf_size) *pIn_buf_size = 0;
+    if (pOut_buf_size) *pOut_buf_size = 0;
+    return TDEFL_STATUS_BAD_PARAM;
+  }
+
+  d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size;
+  d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size;
+  d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0;
+  d->m_out_buf_ofs = 0;
+  d->m_flush = flush;
+
+  if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) ||
+        (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) )
+  {
+    if (pIn_buf_size) *pIn_buf_size = 0;
+    if (pOut_buf_size) *pOut_buf_size = 0;
+    return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM);
+  }
+  d->m_wants_to_finish |= (flush == TDEFL_FINISH);
+
+  if ((d->m_output_flush_remaining) || (d->m_finished))
+    return (d->m_prev_return_status = tdefl_flush_output_buffer(d));
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+  if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) &&
+      ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) &&
+      ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0))
+  {
+    if (!tdefl_compress_fast(d))
+      return d->m_prev_return_status;
+  }
+  else
+#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+  {
+    if (!tdefl_compress_normal(d))
+      return d->m_prev_return_status;
+  }
+
+  if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf))
+    d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf);
+
+  if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining))
+  {
+    if (tdefl_flush_block(d, flush) < 0)
+      return d->m_prev_return_status;
+    d->m_finished = (flush == TDEFL_FINISH);
+    if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; }
+  }
+
+  return (d->m_prev_return_status = tdefl_flush_output_buffer(d));
+}
+
+tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush)
+{
+  MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush);
+}
+
+tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
+{
+  d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user;
+  d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;
+  d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;
+  if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash);
+  d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;
+  d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;
+  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8;
+  d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY;
+  d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1;
+  d->m_pIn_buf = NULL; d->m_pOut_buf = NULL;
+  d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL;
+  d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0;
+  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
+  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
+  return TDEFL_STATUS_OKAY;
+}
+
+tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d)
+{
+  return d->m_prev_return_status;
+}
+
+mz_uint32 tdefl_get_adler32(tdefl_compressor *d)
+{
+  return d->m_adler32;
+}
+
+mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
+{
+  tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE;
+  pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE;
+  succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY);
+  succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE);
+  MZ_FREE(pComp); return succeeded;
+}
+
+typedef struct
+{
+  size_t m_size, m_capacity;
+  mz_uint8 *m_pBuf;
+  mz_bool m_expandable;
+} tdefl_output_buffer;
+
+static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser)
+{
+  tdefl_output_buffer *p = (tdefl_output_buffer *)pUser;
+  size_t new_size = p->m_size + len;
+  if (new_size > p->m_capacity)
+  {
+    size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE;
+    do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity);
+    pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE;
+    p->m_pBuf = pNew_buf; p->m_capacity = new_capacity;
+  }
+  memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size;
+  return MZ_TRUE;
+}
+
+void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
+{
+  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);
+  if (!pOut_len) return MZ_FALSE; else *pOut_len = 0;
+  out_buf.m_expandable = MZ_TRUE;
+  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL;
+  *pOut_len = out_buf.m_size; return out_buf.m_pBuf;
+}
+
+size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
+{
+  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);
+  if (!pOut_buf) return 0;
+  out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len;
+  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0;
+  return out_buf.m_size;
+}
+
+#ifndef MINIZ_NO_ZLIB_APIS
+static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 };
+
+// level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files).
+mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy)
+{
+  mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);
+  if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER;
+
+  if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;
+  else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES;
+  else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK;
+  else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS;
+  else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES;
+
+  return comp_flags;
+}
+#endif //MINIZ_NO_ZLIB_APIS
+
+#ifdef _MSC_VER
+#pragma warning (push)
+#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal)
+#endif
+
+// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at
+// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/.
+// This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck.
+void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip)
+{
+  // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined.
+  static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 };
+  tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0;
+  if (!pComp) return NULL;
+  MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; }
+  // write dummy header
+  for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf);
+  // compress image data
+  tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER);
+  for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); }
+  if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }
+  // write real header
+  *pLen_out = out_buf.m_size-41;
+  {
+    static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06};
+    mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+      0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,chans[num_chans],0,0,0,0,0,0,0,
+      (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54};
+    c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24);
+    memcpy(out_buf.m_pBuf, pnghdr, 41);
+  }
+  // write footer (IDAT CRC-32, followed by IEND chunk)
+  if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }
+  c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24);
+  // compute final size of file, grab compressed data buffer and return
+  *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf;
+}
+
+void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out)
+{
+  // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out)
+  return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE);
+}
+
+// Allocate the tdefl_compressor and tinfl_decompressor structures in C so that
+// non-C language bindings to tdefL_ and tinfl_ API don't need to worry about
+// structure size and allocation mechanism.
+tdefl_compressor *tdefl_compressor_alloc()
+{
+  return (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor));
+}
+
+void tdefl_compressor_free(tdefl_compressor* pComp)
+{
+  MZ_FREE(pComp);
+}
+
+tinfl_decompressor *tinfl_decompressor_alloc()
+{
+  tinfl_decompressor *pDecomp = (tinfl_decompressor *)MZ_MALLOC(sizeof(tinfl_decompressor));
+  if (pDecomp)
+    tinfl_init(pDecomp);
+  return pDecomp;
+}
+
+void tinfl_decompressor_free(tinfl_decompressor *pDecomp)
+{
+  MZ_FREE(pDecomp);
+}
+
+#ifdef _MSC_VER
+#pragma warning (pop)
+#endif
+
+// ------------------- .ZIP archive reading
+
+#ifndef MINIZ_NO_ARCHIVE_APIS
+
+#ifdef MINIZ_NO_STDIO
+  #define MZ_FILE void *
+#else
+  #include <stdio.h>
+  #include <sys/stat.h>
+
+  #if defined(_MSC_VER) || defined(__MINGW64__)
+    static FILE *mz_fopen(const char *pFilename, const char *pMode)
+    {
+      FILE* pFile = NULL;
+      fopen_s(&pFile, pFilename, pMode);
+      return pFile;
+    }
+    static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)
+    {
+      FILE* pFile = NULL;
+      if (freopen_s(&pFile, pPath, pMode, pStream))
+        return NULL;
+      return pFile;
+    }
+    #ifndef MINIZ_NO_TIME
+      #include <sys/utime.h>
+    #endif
+    #define MZ_FILE FILE
+    #define MZ_FOPEN mz_fopen
+    #define MZ_FCLOSE fclose
+    #define MZ_FREAD fread
+    #define MZ_FWRITE fwrite
+    #define MZ_FTELL64 _ftelli64
+    #define MZ_FSEEK64 _fseeki64
+    #define MZ_FILE_STAT_STRUCT _stat
+    #define MZ_FILE_STAT _stat
+    #define MZ_FFLUSH fflush
+    #define MZ_FREOPEN mz_freopen
+    #define MZ_DELETE_FILE remove
+  #elif defined(__MINGW32__)
+    #ifndef MINIZ_NO_TIME
+      #include <sys/utime.h>
+    #endif
+    #define MZ_FILE FILE
+    #define MZ_FOPEN(f, m) fopen(f, m)
+    #define MZ_FCLOSE fclose
+    #define MZ_FREAD fread
+    #define MZ_FWRITE fwrite
+    #define MZ_FTELL64 ftello64
+    #define MZ_FSEEK64 fseeko64
+    #define MZ_FILE_STAT_STRUCT _stat
+    #define MZ_FILE_STAT _stat
+    #define MZ_FFLUSH fflush
+    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)
+    #define MZ_DELETE_FILE remove
+  #elif defined(__TINYC__)
+    #ifndef MINIZ_NO_TIME
+      #include <sys/utime.h>
+    #endif
+    #define MZ_FILE FILE
+    #define MZ_FOPEN(f, m) fopen(f, m)
+    #define MZ_FCLOSE fclose
+    #define MZ_FREAD fread
+    #define MZ_FWRITE fwrite
+    #define MZ_FTELL64 ftell
+    #define MZ_FSEEK64 fseek
+    #define MZ_FILE_STAT_STRUCT stat
+    #define MZ_FILE_STAT stat
+    #define MZ_FFLUSH fflush
+    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)
+    #define MZ_DELETE_FILE remove
+  #elif defined(__GNUC__) && _LARGEFILE64_SOURCE
+    #ifndef MINIZ_NO_TIME
+      #include <utime.h>
+    #endif
+    #define MZ_FILE FILE
+    #define MZ_FOPEN(f, m) fopen64(f, m)
+    #define MZ_FCLOSE fclose
+    #define MZ_FREAD fread
+    #define MZ_FWRITE fwrite
+    #define MZ_FTELL64 ftello64
+    #define MZ_FSEEK64 fseeko64
+    #define MZ_FILE_STAT_STRUCT stat64
+    #define MZ_FILE_STAT stat64
+    #define MZ_FFLUSH fflush
+    #define MZ_FREOPEN(p, m, s) freopen64(p, m, s)
+    #define MZ_DELETE_FILE remove
+  #else
+    #ifndef MINIZ_NO_TIME
+      #include <utime.h>
+    #endif
+    #define MZ_FILE FILE
+    #define MZ_FOPEN(f, m) fopen(f, m)
+    #define MZ_FCLOSE fclose
+    #define MZ_FREAD fread
+    #define MZ_FWRITE fwrite
+    #define MZ_FTELL64 ftello
+    #define MZ_FSEEK64 fseeko
+    #define MZ_FILE_STAT_STRUCT stat
+    #define MZ_FILE_STAT stat
+    #define MZ_FFLUSH fflush
+    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)
+    #define MZ_DELETE_FILE remove
+  #endif // #ifdef _MSC_VER
+#endif // #ifdef MINIZ_NO_STDIO
+
+#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c))
+
+// Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff.
+enum
+{
+  // ZIP archive identifiers and record sizes
+  MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50,
+  MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22,
+  // Central directory header record offsets
+  MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8,
+  MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16,
+  MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30,
+  MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42,
+  // Local directory header offsets
+  MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10,
+  MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22,
+  MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28,
+  // End of central directory offsets
+  MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8,
+  MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20,
+};
+
+typedef struct
+{
+  void *m_p;
+  size_t m_size, m_capacity;
+  mz_uint m_element_size;
+} mz_zip_array;
+
+struct mz_zip_internal_state_tag
+{
+  mz_zip_array m_central_dir;
+  mz_zip_array m_central_dir_offsets;
+  mz_zip_array m_sorted_central_dir_offsets;
+  MZ_FILE *m_pFile;
+  void *m_pMem;
+  size_t m_mem_size;
+  size_t m_mem_capacity;
+};
+
+#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size
+#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index]
+
+static MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray)
+{
+  pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p);
+  memset(pArray, 0, sizeof(mz_zip_array));
+}
+
+static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing)
+{
+  void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE;
+  if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; }
+  if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE;
+  pArray->m_p = pNew_p; pArray->m_capacity = new_capacity;
+  return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing)
+{
+  if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; }
+  return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing)
+{
+  if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; }
+  pArray->m_size = new_size;
+  return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n)
+{
+  return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE);
+}
+
+static MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n)
+{
+  size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE;
+  memcpy((mz_uint8*)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size);
+  return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_TIME
+static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date)
+{
+  struct tm tm;
+  memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1;
+  tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31;
+  tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62;
+  return mktime(&tm);
+}
+
+static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date)
+{
+#ifdef _MSC_VER
+  struct tm tm_struct;
+  struct tm *tm = &tm_struct;
+  errno_t err = localtime_s(tm, &time);
+  if (err)
+  {
+    *pDOS_date = 0; *pDOS_time = 0;
+    return;
+  }
+#else
+  struct tm *tm = localtime(&time);
+#endif
+  *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1));
+  *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday);
+}
+#endif
+
+#ifndef MINIZ_NO_STDIO
+static mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date)
+{
+#ifdef MINIZ_NO_TIME
+  (void)pFilename; *pDOS_date = *pDOS_time = 0;
+#else
+  struct MZ_FILE_STAT_STRUCT file_stat;
+  // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000 bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh.
+  if (MZ_FILE_STAT(pFilename, &file_stat) != 0)
+    return MZ_FALSE;
+  mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date);
+#endif // #ifdef MINIZ_NO_TIME
+  return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_TIME
+static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time)
+{
+  struct utimbuf t; t.actime = access_time; t.modtime = modified_time;
+  return !utime(pFilename, &t);
+}
+#endif // #ifndef MINIZ_NO_TIME
+#endif // #ifndef MINIZ_NO_STDIO
+
+static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags)
+{
+  (void)flags;
+  if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))
+    return MZ_FALSE;
+
+  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;
+  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;
+  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;
+
+  pZip->m_zip_mode = MZ_ZIP_MODE_READING;
+  pZip->m_archive_size = 0;
+  pZip->m_central_directory_file_ofs = 0;
+  pZip->m_total_files = 0;
+
+  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))
+    return MZ_FALSE;
+  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));
+  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8));
+  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32));
+  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32));
+  return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index)
+{
+  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE;
+  const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index));
+  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+  mz_uint8 l = 0, r = 0;
+  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+  pE = pL + MZ_MIN(l_len, r_len);
+  while (pL < pE)
+  {
+    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))
+      break;
+    pL++; pR++;
+  }
+  return (pL == pE) ? (l_len < r_len) : (l < r);
+}
+
+#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END
+
+// Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.)
+static void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip)
+{
+  mz_zip_internal_state *pState = pZip->m_pState;
+  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;
+  const mz_zip_array *pCentral_dir = &pState->m_central_dir;
+  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);
+  const int size = pZip->m_total_files;
+  int start = (size - 2) >> 1, end;
+  while (start >= 0)
+  {
+    int child, root = start;
+    for ( ; ; )
+    {
+      if ((child = (root << 1) + 1) >= size)
+        break;
+      child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])));
+      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))
+        break;
+      MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child;
+    }
+    start--;
+  }
+
+  end = size - 1;
+  while (end > 0)
+  {
+    int child, root = 0;
+    MZ_SWAP_UINT32(pIndices[end], pIndices[0]);
+    for ( ; ; )
+    {
+      if ((child = (root << 1) + 1) >= end)
+        break;
+      child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]));
+      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))
+        break;
+      MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child;
+    }
+    end--;
+  }
+}
+
+static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags)
+{
+  mz_uint cdir_size, num_this_disk, cdir_disk_index;
+  mz_uint64 cdir_ofs;
+  mz_int64 cur_file_ofs;
+  const mz_uint8 *p;
+  mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32;
+  mz_bool sort_central_dir = ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0);
+  // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there.
+  if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+  // Find the end of central directory record by scanning the file from the end towards the beginning.
+  cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0);
+  for ( ; ; )
+  {
+    int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs);
+    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n)
+      return MZ_FALSE;
+    for (i = n - 4; i >= 0; --i)
+      if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG)
+        break;
+    if (i >= 0)
+    {
+      cur_file_ofs += i;
+      break;
+    }
+    if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)))
+      return MZ_FALSE;
+    cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0);
+  }
+  // Read and verify the end of central directory record.
+  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+  if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) ||
+      ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS)))
+    return MZ_FALSE;
+
+  num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS);
+  cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS);
+  if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1)))
+    return MZ_FALSE;
+
+  if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+
+  cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS);
+  if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size)
+    return MZ_FALSE;
+
+  pZip->m_central_directory_file_ofs = cdir_ofs;
+
+  if (pZip->m_total_files)
+  {
+     mz_uint i, n;
+
+    // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices.
+    if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) ||
+        (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE)))
+      return MZ_FALSE;
+
+    if (sort_central_dir)
+    {
+      if (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE))
+        return MZ_FALSE;
+    }
+
+    if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size)
+      return MZ_FALSE;
+
+    // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported).
+    p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p;
+    for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i)
+    {
+      mz_uint total_header_size, comp_size, decomp_size, disk_index;
+      if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG))
+        return MZ_FALSE;
+      MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p);
+      if (sort_central_dir)
+        MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i;
+      comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+      decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
+      if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF))
+        return MZ_FALSE;
+      disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS);
+      if ((disk_index != num_this_disk) && (disk_index != 1))
+        return MZ_FALSE;
+      if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size)
+        return MZ_FALSE;
+      if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n)
+        return MZ_FALSE;
+      n -= total_header_size; p += total_header_size;
+    }
+  }
+
+  if (sort_central_dir)
+    mz_zip_reader_sort_central_dir_offsets_by_filename(pZip);
+
+  return MZ_TRUE;
+}
+
+mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags)
+{
+  if ((!pZip) || (!pZip->m_pRead))
+    return MZ_FALSE;
+  if (!mz_zip_reader_init_internal(pZip, flags))
+    return MZ_FALSE;
+  pZip->m_archive_size = size;
+  if (!mz_zip_reader_read_central_dir(pZip, flags))
+  {
+    mz_zip_reader_end(pZip);
+    return MZ_FALSE;
+  }
+  return MZ_TRUE;
+}
+
+static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)
+{
+  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+  size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n);
+  memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s);
+  return s;
+}
+
+mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags)
+{
+  if (!mz_zip_reader_init_internal(pZip, flags))
+    return MZ_FALSE;
+  pZip->m_archive_size = size;
+  pZip->m_pRead = mz_zip_mem_read_func;
+  pZip->m_pIO_opaque = pZip;
+#ifdef __cplusplus
+  pZip->m_pState->m_pMem = const_cast<void *>(pMem);
+#else
+  pZip->m_pState->m_pMem = (void *)pMem;
+#endif
+  pZip->m_pState->m_mem_size = size;
+  if (!mz_zip_reader_read_central_dir(pZip, flags))
+  {
+    mz_zip_reader_end(pZip);
+    return MZ_FALSE;
+  }
+  return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)
+{
+  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);
+  if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))
+    return 0;
+  return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile);
+}
+
+mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags)
+{
+  mz_uint64 file_size;
+  MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb");
+  if (!pFile)
+    return MZ_FALSE;
+  if (MZ_FSEEK64(pFile, 0, SEEK_END))
+  {
+    MZ_FCLOSE(pFile);
+    return MZ_FALSE;
+  }
+  file_size = MZ_FTELL64(pFile);
+  if (!mz_zip_reader_init_internal(pZip, flags))
+  {
+    MZ_FCLOSE(pFile);
+    return MZ_FALSE;
+  }
+  pZip->m_pRead = mz_zip_file_read_func;
+  pZip->m_pIO_opaque = pZip;
+  pZip->m_pState->m_pFile = pFile;
+  pZip->m_archive_size = file_size;
+  if (!mz_zip_reader_read_central_dir(pZip, flags))
+  {
+    mz_zip_reader_end(pZip);
+    return MZ_FALSE;
+  }
+  return MZ_TRUE;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip)
+{
+  return pZip ? pZip->m_total_files : 0;
+}
+
+static MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index)
+{
+  if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+    return NULL;
+  return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index));
+}
+
+mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index)
+{
+  mz_uint m_bit_flag;
+  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+  if (!p)
+    return MZ_FALSE;
+  m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);
+  return (m_bit_flag & 1);
+}
+
+mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index)
+{
+  mz_uint filename_len, external_attr;
+  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+  if (!p)
+    return MZ_FALSE;
+
+  // First see if the filename ends with a '/' character.
+  filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+  if (filename_len)
+  {
+    if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/')
+      return MZ_TRUE;
+  }
+
+  // Bugfix: This code was also checking if the internal attribute was non-zero, which wasn't correct.
+  // Most/all zip writers (hopefully) set DOS file/directory attributes in the low 16-bits, so check for the DOS directory flag and ignore the source OS ID in the created by field.
+  // FIXME: Remove this check? Is it necessary - we already check the filename.
+  external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);
+  if ((external_attr & 0x10) != 0)
+    return MZ_TRUE;
+
+  return MZ_FALSE;
+}
+
+mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat)
+{
+  mz_uint n;
+  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+  if ((!p) || (!pStat))
+    return MZ_FALSE;
+
+  // Unpack the central directory record.
+  pStat->m_file_index = file_index;
+  pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index);
+  pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS);
+  pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS);
+  pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);
+  pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS);
+#ifndef MINIZ_NO_TIME
+  pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS));
+#endif
+  pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS);
+  pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+  pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
+  pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS);
+  pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);
+  pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS);
+
+  // Copy as much of the filename and comment as possible.
+  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1);
+  memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\0';
+
+  n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);
+  pStat->m_comment_size = n;
+  memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0';
+
+  return MZ_TRUE;
+}
+
+mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size)
+{
+  mz_uint n;
+  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+  if (!p) { if (filename_buf_size) pFilename[0] = '\0'; return 0; }
+  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+  if (filename_buf_size)
+  {
+    n = MZ_MIN(n, filename_buf_size - 1);
+    memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);
+    pFilename[n] = '\0';
+  }
+  return n + 1;
+}
+
+static MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags)
+{
+  mz_uint i;
+  if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE)
+    return 0 == memcmp(pA, pB, len);
+  for (i = 0; i < len; ++i)
+    if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i]))
+      return MZ_FALSE;
+  return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len)
+{
+  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE;
+  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+  mz_uint8 l = 0, r = 0;
+  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+  pE = pL + MZ_MIN(l_len, r_len);
+  while (pL < pE)
+  {
+    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))
+      break;
+    pL++; pR++;
+  }
+  return (pL == pE) ? (int)(l_len - r_len) : (l - r);
+}
+
+static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename)
+{
+  mz_zip_internal_state *pState = pZip->m_pState;
+  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;
+  const mz_zip_array *pCentral_dir = &pState->m_central_dir;
+  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);
+  const int size = pZip->m_total_files;
+  const mz_uint filename_len = (mz_uint)strlen(pFilename);
+  int l = 0, h = size - 1;
+  while (l <= h)
+  {
+    int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len);
+    if (!comp)
+      return file_index;
+    else if (comp < 0)
+      l = m + 1;
+    else
+      h = m - 1;
+  }
+  return -1;
+}
+
+int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags)
+{
+  mz_uint file_index; size_t name_len, comment_len;
+  if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+    return -1;
+  if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size))
+    return mz_zip_reader_locate_file_binary_search(pZip, pName);
+  name_len = strlen(pName); if (name_len > 0xFFFF) return -1;
+  comment_len = pComment ? strlen(pComment) : 0; if (comment_len > 0xFFFF) return -1;
+  for (file_index = 0; file_index < pZip->m_total_files; file_index++)
+  {
+    const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index));
+    mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+    const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+    if (filename_len < name_len)
+      continue;
+    if (comment_len)
+    {
+      mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS);
+      const char *pFile_comment = pFilename + filename_len + file_extra_len;
+      if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags)))
+        continue;
+    }
+    if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len))
+    {
+      int ofs = filename_len - 1;
+      do
+      {
+        if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || (pFilename[ofs] == ':'))
+          break;
+      } while (--ofs >= 0);
+      ofs++;
+      pFilename += ofs; filename_len -= ofs;
+    }
+    if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags)))
+      return file_index;
+  }
+  return -1;
+}
+
+mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
+{
+  int status = TINFL_STATUS_DONE;
+  mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;
+  mz_zip_archive_file_stat file_stat;
+  void *pRead_buf;
+  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;
+  tinfl_decompressor inflator;
+
+  if ((buf_size) && (!pBuf))
+    return MZ_FALSE;
+
+  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
+    return MZ_FALSE;
+
+  // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes)
+  if (!file_stat.m_comp_size)
+    return MZ_TRUE;
+
+  // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers).
+  // I'm torn how to handle this case - should it fail instead?
+  if (mz_zip_reader_is_file_a_directory(pZip, file_index))
+    return MZ_TRUE;
+
+  // Encryption and patch files are not supported.
+  if (file_stat.m_bit_flag & (1 | 32))
+    return MZ_FALSE;
+
+  // This function only supports stored and deflate.
+  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED))
+    return MZ_FALSE;
+
+  // Ensure supplied output buffer is large enough.
+  needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size;
+  if (buf_size < needed_size)
+    return MZ_FALSE;
+
+  // Read and parse the local directory entry.
+  cur_file_ofs = file_stat.m_local_header_ofs;
+  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
+    return MZ_FALSE;
+
+  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)
+    return MZ_FALSE;
+
+  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method))
+  {
+    // The file is stored or the caller has requested the compressed data.
+    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size)
+      return MZ_FALSE;
+    return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32);
+  }
+
+  // Decompress the file either directly from memory or from a file input buffer.
+  tinfl_init(&inflator);
+
+  if (pZip->m_pState->m_pMem)
+  {
+    // Read directly from the archive in memory.
+    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;
+    read_buf_size = read_buf_avail = file_stat.m_comp_size;
+    comp_remaining = 0;
+  }
+  else if (pUser_read_buf)
+  {
+    // Use a user provided read buffer.
+    if (!user_read_buf_size)
+      return MZ_FALSE;
+    pRead_buf = (mz_uint8 *)pUser_read_buf;
+    read_buf_size = user_read_buf_size;
+    read_buf_avail = 0;
+    comp_remaining = file_stat.m_comp_size;
+  }
+  else
+  {
+    // Temporarily allocate a read buffer.
+    read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE);
+#ifdef _MSC_VER
+    if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))
+#else
+    if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))
+#endif
+      return MZ_FALSE;
+    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size)))
+      return MZ_FALSE;
+    read_buf_avail = 0;
+    comp_remaining = file_stat.m_comp_size;
+  }
+
+  do
+  {
+    size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs);
+    if ((!read_buf_avail) && (!pZip->m_pState->m_pMem))
+    {
+      read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);
+      if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)
+      {
+        status = TINFL_STATUS_FAILED;
+        break;
+      }
+      cur_file_ofs += read_buf_avail;
+      comp_remaining -= read_buf_avail;
+      read_buf_ofs = 0;
+    }
+    in_buf_size = (size_t)read_buf_avail;
+    status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0));
+    read_buf_avail -= in_buf_size;
+    read_buf_ofs += in_buf_size;
+    out_buf_ofs += out_buf_size;
+  } while (status == TINFL_STATUS_NEEDS_MORE_INPUT);
+
+  if (status == TINFL_STATUS_DONE)
+  {
+    // Make sure the entire file was decompressed, and check its CRC.
+    if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32))
+      status = TINFL_STATUS_FAILED;
+  }
+
+  if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf))
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+
+  return status == TINFL_STATUS_DONE;
+}
+
+mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
+{
+  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);
+  if (file_index < 0)
+    return MZ_FALSE;
+  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size);
+}
+
+mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags)
+{
+  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0);
+}
+
+mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags)
+{
+  return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0);
+}
+
+void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags)
+{
+  mz_uint64 comp_size, uncomp_size, alloc_size;
+  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+  void *pBuf;
+
+  if (pSize)
+    *pSize = 0;
+  if (!p)
+    return NULL;
+
+  comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+  uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
+
+  alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size;
+#ifdef _MSC_VER
+  if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))
+#else
+  if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))
+#endif
+    return NULL;
+  if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size)))
+    return NULL;
+
+  if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags))
+  {
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+    return NULL;
+  }
+
+  if (pSize) *pSize = (size_t)alloc_size;
+  return pBuf;
+}
+
+void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags)
+{
+  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);
+  if (file_index < 0)
+  {
+    if (pSize) *pSize = 0;
+    return MZ_FALSE;
+  }
+  return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags);
+}
+
+mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)
+{
+  int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT;
+  mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs;
+  mz_zip_archive_file_stat file_stat;
+  void *pRead_buf = NULL; void *pWrite_buf = NULL;
+  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;
+
+  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
+    return MZ_FALSE;
+
+  // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes)
+  if (!file_stat.m_comp_size)
+    return MZ_TRUE;
+
+  // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers).
+  // I'm torn how to handle this case - should it fail instead?
+  if (mz_zip_reader_is_file_a_directory(pZip, file_index))
+    return MZ_TRUE;
+
+  // Encryption and patch files are not supported.
+  if (file_stat.m_bit_flag & (1 | 32))
+    return MZ_FALSE;
+
+  // This function only supports stored and deflate.
+  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED))
+    return MZ_FALSE;
+
+  // Read and parse the local directory entry.
+  cur_file_ofs = file_stat.m_local_header_ofs;
+  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
+    return MZ_FALSE;
+
+  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)
+    return MZ_FALSE;
+
+  // Decompress the file either directly from memory or from a file input buffer.
+  if (pZip->m_pState->m_pMem)
+  {
+    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;
+    read_buf_size = read_buf_avail = file_stat.m_comp_size;
+    comp_remaining = 0;
+  }
+  else
+  {
+    read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE);
+    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size)))
+      return MZ_FALSE;
+    read_buf_avail = 0;
+    comp_remaining = file_stat.m_comp_size;
+  }
+
+  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method))
+  {
+    // The file is stored or the caller has requested the compressed data.
+    if (pZip->m_pState->m_pMem)
+    {
+#ifdef _MSC_VER
+      if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF))
+#else
+      if (((sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF))
+#endif
+        return MZ_FALSE;
+      if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size)
+        status = TINFL_STATUS_FAILED;
+      else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))
+        file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size);
+      cur_file_ofs += file_stat.m_comp_size;
+      out_buf_ofs += file_stat.m_comp_size;
+      comp_remaining = 0;
+    }
+    else
+    {
+      while (comp_remaining)
+      {
+        read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);
+        if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)
+        {
+          status = TINFL_STATUS_FAILED;
+          break;
+        }
+
+        if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))
+          file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail);
+
+        if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)
+        {
+          status = TINFL_STATUS_FAILED;
+          break;
+        }
+        cur_file_ofs += read_buf_avail;
+        out_buf_ofs += read_buf_avail;
+        comp_remaining -= read_buf_avail;
+      }
+    }
+  }
+  else
+  {
+    tinfl_decompressor inflator;
+    tinfl_init(&inflator);
+
+    if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE)))
+      status = TINFL_STATUS_FAILED;
+    else
+    {
+      do
+      {
+        mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));
+        size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));
+        if ((!read_buf_avail) && (!pZip->m_pState->m_pMem))
+        {
+          read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);
+          if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)
+          {
+            status = TINFL_STATUS_FAILED;
+            break;
+          }
+          cur_file_ofs += read_buf_avail;
+          comp_remaining -= read_buf_avail;
+          read_buf_ofs = 0;
+        }
+
+        in_buf_size = (size_t)read_buf_avail;
+        status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0);
+        read_buf_avail -= in_buf_size;
+        read_buf_ofs += in_buf_size;
+
+        if (out_buf_size)
+        {
+          if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size)
+          {
+            status = TINFL_STATUS_FAILED;
+            break;
+          }
+          file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size);
+          if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size)
+          {
+            status = TINFL_STATUS_FAILED;
+            break;
+          }
+        }
+      } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT));
+    }
+  }
+
+  if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)))
+  {
+    // Make sure the entire file was decompressed, and check its CRC.
+    if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32))
+      status = TINFL_STATUS_FAILED;
+  }
+
+  if (!pZip->m_pState->m_pMem)
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+  if (pWrite_buf)
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf);
+
+  return status == TINFL_STATUS_DONE;
+}
+
+mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)
+{
+  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);
+  if (file_index < 0)
+    return MZ_FALSE;
+  return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags);
+}
+
+#ifndef MINIZ_NO_STDIO
+static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n)
+{
+  (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE*)pOpaque);
+}
+
+mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags)
+{
+  mz_bool status;
+  mz_zip_archive_file_stat file_stat;
+  MZ_FILE *pFile;
+  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
+    return MZ_FALSE;
+  pFile = MZ_FOPEN(pDst_filename, "wb");
+  if (!pFile)
+    return MZ_FALSE;
+  status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags);
+  if (MZ_FCLOSE(pFile) == EOF)
+    return MZ_FALSE;
+#ifndef MINIZ_NO_TIME
+  if (status)
+    mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time);
+#endif
+  return status;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_bool mz_zip_reader_end(mz_zip_archive *pZip)
+{
+  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+    return MZ_FALSE;
+
+  if (pZip->m_pState)
+  {
+    mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL;
+    mz_zip_array_clear(pZip, &pState->m_central_dir);
+    mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);
+    mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);
+
+#ifndef MINIZ_NO_STDIO
+    if (pState->m_pFile)
+    {
+      MZ_FCLOSE(pState->m_pFile);
+      pState->m_pFile = NULL;
+    }
+#endif // #ifndef MINIZ_NO_STDIO
+
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pState);
+  }
+  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;
+
+  return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags)
+{
+  int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags);
+  if (file_index < 0)
+    return MZ_FALSE;
+  return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags);
+}
+#endif
+
+// ------------------- .ZIP archive writing
+
+#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+static void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); }
+static void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); }
+#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v))
+#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v))
+
+mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size)
+{
+  if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))
+    return MZ_FALSE;
+
+  if (pZip->m_file_offset_alignment)
+  {
+    // Ensure user specified file offset alignment is a power of 2.
+    if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1))
+      return MZ_FALSE;
+  }
+
+  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;
+  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;
+  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;
+
+  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;
+  pZip->m_archive_size = existing_size;
+  pZip->m_central_directory_file_ofs = 0;
+  pZip->m_total_files = 0;
+
+  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))
+    return MZ_FALSE;
+  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));
+  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8));
+  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32));
+  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32));
+  return MZ_TRUE;
+}
+
+static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)
+{
+  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+  mz_zip_internal_state *pState = pZip->m_pState;
+  mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size);
+#ifdef _MSC_VER
+  if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))
+#else
+  if ((!n) || ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))
+#endif
+    return 0;
+  if (new_size > pState->m_mem_capacity)
+  {
+    void *pNew_block;
+    size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2;
+    if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity)))
+      return 0;
+    pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity;
+  }
+  memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n);
+  pState->m_mem_size = (size_t)new_size;
+  return n;
+}
+
+mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size)
+{
+  pZip->m_pWrite = mz_zip_heap_write_func;
+  pZip->m_pIO_opaque = pZip;
+  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))
+    return MZ_FALSE;
+  if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning)))
+  {
+    if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size)))
+    {
+      mz_zip_writer_end(pZip);
+      return MZ_FALSE;
+    }
+    pZip->m_pState->m_mem_capacity = initial_allocation_size;
+  }
+  return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)
+{
+  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);
+  if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))
+    return 0;
+  return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile);
+}
+
+mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning)
+{
+  MZ_FILE *pFile;
+  pZip->m_pWrite = mz_zip_file_write_func;
+  pZip->m_pIO_opaque = pZip;
+  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))
+    return MZ_FALSE;
+  if (NULL == (pFile = MZ_FOPEN(pFilename, "wb")))
+  {
+    mz_zip_writer_end(pZip);
+    return MZ_FALSE;
+  }
+  pZip->m_pState->m_pFile = pFile;
+  if (size_to_reserve_at_beginning)
+  {
+    mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf);
+    do
+    {
+      size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning);
+      if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n)
+      {
+        mz_zip_writer_end(pZip);
+        return MZ_FALSE;
+      }
+      cur_ofs += n; size_to_reserve_at_beginning -= n;
+    } while (size_to_reserve_at_beginning);
+  }
+  return MZ_TRUE;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename)
+{
+  mz_zip_internal_state *pState;
+  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+    return MZ_FALSE;
+  // No sense in trying to write to an archive that's already at the support max size
+  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  pState = pZip->m_pState;
+
+  if (pState->m_pFile)
+  {
+#ifdef MINIZ_NO_STDIO
+    pFilename; return MZ_FALSE;
+#else
+    // Archive is being read from stdio - try to reopen as writable.
+    if (pZip->m_pIO_opaque != pZip)
+      return MZ_FALSE;
+    if (!pFilename)
+      return MZ_FALSE;
+    pZip->m_pWrite = mz_zip_file_write_func;
+    if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile)))
+    {
+      // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it.
+      mz_zip_reader_end(pZip);
+      return MZ_FALSE;
+    }
+#endif // #ifdef MINIZ_NO_STDIO
+  }
+  else if (pState->m_pMem)
+  {
+    // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback.
+    if (pZip->m_pIO_opaque != pZip)
+      return MZ_FALSE;
+    pState->m_mem_capacity = pState->m_mem_size;
+    pZip->m_pWrite = mz_zip_heap_write_func;
+  }
+  // Archive is being read via a user provided read function - make sure the user has specified a write function too.
+  else if (!pZip->m_pWrite)
+    return MZ_FALSE;
+
+  // Start writing new files at the archive's current central directory location.
+  pZip->m_archive_size = pZip->m_central_directory_file_ofs;
+  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;
+  pZip->m_central_directory_file_ofs = 0;
+
+  return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags)
+{
+  return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0);
+}
+
+typedef struct
+{
+  mz_zip_archive *m_pZip;
+  mz_uint64 m_cur_archive_file_ofs;
+  mz_uint64 m_comp_size;
+} mz_zip_writer_add_state;
+
+static mz_bool mz_zip_writer_add_put_buf_callback(const void* pBuf, int len, void *pUser)
+{
+  mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser;
+  if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len)
+    return MZ_FALSE;
+  pState->m_cur_archive_file_ofs += len;
+  pState->m_comp_size += len;
+  return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date)
+{
+  (void)pZip;
+  memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size);
+  return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes)
+{
+  (void)pZip;
+  memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size);
+  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes);
+  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs);
+  return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes)
+{
+  mz_zip_internal_state *pState = pZip->m_pState;
+  mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size;
+  size_t orig_central_dir_size = pState->m_central_dir.m_size;
+  mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];
+
+  // No zip64 support yet
+  if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes))
+    return MZ_FALSE;
+
+  if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) ||
+      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) ||
+      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) ||
+      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) ||
+      (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &central_dir_ofs, 1)))
+  {
+    // Try to push the central directory array back into its original state.
+    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);
+    return MZ_FALSE;
+  }
+
+  return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name)
+{
+  // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes.
+  if (*pArchive_name == '/')
+    return MZ_FALSE;
+  while (*pArchive_name)
+  {
+    if ((*pArchive_name == '\\') || (*pArchive_name == ':'))
+      return MZ_FALSE;
+    pArchive_name++;
+  }
+  return MZ_TRUE;
+}
+
+static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip)
+{
+  mz_uint32 n;
+  if (!pZip->m_file_offset_alignment)
+    return 0;
+  n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1));
+  return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1);
+}
+
+static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n)
+{
+  char buf[4096];
+  memset(buf, 0, MZ_MIN(sizeof(buf), n));
+  while (n)
+  {
+    mz_uint32 s = MZ_MIN(sizeof(buf), n);
+    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s)
+      return MZ_FALSE;
+    cur_file_ofs += s; n -= s;
+  }
+  return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32)
+{
+  mz_uint16 method = 0, dos_time = 0, dos_date = 0;
+  mz_uint level, ext_attributes = 0, num_alignment_padding_bytes;
+  mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0;
+  size_t archive_name_size;
+  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];
+  tdefl_compressor *pComp = NULL;
+  mz_bool store_data_uncompressed;
+  mz_zip_internal_state *pState;
+
+  if ((int)level_and_flags < 0)
+    level_and_flags = MZ_DEFAULT_LEVEL;
+  level = level_and_flags & 0xF;
+  store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA));
+
+  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION))
+    return MZ_FALSE;
+
+  pState = pZip->m_pState;
+
+  if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size))
+    return MZ_FALSE;
+  // No zip64 support yet
+  if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))
+    return MZ_FALSE;
+  if (!mz_zip_writer_validate_archive_name(pArchive_name))
+    return MZ_FALSE;
+
+#ifndef MINIZ_NO_TIME
+  {
+    time_t cur_time; time(&cur_time);
+    mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date);
+  }
+#endif // #ifndef MINIZ_NO_TIME
+
+  archive_name_size = strlen(pArchive_name);
+  if (archive_name_size > 0xFFFF)
+    return MZ_FALSE;
+
+  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
+
+  // no zip64 support yet
+  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/'))
+  {
+    // Set DOS Subdirectory attribute bit.
+    ext_attributes |= 0x10;
+    // Subdirectories cannot contain data.
+    if ((buf_size) || (uncomp_size))
+      return MZ_FALSE;
+  }
+
+  // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.)
+  if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1)))
+    return MZ_FALSE;
+
+  if ((!store_data_uncompressed) && (buf_size))
+  {
+    if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor))))
+      return MZ_FALSE;
+  }
+
+  if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header)))
+  {
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+    return MZ_FALSE;
+  }
+  local_dir_header_ofs += num_alignment_padding_bytes;
+  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }
+  cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header);
+
+  MZ_CLEAR_OBJ(local_dir_header);
+  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)
+  {
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+    return MZ_FALSE;
+  }
+  cur_archive_file_ofs += archive_name_size;
+
+  if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA))
+  {
+    uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8*)pBuf, buf_size);
+    uncomp_size = buf_size;
+    if (uncomp_size <= 3)
+    {
+      level = 0;
+      store_data_uncompressed = MZ_TRUE;
+    }
+  }
+
+  if (store_data_uncompressed)
+  {
+    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size)
+    {
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+      return MZ_FALSE;
+    }
+
+    cur_archive_file_ofs += buf_size;
+    comp_size = buf_size;
+
+    if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)
+      method = MZ_DEFLATED;
+  }
+  else if (buf_size)
+  {
+    mz_zip_writer_add_state state;
+
+    state.m_pZip = pZip;
+    state.m_cur_archive_file_ofs = cur_archive_file_ofs;
+    state.m_comp_size = 0;
+
+    if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) ||
+        (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE))
+    {
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+      return MZ_FALSE;
+    }
+
+    comp_size = state.m_comp_size;
+    cur_archive_file_ofs = state.m_cur_archive_file_ofs;
+
+    method = MZ_DEFLATED;
+  }
+
+  pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+  pComp = NULL;
+
+  // no zip64 support yet
+  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))
+    return MZ_FALSE;
+
+  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header))
+    return MZ_FALSE;
+
+  if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))
+    return MZ_FALSE;
+
+  pZip->m_total_files++;
+  pZip->m_archive_size = cur_archive_file_ofs;
+
+  return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)
+{
+  mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes;
+  mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;
+  mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0;
+  size_t archive_name_size;
+  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];
+  MZ_FILE *pSrc_file = NULL;
+
+  if ((int)level_and_flags < 0)
+    level_and_flags = MZ_DEFAULT_LEVEL;
+  level = level_and_flags & 0xF;
+
+  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION))
+    return MZ_FALSE;
+  if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)
+    return MZ_FALSE;
+  if (!mz_zip_writer_validate_archive_name(pArchive_name))
+    return MZ_FALSE;
+
+  archive_name_size = strlen(pArchive_name);
+  if (archive_name_size > 0xFFFF)
+    return MZ_FALSE;
+
+  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
+
+  // no zip64 support yet
+  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date))
+    return MZ_FALSE;
+    
+  pSrc_file = MZ_FOPEN(pSrc_filename, "rb");
+  if (!pSrc_file)
+    return MZ_FALSE;
+  MZ_FSEEK64(pSrc_file, 0, SEEK_END);
+  uncomp_size = MZ_FTELL64(pSrc_file);
+  MZ_FSEEK64(pSrc_file, 0, SEEK_SET);
+
+  if (uncomp_size > 0xFFFFFFFF)
+  {
+    // No zip64 support yet
+    MZ_FCLOSE(pSrc_file);
+    return MZ_FALSE;
+  }
+  if (uncomp_size <= 3)
+    level = 0;
+
+  if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header)))
+  {
+    MZ_FCLOSE(pSrc_file);
+    return MZ_FALSE;
+  }
+  local_dir_header_ofs += num_alignment_padding_bytes;
+  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }
+  cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header);
+
+  MZ_CLEAR_OBJ(local_dir_header);
+  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)
+  {
+    MZ_FCLOSE(pSrc_file);
+    return MZ_FALSE;
+  }
+  cur_archive_file_ofs += archive_name_size;
+
+  if (uncomp_size)
+  {
+    mz_uint64 uncomp_remaining = uncomp_size;
+    void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE);
+    if (!pRead_buf)
+    {
+      MZ_FCLOSE(pSrc_file);
+      return MZ_FALSE;
+    }
+
+    if (!level)
+    {
+      while (uncomp_remaining)
+      {
+        mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining);
+        if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n))
+        {
+          pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+          MZ_FCLOSE(pSrc_file);
+          return MZ_FALSE;
+        }
+        uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n);
+        uncomp_remaining -= n;
+        cur_archive_file_ofs += n;
+      }
+      comp_size = uncomp_size;
+    }
+    else
+    {
+      mz_bool result = MZ_FALSE;
+      mz_zip_writer_add_state state;
+      tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor));
+      if (!pComp)
+      {
+        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+        MZ_FCLOSE(pSrc_file);
+        return MZ_FALSE;
+      }
+
+      state.m_pZip = pZip;
+      state.m_cur_archive_file_ofs = cur_archive_file_ofs;
+      state.m_comp_size = 0;
+
+      if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY)
+      {
+        pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+        MZ_FCLOSE(pSrc_file);
+        return MZ_FALSE;
+      }
+
+      for ( ; ; )
+      {
+        size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE);
+        tdefl_status status;
+
+        if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size)
+          break;
+
+        uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size);
+        uncomp_remaining -= in_buf_size;
+
+        status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH);
+        if (status == TDEFL_STATUS_DONE)
+        {
+          result = MZ_TRUE;
+          break;
+        }
+        else if (status != TDEFL_STATUS_OKAY)
+          break;
+      }
+
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+
+      if (!result)
+      {
+        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+        MZ_FCLOSE(pSrc_file);
+        return MZ_FALSE;
+      }
+
+      comp_size = state.m_comp_size;
+      cur_archive_file_ofs = state.m_cur_archive_file_ofs;
+
+      method = MZ_DEFLATED;
+    }
+
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+  }
+
+  MZ_FCLOSE(pSrc_file); pSrc_file = NULL;
+
+  // no zip64 support yet
+  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))
+    return MZ_FALSE;
+
+  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header))
+    return MZ_FALSE;
+
+  if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))
+    return MZ_FALSE;
+
+  pZip->m_total_files++;
+  pZip->m_archive_size = cur_archive_file_ofs;
+
+  return MZ_TRUE;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index)
+{
+  mz_uint n, bit_flags, num_alignment_padding_bytes;
+  mz_uint64 comp_bytes_remaining, local_dir_header_ofs;
+  mz_uint64 cur_src_file_ofs, cur_dst_file_ofs;
+  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;
+  mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];
+  size_t orig_central_dir_size;
+  mz_zip_internal_state *pState;
+  void *pBuf; const mz_uint8 *pSrc_central_header;
+
+  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))
+    return MZ_FALSE;
+  if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index)))
+    return MZ_FALSE;
+  pState = pZip->m_pState;
+
+  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
+
+  // no zip64 support yet
+  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS);
+  cur_dst_file_ofs = pZip->m_archive_size;
+
+  if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
+    return MZ_FALSE;
+  cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;
+
+  if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes))
+    return MZ_FALSE;
+  cur_dst_file_ofs += num_alignment_padding_bytes;
+  local_dir_header_ofs = cur_dst_file_ofs;
+  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }
+
+  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+    return MZ_FALSE;
+  cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;
+
+  n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+  comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+
+  if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining)))))
+    return MZ_FALSE;
+
+  while (comp_bytes_remaining)
+  {
+    n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining);
+    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n)
+    {
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+      return MZ_FALSE;
+    }
+    cur_src_file_ofs += n;
+
+    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n)
+    {
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+      return MZ_FALSE;
+    }
+    cur_dst_file_ofs += n;
+
+    comp_bytes_remaining -= n;
+  }
+
+  bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS);
+  if (bit_flags & 8)
+  {
+    // Copy data descriptor
+    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4)
+    {
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+      return MZ_FALSE;
+    }
+
+    n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3);
+    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n)
+    {
+      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+      return MZ_FALSE;
+    }
+
+    cur_src_file_ofs += n;
+    cur_dst_file_ofs += n;
+  }
+  pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+
+  // no zip64 support yet
+  if (cur_dst_file_ofs > 0xFFFFFFFF)
+    return MZ_FALSE;
+
+  orig_central_dir_size = pState->m_central_dir.m_size;
+
+  memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);
+  MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs);
+  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE))
+    return MZ_FALSE;
+
+  n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS);
+  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n))
+  {
+    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);
+    return MZ_FALSE;
+  }
+
+  if (pState->m_central_dir.m_size > 0xFFFFFFFF)
+    return MZ_FALSE;
+  n = (mz_uint32)orig_central_dir_size;
+  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1))
+  {
+    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);
+    return MZ_FALSE;
+  }
+
+  pZip->m_total_files++;
+  pZip->m_archive_size = cur_dst_file_ofs;
+
+  return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)
+{
+  mz_zip_internal_state *pState;
+  mz_uint64 central_dir_ofs, central_dir_size;
+  mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE];
+
+  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))
+    return MZ_FALSE;
+
+  pState = pZip->m_pState;
+
+  // no zip64 support yet
+  if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))
+    return MZ_FALSE;
+
+  central_dir_ofs = 0;
+  central_dir_size = 0;
+  if (pZip->m_total_files)
+  {
+    // Write central directory
+    central_dir_ofs = pZip->m_archive_size;
+    central_dir_size = pState->m_central_dir.m_size;
+    pZip->m_central_directory_file_ofs = central_dir_ofs;
+    if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size)
+      return MZ_FALSE;
+    pZip->m_archive_size += central_dir_size;
+  }
+
+  // Write end of central directory record
+  MZ_CLEAR_OBJ(hdr);
+  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG);
+  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files);
+  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files);
+  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size);
+  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs);
+
+  if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr))
+    return MZ_FALSE;
+#ifndef MINIZ_NO_STDIO
+  if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF))
+    return MZ_FALSE;
+#endif // #ifndef MINIZ_NO_STDIO
+
+  pZip->m_archive_size += sizeof(hdr);
+
+  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED;
+  return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize)
+{
+  if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize))
+    return MZ_FALSE;
+  if (pZip->m_pWrite != mz_zip_heap_write_func)
+    return MZ_FALSE;
+  if (!mz_zip_writer_finalize_archive(pZip))
+    return MZ_FALSE;
+
+  *pBuf = pZip->m_pState->m_pMem;
+  *pSize = pZip->m_pState->m_mem_size;
+  pZip->m_pState->m_pMem = NULL;
+  pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0;
+  return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_end(mz_zip_archive *pZip)
+{
+  mz_zip_internal_state *pState;
+  mz_bool status = MZ_TRUE;
+  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED)))
+    return MZ_FALSE;
+
+  pState = pZip->m_pState;
+  pZip->m_pState = NULL;
+  mz_zip_array_clear(pZip, &pState->m_central_dir);
+  mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);
+  mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);
+
+#ifndef MINIZ_NO_STDIO
+  if (pState->m_pFile)
+  {
+    MZ_FCLOSE(pState->m_pFile);
+    pState->m_pFile = NULL;
+  }
+#endif // #ifndef MINIZ_NO_STDIO
+
+  if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem))
+  {
+    pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem);
+    pState->m_pMem = NULL;
+  }
+
+  pZip->m_pFree(pZip->m_pAlloc_opaque, pState);
+  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;
+  return status;
+}
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)
+{
+  mz_bool status, created_new_archive = MZ_FALSE;
+  mz_zip_archive zip_archive;
+  struct MZ_FILE_STAT_STRUCT file_stat;
+  MZ_CLEAR_OBJ(zip_archive);
+  if ((int)level_and_flags < 0)
+     level_and_flags = MZ_DEFAULT_LEVEL;
+  if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION))
+    return MZ_FALSE;
+  if (!mz_zip_writer_validate_archive_name(pArchive_name))
+    return MZ_FALSE;
+  if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0)
+  {
+    // Create a new archive.
+    if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0))
+      return MZ_FALSE;
+    created_new_archive = MZ_TRUE;
+  }
+  else
+  {
+    // Append to an existing archive.
+    if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))
+      return MZ_FALSE;
+    if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename))
+    {
+      mz_zip_reader_end(&zip_archive);
+      return MZ_FALSE;
+    }
+  }
+  status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0);
+  // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.)
+  if (!mz_zip_writer_finalize_archive(&zip_archive))
+    status = MZ_FALSE;
+  if (!mz_zip_writer_end(&zip_archive))
+    status = MZ_FALSE;
+  if ((!status) && (created_new_archive))
+  {
+    // It's a new archive and something went wrong, so just delete it.
+    int ignoredStatus = MZ_DELETE_FILE(pZip_filename);
+    (void)ignoredStatus;
+  }
+  return status;
+}
+
+void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags)
+{
+  int file_index;
+  mz_zip_archive zip_archive;
+  void *p = NULL;
+
+  if (pSize)
+    *pSize = 0;
+
+  if ((!pZip_filename) || (!pArchive_name))
+    return NULL;
+
+  MZ_CLEAR_OBJ(zip_archive);
+  if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))
+    return NULL;
+
+  if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0)
+    p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags);
+
+  mz_zip_reader_end(&zip_archive);
+  return p;
+}
+
+#endif // #ifndef MINIZ_NO_STDIO
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_APIS
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MINIZ_HEADER_FILE_ONLY
+
+/*
+  This is free and unencumbered software released into the public domain.
+
+  Anyone is free to copy, modify, publish, use, compile, sell, or
+  distribute this software, either in source code form or as a compiled
+  binary, for any purpose, commercial or non-commercial, and by any
+  means.
+
+  In jurisdictions that recognize copyright laws, the author or authors
+  of this software dedicate any and all copyright interest in the
+  software to the public domain. We make this dedication for the benefit
+  of the public at large and to the detriment of our heirs and
+  successors. We intend this dedication to be an overt act of
+  relinquishment in perpetuity of all present and future rights to this
+  software under copyright law.
+
+  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 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+  OTHER DEALINGS IN THE SOFTWARE.
+
+  For more information, please refer to <http://unlicense.org/>
+*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247","Cargo.toml":"1e814cdffc5c7c21f30adb6baab40494c1697821baa95b6f15b14b81731fe689","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","src/lib.rs":"8d7d5bd14f58269edc5cb56d0218c854a3efa6a7155ffa14bd3e5486c355977b","src/prefdata.rs":"f3157c44e3d395331dd9ac8f2a065fe0512b4090804b14d044b70ae2f688fcdf","src/preferences.rs":"96e6fd609c48f3dcf1c945c7c095d5f33a13fc39f0d7c56a30924a59bd8f54f6","src/prefreader.rs":"84e357411164ebd8b11ab95962a1a5474bc7e79b8f1461f674a2b19868c39ddd","src/profile.rs":"0686a64b55afa928477a72ff1135939e68903305e26f47ddfb65e62409b2ea12"},"package":"4981de229fba7d949465a2f564e2b46906c6e876516040416956a54021a84165"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "mozprofile"
+version = "0.2.1"
+authors = ["Mozilla Tools and Automation <auto-tools@mozilla.com>"]
+description = "Library for working with Mozilla profiles."
+repository = "https://github.com/jgraham/rust_mozprofile"
+license = "MPL-2.0"
+
+[dependencies]
+tempdir = "0.3.4"
+lazy_static = "0.1"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/src/lib.rs
@@ -0,0 +1,213 @@
+#[macro_use]
+extern crate lazy_static;
+
+extern crate tempdir;
+
+pub mod profile;
+pub mod preferences;
+pub mod prefreader;
+pub mod prefdata;
+
+#[cfg(test)]
+mod test {
+//    use std::fs::File;
+//    use profile::Profile;
+    use prefreader::{parse, tokenize, serialize};
+    use prefreader::{PrefToken, Position};
+    use preferences::Pref;
+    use std::collections::BTreeMap;
+    use std::error::Error;
+    use std::io::Cursor;
+    use std::str;
+
+    #[test]
+    fn tokenize_simple() {
+        let prefs = "  user_pref ( 'example.pref.string', 'value' )   ;\n pref(\"example.pref.int\", -123); sticky_pref('example.pref.bool',false);";
+
+        let p = Position::new();
+
+        let expected = vec![PrefToken::UserPrefFunction(p),
+                            PrefToken::Paren('(', p),
+                            PrefToken::String("example.pref.string".into(), p),
+                            PrefToken::Comma(p),
+                            PrefToken::String("value".into(), p),
+                            PrefToken::Paren(')', p),
+                            PrefToken::Semicolon(p),
+                            PrefToken::PrefFunction(p),
+                            PrefToken::Paren('(', p),
+                            PrefToken::String("example.pref.int".into(), p),
+                            PrefToken::Comma(p),
+                            PrefToken::Int(-123, p),
+                            PrefToken::Paren(')', p),
+                            PrefToken::Semicolon(p),
+                            PrefToken::StickyPrefFunction(p),
+                            PrefToken::Paren('(', p),
+                            PrefToken::String("example.pref.bool".into(), p),
+                            PrefToken::Comma(p),
+                            PrefToken::Bool(false, p),
+                            PrefToken::Paren(')', p),
+                            PrefToken::Semicolon(p)];
+
+        tokenize_test(prefs, &expected);
+    }
+
+    #[test]
+    fn tokenize_comments() {
+        let prefs = "# bash style comment\n /*block comment*/ user_pref/*block comment*/(/*block comment*/ 'example.pref.string'  /*block comment*/,/*block comment*/ 'value'/*block comment*/ )// line comment";
+
+        let p = Position::new();
+
+        let expected = vec![PrefToken::CommentBashLine(" bash style comment".into(), p),
+                            PrefToken::CommentBlock("block comment".into(), p),
+                            PrefToken::UserPrefFunction(p),
+                            PrefToken::CommentBlock("block comment".into(), p),
+                            PrefToken::Paren('(', p),
+                            PrefToken::CommentBlock("block comment".into(), p),
+                            PrefToken::String("example.pref.string".into(), p),
+                            PrefToken::CommentBlock("block comment".into(), p),
+                            PrefToken::Comma(p),
+                            PrefToken::CommentBlock("block comment".into(), p),
+                            PrefToken::String("value".into(), p),
+                            PrefToken::CommentBlock("block comment".into(), p),
+                            PrefToken::Paren(')', p),
+                            PrefToken::CommentLine(" line comment".into(), p)];
+
+        tokenize_test(prefs, &expected);
+    }
+
+    #[test]
+    fn tokenize_escapes() {
+        let prefs = r#"user_pref('example\x20pref', "\u0020\u2603\uD800\uDC96\"\'\n\r\\\w)"#;
+
+        let p = Position::new();
+
+        let expected = vec![PrefToken::UserPrefFunction(p),
+                            PrefToken::Paren('(', p),
+                            PrefToken::String("example pref".into(), p),
+                            PrefToken::Comma(p),
+                            PrefToken::String(" ☃ð‚–\"'\n\r\\\\w".into(), p),
+                            PrefToken::Paren(')', p)];
+
+        tokenize_test(prefs, &expected);
+    }
+
+    fn tokenize_test(prefs: &str, expected: &[PrefToken]) {
+        println!("{}\n", prefs);
+
+        for (e, a) in expected.iter().zip(tokenize(prefs.as_bytes())) {
+            let success = match (e, &a) {
+                (&PrefToken::PrefFunction(_),
+                 &PrefToken::PrefFunction(_)) => true,
+                (&PrefToken::UserPrefFunction(_),
+                 &PrefToken::UserPrefFunction(_)) => true,
+                (&PrefToken::StickyPrefFunction(_),
+                 &PrefToken::StickyPrefFunction(_)) => true,
+                (&PrefToken::CommentBlock(ref data_e, _),
+                 &PrefToken::CommentBlock(ref data_a, _)) => {
+                    data_e == data_a
+                },
+                (&PrefToken::CommentLine(ref data_e, _),
+                 &PrefToken::CommentLine(ref data_a, _)) => {
+                    data_e == data_a
+                },
+                (&PrefToken::CommentBashLine(ref data_e, _),
+                 &PrefToken::CommentBashLine(ref data_a, _))  => {
+                    data_e == data_a
+                },
+                (&PrefToken::Paren(data_e, _),
+                 &PrefToken::Paren(data_a, _)) => {
+                    data_e == data_a
+                },
+                (&PrefToken::Semicolon(_),
+                 &PrefToken::Semicolon(_)) => true,
+                (&PrefToken::Comma(_),
+                 &PrefToken::Comma(_)) => true,
+                (&PrefToken::String(ref data_e, _),
+                 &PrefToken::String(ref data_a, _)) => {
+                    data_e == data_a
+                },
+                (&PrefToken::Int(data_e, _),
+                 &PrefToken::Int(data_a, _)) => {
+                    data_e == data_a
+                },
+                (&PrefToken::Bool(data_e, _),
+                 &PrefToken::Bool(data_a, _)) => {
+                    data_e == data_a
+                },
+                (&PrefToken::Error(data_e, _),
+                 &PrefToken::Error(data_a, _)) => {
+                    data_e == data_a
+                },
+                (_, _) => false
+            };
+            if !success {
+                println!("Expected {:?}, got {:?}", e, a);
+            }
+            assert!(success);
+        }
+    }
+
+    #[test]
+    fn parse_simple() {
+        let input = "  user_pref /* block comment */ ( 'example.pref.string', 'value' )   ;\n pref(\"example.pref.int\", -123); sticky_pref('example.pref.bool',false)";
+
+        let mut expected: BTreeMap<String, Pref> = BTreeMap::new();
+        expected.insert("example.pref.string".into(), Pref::new("value"));
+        expected.insert("example.pref.int".into(), Pref::new(-123));
+        expected.insert("example.pref.bool".into(), Pref::new_sticky(false));
+
+        parse_test(input, expected);
+    }
+
+    #[test]
+    fn parse_escape() {
+        let input = r#"user_pref('example\\pref\"string', 'val\x20ue' )"#;
+
+        let mut expected: BTreeMap<String, Pref> = BTreeMap::new();
+        expected.insert("example\\pref\"string".into(), Pref::new("val ue"));
+
+        parse_test(input, expected);
+    }
+
+    fn parse_test(input: &str, expected: BTreeMap<String, Pref>) {
+        match parse(input.as_bytes()) {
+            Ok(ref actual) => {
+                println!("Expected:\n{:?}\nActual\n{:?}", expected, actual);
+                assert_eq!(actual, &expected);
+            }
+            Err(e) => {
+                println!("{}", e.description());
+                assert!(false)
+            }
+        }
+   }
+
+    #[test]
+    fn serialize_simple() {
+        let input = "  user_pref /* block comment */ ( 'example.pref.string', 'value' )   ;\n pref(\"example.pref.int\", -123); sticky_pref('example.pref.bool',false)";
+        let expected = "sticky_pref(\"example.pref.bool\", false);
+user_pref(\"example.pref.int\", -123);
+user_pref(\"example.pref.string\", \"value\");\n";
+
+        serialize_test(input, expected);
+    }
+
+    #[test]
+    fn serialize_quotes() {
+        let input = r#"user_pref('example\\with"quotes"', '"Value"')"#;
+        let expected = r#"user_pref("example\\with\"quotes\"", "\"Value\"");
+"#;
+
+        serialize_test(input, expected);
+    }
+
+    fn serialize_test(input: &str, expected: &str) {
+        let buf = Vec::with_capacity(expected.len());
+        let mut out = Cursor::new(buf);
+        serialize(&parse(input.as_bytes()).unwrap(), &mut out).unwrap();
+        let data = out.into_inner();
+        let actual = str::from_utf8(&*data).unwrap();
+        println!("Expected:\n{:?}\nActual\n{:?}", expected, actual);
+        assert_eq!(actual, expected);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/src/prefdata.rs
@@ -0,0 +1,44 @@
+#![allow(dead_code)]
+use preferences::Pref;
+
+lazy_static! {
+    pub static ref FIREFOX_PREFERENCES: [(&'static str, Pref); 17] = [
+        // Don't automatically update the application
+        ("app.update.enabled", Pref::new(false)),
+        // Don't restore the last open set of tabs if the browser has crashed
+        ("browser.sessionstore.resume_from_crash", Pref::new(false)),
+        // Don't check for the default web browser during startup
+        ("browser.shell.checkDefaultBrowser", Pref::new(false)),
+        // Don't warn on exit when multiple tabs are open
+        ("browser.tabs.warnOnClose", Pref::new(false)),
+        // Don't warn when exiting the browser
+        ("browser.warnOnQuit", Pref::new(false)),
+        // Don't send Firefox health reports to the production server
+        //"datareporting.healthreport.documentServerURI", "http://%(server)s/healthreport/",
+        // Only install add-ons from the profile and the application scope
+        // Also ensure that those are not getting disabled.
+        // see: https://developer.mozilla.org/en/Installing_extensions
+        ("extensions.enabledScopes", Pref::new(5)),
+        ("extensions.autoDisableScopes", Pref::new(10)),
+        // Don't send the list of installed addons to AMO
+        ("extensions.getAddons.cache.enabled", Pref::new(false)),
+        // Don't install distribution add-ons from the app folder
+        ("extensions.installDistroAddons", Pref::new(false)),
+        // Dont' run the add-on compatibility check during start-up
+        ("extensions.showMismatchUI", Pref::new(false)),
+        // Don't automatically update add-ons
+        ("extensions.update.enabled", Pref::new(false)),
+        // Don't open a dialog to show available add-on updates
+        ("extensions.update.notifyUser", Pref::new(false)),
+        // Enable test mode to run multiple tests in parallel
+        ("focusmanager.testmode", Pref::new(true)),
+        // Enable test mode to not raise an OS level dialog for location sharing
+        ("geo.provider.testing", Pref::new(true)),
+        // Suppress delay for main action in popup notifications
+        ("security.notification_enable_delay", Pref::new(0)),
+        // Suppress automatic safe mode after crashes
+        ("toolkit.startup.max_resumed_crashes", Pref::new(-1)),
+        // Don't report telemetry information
+        ("toolkit.telemetry.enabled", Pref::new(false)),
+    ];
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/src/preferences.rs
@@ -0,0 +1,60 @@
+use std::collections::BTreeMap;
+use std::string;
+use std::convert::From;
+
+pub type Preferences = BTreeMap<String, Pref>;
+
+#[derive(Debug, PartialEq, Clone)]
+pub enum PrefValue {
+    Bool(bool),
+    String(string::String),
+    Int(i64),
+}
+
+impl From<bool> for PrefValue {
+    fn from(value: bool) -> Self {
+        PrefValue::Bool(value)
+    }
+}
+
+impl From<String> for PrefValue {
+    fn from(value: String) -> Self {
+        PrefValue::String(value)
+    }
+}
+
+impl From<&'static str> for PrefValue {
+    fn from(value: &'static str) -> Self {
+        PrefValue::String(value.into())
+    }
+}
+
+impl From<i64> for PrefValue {
+    fn from(value: i64) -> Self {
+        PrefValue::Int(value)
+    }
+}
+
+#[derive(Debug, PartialEq, Clone)]
+pub struct Pref {
+    pub value: PrefValue,
+    pub sticky: bool
+}
+
+impl Pref {
+    pub fn new<T>(value: T) -> Pref
+        where T: Into<PrefValue> {
+        Pref {
+            value: value.into(),
+            sticky: false
+        }
+    }
+
+    pub fn new_sticky<T>(value: T) -> Pref
+        where T: Into<PrefValue> {
+        Pref {
+            value: value.into(),
+            sticky: true
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/src/prefreader.rs
@@ -0,0 +1,1010 @@
+use preferences::{Pref, PrefValue, Preferences};
+use std::borrow::Borrow;
+use std::borrow::Cow;
+use std::char;
+use std::error::Error;
+use std::fmt;
+use std::io::{self, Write};
+use std::iter::Iterator;
+use std::str;
+use std::mem;
+use std::ops::Deref;
+
+impl PrefReaderError {
+    fn new(message: &'static str, position: Position, parent: Option<Box<Error>>) -> PrefReaderError {
+        PrefReaderError {
+            message: message,
+            position: position,
+            parent: parent
+        }
+    }
+}
+
+
+impl fmt::Display for PrefReaderError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} at line {}, column {}",
+               self.message, self.position.line, self.position.column)
+    }
+}
+
+
+impl Error for PrefReaderError {
+    fn description(&self) -> &str {
+        self.message
+    }
+
+    fn cause(&self) -> Option<&Error> {
+        match self.parent {
+            None => None,
+            Some(ref cause) => Some(cause.deref())
+        }
+    }
+}
+
+impl From<io::Error> for PrefReaderError {
+    fn from(err: io::Error) -> PrefReaderError {
+        PrefReaderError::new("IOError",
+                             Position::new(),
+                             Some(err.into()))
+    }
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+enum TokenizerState {
+    Junk,
+    CommentStart,
+    CommentLine,
+    CommentBlock,
+    FunctionName,
+    AfterFunctionName,
+    FunctionArgs,
+    FunctionArg,
+    DoubleQuotedString,
+    SingleQuotedString,
+    Number,
+    Bool,
+    AfterFunctionArg,
+    AfterFunction,
+    Error,
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+pub struct Position {
+    line: u32,
+    column: u32
+}
+
+impl Position {
+    pub fn new() -> Position {
+        Position {
+            line: 1,
+            column: 0
+        }
+    }
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+pub enum TokenType {
+    None,
+    PrefFunction,
+    UserPrefFunction,
+    StickyPrefFunction,
+    CommentBlock,
+    CommentLine,
+    CommentBashLine,
+    Paren,
+    Semicolon,
+    Comma,
+    String,
+    Int,
+    Bool,
+    Error
+}
+
+#[derive(Debug, PartialEq)]
+pub enum PrefToken<'a> {
+    PrefFunction(Position),
+    UserPrefFunction(Position),
+    StickyPrefFunction(Position),
+    CommentBlock(Cow<'a, str>, Position),
+    CommentLine(Cow<'a, str>, Position),
+    CommentBashLine(Cow<'a, str>, Position),
+    Paren(char, Position),
+    Semicolon(Position),
+    Comma(Position),
+    String(Cow<'a, str>, Position),
+    Int(i64, Position),
+    Bool(bool, Position),
+    Error(&'static str, Position)
+}
+
+impl<'a> PrefToken<'a> {
+    fn position(&self) -> Position {
+        match *self {
+            PrefToken::PrefFunction(position) => position,
+            PrefToken::UserPrefFunction(position) => position,
+            PrefToken::StickyPrefFunction(position) => position,
+            PrefToken::CommentBlock(_, position) => position,
+            PrefToken::CommentLine(_, position) => position,
+            PrefToken::CommentBashLine(_, position) => position,
+            PrefToken::Paren(_, position) => position,
+            PrefToken::Semicolon(position) => position,
+            PrefToken::Comma(position) => position,
+            PrefToken::String(_, position) => position,
+            PrefToken::Int(_, position) => position,
+            PrefToken::Bool(_, position) => position,
+            PrefToken::Error(_, position) => position
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct PrefReaderError {
+    message: &'static str,
+    position: Position,
+    parent: Option<Box<Error>>
+}
+
+struct TokenData<'a> {
+    token_type: TokenType,
+    complete: bool,
+    position: Position,
+    data: Cow<'a, str>,
+    start_pos: usize,
+}
+
+impl<'a> TokenData<'a> {
+    fn new(token_type: TokenType, position: Position, start_pos: usize) -> TokenData<'a> {
+        TokenData {
+            token_type: token_type,
+            complete: false,
+            position: position,
+            data: Cow::Borrowed(""),
+            start_pos: start_pos,
+        }
+    }
+
+    fn start(&mut self, tokenizer: &PrefTokenizer, token_type: TokenType) {
+        self.token_type = token_type;
+        self.position = tokenizer.position;
+        self.start_pos = tokenizer.pos;
+    }
+
+    fn end(&mut self, buf: &'a [u8], end_pos: usize) -> Result<(), PrefReaderError> {
+        self.complete = true;
+        self.add_slice_to_token(buf, end_pos)
+    }
+
+    fn add_slice_to_token(&mut self, buf: &'a [u8], end_pos: usize) -> Result<(), PrefReaderError> {
+        let data = match str::from_utf8(&buf[self.start_pos..end_pos]) {
+            Ok(x) => x,
+            Err(_) => {
+                return Err(PrefReaderError::new("Could not convert string to utf8",
+                                               self.position, None));
+            }
+        };
+        if self.data != "" {
+            self.data.to_mut().push_str(&data)
+        } else {
+            self.data = Cow::Borrowed(&data)
+        };
+        Ok(())
+    }
+
+    fn push_char(&mut self, tokenizer: &PrefTokenizer, data: char) {
+        self.data.to_mut().push(data);
+        self.start_pos = tokenizer.pos + 1;
+    }
+}
+
+pub struct PrefTokenizer<'a> {
+    data: &'a [u8],
+    pos: usize,
+    cur: Option<char>,
+    position: Position,
+    state: TokenizerState,
+    next_state: Option<TokenizerState>,
+}
+
+impl<'a> PrefTokenizer<'a> {
+    pub fn new(data: &'a [u8]) -> PrefTokenizer<'a> {
+        PrefTokenizer {
+            data: data,
+            pos: 0,
+            cur: None,
+            position: Position::new(),
+            state: TokenizerState::Junk,
+            next_state: Some(TokenizerState::FunctionName),
+        }
+    }
+
+    fn make_token(&mut self, token_data: TokenData<'a>) -> PrefToken<'a> {
+        let buf = token_data.data;
+        let position = token_data.position;
+        match token_data.token_type {
+            TokenType::None => panic!("Got a token without a type"),
+            TokenType::PrefFunction => PrefToken::PrefFunction(position),
+            TokenType::UserPrefFunction => PrefToken::UserPrefFunction(position),
+            TokenType::StickyPrefFunction => PrefToken::StickyPrefFunction(position),
+            TokenType::CommentBlock => PrefToken::CommentBlock(buf, position),
+            TokenType::CommentLine => PrefToken::CommentLine(buf, position),
+            TokenType::CommentBashLine => PrefToken::CommentBashLine(buf, position),
+            TokenType::Paren => {
+                if buf.len() != 1 {
+                    panic!("Expected a buffer of length one");
+                }
+                PrefToken::Paren(buf.chars().next().unwrap(), position)
+            },
+            TokenType::Semicolon => PrefToken::Semicolon(position),
+            TokenType::Comma => PrefToken::Comma(position),
+            TokenType::String => PrefToken::String(buf, position),
+            TokenType::Int => {
+                let value = i64::from_str_radix(buf.borrow(), 10)
+                    .expect("Integer wasn't parsed as an i64");
+                PrefToken::Int(value, position)
+            },
+            TokenType::Bool => {
+                let value = match buf.borrow() {
+                    "true" => true,
+                    "false" => false,
+                    x => panic!(format!("Boolean wasn't 'true' or 'false' (was {})", x))
+                };
+                PrefToken::Bool(value, position)
+            },
+            TokenType::Error => panic!("make_token can't construct errors")
+        }
+    }
+
+    fn get_char(&mut self) -> Option<char> {
+        if self.pos >= self.data.len() - 1 {
+            self.cur = None;
+            return None
+        };
+        if self.cur.is_some() {
+            self.pos += 1;
+        }
+        let c = self.data[self.pos] as char;
+        if self.cur == Some('\n') {
+            self.position.line += 1;
+            self.position.column = 0;
+        } else if self.cur.is_some() {
+            self.position.column += 1;
+        };
+        self.cur = Some(c);
+        self.cur
+    }
+
+    fn unget_char(&mut self) -> Option<char> {
+        if self.pos == 0 {
+            self.position.column = 0;
+            self.cur = None
+        } else {
+            self.pos -= 1;
+            let c = self.data[self.pos] as char;
+            if c == '\n' {
+                self.position.line -= 1;
+                let mut col_pos = self.pos - 1;
+                while col_pos > 0 && self.data[col_pos] as char != '\n' {
+                    col_pos -= 1;
+                }
+                self.position.column = (self.pos - col_pos as usize - 1) as u32;
+            } else {
+                self.position.column -= 1;
+            }
+            self.cur = Some(c);
+        }
+        self.cur
+    }
+
+    fn is_space(c: char) -> bool {
+        match c {
+            ' ' | '\t' | '\r' | '\n' => true,
+            _ => false
+        }
+    }
+
+    fn skip_whitespace(&mut self) -> Option<char> {
+        while let Some(c) = self.cur {
+            if PrefTokenizer::is_space(c) {
+                self.get_char();
+            } else {
+                break
+            };
+        }
+        self.cur
+    }
+
+    fn consume_escape(&mut self, token_data: &mut TokenData<'a>) -> Result<(), PrefReaderError> {
+        let pos = self.pos;
+        let escaped = try!(self.read_escape());
+        if let Some(escape_char) = escaped {
+            try!(token_data.add_slice_to_token(&self.data, pos));
+            token_data.push_char(&self, escape_char);
+        };
+        Ok(())
+    }
+
+    fn read_escape(&mut self) -> Result<Option<char>, PrefReaderError> {
+        let escape_char = match self.get_char() {
+            Some('u') => try!(self.read_hex_escape(4, true)),
+            Some('x') => try!(self.read_hex_escape(2, true)),
+            Some('\\') => '\\' as u32,
+            Some('"') => '"' as u32,
+            Some('\'') => '\'' as u32,
+            Some('r') => '\r' as u32,
+            Some('n') => '\n' as u32,
+            Some(_) => return Ok(None),
+            None => return Err(PrefReaderError::new("EOF in character escape",
+                                                   self.position, None))
+        };
+        Ok(Some(try!(char::from_u32(escape_char)
+                     .ok_or(PrefReaderError::new("Invalid codepoint decoded from escape",
+                                                 self.position, None)))))
+    }
+
+    fn read_hex_escape(&mut self, hex_chars: isize, first: bool) -> Result<u32, PrefReaderError> {
+        let mut value = 0;
+        for _ in 0..hex_chars {
+            match self.get_char() {
+                Some(x) => {
+                    value = value << 4;
+                    match x {
+                        '0'...'9' => value += x as u32 - '0' as u32,
+                        'a'...'f' => value += x as u32 - 'a' as u32,
+                        'A'...'F' => value += x as u32 - 'A' as u32,
+                        _ => return Err(PrefReaderError::new(
+                            "Unexpected character in escape", self.position, None))
+                    }
+                },
+                None => return Err(PrefReaderError::new(
+                    "Unexpected EOF in escape", self.position, None))
+            }
+        }
+        if first && value >= 0xD800 && value <= 0xDBFF {
+            // First part of a surrogate pair
+            if self.get_char() != Some('\\') || self.get_char() != Some('u') {
+                return Err(PrefReaderError::new("Lone high surrogate in surrogate pair",
+                                               self.position, None))
+            }
+            self.unget_char();
+            let high_surrogate = value;
+            let low_surrogate = try!(self.read_hex_escape(4, false));
+            let high_value = (high_surrogate - 0xD800) << 10;
+            let low_value = low_surrogate - 0xDC00;
+            value = high_value + low_value + 0x10000;
+        } else if first && value >= 0xDC00 && value <= 0xDFFF {
+            return Err(PrefReaderError::new("Lone low surrogate",
+                                            self.position,
+                                            None))
+        } else if !first && (value < 0xDC00 || value > 0xDFFF) {
+            return Err(PrefReaderError::new("Invalid low surrogate in surrogate pair",
+                                            self.position,
+                                            None));
+        }
+        Ok(value)
+    }
+
+    fn get_match(&mut self, target: &str, separators: &str) -> bool {
+        let initial_pos = self.pos;
+        let mut matched = true;
+        for c in target.chars() {
+            if self.cur == Some(c) {
+                self.get_char();
+            } else {
+                matched = false;
+                break;
+            }
+        }
+
+        if !matched {
+            for _ in 0..(self.pos - initial_pos) {
+                self.unget_char();
+            }
+        } else {
+            // Check that the next character is whitespace or a separator
+            if let Some(c) = self.cur {
+                if !(PrefTokenizer::is_space(c) || separators.contains(c) || c == '/') {
+                    matched = false;
+                }
+            }
+            self.unget_char();
+        }
+
+        matched
+    }
+
+    fn next_token(&mut self) -> Result<Option<TokenData<'a>>, PrefReaderError> {
+        let mut token_data = TokenData::new(TokenType::None, Position::new(), 0);
+
+        loop {
+            let mut c = match self.get_char() {
+                Some(x) => x,
+                None => return Ok(None)
+            };
+
+            self.state = match self.state {
+                TokenizerState::Junk => {
+                    c = match self.skip_whitespace() {
+                        Some(x) => x,
+                        None => return Ok(None)
+                    };
+                    match c {
+                        '/' => TokenizerState::CommentStart,
+                        '#' => {
+                            token_data.start(&self, TokenType::CommentBashLine);
+                            token_data.start_pos = self.pos + 1;
+                            TokenizerState::CommentLine
+                        },
+                        _ => {
+                            self.unget_char();
+                            let next = match self.next_state {
+                                Some(x) => x,
+                                None => {
+                                    return Err(PrefReaderError::new(
+                                        "In Junk state without a next state defined",
+                                        self.position,
+                                        None))
+                                }
+                            };
+                            self.next_state = None;
+                            next
+                        }
+                    }
+                },
+                TokenizerState::CommentStart => {
+                    match c {
+                        '*' => {
+                            token_data.start(&self, TokenType::CommentBlock);
+                            token_data.start_pos = self.pos + 1;
+                            TokenizerState::CommentBlock
+                        },
+                        '/' => {
+                            token_data.start(&self, TokenType::CommentLine);
+                            token_data.start_pos = self.pos + 1;
+                            TokenizerState::CommentLine
+                        },
+                        _ => {
+                            return Err(PrefReaderError::new(
+                                "Invalid character after /", self.position, None))
+                        }
+                    }
+
+                },
+                TokenizerState::CommentLine => {
+                    match c {
+                        '\n' => {
+                            try!(token_data.end(&self.data, self.pos));
+                            TokenizerState::Junk
+                        },
+                        _ => {
+                            TokenizerState::CommentLine
+                        }
+                    }
+                },
+                TokenizerState::CommentBlock => {
+                    match c {
+                        '*' => {
+                            if self.get_char() == Some('/') {
+                                try!(token_data.end(&self.data, self.pos - 1));
+                                TokenizerState::Junk
+                            } else {
+                                TokenizerState::CommentBlock
+                            }
+                        },
+                        _ => TokenizerState::CommentBlock
+                    }
+                },
+                TokenizerState::FunctionName => {
+                    let position = self.position;
+                    let start_pos = self.pos;
+                    match c {
+                        'u' => {
+                            if self.get_match("user_pref", "(") {
+                                token_data.start(&self, TokenType::UserPrefFunction);
+                            }
+                        },
+                        's' => {
+                            if self.get_match("sticky_pref", "(") {
+                                token_data.start(&self, TokenType::StickyPrefFunction);
+                            }
+                        }
+                        'p' => {
+                            if self.get_match("pref", "(") {
+                                token_data.start(&self, TokenType::PrefFunction);
+                            }
+                        },
+                        _ => {}
+                    };
+                    if token_data.token_type == TokenType::None {
+                        // We didn't match anything
+                        return Err(PrefReaderError::new(
+                            "Expected a pref function name", position, None))
+                    } else {
+                        token_data.start_pos = start_pos;
+                        token_data.position = position;
+                        try!(token_data.end(&self.data, self.pos + 1));
+                        self.next_state = Some(TokenizerState::AfterFunctionName);
+                        TokenizerState::Junk
+                    }
+                },
+                TokenizerState::AfterFunctionName => {
+                    match c {
+                        '(' => {
+                            self.next_state = Some(TokenizerState::FunctionArgs);
+                            token_data.start(&self, TokenType::Paren);
+                            try!(token_data.end(&self.data, self.pos + 1));
+                            self.next_state = Some(TokenizerState::FunctionArgs);
+                            TokenizerState::Junk
+                        },
+                        _ => {
+                            return Err(PrefReaderError::new(
+                                "Expected an opening paren", self.position, None))
+                        }
+                    }
+                },
+                TokenizerState::FunctionArgs => {
+                    match c {
+                        ')' => {
+                            token_data.start(&self, TokenType::Paren);
+                            try!(token_data.end(&self.data, self.pos + 1));
+                            self.next_state = Some(TokenizerState::AfterFunction);
+                            TokenizerState::Junk
+                        },
+                        _ => {
+                            self.unget_char();
+                            TokenizerState::FunctionArg
+                        }
+                    }
+                },
+                TokenizerState::FunctionArg => {
+                    match c {
+                        '"' => {
+                            token_data.start(&self, TokenType::String);
+                            token_data.start_pos = self.pos + 1;
+                            TokenizerState::DoubleQuotedString
+                        },
+                        '\'' => {
+                            token_data.start(&self, TokenType::String);
+                            token_data.start_pos = self.pos + 1;
+                            TokenizerState::SingleQuotedString
+                        },
+                        't' | 'f' => {
+                            self.unget_char();
+                            TokenizerState::Bool
+                        },
+                        '0'...'9' | '-' |'+' => {
+                            token_data.start(&self, TokenType::Int);
+                            TokenizerState::Number
+                        },
+                        _ => {
+                            return Err(PrefReaderError::new(
+                                "Invalid character at start of function argument",
+                                self.position, None))
+                        }
+                    }
+                },
+                TokenizerState::DoubleQuotedString => {
+                    match c {
+                        '"' => {
+                            try!(token_data.end(&self.data, self.pos));
+                            self.next_state = Some(TokenizerState::AfterFunctionArg);
+                            TokenizerState::Junk
+
+                        },
+                        '\n' => {
+                            return Err(PrefReaderError::new(
+                                "EOL in double quoted string", self.position, None))
+                        },
+                        '\\' => {
+                            try!(self.consume_escape(&mut token_data));
+                            TokenizerState::DoubleQuotedString
+                        },
+                        _ => TokenizerState::DoubleQuotedString
+                    }
+                },
+                TokenizerState::SingleQuotedString => {
+                    match c {
+                        '\'' => {
+                            try!(token_data.end(&self.data, self.pos));
+                            self.next_state = Some(TokenizerState::AfterFunctionArg);
+                            TokenizerState::Junk
+
+                        },
+                        '\n' => {
+                            return Err(PrefReaderError::new(
+                                "EOL in single quoted string", self.position, None))
+                        },
+                        '\\' => {
+                            try!(self.consume_escape(&mut token_data));
+                            TokenizerState::SingleQuotedString
+                        }
+                        _ => TokenizerState::SingleQuotedString
+                    }
+                },
+                TokenizerState::Number => {
+                    match c {
+                        '0'...'9' => TokenizerState::Number,
+                        ')' | ',' => {
+                            try!(token_data.end(&self.data, self.pos));
+                            self.unget_char();
+                            self.next_state = Some(TokenizerState::AfterFunctionArg);
+                            TokenizerState::Junk
+                        },
+                        x if PrefTokenizer::is_space(x) => {
+                            try!(token_data.end(&self.data, self.pos));
+                            self.next_state = Some(TokenizerState::AfterFunctionArg);
+                            TokenizerState::Junk
+                        },
+                        _ => {
+                            return Err(PrefReaderError::new(
+                                "Invalid character in number literal", self.position, None))
+                        }
+                    }
+                },
+                TokenizerState::Bool => {
+                    let start_pos = self.pos;
+                    let position = self.position;
+                    match c {
+                        't' => {
+                            if self.get_match("true", ",)") {
+                                token_data.start(&self, TokenType::Bool)
+                            }
+                        },
+                        'f' => {
+                            if self.get_match("false", ",)") {
+                                token_data.start(&self, TokenType::Bool)
+                            }
+                        }
+                        _ => {}
+                    };
+                    if token_data.token_type == TokenType::None {
+                        return Err(PrefReaderError::new(
+                            "Unexpected characters in function argument",
+                            position, None));
+                    } else {
+                        token_data.start_pos = start_pos;
+                        token_data.position = position;
+                        try!(token_data.end(&self.data, self.pos + 1));
+                        self.next_state = Some(TokenizerState::AfterFunctionArg);
+                        TokenizerState::Junk
+                    }
+                },
+                TokenizerState::AfterFunctionArg => {
+                    match c {
+                        ',' => {
+                            token_data.start(&self, TokenType::Comma);
+                            try!(token_data.end(&self.data, self.pos + 1));
+                            self.next_state = Some(TokenizerState::FunctionArg);
+                            TokenizerState::Junk
+                        }
+                        ')' => {
+                            token_data.start(&self, TokenType::Paren);
+                            try!(token_data.end(&self.data, self.pos + 1));
+                            self.next_state = Some(TokenizerState::AfterFunction);
+                            TokenizerState::Junk
+                        }
+                        _ => return Err(PrefReaderError::new
+                                        ("Unexpected character after function argument",
+                                         self.position,
+                                         None))
+                    }
+                },
+                TokenizerState::AfterFunction => {
+                    match c {
+                        ';' => {
+                            token_data.start(&self, TokenType::Semicolon);
+                            try!(token_data.end(&self.data, self.pos));
+                            self.next_state = Some(TokenizerState::FunctionName);
+                            TokenizerState::Junk
+                        }
+                        _ => return Err(PrefReaderError::new(
+                            "Unexpected character after function",
+                            self.position, None))
+                    }
+                },
+                TokenizerState::Error => TokenizerState::Error
+            };
+            if token_data.complete {
+                return Ok(Some(token_data));
+            }
+        }
+    }
+}
+
+impl<'a> Iterator for PrefTokenizer<'a> {
+    type Item = PrefToken<'a>;
+
+    fn next(&mut self) -> Option<PrefToken<'a>> {
+        if let TokenizerState::Error = self.state {
+            return None;
+        }
+        let token_data = match self.next_token() {
+            Err(e) => {
+                self.state = TokenizerState::Error;
+                return Some(PrefToken::Error(e.message,
+                                             e.position))
+
+            },
+            Ok(Some(token_data)) => token_data,
+            Ok(None) => return None,
+        };
+        let token = self.make_token(token_data);
+        Some(token)
+    }
+}
+
+pub fn tokenize<'a>(data: &'a [u8]) -> PrefTokenizer<'a> {
+    PrefTokenizer::new(data)
+}
+
+pub fn serialize_token<T: Write>(token: &PrefToken, output: &mut T) -> Result<(), PrefReaderError> {
+    let mut data_buf = String::new();
+
+    let data = match token {
+        &PrefToken::PrefFunction(_) => "pref",
+        &PrefToken::UserPrefFunction(_) => "user_pref",
+        &PrefToken::StickyPrefFunction(_) => "sticky_pref",
+        &PrefToken::CommentBlock(ref data, _) => {
+            data_buf.reserve(data.len() + 4);
+            data_buf.push_str("/*");
+            data_buf.push_str(data.borrow());
+            data_buf.push_str("*");
+            &*data_buf
+        },
+        &PrefToken::CommentLine(ref data, _) => {
+            data_buf.reserve(data.len() + 2);
+            data_buf.push_str("//");
+            data_buf.push_str(data.borrow());
+            &*data_buf
+        },
+        &PrefToken::CommentBashLine(ref data, _) => {
+            data_buf.reserve(data.len() + 1);
+            data_buf.push_str("#");
+            data_buf.push_str(data.borrow());
+            &*data_buf
+        },
+        &PrefToken::Paren(data, _) => {
+            data_buf.push(data);
+            &*data_buf
+        },
+        &PrefToken::Comma(_) => ",",
+        &PrefToken::Semicolon(_) => ";\n",
+        &PrefToken::String(ref data, _) => {
+            data_buf.reserve(data.len() + 2);
+            data_buf.push('"');
+            data_buf.push_str(escape_quote(data.borrow()).borrow());
+            data_buf.push('"');
+            &*data_buf
+        },
+        &PrefToken::Int(data, _) => {
+            data_buf.push_str(&*data.to_string());
+            &*data_buf
+        },
+        &PrefToken::Bool(data, _) => {
+            if data {"true"} else {"false"}
+        },
+        &PrefToken::Error(data, pos) => return Err(PrefReaderError::new(data, pos, None))
+    };
+    try!(output.write(data.as_bytes()));
+    Ok(())
+}
+
+pub fn serialize_tokens<'a, I, W>(tokens: I, output: &mut W) -> Result<(), PrefReaderError>
+    where I: Iterator<Item=&'a PrefToken<'a>>, W: Write {
+    for token in tokens {
+        try!(serialize_token(token, output));
+    }
+    Ok(())
+}
+
+fn escape_quote<'a>(data: &'a str) -> Cow<'a, str> {
+    // Not very efficient…
+    if data.contains("\"") || data.contains("\\") {
+        let new_data = Cow::Owned(data
+            .replace(r#"\"#, r#"\\"#)
+            .replace(r#"""#, r#"\""#));
+        new_data
+    } else {
+        Cow::Borrowed(data)
+    }
+}
+
+#[derive(Debug, PartialEq)]
+enum ParserState {
+    Function,
+    Key,
+    Value,
+}
+
+struct PrefBuilder {
+    key: Option<String>,
+    value: Option<PrefValue>,
+    sticky: bool
+}
+
+impl PrefBuilder {
+    fn new() -> PrefBuilder {
+        PrefBuilder {
+            key: None,
+            value: None,
+            sticky: false
+        }
+    }
+}
+
+
+fn skip_comments<'a>(tokenizer: &mut PrefTokenizer<'a>) -> Option<PrefToken<'a>> {
+    loop {
+        match tokenizer.next() {
+            Some(PrefToken::CommentBashLine(_, _)) |
+            Some(PrefToken::CommentBlock(_, _)) |
+            Some(PrefToken::CommentLine(_, _)) => {},
+            Some(x) => return Some(x),
+            None => return None,
+        }
+    }
+}
+
+pub fn parse_tokens<'a>(tokenizer: &mut PrefTokenizer<'a>) -> Result<Preferences,
+                                                                     PrefReaderError> {
+
+    let mut state = ParserState::Function;
+    let mut current_pref = PrefBuilder::new();
+    let mut rv = Preferences::new();
+
+    loop {
+        // Not just using a for loop here seems strange, but this restricts the
+        // scope of the borrow
+        let token = {
+            match tokenizer.next() {
+                Some(x) => x,
+                None => break
+            }
+        };
+        // First deal with comments and errors
+        match token {
+            PrefToken::Error(msg, position) => {
+                return Err(PrefReaderError::new(msg.into(), position, None));
+            },
+            PrefToken::CommentBashLine(_, _) |
+            PrefToken::CommentLine(_, _) |
+            PrefToken::CommentBlock(_, _) => {
+                continue
+            },
+            _ => {}
+        }
+        state = match state {
+            ParserState::Function => {
+                match token {
+                    PrefToken::PrefFunction(_) => {
+                        current_pref.sticky = false;
+                    }
+                    PrefToken::UserPrefFunction(_) => {
+                        current_pref.sticky = false;
+                    },
+                    PrefToken::StickyPrefFunction(_) => {
+                        current_pref.sticky = true;
+                    },
+                    _ => {
+                        return Err(PrefReaderError::new("Expected pref function".into(),
+                                                        token.position(), None));
+                    }
+                }
+                let next = skip_comments(tokenizer);
+                match next {
+                    Some(PrefToken::Paren('(', _)) => ParserState::Key,
+                    _ => return Err(PrefReaderError::new("Expected open paren".into(),
+                                                         next.map(|x| x.position())
+                                                         .unwrap_or(tokenizer.position),
+                                                         None))
+                }
+            },
+            ParserState::Key => {
+                match token {
+                    PrefToken::String(data, _) => current_pref.key = Some(data.into_owned()),
+                    _ => {
+                        return Err(PrefReaderError::new("Expected string", token.position(), None));
+                    }
+                }
+                let next = skip_comments(tokenizer);
+                match next {
+                    Some(PrefToken::Comma(_)) => ParserState::Value,
+                    _ => return Err(PrefReaderError::new("Expected comma",
+                                                         next.map(|x| x.position())
+                                                         .unwrap_or(tokenizer.position),
+                                                         None))
+                }
+            },
+            ParserState::Value => {
+                match token {
+                    PrefToken::String(data, _) => {
+                        current_pref.value = Some(PrefValue::String(data.into_owned()))
+                    },
+                    PrefToken::Int(data, _) => {
+                        current_pref.value = Some(PrefValue::Int(data))
+                    }
+                    PrefToken::Bool(data, _) => {
+                        current_pref.value = Some(PrefValue::Bool(data))
+                    },
+                    _ => {
+                        return Err(PrefReaderError::new("Expected value", token.position(),
+                                                        None))
+                    }
+                }
+                let next = skip_comments(tokenizer);
+                match next {
+                    Some(PrefToken::Paren(')', _)) => {}
+                    _ => return Err(PrefReaderError::new("Expected close paren",
+                                                         next.map(|x| x.position())
+                                                         .unwrap_or(tokenizer.position),
+                                                         None))
+                }
+                let next = skip_comments(tokenizer);
+                match next {
+                    Some(PrefToken::Semicolon(_)) |
+                    None => {},
+                    _ => return Err(PrefReaderError::new("Expected semicolon",
+                                                         next.map(|x| x.position())
+                                                         .unwrap_or(tokenizer.position),
+                                                         None))
+                }
+                let key = mem::replace(&mut current_pref.key, None);
+                let value = mem::replace(&mut current_pref.value, None);
+                let pref = if current_pref.sticky {
+                    Pref::new_sticky(value.unwrap())
+                } else {
+                    Pref::new(value.unwrap())
+                };
+                rv.insert(key.unwrap(), pref);
+                current_pref.sticky = false;
+                ParserState::Function
+            },
+        }
+    }
+    match state {
+        ParserState::Key | ParserState::Value => {
+            return Err(PrefReaderError::new("EOF in middle of function",
+                                            tokenizer.position, None));
+        },
+        _ => {}
+    }
+    Ok(rv)
+}
+
+pub fn serialize<W: Write>(prefs: &Preferences, output: &mut W) -> io::Result<()> {
+    let mut p: Vec<_> = prefs.iter().collect();
+    p.sort_by(|a, b| a.0.cmp(&b.0));
+    for &(key, pref) in p.iter() {
+        let func = if pref.sticky {
+            "sticky_pref("
+        } else {
+            "user_pref("
+        }.as_bytes();
+        try!(output.write(func));
+        try!(output.write("\"".as_bytes()));
+        try!(output.write(escape_quote(key).as_bytes()));
+        try!(output.write("\"".as_bytes()));
+        try!(output.write(", ".as_bytes()));
+        match pref.value {
+            PrefValue::Bool(x) => {
+                try!(output.write((if x {"true"} else {"false"}).as_bytes()));
+            },
+            PrefValue::Int(x) => {
+                try!(output.write(x.to_string().as_bytes()));
+            },
+            PrefValue::String(ref x) => {
+                try!(output.write("\"".as_bytes()));
+                try!(output.write(escape_quote(x).as_bytes()));
+                try!(output.write("\"".as_bytes()));
+            }
+        };
+        try!(output.write(");\n".as_bytes()));
+    };
+    Ok(())
+}
+
+pub fn parse<'a>(data: &'a [u8]) -> Result<Preferences, PrefReaderError> {
+    let mut tokenizer = tokenize(data);
+    parse_tokens(&mut tokenizer)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozprofile/src/profile.rs
@@ -0,0 +1,115 @@
+use preferences::{Preferences, Pref};
+use prefreader::{parse, serialize, PrefReaderError};
+use std::collections::btree_map::Iter;
+use std::fs::File;
+use std::io::Result as IoResult;
+use std::io::prelude::*;
+use std::path::{Path, PathBuf};
+use tempdir::TempDir;
+
+#[derive(Debug)]
+pub struct Profile {
+    pub path: PathBuf,
+    pub temp_dir: Option<TempDir>,
+    prefs: Option<PrefFile>,
+    user_prefs: Option<PrefFile>,
+}
+
+impl Profile {
+    pub fn new(opt_path: Option<&Path>) -> IoResult<Profile> {
+        let mut temp_dir = None;
+        let path = match opt_path {
+            Some(p) => p.to_path_buf(),
+            None => {
+                let dir = try!(TempDir::new("rust_mozprofile"));
+                let temp_path = dir.path().to_path_buf();
+                temp_dir = Some(dir);
+                temp_path
+            }
+        };
+
+        Ok(Profile {
+            path: path,
+            temp_dir: temp_dir,
+            prefs: None,
+            user_prefs: None
+        })
+    }
+
+    pub fn prefs(&mut self) -> Result<&mut PrefFile, PrefReaderError> {
+        if self.prefs.is_none() {
+            let mut pref_path = PathBuf::from(&self.path);
+            pref_path.push("prefs.js");
+            self.prefs = Some(try!(PrefFile::new(pref_path)))
+        };
+        // This error handling doesn't make much sense
+        Ok(self.prefs.as_mut().unwrap())
+    }
+
+    pub fn user_prefs(&mut self) -> Result<&mut PrefFile, PrefReaderError> {
+        if self.user_prefs.is_none() {
+            let mut pref_path = PathBuf::from(&self.path);
+            pref_path.push("user.js");
+            self.user_prefs = Some(try!(PrefFile::new(pref_path)))
+        };
+        // This error handling doesn't make much sense
+        Ok(self.user_prefs.as_mut().unwrap())
+    }
+}
+
+#[derive(Debug)]
+pub struct PrefFile {
+    path: PathBuf,
+    pub prefs: Preferences,
+}
+
+impl PrefFile {
+    pub fn new(path: PathBuf) -> Result<PrefFile, PrefReaderError> {
+        let prefs = if !path.exists() {
+            Preferences::new()
+        } else {
+            let mut f = try!(File::open(&path));
+            let mut buf = String::with_capacity(4096);
+            try!(f.read_to_string(&mut buf));
+            try!(parse(buf.as_bytes()))
+        };
+
+        Ok(PrefFile {
+            path: path,
+            prefs: prefs
+        })
+    }
+
+    pub fn write(&self) -> IoResult<()> {
+        let mut f = try!(File::create(&self.path));
+        serialize(&self.prefs, &mut f)
+    }
+
+    pub fn insert_slice<K>(&mut self, preferences: &[(K, Pref)])
+        where K: Into<String> + Clone {
+        for &(ref name, ref value) in preferences.iter() {
+            self.insert((*name).clone(), (*value).clone());
+        }
+    }
+
+    pub fn insert<K>(&mut self, key: K, value: Pref)
+        where K: Into<String> {
+        self.prefs.insert(key.into(), value);
+    }
+
+    pub fn remove(&mut self, key: &str) -> Option<Pref> {
+        self.prefs.remove(key)
+    }
+
+    pub fn get(&mut self, key: &str) -> Option<&Pref> {
+        self.prefs.get(key)
+    }
+
+    pub fn contains_key(&self, key: &str) -> bool {
+        self.prefs.contains_key(key)
+    }
+
+    pub fn iter(&self) -> Iter<String, Pref> {
+        self.prefs.iter()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247","Cargo.toml":"61ed94f83de70e690fd840ac055f3c7307bd92a14efc33f1f8297e89c52e83bc","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","src/bin/firefox-default-path.rs":"21f1aa96a4ffb368a4266e294bc4b1b17ff8229f2418af6679783f6d9c0280df","src/lib.rs":"3ed528f2069e810adb6f2ea0b248c4542de95f1cc305154f440877d4ee6d550c","src/runner.rs":"a54c399eb67136d437f0a51795de5d2c510b3feb44ff56f059e1d411e583a7ee"},"package":"91c54a746e7430326d2bc48a5b10ba7e9cd2294306773cb9f232835abe791f02"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "mozrunner"
+version = "0.3.4"
+authors = ["Mozilla Tools and Automation <auto-tools@mozilla.com>"]
+description = "Library for starting Firefox binaries."
+repository = "https://github.com/jgraham/rust_mozrunner"
+license = "MPL-2.0"
+
+[dependencies]
+log = "0.3"
+mozprofile = "0.2"
+
+[target.'cfg(target_os = "windows")'.dependencies]
+winreg = "0.3.5"
+
+[[bin]]
+name = "firefox-default-path"
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/src/bin/firefox-default-path.rs
@@ -0,0 +1,17 @@
+extern crate mozrunner;
+
+use mozrunner::runner::platform;
+use std::io::Write;
+
+fn main() {
+    let (path, code) = platform::firefox_default_path()
+        .map(|x| (x.to_string_lossy().into_owned(), 0))
+        .unwrap_or(("Firefox binary not found".to_owned(), 1));
+
+    let mut writer: Box<Write> = match code {
+        0 => Box::new(std::io::stdout()),
+        _ => Box::new(std::io::stderr())
+    };
+    writeln!(&mut writer, "{}", &*path).unwrap();
+    std::process::exit(code);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/src/lib.rs
@@ -0,0 +1,8 @@
+extern crate log;
+extern crate mozprofile;
+#[cfg(target_os = "windows")]
+extern crate winreg;
+
+pub mod runner;
+
+pub use runner::platform::firefox_default_path;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozrunner/src/runner.rs
@@ -0,0 +1,249 @@
+use mozprofile::prefdata::FIREFOX_PREFERENCES;
+use mozprofile::prefreader::PrefReaderError;
+use mozprofile::profile::Profile;
+use std::convert::From;
+use std::env;
+use std::error::Error;
+use std::fmt;
+use std::io::{Result as IoResult, Error as IoError, ErrorKind};
+use std::path::{Path, PathBuf};
+use std::process;
+use std::process::{Command, Stdio};
+
+pub trait Runner {
+    fn start(&mut self) -> Result<(), RunnerError>;
+
+    fn args(&mut self) -> &mut Vec<String>;
+
+    fn build_command(&self, &mut Command);
+
+    fn is_running(&self) -> bool;
+
+    fn stop(&mut self) -> IoResult<Option<process::ExitStatus>>;
+}
+
+#[derive(Debug)]
+pub enum RunnerError {
+    Io(IoError),
+    PrefReader(PrefReaderError),
+}
+
+impl fmt::Display for RunnerError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.description().fmt(f)
+    }
+}
+
+impl Error for RunnerError {
+    fn description(&self) -> &str {
+        match *self {
+            RunnerError::Io(ref err) => {
+                match err.kind() {
+                    ErrorKind::NotFound => "no such file or directory",
+                    _ => err.description(),
+                }
+            }
+            RunnerError::PrefReader(ref err) => err.description(),
+        }
+    }
+
+    fn cause(&self) -> Option<&Error> {
+        Some(match *self {
+            RunnerError::Io(ref err) => err as &Error,
+            RunnerError::PrefReader(ref err) => err as &Error,
+        })
+    }
+}
+
+impl From<IoError> for RunnerError {
+    fn from(value: IoError) -> RunnerError {
+        RunnerError::Io(value)
+    }
+}
+
+impl From<PrefReaderError> for RunnerError {
+    fn from(value: PrefReaderError) -> RunnerError {
+        RunnerError::PrefReader(value)
+    }
+}
+
+pub struct FirefoxRunner {
+    pub binary: PathBuf,
+    args: Vec<String>,
+    process: Option<process::Child>,
+    pub ret_code: Option<process::ExitStatus>,
+    pub profile: Profile
+}
+
+impl FirefoxRunner {
+    pub fn new(binary: &Path, profile: Option<Profile>) -> IoResult<FirefoxRunner> {
+        let prof = match profile {
+            Some(p) => p,
+            None => try!(Profile::new(None))
+        };
+
+        Ok(FirefoxRunner {
+            binary: binary.to_path_buf(),
+            process: None,
+            ret_code: None,
+            args: Vec::new(),
+            profile: prof
+        })
+    }
+}
+
+impl Runner for FirefoxRunner {
+    fn start(&mut self) -> Result<(), RunnerError> {
+        let mut cmd = Command::new(&self.binary);
+        self.build_command(&mut cmd);
+
+        let mut prefs = try!(self.profile.user_prefs());
+        prefs.insert_slice(&FIREFOX_PREFERENCES[..]);
+
+        try!(prefs.write());
+
+        let process = try!(cmd.spawn());
+        self.process = Some(process);
+        Ok(())
+    }
+
+    fn args(&mut self) -> &mut Vec<String> {
+        &mut self.args
+    }
+
+    fn build_command(&self, command: &mut Command) {
+        command
+            .env("MOZ_NO_REMOTE", "1")
+            .env("NO_EM_RESTART", "1")
+            .args(&self.args[..])
+            .arg("-profile").arg(&self.profile.path)
+            .stdout(Stdio::inherit())
+            .stderr(Stdio::inherit());
+    }
+
+    fn is_running(&self) -> bool {
+        self.process.is_some() && self.ret_code.is_none()
+    }
+
+    fn stop(&mut self) -> IoResult<Option<process::ExitStatus>> {
+        match self.process.as_mut() {
+            Some(p) => {
+                try!(p.kill());
+                let status = try!(p.wait());
+                self.ret_code = Some(status);
+            },
+            None => {}
+        };
+        Ok(self.ret_code)
+    }
+}
+
+fn find_binary(name: &str) -> Option<PathBuf> {
+    env::var("PATH")
+        .ok()
+        .and_then(|path_env| {
+            for mut path in env::split_paths(&*path_env) {
+                path.push(name);
+                if path.exists() {
+                    return Some(path)
+                }
+            }
+            None
+        })
+}
+
+#[cfg(target_os = "linux")]
+pub mod platform {
+    use super::find_binary;
+    use std::path::PathBuf;
+
+    pub fn firefox_default_path() -> Option<PathBuf> {
+        find_binary("firefox")
+    }
+}
+
+#[cfg(target_os = "macos")]
+pub mod platform {
+    use super::find_binary;
+    use std::env;
+    use std::path::PathBuf;
+
+    pub fn firefox_default_path() -> Option<PathBuf> {
+        if let Some(path) = find_binary("firefox-bin") {
+            return Some(path)
+        }
+        let home = env::home_dir();
+        for &(prefix_home, trial_path) in [
+            (false, "/Applications/Firefox.app/Contents/MacOS/firefox-bin"),
+            (true, "Applications/Firefox.app/Contents/MacOS/firefox-bin")].iter() {
+            let path = match (home.as_ref(), prefix_home) {
+                (Some(ref home_dir), true) => home_dir.join(trial_path),
+                (None, true) => continue,
+                (_, false) => PathBuf::from(trial_path)
+            };
+            if path.exists() {
+                return Some(path)
+            }
+        }
+        None
+    }
+}
+
+#[cfg(target_os = "windows")]
+pub mod platform {
+    use super::find_binary;
+    use std::io::Error;
+    use std::path::PathBuf;
+    use winreg::RegKey;
+    use winreg::enums::*;
+
+    pub fn firefox_default_path() -> Option<PathBuf> {
+        let opt_path = firefox_registry_path().unwrap_or(None);
+        if let Some(path) = opt_path {
+            if path.exists() {
+                return Some(path)
+            }
+        };
+        find_binary("firefox.exe")
+    }
+
+    fn firefox_registry_path() -> Result<Option<PathBuf>, Error> {
+        let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+        for subtree_key in ["SOFTWARE", "SOFTWARE\\WOW6432Node"].iter() {
+            let subtree = try!(hklm.open_subkey_with_flags(subtree_key, KEY_READ));
+            let mozilla_org = match subtree.open_subkey_with_flags("mozilla.org\\Mozilla", KEY_READ) {
+                Ok(val) => val,
+                Err(_) => continue
+            };
+            let current_version: String = try!(mozilla_org.get_value("CurrentVersion"));
+            let mozilla = try!(subtree.open_subkey_with_flags("Mozilla", KEY_READ));
+            for key_res in mozilla.enum_keys() {
+                let key = try!(key_res);
+                let section_data = try!(mozilla.open_subkey_with_flags(&key, KEY_READ));
+                let version: Result<String, _> = section_data.get_value("GeckoVer");
+                if let Ok(ver) = version {
+                    if ver == current_version {
+                        let mut bin_key = key.to_owned();
+                        bin_key.push_str("\\bin");
+                        if let Ok(bin_subtree) = mozilla.open_subkey_with_flags(bin_key, KEY_READ) {
+                            let path: Result<String, _> = bin_subtree.get_value("PathToExe");
+                            if let Ok(path) = path {
+                                return Ok(Some(PathBuf::from(path)))
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        Ok(None)
+    }
+}
+
+#[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))]
+pub mod platform {
+    use std::path::PathBuf;
+
+    pub fn firefox_default_path() -> Option<PathBuf> {
+        None
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozversion/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805","Cargo.toml":"de3d35ee619ea8c23287c463c8a4f9ef999b851707f01d3cb1877c10ff973515","src/lib.rs":"4a28ed1eae70962084d4cb7d08e83be30515dd680c7bf21b9c6e8deba6023655"},"package":"76acea204db8c94a612821e0ddc5e4513e46af21fdbd8c15b8efe13b343062f0"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozversion/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozversion/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "mozversion"
+version = "0.1.1"
+authors = ["James Graham <james@hoppipolla.co.uk>"]
+description = "Utility for accessing Firefox version metadata"
+keywords = ["mozilla", "firefox"]
+repository = "https://github.com/jgraham/mozversion"
+license = "MPL-2.0"
+
+
+[dependencies]
+regex = "0.2"
+rust-ini = "0.10.0"
+semver = "0.6"
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mozversion/src/lib.rs
@@ -0,0 +1,312 @@
+extern crate ini;
+extern crate regex;
+extern crate semver;
+
+use ini::Ini;
+use regex::Regex;
+use platform::ini_path;
+use std::default::Default;
+use std::error;
+use std::fmt::{self, Display, Formatter};
+use std::path::Path;
+use std::str::FromStr;
+
+/// Details about the version of a Firefox build.
+#[derive(Clone, Default)]
+pub struct AppVersion {
+    /// Unique date-based id for a build
+    pub build_id: Option<String>,
+    /// Channel name
+    pub code_name: Option<String>,
+    /// Version number e.g. 55.0a1
+    pub version_string: Option<String>,
+    /// Url of the respoistory from which the build was made
+    pub source_repository: Option<String>,
+    /// Commit ID of the build
+    pub source_stamp: Option<String>,
+}
+
+impl AppVersion {
+    pub fn new() -> AppVersion {
+        Default::default()
+    }
+
+    fn update_from_application_ini(&mut self, ini_file: &Ini) {
+        if let Some(section) = ini_file.section(Some("App")) {
+            if let Some(build_id) = section.get("BuildID") {
+                self.build_id = Some(build_id.clone());
+            }
+            if let Some(code_name) = section.get("CodeName") {
+                self.code_name = Some(code_name.clone());
+            }
+            if let Some(version) = section.get("Version") {
+                self.version_string = Some(version.clone());
+            }
+            if let Some(source_repository) = section.get("SourceRepository") {
+                self.source_repository = Some(source_repository.clone());
+            }
+            if let Some(source_stamp) = section.get("SourceStamp") {
+                self.source_stamp = Some(source_stamp.clone());
+            }
+        }
+    }
+
+    fn update_from_platform_ini(&mut self, ini_file: &Ini) {
+        if let Some(section) = ini_file.section(Some("Build")) {
+            if let Some(build_id) = section.get("BuildID") {
+                self.build_id = Some(build_id.clone());
+            }
+            if let Some(version) = section.get("Milestone") {
+                self.version_string = Some(version.clone());
+            }
+            if let Some(source_repository) = section.get("SourceRepository") {
+                self.source_repository = Some(source_repository.clone());
+            }
+            if let Some(source_stamp) = section.get("SourceStamp") {
+                self.source_stamp = Some(source_stamp.clone());
+            }
+        }
+    }
+
+    pub fn version(&self) -> Option<Version> {
+        self.version_string
+            .as_ref()
+            .and_then(|x| Version::from_str(&*x).ok())
+    }
+}
+
+#[derive(Default, Clone)]
+/// Version number information
+pub struct Version {
+    /// Major version number (e.g. 55 in 55.0)
+    pub major: u64,
+    /// Minor version number (e.g. 1 in 55.1)
+    pub minor: u64,
+    /// Patch version number (e.g. 2 in 55.1.2)
+    pub patch: u64,
+    /// Prerelase information (e.g. Some(("a", 1)) in 55.0a1)
+    pub pre: Option<(String, u64)>,
+}
+
+impl Version {
+    pub fn from_str(version_string: &str) -> Result<Version, Error> {
+        let mut version: Version = Default::default();
+        let version_re = Regex::new(r"^(?P<major>\d+)\.(?P<minor>\d+)(?:\.(?P<patch>\d+))?(?:(?P<pre0>[a-z]+)(?P<pre1>\d*))?$").unwrap();
+        if let Some(captures) = version_re.captures(version_string) {
+            match captures.name("major")
+                .and_then(|x| u64::from_str(x.as_str()).ok()) {
+                    Some(x) => version.major = x,
+                    None => return Err(Error::VersionError("No major version number found".into()))
+                }
+            match captures.name("minor")
+                .and_then(|x| u64::from_str(x.as_str()).ok()) {
+                    Some(x) => version.minor = x,
+                    None => return Err(Error::VersionError("No minor version number found".into()))
+                }
+            match captures.name("patch")
+                .and_then(|x| u64::from_str(x.as_str()).ok()) {
+                    Some(x) => version.patch = x,
+                    None => {}
+                }
+            if let Some(pre_0) = captures.name("pre0").map(|x| x.as_str().to_string()) {
+                if captures.name("pre1").is_some() {
+                    if let Some(pre_1) = captures.name("pre1")
+                        .and_then(|x| u64::from_str(x.as_str()).ok()) {
+                            version.pre = Some((pre_0, pre_1))
+                        } else {
+                            return Err(Error::VersionError("Failed to convert prelease number to u64".into()));
+                        }
+                } else {
+                    return Err(Error::VersionError("Failed to convert prelease number to u64".into()));
+                }
+            }
+        } else {
+            return Err(Error::VersionError("Failed to parse input as version string".into()))
+        }
+        Ok(version)
+    }
+
+    fn to_semver(&self) -> semver::Version {
+        // The way the semver crate handles prereleases isn't what we want here
+        // This should be fixed in the long term by implementing our own comparison
+        // operators, but for now just act as if prerelease metadata was missing, otherwise
+        // it is almost impossible to use this with nightly
+        semver::Version {
+            major: self.major,
+            minor: self.minor,
+            patch: self.patch,
+            pre: vec![],
+            build: vec![],
+        }
+    }
+
+    pub fn matches(&self, version_req: &str) -> Result<bool, Error> {
+        let req = try!(semver::VersionReq::parse(version_req));
+        Ok(req.matches(&self.to_semver()))
+    }
+}
+
+impl Display for Version {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        match self.patch {
+            0 => try!(write!(f, "{}.{}", self.major, self.minor)),
+            _ => try!(write!(f, "{}.{}.{}", self.major, self.minor, self.patch))
+        }
+        if let Some(ref pre) = self.pre {
+            try!(write!(f, "{}{}", pre.0, pre.1));
+        };
+        Ok(())
+    }
+}
+
+/// Determine the version of Firefox given the path to a binary.
+///
+/// Given the path to a Firefox binary, read the associated application.ini
+/// and platform.ini files to extract information about the version of Firefox
+/// at that path.
+pub fn firefox_version(binary: &Path) -> Result<AppVersion, Error>  {
+    let mut version = AppVersion::new();
+    let mut updated = false;
+
+    if let Some(dir) = ini_path(binary) {
+        let mut application_ini = dir.clone();
+        application_ini.push("application.ini");
+
+        if Path::exists(&application_ini) {
+            let ini_file = Ini::load_from_file(application_ini).ok();
+            if let Some(ini) = ini_file {
+                updated = true;
+                version.update_from_application_ini(&ini);
+            }
+        }
+
+        let mut platform_ini = dir.clone();
+        platform_ini.push("platform.ini");
+
+        if Path::exists(&platform_ini) {
+            let ini_file = Ini::load_from_file(platform_ini).ok();
+            if let Some(ini) = ini_file {
+                updated = true;
+                version.update_from_platform_ini(&ini);
+            }
+        }
+
+        if !updated {
+            return Err(Error::MetadataError("Neither platform.ini nor application.ini found".into()))
+        }
+    } else {
+        return Err(Error::MetadataError("Invalid binary path".into()))
+    }
+    Ok(version)
+}
+
+#[derive(Debug)]
+pub enum Error {
+    /// Error parsing a version string
+    VersionError(String),
+    /// Error reading application metadata
+    MetadataError(String),
+    /// Error processing a string as a semver comparator
+    SemVerError(semver::ReqParseError)
+}
+
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            &Error::VersionError(ref x) => {
+                try!("VersionError: ".fmt(f));
+                x.fmt(f)
+            },
+            &Error::MetadataError(ref x) => {
+                try!("MetadataError: ".fmt(f));
+                x.fmt(f)
+            },
+            &Error::SemVerError(ref e) => {
+                try!("SemVerError: ".fmt(f));
+                e.fmt(f)
+            }
+        }
+    }
+}
+
+impl From<semver::ReqParseError> for Error {
+    fn from(err: semver::ReqParseError) -> Error {
+        Error::SemVerError(err)
+    }
+}
+
+impl error::Error for Error {
+    fn description(&self) -> &str {
+        match self {
+            &Error::VersionError(ref x) => &*x,
+            &Error::MetadataError(ref x) => &*x,
+            &Error::SemVerError(ref e) => e.description(),
+        }
+    }
+
+    fn cause(&self) -> Option<&error::Error> {
+        match self {
+            &Error::SemVerError(ref e) => Some(e),
+            _ => None,
+        }
+    }
+}
+
+#[cfg(target_os = "macos")]
+mod platform {
+    use std::path::{Path, PathBuf};
+
+    pub fn ini_path(binary: &Path) -> Option<PathBuf> {
+        binary.parent().and_then(|x| x.parent()).map(|x| x.join("Resources"))
+    }
+}
+
+#[cfg(not(target_os = "macos"))]
+mod platform {
+    use std::path::{Path, PathBuf};
+
+    pub fn ini_path(binary: &Path) -> Option<PathBuf> {
+        binary.parent().map(|dir| dir.to_path_buf())
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::{Version};
+
+    fn parse_version(input: &str) -> String {
+        Version::from_str(input).unwrap().to_string()
+    }
+
+    fn compare(version: &str, comparison: &str) -> bool {
+        let v = Version::from_str(version).unwrap();
+        v.matches(comparison).unwrap()
+    }
+
+    #[test]
+    fn test_parser() {
+        assert!(parse_version("50.0a1") == "50.0a1");
+        assert!(parse_version("50.0.1a1") == "50.0.1a1");
+        assert!(parse_version("50.0.0") == "50.0");
+    }
+
+    #[test]
+    fn test_matches() {
+        assert!(compare("50.0", "=50"));
+        assert!(compare("50.1", "=50"));
+        assert!(compare("50.1", "=50.1"));
+        assert!(compare("50.1.1", "=50.1"));
+        assert!(compare("50.0.0", "=50.0.0"));
+        assert!(compare("51.0.0", ">50"));
+        assert!(compare("49.0", "<50"));
+        assert!(compare("50.0", "<50.1"));
+        assert!(compare("50.0.0", "<50.0.1"));
+        assert!(!compare("50.1.0", ">50"));
+        assert!(!compare("50.1.0", "<50"));
+        assert!(compare("50.1.0", ">=50,<51"));
+        assert!(compare("50.0a1", ">49.0"));
+        assert!(compare("50.0a2", "=50"));
+        //This is the weird one
+        assert!(!compare("50.0a2", ">50.0"));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"f0902052851b9d4fec53cea56ce4075686365f0075d64a788fe7ba9f9b98fb8a","Cargo.toml":"b2dbd542893d6b03621c7c65c4fdd7ddb7e6e7c713c610ea3ef5ca88108d3644","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"0241727cb9f7e4ab1ad206ff89ec1dc31034a69b146f076237e8c1b1534b6fe0","README.md":"11cdfba96992fcee089bdcad6682ba5357d8161304d35618ee76abad298ffba7","appveyor.yml":"266ca65d48f02c6a3ce1ba1c0772ef9afece737da03b3176e000b7c32a9ea748","script/doc-upload.cfg":"8cae598ef8592842fa8319b18d515e7a322296490cbdf909b29f5e042a95419e","src/lib.rs":"996474c9c88d9c79865b4923d9739f4c9bc650b29ea70db1c7af43fa59947ed1"},"package":"65ba9d75bcea84e07812618fedf284a64776c2f2ea0cad6bca7f69739695a958"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/.travis.yml
@@ -0,0 +1,20 @@
+language: rust
+
+rust:
+    - stable
+
+sudo: false
+
+notifications:
+    email:
+        on_success: never
+        on_failure: always
+
+script:
+    - cargo build
+    - cargo test
+    - cargo doc --no-deps
+    - rustdoc --test README.md -L target/debug
+
+after_success:
+    - curl https://mvdnes.github.io/rust-docs/travis-doc-upload.sh | bash
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "msdos_time"
+version = "0.1.5"
+authors = ["Mathijs van de Nes <git@mathijs.vd-nes.nl>"]
+license = "MIT OR Apache-2.0"
+description = """
+Converts an MsDosDateTime (FAT time) to a Tm value
+"""
+repository = "https://github.com/mvdnes/msdos_time"
+documentation = "https://mvdnes.github.io/rust-docs/msdos_time/msdos_time/"
+
+[lib]
+name = "msdos_time"
+
+[dependencies]
+time = "0.1"
+
+[target.'cfg(windows)'.dependencies]
+winapi = "0.2"
+kernel32-sys = "0.2"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/LICENSE-APACHE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/LICENSE-MIT
@@ -0,0 +1,19 @@
+Copyright (c) 2015 The msdos_time Developers
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/README.md
@@ -0,0 +1,25 @@
+# msdos_time
+
+[![Build Status](https://travis-ci.org/mvdnes/msdos_time.svg?branch=master)](https://travis-ci.org/mvdnes/msdos_time)
+[![Build status](https://ci.appveyor.com/api/projects/status/tf4jgk6wr66n17xa/branch/master?svg=true)](https://ci.appveyor.com/project/mvdnes/msdos-time/branch/master)
+[![Crates.io](https://img.shields.io/crates/v/msdos_time.svg)](https://crates.io/crates/msdos_time)
+
+[Documentation](https://mvdnes.github.io/rust-docs/msdos_time/msdos_time/)
+
+Library to convert Fat time to a Tm struct in Rust.
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally
+submitted for inclusion in the work by you, as defined in the Apache-2.0
+license, shall be dual licensed as above, without any additional terms or
+conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/appveyor.yml
@@ -0,0 +1,39 @@
+environment:
+    matrix:
+        - RUST_INSTALL_TRIPLE: i686-pc-windows-gnu
+          RUST_CHANNEL: stable
+        - RUST_INSTALL_TRIPLE: x86_64-pc-windows-gnu
+          RUST_CHANNEL: stable
+        - RUST_INSTALL_TRIPLE: x86_64-pc-windows-msvc
+          RUST_CHANNEL: stable
+
+matrix:
+    allow_failures:
+        - RUST_CHANNEL: nightly
+
+install:
+    - ps: Start-FileDownload "http://static.rust-lang.org/dist/channel-rust-${env:RUST_CHANNEL}"
+    - ps: $env:RUST_INSTALLER = Select-String "${env:RUST_INSTALL_TRIPLE}.*exe" "channel-rust-${env:RUST_CHANNEL}" | select -exp line
+    - ps: Start-FileDownload "http://static.rust-lang.org/dist/${env:RUST_INSTALLER}"
+    - '%RUST_INSTALLER% /VERYSILENT /NORESTART /DIR="C:\Rust"'
+    - call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64
+    - ps: $env:path = "C:\Rust\bin;" + $env:path
+    - ps: |
+        if ($env:RUST_INSTALL_TRIPLE -like "x86_64-*-gnu") {
+            Start-FileDownload "http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/5.1.0/threads-win32/seh/x86_64-5.1.0-release-win32-seh-rt_v4-rev0.7z/download" -FileName mingw64.7z
+            7z x -oC:\ mingw64.7z > $null
+            $env:path = "C:\mingw64\bin;" + $env:path
+            gcc --version
+        }
+        elseif ($env:RUST_INSTALL_TRIPLE -like "i686-*-gnu") {
+            $env:path = "C:\mingw\bin;" + $env:path
+            gcc --version
+        }
+    - rustc --version --verbose
+    - cargo --version
+
+build: false
+
+test_script:
+    - cargo build
+    - cargo test
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/script/doc-upload.cfg
@@ -0,0 +1,3 @@
+PROJECT_NAME=msdos_time
+DOCS_REPO=mvdnes/rust-docs.git
+DOC_RUST_VERSION=stable
new file mode 100644
--- /dev/null
+++ b/third_party/rust/msdos_time/src/lib.rs
@@ -0,0 +1,224 @@
+#![warn(missing_docs)]
+
+//! This crate converts a `Tm` struct to an `MsDosDateTime` and vice-versa
+//!
+//! MsDosDateTime is based on a FAT datetime and is a compact representation of a date.
+//! It is currently mostly used in zip files.
+
+extern crate time;
+#[cfg(windows)] extern crate kernel32;
+#[cfg(windows)] extern crate winapi;
+
+use std::io;
+use time::Tm;
+
+/// Struct representing the date and time part of an MsDos datetime
+#[derive(Copy, Clone, Debug)]
+pub struct MsDosDateTime {
+    /// Part representing the date
+    pub datepart: u16,
+    /// Part representing the time
+    pub timepart: u16,
+}
+
+impl MsDosDateTime {
+    /// Constructor of an MsDos datetime, from the raw representation
+    pub fn new(time: u16, date: u16) -> MsDosDateTime {
+        MsDosDateTime {
+            datepart: date,
+            timepart: time,
+        }
+    }
+}
+
+/// Trait to convert a time representation to and from a MsDosDateTime
+pub trait TmMsDosExt : Sized {
+    /// Convert a value to MsDosDateTime
+    fn to_msdos(&self) -> Result<MsDosDateTime, io::Error>;
+    /// Construct a value from an MsDosDateTime
+    fn from_msdos(MsDosDateTime) -> Result<Self, io::Error>;
+}
+
+impl TmMsDosExt for Tm {
+    fn to_msdos(&self) -> Result<MsDosDateTime, io::Error> {
+        sys::tm_to_msdos(self)
+    }
+
+    fn from_msdos(ms: MsDosDateTime) -> Result<Self, io::Error> {
+        sys::msdos_to_tm(ms)
+    }
+}
+
+#[cfg(not(windows))]
+mod sys {
+    use super::MsDosDateTime;
+    use time::{self, Tm};
+    use std::io;
+
+    pub fn msdos_to_tm(ms: MsDosDateTime) -> Result<Tm, io::Error> {
+        let seconds = (ms.timepart & 0b0000000000011111) << 1;
+        let minutes = (ms.timepart & 0b0000011111100000) >> 5;
+        let hours =   (ms.timepart & 0b1111100000000000) >> 11;
+        let days =    (ms.datepart & 0b0000000000011111) >> 0;
+        let months =  (ms.datepart & 0b0000000111100000) >> 5;
+        let years =   (ms.datepart & 0b1111111000000000) >> 9;
+
+        // Month range: Dos [1..12], Tm [0..11]
+        // Year zero: Dos 1980, Tm 1900
+
+        let tm = Tm {
+            tm_sec: seconds as i32,
+            tm_min: minutes as i32,
+            tm_hour: hours as i32,
+            tm_mday: days as i32,
+            tm_mon: months as i32 - 1,
+            tm_year: years as i32 + 80,
+            ..time::empty_tm()
+        };
+
+        // Re-parse the possibly incorrect timestamp to get a correct one.
+        // This ensures every value will be in range
+        // TODO: Check if this will only panic on Windows, or also other platforms
+        Ok(time::at_utc(tm.to_timespec()))
+    }
+
+    pub fn tm_to_msdos(tm: &Tm) -> Result<MsDosDateTime, io::Error> {
+        let timepart = ((tm.tm_sec >> 1) | (tm.tm_min << 5) | (tm.tm_hour << 11)) as u16;
+        let datepart = (tm.tm_mday | ((tm.tm_mon + 1) << 5) | ((tm.tm_year - 80) << 9)) as u16;
+        Ok(MsDosDateTime { datepart: datepart, timepart: timepart })
+    }
+}
+
+#[cfg(windows)]
+mod sys {
+    use super::MsDosDateTime;
+    use time::{self, Tm};
+    use winapi::*;
+    use kernel32::*;
+    use std::io;
+
+    pub fn msdos_to_tm(ms: MsDosDateTime) -> Result<Tm, io::Error> {
+        let datepart: WORD = ms.datepart;
+        let timepart: WORD = ms.timepart;
+        let mut filetime: FILETIME = unsafe { ::std::mem::zeroed() };
+        let mut systemtime: SYSTEMTIME = unsafe { ::std::mem::zeroed() };
+
+        if unsafe { DosDateTimeToFileTime(datepart, timepart, &mut filetime) } == 0 {
+            return Err(io::Error::last_os_error());
+        }
+
+        if unsafe { FileTimeToSystemTime(&filetime, &mut systemtime) } == 0 {
+            return Err(io::Error::last_os_error());
+        }
+
+        Ok(Tm {
+            tm_sec: systemtime.wSecond as i32,
+            tm_min: systemtime.wMinute as i32,
+            tm_hour: systemtime.wHour as i32,
+            tm_mday: systemtime.wDay as i32,
+            tm_wday: systemtime.wDayOfWeek as i32,
+            tm_mon: (systemtime.wMonth - 1) as i32,
+            tm_year: (systemtime.wYear - 1900) as i32,
+            ..time::empty_tm()
+        })
+    }
+
+    pub fn tm_to_msdos(tm: &Tm) -> Result<MsDosDateTime, io::Error> {
+        let systemtime = SYSTEMTIME {
+            wYear: (tm.tm_year + 1900) as WORD,
+            wMonth: (tm.tm_mon + 1) as WORD,
+            wDayOfWeek: tm.tm_wday as WORD,
+            wDay: tm.tm_mday as WORD,
+            wHour: tm.tm_hour as WORD,
+            wMinute: tm.tm_min as WORD,
+            wSecond: tm.tm_sec as WORD,
+            wMilliseconds: 0,
+        };
+        let mut filetime = unsafe { ::std::mem::zeroed() };
+        let mut datepart : WORD = 0;
+        let mut timepart : WORD = 0;
+
+        if unsafe { SystemTimeToFileTime(&systemtime, &mut filetime) } == 0 {
+            return Err(io::Error::last_os_error());
+        }
+
+        if unsafe { FileTimeToDosDateTime(&filetime, &mut datepart, &mut timepart) } == 0 {
+            return Err(io::Error::last_os_error());
+        }
+
+        Ok(MsDosDateTime { datepart: datepart, timepart: timepart })
+    }
+}
+
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use time::{self, Tm};
+
+    fn check_date(input: Tm, day: i32, month: i32, year: i32) {
+        assert_eq!(input.tm_mday, day);
+        assert_eq!(input.tm_mon + 1, month);
+        assert_eq!(input.tm_year + 1900, year);
+    }
+
+    fn check_time(input: Tm, hour: i32, minute: i32, second: i32) {
+        assert_eq!(input.tm_hour, hour);
+        assert_eq!(input.tm_min, minute);
+        assert_eq!(input.tm_sec, second);
+    }
+
+    #[test]
+    fn dos_zero() {
+        // The 0 date is not a correct msdos date
+        // We assert here that it does not panic. What it will return is undefined.
+        let _ = Tm::from_msdos(MsDosDateTime::new(0, 0));
+    }
+
+    #[test]
+    fn dos_smallest() {
+        // This is the actual smallest date possible
+        let tm = Tm::from_msdos(MsDosDateTime::new(0, 0b100001)).unwrap();
+        check_date(tm, 1, 1, 1980);
+        check_time(tm, 0, 0, 0);
+    }
+
+    #[test]
+    fn dos_today() {
+        let tm = Tm::from_msdos(MsDosDateTime::new(0b01001_100000_10101, 0b0100011_0110_11110)).unwrap();
+        check_date(tm, 30, 6, 2015);
+        check_time(tm, 9, 32, 42);
+    }
+
+    #[test]
+    fn zero_dos() {
+        let tm = Tm {
+            tm_year: 80,
+            tm_mon: 0,
+            tm_mday: 1,
+            tm_hour: 0,
+            tm_min: 0,
+            tm_sec: 0,
+            ..time::empty_tm()
+        };
+        let ms = tm.to_msdos().unwrap();
+        assert_eq!(ms.datepart, 0b100001);
+        assert_eq!(ms.timepart, 0);
+    }
+
+    #[test]
+    fn today_dos() {
+        let tm = Tm {
+            tm_year: 115,
+            tm_mon: 5,
+            tm_mday: 30,
+            tm_hour: 9,
+            tm_min: 32,
+            tm_sec: 42,
+            ..time::empty_tm()
+        };
+        let ms = tm.to_msdos().unwrap();
+        assert_eq!(ms.datepart, 0b0100011_0110_11110);
+        assert_eq!(ms.timepart, 0b01001_100000_10101);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num-iter/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"4da183ea870d8853d14a5c95bed8f9ceaa26b50118dd398344821cbd25452dd0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"7cc73113897d1399dafc7f64ecc53f809295a4df3b401b42c2c8b1a7743a3748"},"package":"f7d1891bd7b936f12349b7d1403761c8a0b85a18b148e9da4429d5d102c1a41e"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num-iter/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+authors = ["The Rust Project Developers"]
+description = "External iterators for generic mathematics"
+documentation = "http://rust-num.github.io/num"
+homepage = "https://github.com/rust-num/num"
+keywords = ["mathematics", "numerics"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/rust-num/num"
+name = "num-iter"
+version = "0.1.33"
+
+[dependencies]
+
+[dependencies.num-integer]
+optional = false
+path = "../integer"
+version = "0.1.32"
+
+[dependencies.num-traits]
+optional = false
+path = "../traits"
+version = "0.1.32"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num-iter/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num-iter/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num-iter/src/lib.rs
@@ -0,0 +1,378 @@
+// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! External iterators for generic mathematics
+#![doc(html_logo_url = "https://rust-num.github.io/num/rust-logo-128x128-blk-v2.png",
+       html_favicon_url = "https://rust-num.github.io/num/favicon.ico",
+       html_root_url = "https://rust-num.github.io/num/",
+       html_playground_url = "http://play.integer32.com/")]
+
+extern crate num_traits as traits;
+extern crate num_integer as integer;
+
+use integer::Integer;
+use traits::{Zero, One, CheckedAdd, ToPrimitive};
+use std::ops::{Add, Sub};
+
+/// An iterator over the range [start, stop)
+#[derive(Clone)]
+pub struct Range<A> {
+    state: A,
+    stop: A,
+    one: A
+}
+
+/// Returns an iterator over the given range [start, stop) (that is, starting
+/// at start (inclusive), and ending at stop (exclusive)).
+///
+/// # Example
+///
+/// ```rust
+/// let array = [0, 1, 2, 3, 4];
+///
+/// for i in num_iter::range(0, 5) {
+///     println!("{}", i);
+///     assert_eq!(i,  array[i]);
+/// }
+/// ```
+#[inline]
+pub fn range<A>(start: A, stop: A) -> Range<A>
+    where A: Add<A, Output = A> + PartialOrd + Clone + One
+{
+    Range{state: start, stop: stop, one: One::one()}
+}
+
+// FIXME: rust-lang/rust#10414: Unfortunate type bound
+impl<A> Iterator for Range<A>
+    where A: Add<A, Output = A> + PartialOrd + Clone + ToPrimitive
+{
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        if self.state < self.stop {
+            let result = self.state.clone();
+            self.state = self.state.clone() + self.one.clone();
+            Some(result)
+        } else {
+            None
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // This first checks if the elements are representable as i64. If they aren't, try u64 (to
+        // handle cases like range(huge, huger)). We don't use usize/int because the difference of
+        // the i64/u64 might lie within their range.
+        let bound = match self.state.to_i64() {
+            Some(a) => {
+                let sz = self.stop.to_i64().map(|b| b.checked_sub(a));
+                match sz {
+                    Some(Some(bound)) => bound.to_usize(),
+                    _ => None,
+                }
+            },
+            None => match self.state.to_u64() {
+                Some(a) => {
+                    let sz = self.stop.to_u64().map(|b| b.checked_sub(a));
+                    match sz {
+                        Some(Some(bound)) => bound.to_usize(),
+                        _ => None
+                    }
+                },
+                None => None
+            }
+        };
+
+        match bound {
+            Some(b) => (b, Some(b)),
+            // Standard fallback for unbounded/unrepresentable bounds
+            None => (0, None)
+        }
+    }
+}
+
+/// `Integer` is required to ensure the range will be the same regardless of
+/// the direction it is consumed.
+impl<A> DoubleEndedIterator for Range<A>
+    where A: Integer + Clone + ToPrimitive
+{
+    #[inline]
+    fn next_back(&mut self) -> Option<A> {
+        if self.stop > self.state {
+            self.stop = self.stop.clone() - self.one.clone();
+            Some(self.stop.clone())
+        } else {
+            None
+        }
+    }
+}
+
+/// An iterator over the range [start, stop]
+#[derive(Clone)]
+pub struct RangeInclusive<A> {
+    range: Range<A>,
+    done: bool,
+}
+
+/// Return an iterator over the range [start, stop]
+#[inline]
+pub fn range_inclusive<A>(start: A, stop: A) -> RangeInclusive<A>
+    where A: Add<A, Output = A> + PartialOrd + Clone + One
+{
+    RangeInclusive{range: range(start, stop), done: false}
+}
+
+impl<A> Iterator for RangeInclusive<A>
+    where A: Add<A, Output = A> + PartialOrd + Clone + ToPrimitive
+{
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        match self.range.next() {
+            Some(x) => Some(x),
+            None => {
+                if !self.done && self.range.state == self.range.stop {
+                    self.done = true;
+                    Some(self.range.stop.clone())
+                } else {
+                    None
+                }
+            }
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (lo, hi) = self.range.size_hint();
+        if self.done {
+            (lo, hi)
+        } else {
+            let lo = lo.saturating_add(1);
+            let hi = match hi {
+                Some(x) => x.checked_add(1),
+                None => None
+            };
+            (lo, hi)
+        }
+    }
+}
+
+impl<A> DoubleEndedIterator for RangeInclusive<A>
+    where A: Sub<A, Output = A> + Integer + Clone + ToPrimitive
+{
+    #[inline]
+    fn next_back(&mut self) -> Option<A> {
+        if self.range.stop > self.range.state {
+            let result = self.range.stop.clone();
+            self.range.stop = self.range.stop.clone() - self.range.one.clone();
+            Some(result)
+        } else if !self.done && self.range.state == self.range.stop {
+            self.done = true;
+            Some(self.range.stop.clone())
+        } else {
+            None
+        }
+    }
+}
+
+/// An iterator over the range [start, stop) by `step`. It handles overflow by stopping.
+#[derive(Clone)]
+pub struct RangeStep<A> {
+    state: A,
+    stop: A,
+    step: A,
+    rev: bool,
+}
+
+/// Return an iterator over the range [start, stop) by `step`. It handles overflow by stopping.
+#[inline]
+pub fn range_step<A>(start: A, stop: A, step: A) -> RangeStep<A>
+    where A: CheckedAdd + PartialOrd + Clone + Zero
+{
+    let rev = step < Zero::zero();
+    RangeStep{state: start, stop: stop, step: step, rev: rev}
+}
+
+impl<A> Iterator for RangeStep<A>
+    where A: CheckedAdd + PartialOrd + Clone
+{
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        if (self.rev && self.state > self.stop) || (!self.rev && self.state < self.stop) {
+            let result = self.state.clone();
+            match self.state.checked_add(&self.step) {
+                Some(x) => self.state = x,
+                None => self.state = self.stop.clone()
+            }
+            Some(result)
+        } else {
+            None
+        }
+    }
+}
+
+/// An iterator over the range [start, stop] by `step`. It handles overflow by stopping.
+#[derive(Clone)]
+pub struct RangeStepInclusive<A> {
+    state: A,
+    stop: A,
+    step: A,
+    rev: bool,
+    done: bool,
+}
+
+/// Return an iterator over the range [start, stop] by `step`. It handles overflow by stopping.
+#[inline]
+pub fn range_step_inclusive<A>(start: A, stop: A, step: A) -> RangeStepInclusive<A>
+    where A: CheckedAdd + PartialOrd + Clone + Zero
+{
+    let rev = step < Zero::zero();
+    RangeStepInclusive{state: start, stop: stop, step: step, rev: rev, done: false}
+}
+
+impl<A> Iterator for RangeStepInclusive<A>
+    where A: CheckedAdd + PartialOrd + Clone + PartialEq
+{
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        if !self.done && ((self.rev && self.state >= self.stop) ||
+                          (!self.rev && self.state <= self.stop)) {
+            let result = self.state.clone();
+            match self.state.checked_add(&self.step) {
+                Some(x) => self.state = x,
+                None => self.done = true
+            }
+            Some(result)
+        } else {
+            None
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::usize;
+    use std::ops::{Add, Mul};
+    use std::cmp::Ordering;
+    use traits::{One, ToPrimitive};
+
+    #[test]
+    fn test_range() {
+        /// A mock type to check Range when ToPrimitive returns None
+        struct Foo;
+
+        impl ToPrimitive for Foo {
+            fn to_i64(&self) -> Option<i64> { None }
+            fn to_u64(&self) -> Option<u64> { None }
+        }
+
+        impl Add<Foo> for Foo {
+            type Output = Foo;
+
+            fn add(self, _: Foo) -> Foo {
+                Foo
+            }
+        }
+
+        impl PartialEq for Foo {
+            fn eq(&self, _: &Foo) -> bool {
+                true
+            }
+        }
+
+        impl PartialOrd for Foo {
+            fn partial_cmp(&self, _: &Foo) -> Option<Ordering> {
+                None
+            }
+        }
+
+        impl Clone for Foo {
+            fn clone(&self) -> Foo {
+                Foo
+            }
+        }
+
+        impl Mul<Foo> for Foo {
+            type Output = Foo;
+
+            fn mul(self, _: Foo) -> Foo {
+                Foo
+            }
+        }
+
+        impl One for Foo {
+            fn one() -> Foo {
+                Foo
+            }
+        }
+
+        assert!(super::range(0, 5).collect::<Vec<isize>>() == vec![0, 1, 2, 3, 4]);
+        assert!(super::range(-10, -1).collect::<Vec<isize>>() ==
+                vec![-10, -9, -8, -7, -6, -5, -4, -3, -2]);
+        assert!(super::range(0, 5).rev().collect::<Vec<isize>>() == vec![4, 3, 2, 1, 0]);
+        assert_eq!(super::range(200, -5).count(), 0);
+        assert_eq!(super::range(200, -5).rev().count(), 0);
+        assert_eq!(super::range(200, 200).count(), 0);
+        assert_eq!(super::range(200, 200).rev().count(), 0);
+
+        assert_eq!(super::range(0, 100).size_hint(), (100, Some(100)));
+        // this test is only meaningful when sizeof usize < sizeof u64
+        assert_eq!(super::range(usize::MAX - 1, usize::MAX).size_hint(), (1, Some(1)));
+        assert_eq!(super::range(-10, -1).size_hint(), (9, Some(9)));
+    }
+
+    #[test]
+    fn test_range_inclusive() {
+        assert!(super::range_inclusive(0, 5).collect::<Vec<isize>>() ==
+                vec![0, 1, 2, 3, 4, 5]);
+        assert!(super::range_inclusive(0, 5).rev().collect::<Vec<isize>>() ==
+                vec![5, 4, 3, 2, 1, 0]);
+        assert_eq!(super::range_inclusive(200, -5).count(), 0);
+        assert_eq!(super::range_inclusive(200, -5).rev().count(), 0);
+        assert!(super::range_inclusive(200, 200).collect::<Vec<isize>>() == vec![200]);
+        assert!(super::range_inclusive(200, 200).rev().collect::<Vec<isize>>() == vec![200]);
+    }
+
+    #[test]
+    fn test_range_step() {
+        assert!(super::range_step(0, 20, 5).collect::<Vec<isize>>() ==
+                vec![0, 5, 10, 15]);
+        assert!(super::range_step(20, 0, -5).collect::<Vec<isize>>() ==
+                vec![20, 15, 10, 5]);
+        assert!(super::range_step(20, 0, -6).collect::<Vec<isize>>() ==
+                vec![20, 14, 8, 2]);
+        assert!(super::range_step(200u8, 255, 50).collect::<Vec<u8>>() ==
+                vec![200u8, 250]);
+        assert!(super::range_step(200, -5, 1).collect::<Vec<isize>>() == vec![]);
+        assert!(super::range_step(200, 200, 1).collect::<Vec<isize>>() == vec![]);
+    }
+
+    #[test]
+    fn test_range_step_inclusive() {
+        assert!(super::range_step_inclusive(0, 20, 5).collect::<Vec<isize>>() ==
+                vec![0, 5, 10, 15, 20]);
+        assert!(super::range_step_inclusive(20, 0, -5).collect::<Vec<isize>>() ==
+                vec![20, 15, 10, 5, 0]);
+        assert!(super::range_step_inclusive(20, 0, -6).collect::<Vec<isize>>() ==
+                vec![20, 14, 8, 2]);
+        assert!(super::range_step_inclusive(200u8, 255, 50).collect::<Vec<u8>>() ==
+                vec![200u8, 250]);
+        assert!(super::range_step_inclusive(200, -5, 1).collect::<Vec<isize>>() ==
+                vec![]);
+        assert!(super::range_step_inclusive(200, 200, 1).collect::<Vec<isize>>() ==
+                vec![200]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"944bf600c6230664922a011cbca026699969f2f89f6c7ff689835836ccd7b1de",".travis.yml":"9764d2f312c0ffd5e766f590fa3cbbe09059d10bf04b869e937c9ebf5d674eb9","Cargo.toml":"f533d81572ed9dc06e953829c4a837dce6f8ae096dc1f3a6bbd33095ad85aa8a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8c15b94f3309d43f316d58f351c143d4c8ef779382631fc65ea32d2dcdcddc4a","benches/bigint.rs":"20d98b7f41d721c62d46711ef9aa61d29d49b3a901faa715ff61bd43c61156f9","benches/shootout-pidigits.rs":"4e2392cdeba33986f8b294c0808b30c85bcf4bbc2a39537af849648cd0d749e1","ci/.gitignore":"0c1b2945862ea881e4013796e3ff31004dbd942cdee2dc86d7298959b8d46d78","ci/deploy.enc":"96fd3f8e1dc04d22c877a49b68788794f6cb515d0b7606df51d8b6be53131cd8","ci/deploy.sh":"8b7eeb9822e49bbfe36a22d846d5c06b4b7962330b3e4a5a64d59aeee1e45d66","ci/rustup.sh":"57e22a9e2a1dcfe4dcea577db7703e5700adf81792b5f0e2c04800f653094eda","ci/test_full.sh":"edc8bd2a61f3ec9886f4076c84b5c5ac667ca879f570b24608dd70bf4fdedd14","doc/favicon.ico":"7bc6bd910e0a3b5ccf9c8480a35cbec866563224d12b23052f1a7ffe9eb17c75","doc/index.html":"6977977443a0dd8c930a798c16e39bd99cdcbf78e5829e9502456117aa3a28dd","doc/rust-logo-128x128-blk-v2.png":"a3b727c6ff3ff9014b01a9ac0e721b027344a080ca7dc1107533b4c63a369af1","src/lib.rs":"8d45ef22ffe42258a8636ff482bb7fe1077eb7326fb4c4a6852e77e92a881742"},"package":"98b15ba84e910ea7a1973bccd3df7b31ae282bf9d8bd2897779950c9b8303d40"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/.gitignore
@@ -0,0 +1,2 @@
+Cargo.lock
+target
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/.travis.yml
@@ -0,0 +1,19 @@
+language: rust
+rust:
+  - 1.8.0
+  - 1.15.0
+  - beta
+  - nightly
+sudo: false
+script:
+  - cargo build --verbose
+  - ./ci/test_full.sh
+  - cargo doc
+after_success: |
+  [ $TRAVIS_BRANCH = master ] &&
+  [ $TRAVIS_PULL_REQUEST = false ] &&
+  [ $TRAVIS_RUST_VERSION = nightly ] &&
+  ssh-agent ./ci/deploy.sh
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/Cargo.toml
@@ -0,0 +1,69 @@
+[package]
+authors = ["The Rust Project Developers"]
+description = "A collection of numeric types and traits for Rust, including bigint,\ncomplex, rational, range iterators, generic integers, and more!\n"
+documentation = "http://rust-num.github.io/num"
+homepage = "https://github.com/rust-num/num"
+keywords = ["mathematics", "numerics"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/rust-num/num"
+name = "num"
+version = "0.1.37"
+
+[[bench]]
+name = "bigint"
+
+[[bench]]
+harness = false
+name = "shootout-pidigits"
+
+[dependencies]
+
+[dependencies.num-bigint]
+optional = true
+path = "bigint"
+version = "0.1.36"
+
+[dependencies.num-complex]
+optional = true
+path = "complex"
+version = "0.1.36"
+
+[dependencies.num-integer]
+path = "./integer"
+version = "0.1.33"
+
+[dependencies.num-iter]
+optional = false
+path = "iter"
+version = "0.1.33"
+
+[dependencies.num-rational]
+optional = true
+path = "rational"
+version = "0.1.36"
+
+[dependencies.num-traits]
+path = "./traits"
+version = "0.1.37"
+
+[dev-dependencies]
+
+[dev-dependencies.rand]
+version = "0.3.8"
+
+[features]
+bigint = ["num-bigint"]
+complex = ["num-complex"]
+rational = ["num-rational"]
+default = ["bigint", "complex", "rational", "rustc-serialize"]
+
+serde = [
+  "num-bigint/serde",
+  "num-complex/serde",
+  "num-rational/serde"
+]
+rustc-serialize = [
+  "num-bigint/rustc-serialize",
+  "num-complex/rustc-serialize",
+  "num-rational/rustc-serialize"
+]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/README.md
@@ -0,0 +1,30 @@
+# num
+
+A collection of numeric types and traits for Rust.
+
+This includes new types for big integers, rationals, and complex numbers,
+new traits for generic programming on numeric properties like `Integer,
+and generic range iterators.
+
+[Documentation](http://rust-num.github.io/num)
+
+## Usage
+
+Add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+num = "0.1"
+```
+
+and this to your crate root:
+
+```rust
+extern crate num;
+```
+
+## Compatibility
+
+Most of the `num` crates are tested for rustc 1.8 and greater.
+The exceptions are `num-derive` which requires at least rustc 1.15,
+and the deprecated `num-macros` which requires nightly rustc.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/benches/bigint.rs
@@ -0,0 +1,252 @@
+#![feature(test)]
+
+extern crate test;
+extern crate num;
+extern crate rand;
+
+use std::mem::replace;
+use test::Bencher;
+use num::{BigInt, BigUint, Zero, One, FromPrimitive};
+use num::bigint::RandBigInt;
+use rand::{SeedableRng, StdRng};
+
+fn get_rng() -> StdRng {
+    let seed: &[_] = &[1, 2, 3, 4];
+    SeedableRng::from_seed(seed)
+}
+
+fn multiply_bench(b: &mut Bencher, xbits: usize, ybits: usize) {
+    let mut rng = get_rng();
+    let x = rng.gen_bigint(xbits);
+    let y = rng.gen_bigint(ybits);
+
+    b.iter(|| &x * &y);
+}
+
+fn divide_bench(b: &mut Bencher, xbits: usize, ybits: usize) {
+    let mut rng = get_rng();
+    let x = rng.gen_bigint(xbits);
+    let y = rng.gen_bigint(ybits);
+
+    b.iter(|| &x / &y);
+}
+
+fn factorial(n: usize) -> BigUint {
+    let mut f: BigUint = One::one();
+    for i in 1..(n+1) {
+        let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
+        f = f * bu;
+    }
+    f
+}
+
+/// Compute Fibonacci numbers
+fn fib(n: usize) -> BigUint {
+    let mut f0: BigUint = Zero::zero();
+    let mut f1: BigUint = One::one();
+    for _ in 0..n {
+        let f2 = f0 + &f1;
+        f0 = replace(&mut f1, f2);
+    }
+    f0
+}
+
+/// Compute Fibonacci numbers with two ops per iteration
+/// (add and subtract, like issue #200)
+fn fib2(n: usize) -> BigUint {
+    let mut f0: BigUint = Zero::zero();
+    let mut f1: BigUint = One::one();
+    for _ in 0..n {
+        f1 = f1 + &f0;
+        f0 = &f1 - f0;
+    }
+    f0
+}
+
+#[bench]
+fn multiply_0(b: &mut Bencher) {
+    multiply_bench(b, 1 << 8, 1 << 8);
+}
+
+#[bench]
+fn multiply_1(b: &mut Bencher) {
+    multiply_bench(b, 1 << 8, 1 << 16);
+}
+
+#[bench]
+fn multiply_2(b: &mut Bencher) {
+    multiply_bench(b, 1 << 16, 1 << 16);
+}
+
+#[bench]
+fn divide_0(b: &mut Bencher) {
+    divide_bench(b, 1 << 8, 1 << 6);
+}
+
+#[bench]
+fn divide_1(b: &mut Bencher) {
+    divide_bench(b, 1 << 12, 1 << 8);
+}
+
+#[bench]
+fn divide_2(b: &mut Bencher) {
+    divide_bench(b, 1 << 16, 1 << 12);
+}
+
+#[bench]
+fn factorial_100(b: &mut Bencher) {
+    b.iter(|| factorial(100));
+}
+
+#[bench]
+fn fib_100(b: &mut Bencher) {
+    b.iter(|| fib(100));
+}
+
+#[bench]
+fn fib_1000(b: &mut Bencher) {
+    b.iter(|| fib(1000));
+}
+
+#[bench]
+fn fib_10000(b: &mut Bencher) {
+    b.iter(|| fib(10000));
+}
+
+#[bench]
+fn fib2_100(b: &mut Bencher) {
+    b.iter(|| fib2(100));
+}
+
+#[bench]
+fn fib2_1000(b: &mut Bencher) {
+    b.iter(|| fib2(1000));
+}
+
+#[bench]
+fn fib2_10000(b: &mut Bencher) {
+    b.iter(|| fib2(10000));
+}
+
+#[bench]
+fn fac_to_string(b: &mut Bencher) {
+    let fac = factorial(100);
+    b.iter(|| fac.to_string());
+}
+
+#[bench]
+fn fib_to_string(b: &mut Bencher) {
+    let fib = fib(100);
+    b.iter(|| fib.to_string());
+}
+
+fn to_str_radix_bench(b: &mut Bencher, radix: u32) {
+    let mut rng = get_rng();
+    let x = rng.gen_bigint(1009);
+    b.iter(|| x.to_str_radix(radix));
+}
+
+#[bench]
+fn to_str_radix_02(b: &mut Bencher) {
+    to_str_radix_bench(b, 2);
+}
+
+#[bench]
+fn to_str_radix_08(b: &mut Bencher) {
+    to_str_radix_bench(b, 8);
+}
+
+#[bench]
+fn to_str_radix_10(b: &mut Bencher) {
+    to_str_radix_bench(b, 10);
+}
+
+#[bench]
+fn to_str_radix_16(b: &mut Bencher) {
+    to_str_radix_bench(b, 16);
+}
+
+#[bench]
+fn to_str_radix_36(b: &mut Bencher) {
+    to_str_radix_bench(b, 36);
+}
+
+fn from_str_radix_bench(b: &mut Bencher, radix: u32) {
+    use num::Num;
+    let mut rng = get_rng();
+    let x = rng.gen_bigint(1009);
+    let s = x.to_str_radix(radix);
+    assert_eq!(x, BigInt::from_str_radix(&s, radix).unwrap());
+    b.iter(|| BigInt::from_str_radix(&s, radix));
+}
+
+#[bench]
+fn from_str_radix_02(b: &mut Bencher) {
+    from_str_radix_bench(b, 2);
+}
+
+#[bench]
+fn from_str_radix_08(b: &mut Bencher) {
+    from_str_radix_bench(b, 8);
+}
+
+#[bench]
+fn from_str_radix_10(b: &mut Bencher) {
+    from_str_radix_bench(b, 10);
+}
+
+#[bench]
+fn from_str_radix_16(b: &mut Bencher) {
+    from_str_radix_bench(b, 16);
+}
+
+#[bench]
+fn from_str_radix_36(b: &mut Bencher) {
+    from_str_radix_bench(b, 36);
+}
+
+#[bench]
+fn shl(b: &mut Bencher) {
+    let n = BigUint::one() << 1000;
+    b.iter(|| {
+        let mut m = n.clone();
+        for i in 0..50 {
+            m = m << i;
+        }
+    })
+}
+
+#[bench]
+fn shr(b: &mut Bencher) {
+    let n = BigUint::one() << 2000;
+    b.iter(|| {
+        let mut m = n.clone();
+        for i in 0..50 {
+            m = m >> i;
+        }
+    })
+}
+
+#[bench]
+fn hash(b: &mut Bencher) {
+    use std::collections::HashSet;
+    let mut rng = get_rng();
+    let v: Vec<BigInt> = (1000..2000).map(|bits| rng.gen_bigint(bits)).collect();
+    b.iter(|| {
+        let h: HashSet<&BigInt> = v.iter().collect();
+        assert_eq!(h.len(), v.len());
+    });
+}
+
+#[bench]
+fn pow_bench(b: &mut Bencher) {
+    b.iter(|| {
+        let upper = 100_usize;
+        for i in 2..upper + 1 {
+            for j in 2..upper + 1 {
+                let i_big = BigUint::from_usize(i).unwrap();
+                num::pow(i_big, j);
+            }
+        }
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/benches/shootout-pidigits.rs
@@ -0,0 +1,131 @@
+// The Computer Language Benchmarks Game
+// http://benchmarksgame.alioth.debian.org/
+//
+// contributed by the Rust Project Developers
+
+// Copyright (c) 2013-2014 The Rust Project Developers
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// - Redistributions of source code must retain the above copyright
+//   notice, this list of conditions and the following disclaimer.
+//
+// - 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.
+//
+// - Neither the name of "The Computer Language Benchmarks Game" nor
+//   the name of "The Computer Language Shootout Benchmarks" nor the
+//   names of its contributors may be used to endorse or promote
+//   products derived from this software without specific prior
+//   written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+// COPYRIGHT OWNER 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.
+
+extern crate num;
+
+use std::str::FromStr;
+use std::io;
+
+use num::traits::{FromPrimitive, ToPrimitive};
+use num::{BigInt, Integer, One, Zero};
+
+struct Context {
+    numer: BigInt,
+    accum: BigInt,
+    denom: BigInt,
+}
+
+impl Context {
+    fn new() -> Context {
+        Context {
+            numer: One::one(),
+            accum: Zero::zero(),
+            denom: One::one(),
+        }
+    }
+
+    fn from_i32(i: i32) -> BigInt {
+        FromPrimitive::from_i32(i).unwrap()
+    }
+
+    fn extract_digit(&self) -> i32 {
+        if self.numer > self.accum {return -1;}
+        let (q, r) =
+            (&self.numer * Context::from_i32(3) + &self.accum)
+            .div_rem(&self.denom);
+        if r + &self.numer >= self.denom {return -1;}
+        q.to_i32().unwrap()
+    }
+
+    fn next_term(&mut self, k: i32) {
+        let y2 = Context::from_i32(k * 2 + 1);
+        self.accum = (&self.accum + (&self.numer << 1)) * &y2;
+        self.numer = &self.numer * Context::from_i32(k);
+        self.denom = &self.denom * y2;
+    }
+
+    fn eliminate_digit(&mut self, d: i32) {
+        let d = Context::from_i32(d);
+        let ten = Context::from_i32(10);
+        self.accum = (&self.accum - &self.denom * d) * &ten;
+        self.numer = &self.numer * ten;
+    }
+}
+
+fn pidigits(n: isize, out: &mut io::Write) -> io::Result<()> {
+    let mut k = 0;
+    let mut context = Context::new();
+
+    for i in 1..(n+1) {
+        let mut d;
+        loop {
+            k += 1;
+            context.next_term(k);
+            d = context.extract_digit();
+            if d != -1 {break;}
+        }
+
+        try!(write!(out, "{}", d));
+        if i % 10 == 0 { try!(write!(out, "\t:{}\n", i)); }
+
+        context.eliminate_digit(d);
+    }
+
+    let m = n % 10;
+    if m != 0 {
+        for _ in m..10 { try!(write!(out, " ")); }
+        try!(write!(out, "\t:{}\n", n));
+    }
+    Ok(())
+}
+
+const DEFAULT_DIGITS: isize = 512;
+
+fn main() {
+    let args = std::env::args().collect::<Vec<_>>();
+    let n = if args.len() < 2 {
+        DEFAULT_DIGITS
+    } else if args[1] == "--bench" {
+        return pidigits(DEFAULT_DIGITS, &mut std::io::sink()).unwrap()
+    } else {
+        FromStr::from_str(&args[1]).unwrap()
+    };
+    pidigits(n, &mut std::io::stdout()).unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/ci/.gitignore
@@ -0,0 +1,1 @@
+/deploy
new file mode 100644
index 0000000000000000000000000000000000000000..720d001bc2fbc4dffbd4bcee2bf23e3a3b40bf34
GIT binary patch
literal 1680
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
aO!aa?JUp!KG!o3>a{GU7!Am~;hs|r;&_KEX
new file mode 100755
--- /dev/null
+++ b/third_party/rust/num/ci/deploy.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -ex
+
+cp doc/* target/doc/
+pip install ghp-import --user
+$HOME/.local/bin/ghp-import -n target/doc
+
+openssl aes-256-cbc -K $encrypted_9e86330b283d_key -iv $encrypted_9e86330b283d_iv -in ./ci/deploy.enc -out ./ci/deploy -d
+chmod 600 ./ci/deploy
+ssh-add ./ci/deploy
+git push -qf ssh://git@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
new file mode 100755
--- /dev/null
+++ b/third_party/rust/num/ci/rustup.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Use rustup to locally run the same suite of tests as .travis.yml.
+# (You should first install/update 1.8.0, 1.15.0, beta, and nightly.)
+
+set -ex
+
+for toolchain in 1.8.0 1.15.0 beta nightly; do
+    run="rustup run $toolchain"
+    $run cargo build --verbose
+    $run $PWD/ci/test_full.sh $toolchain
+    $run cargo doc
+done
new file mode 100755
--- /dev/null
+++ b/third_party/rust/num/ci/test_full.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+set -ex
+
+echo Testing num on rustc ${TRAVIS_RUST_VERSION:=$1}
+
+# All of these packages should build and test everywhere.
+for package in bigint complex integer iter rational traits; do
+  cargo build --manifest-path $package/Cargo.toml
+  cargo test --manifest-path $package/Cargo.toml
+done
+
+# Each isolated feature should also work everywhere.
+for feature in '' bigint rational complex; do
+  cargo build --verbose --no-default-features --features="$feature"
+  cargo test --verbose --no-default-features --features="$feature"
+done
+
+# Build test for the serde feature
+cargo build --verbose --features "serde"
+
+# Downgrade serde and build test the 0.7.0 channel as well
+cargo update -p serde --precise 0.7.0
+cargo build --verbose --features "serde"
+
+
+if [ "$TRAVIS_RUST_VERSION" = 1.8.0 ]; then exit; fi
+
+# num-derive should build on 1.15.0+
+cargo build --verbose --manifest-path=derive/Cargo.toml
+
+
+if [ "$TRAVIS_RUST_VERSION" != nightly ]; then exit; fi
+
+# num-derive testing requires compiletest_rs, which requires nightly
+cargo test --verbose --manifest-path=derive/Cargo.toml
+
+# num-macros only works on nightly, soon to be deprecated
+cargo build --verbose --manifest-path=macros/Cargo.toml
+cargo test --verbose --manifest-path=macros/Cargo.toml
+
+# benchmarks only work on nightly
+cargo bench --verbose
new file mode 100644
index 0000000000000000000000000000000000000000..b8ad23769ac8d06eb5973bfb3d2acbf385240f98
GIT binary patch
literal 23229
zc%1EfcRZEv|Nj~GUJa|0omEygm61e;%8X9OO2aNY8O3oZQW+T)385S+vQJh@L?t8~
zvNA&1l;3^l^!=Q-@1gnme7=AD&ZB47eP8!$Jg@71UHb-sKp_;6swxPOZibX2AduY<
z2t-P1`94Dk0-@Xtfo$GPyk~(x?rK9IEG*0S$0#5WV-pAjYlzfgq~oFkR2g;mXdM93
zDiAbO!2kHPh?5WqB1BhfmyuWEXp;AX!`jhHJNT?NtrH5spEcYS7;t{qPKGNowJb)L
zbdOgz2l3aoZsC8sh<g}i60+GtcFRkc<dwU%EV}}w9&Bb543whL&a*Q*mUf<kZPVPB
z+~LQ4eb;^aPkr>8IrGLxTzn=m^X*v2+kw}(;bI-hLk~hjLa1!8MU2Oe4GME%jvYIe
z><VP9Cx2N})gg7_b%xl;pk89_7QzC4fA_5$u&&9>`hG**s?p+VWi3rPq%9|!njlG7
zpEG~-nOGUsnXJAg5r_fw%E7nNRIRkW?+vChbJ8E&;*%0<u!&dD@=dHYLyL_kk2m?@
zMM{T0)7IrcRbkn3BQJT-nmO~QD|}2Soham)5o$~h1I9P>4wQ9;4v*FI@T-VSM92oX
z*PcwO9cS89Z7%VV0U{2w7rBGSW<xArs5C&Nwzj^x6xh!g1r^ET7-ztpNT@4-_@3s<
zSB&Zi5S6YU`CyzAnQKKSZ^YFQj*mx8U5t~TkLYLI&*a<G$%$7UT!*whT^x?IHFx;L
z^P~`ITNtXm8y@?rlM~WOufMl(ccs+)TfW5Fd1Nmlu~t|#d=uL#KQ@>BX4+g01%Xp+
z52PVy>}N5_4L6`SB1HZ71j!#7?oeEmd}DCXDYdCUQ&{Aa5CMiB)IAGz$u{+qOnYbM
zAhhKvU566N{h01Lkvu*rUNf2GYtAtClA-4@$_=mxq@f3knYfc1Z>NSm6cZBJ31gbd
z++lFc#(=fGYoUp+LZ+_^m#i%w38VIIUQoHJ#x(01)?Y@QNT1D=2zQ8WIP{Ssg5o-5
z8C~M#lo49gl+OMQNwpM&@&Lw=!#<o|{vmd~_tITM<rSkC126(xx8Y5WHykV2)vuKX
zO^7*$ih4eo$<4eZ#ZVjpMZ#mkwy1PwsT-xax;N@)w%@nHoYaHvfTbx$HCt>uFLEMB
z5svo~$<rRDwyO1nyHGVXK*Gzn&j+1#5536t?!LHGC3b|?**P`IEYrAe{32QfY3oUV
zq6;Yc*8AR{gn!{GimKv+bVfSn*E87pxGp~0f%Bi`tx4a~66+jV!*@9<O~76JxIgBB
z|1H*CFAOr1YTvddqT@}!_y#S+Li%BKF^(3IpQ&&qro0!5o3Pnb`jAc2nFcXV=1jXM
zQ{Q5Fn4ZJVGOPA!o&BJt&U4Tq;Nz(fC(BMtt_2J29xZuS{_?76yR*#C-S~A(&=$uh
zvo+6eF1qh!Z{w&-K%<M;3!AVbJo_J5gzU(%t}BM4+;!33Xaj=5!$VU}Z@=D6tZhKr
z(n-M=5||z3BB&Z%_{B|ak91FtTzZOipwka8bmYoE?^9^%CreS41m`iy_mftIj|>_k
zxX<!ci2^yOLgVmLd@kor53|V2&OB*w&<_<YxMq5B!RdrmmD6*jC|A5SuUL>spkD4a
zIbELpZTgd$p1Th-AYHj}j_$(RGW7I<i##}Fg$%b(v(7VFQ5AtUJ}TU{td>XBS!Y#0
z3X90lK1zf6K0_bQQ7(28cq@Hbq&erc<IdeqqO)aAwoV;Xwzp$>`8||ydb)4T`=d{2
z7oL8fY0mHShOcBO%f0<llq>Dna7ZE2#Aj->qnL@+%&Y*)*{YBjAO8OHZHog;&Qp08
zkU1(^3QXebq5h*Tei9zL`7gU%8oXisc0zPCGfc^y`x53J*3OMz4^|A%vRa^i#l~ZJ
zjrnyc?Ie}U1{ZM`YL`e;ziMn^#ND=n_g*5fao!x|@~I&9HmJ&j`x;tp1p$?%LvzSp
zHM|L4ComG@Kl~NBp{j!=CRzlN0DS>(@om26)$UoHchV&!L8>W-4^`>m==?<a?O~KV
zO79xh?9tBlbF)I9RmUv|hX`pV#UV5pm$P9>Zs9%Vgcdw|9Q+KdwXE`sGxW%KW^8`(
zpq5G1dFp8j^>f<8CiSZNH-@Iy7stT!p~4|I9CMTA_?+M#_bNnvtPvI1GhDM{aqU!r
zzS09;oGJk~CLP>ZpF{6e$j>_M+c+stH!D>AoO(TM!MnLjxKK$ocn6e+W<+O_JDp*@
zb!COI6m@Hmr-nny>;=;=``SXL!ZdlP5>0(H+a6KhA2oG_QH;{?ex^g;;E{h$Jw27F
zU@OYg$wLi2LZyDWGD2o9%v7y>WVcT>pE_)@a5CibeVRvHidhFkwGU`8H0R_d>mTZe
z-T0KLFz`^IHBWM!5$#+wjDPh8^>9+XQJhJdiknIj;pzO80agw>Yd8sAkcudaIp&({
zQ9?H|WIVR@Weoa7NL=Hm$FIjWeh!GvGMpQv#Xwy6{qZ#=?h`76Dw$~Ep!LIu+~{OQ
z6ka&~Rb8G)>jPThr$^FXcGaUEULGrpwZ8T-<4y-Bo(bhXmS<;LGGwV=viaVX9gHJJ
z`LYxVo5nMJ;VLj$8>emI?eCrMgq-yVEsT?IT92B_&*TCI5=b%n)7+>RkBayN+E^ay
z)qJP56F*^8UTD%%=^|Zpy!HW1J~Gtex_A(`bYTrr<=Jhv%XfKbc_7)?QO8BDgxVIa
z^ggXOkC~`P59~U14lmX{YObs%3l?JrViD6?b%vmrGmj9;m*%JO-GYIqAN*+jWXY%b
zSxk`caVBVAnX)}vhnw4ePk`y+USt0-wVTg)%G~Q+Xp3I(p~UWV9)YxbHS6eQ`d6_<
z1UWHUS{`7x^BcIf#jlpbL${^c`U+L9cg0Q9B-xQNEWVzDJ3^X<XWjMFj7qe5J9Z?u
zQh(4Ou;0x!NWQx+cdl2gyQ?p-&3nM~VFO<UVq9PUeL63F?!IetW@Qig;Zvx`*8Wan
zxP~&3RCsaF^xQ<A40HQ=%k{(X{mj*rcxlvB*L``T1WgL<QgfsGC*%^-13OBG;M*Ul
z^|<nLTZy|PGLq+Zp-Z#H&$}Zt6;e0ZkH<aNd(R-mDlb)#eqD3#Ez$j+`TCeR<P@e}
zE&tB;;vSC$rkr_-{NlqOsQBNc^UJFC-Il|QXZlxC+{^6QkG9B}Hwt!~-rnt8D%)Hp
zx|P{4i{lx}<4eKiVMLFv1j|;FFU84b8UycG7nm|{zE(G`&KtgXl?OIHJJRNk*)~IA
zx0{#Zc+(E(nD|}R*>k4#&9Nt#J6!mS(c)~3Q=g@TLtJ>*yQ!6b9{u3LkEpC@zZKK=
zIWOUxoF@%LM20uCuD#Jv@)YjN`5V5?OQM+vL_R5vyz_2)KAu^~j`GlxIB0wd8`7Ii
zvnb$_&R*DoJ(Cx@w{*zPtf(vHPAao;A4}}Pj?^qZHTFPmjg)Ih(eNv7GExr%d_ug!
z!b~K@T|;jc9IQF{Alc00@d4HwJg+rmSOtBUD6Wgw-mA-GlgT>4l*=KXJZuN;I%^{~
zZk{u*@rF(VH8M<(>!X#R)yoz`^SIZ@NJ44y>(yyz_ojt$4cW@$?62SNNA{|Q=~{WH
z$L#Fq+gUnfVJ;@x!54J?xuQhVjF&{n@mu3dPIc35m#%LJh_t`RNUw7av03=m@xA@<
zNOZ%5OI>;76Wz9}LoCQ%J$z)~%<1gZ<Q8ve>(-N<k8nZJy6#d!+n`T;o5NF_w$$@g
zH1rC*W^a0HsAd4M@M+c;d6!rljkgcqen;|L>zP}Q8VxcteCm7OGkmG?=~db7!$X_;
zi5@MNCU+gH%G4C?9m>7e?lSwFMonH8L~q@3eQKE-!B0n6tS-A-z4^qbR`<awB{9Z^
zz93a?L%%N94Nseo8wuN#hK~(O)>y+%VqN*Otgu~m{oBlLJlEffp_yZ2N{!F8(wuQI
zGIKI`*0N<A%p;T%A8798_29C~>B_85=ESQ7*F&ybGolLw6{wyz<V2rjf`|l{#f7I>
zUu(Fj^tsXbjB>Z%jr2uJPX%i~DTQD~ty;ZBZGBup@{Yl)JZxST2>F&cbzp!vA|a;W
zk({fKv^9{>Lmv3bthY;r@l-=3`btibEbVqdn`&fc2Q5;sq0&uL6?0s5A4QDr@k$hG
zswh>#bkn;5txZ+d@jZ`ViW0qg$0V1|N*I-lwzZ`Wq(5O~;P_OvN7LNC7`QA6;~o4U
zFF%zjo3d3oiaQ|VoQ^#_-K#m);-f$Fc#a@5MbZaj1>^|{qcheG*z8?0tan85yDF2Q
z_$>8EA&SK=4@$s_rNW8VTa>@Nu6`647^v8ux9HUzjl+%%;3lhcMFYiqO80LFDmrpi
z_Dp5grdLA@5Y&`V&b+b2ZD+O`jJoN@V5Rfy*8)B~s+p?Q#<!>hkNGsWU^{EufWY69
z5M3H>>erC<HP*C)+6+;LHC0G@;1wA$ySRy<BRzFp<I|o{*`(Tj+Odm5v6_lexyW8c
z5gGWwgDRVM<t~&Ay?0gcZdSqFI#+qeI^|8XSF<_aHp>owjQ6PeY5p;IiiT=KWC8?(
zv9qljl462<bmy1VIKq>Fv$Qy%a-QA%8Fu8o*1gBdBawmo4j4&`SC`%wP+v-6H{Y(U
zCcu{CBTp%*aJ08A^hNpJ$zH|diTius2?p)MmCasdFBG0^dYyX^%UglX{-`Ake}UGm
z7l9u45XXe_c&0t_G!Ih>-p-~N9V+7fv?MV2e0g{ytxB+m;KfS~@glYiZxnK<uDkMI
zNva*vr5AAv#kG5hkGpRkyW-t`i9z6AJu^CeEM@i#Qe`)Vl~qpzSA3ax4`B&qR&tQT
zLL_^~DH>1uENefH6N8nxf_|DK5RUCphp80#9{Vln577E_?aNj%d=fI~ETA5#x7T0m
zonZ}@Lk%{&`3=TKcZlU0(`ipaJ5uly?U+^s71PB#0;Vi2G&UV!?G_Nr^{$dm(M`~S
zki#R@+u|4N=kSNx>g$j%mGF{gDHAC%1u>AVuKd360V{E%Te%lvb=XVKc08-6Y<u}i
zF=~QCwq#FbHLu`@v3-VL>+o-py$LAy`9=)VmR>*EIUVNU(5J3{N<OAarP+#l?oiJW
ztTB$IRavaawJAmW;fN7@*yLJvHMV4fubJ_k1Qq7lo2Gus6=}C|_osEc4jEWy8J|4R
zVA1`;%<IW#Ljux0!)3z=ea4l-)~%k$&24=GH^V%(HHYuH!PdtB*`@EWL;sEd?MWNv
zHkrik_2^hW`#l<&exaAx+?j{kg#0MmyDhu2P=_@a9`<O}C`Qp*eLl{W7OG&F%c*b$
z-32sxdWW!jO4PRY44SjlBT@1fozn<qQWJ$VvlzLHcDCzX)(f|9;xupDdss6~hP~hd
z_eQTPKE}xF6#1Vr?@S)5G+b~Y(4Zg6Fr2Iu!t?F2nLd2=PMsWGxY?r50r7)wBGYp7
z`wq2La1F2sM4JXidN)6(U7u9@vbD1*cV{L|^VLNPMKLkeR65bRgMnkGOGK5<;iK`K
zsHyAO(Q-`tx8%TzeVU8IGbB{^c-EYbr+cc~R54RB<f+nO7_50gsC;Bj98Zb2&52iu
z)OybnJRyhkHCHOv44uuzKTh4T@pVM=dzq^yuABIsRp%e#522>c^Cu=JOKqxo$rIbd
zfTkss4khE2&1^M}e)zKU<9$}|%5nvm@W2BrpO;VFH0>7Y5_T><467*_`iz<~BD_m9
zPGX<8J({PL#Z(=ic%fR*?&4malm~+E81GzTP9zwA_IRG%>!+ztk){-du=<RBZEkWu
z5i=_|zB#S>Y76J)B}8)a#*b9;IZd1pl*G*lp+IM-Y-PWl*vmwWStZso@WbMUYg}24
zmQNY4d9f=ho&1V{iGH$tQiPvE_R@*u9et^h%hav4TPaE)KqpsnF6DTN$*?_xR5jK}
zXb(?y-9$m^(H#U<5jR_-^N!-Woh(aXjviNq&K=P8cp7518*Z-{MW48bRkPd4TARR=
zz0Fe)tC@Ph$7#^JjKMOgPt}c?r9C!l@4L=M3w_u<u4H6Wlpxdo>CDP!LM>gFF6x>+
zI1!zF!0k(}pAuFxF*M0K;Yxerw4C=)QS3J5C`~bkob19no^0kD8$E5ZHNBd(QSLG^
zp7WWD`I0qzg<iKA^4N#4d=%TF**h<WhUX|NVKuyZl1}8zGvIEpx4|vk#fH$nvbIA`
zCXZ9tQc^|P-)qG{zQPYaKBi;+C6(eiEMhXVC0+FDR6wI!342kL=;E#5SEWM=r`}9#
zjX%~>;mymEGe4smO>y_G$EQ^7Pr|}R<J(Z~xfjbGeZ781788PW<BvtN=S14w5y5#x
z<aN||^e$ECSPg_LJkcumXgFyEm4Gh_(7u_l+2ZT}9w|{>p=mC@rAM`jLVvfgc!5u|
zhMmst%R?dTZID@YoI%voQG!)Yy!hqUScXf;b_L0V>f60{dsMZq5*!blU`-ubS284k
zazCQ~XtbVdUt1&gLRRh<!QRnuVBG9vxH2r%+%aNbG8By8wLL*v)P62cA?TF7O1%S`
zW?qGR&?{tnGGigC`b&^$DV<{JZuSG1gUq)Y9d<a*-eXr%(PcTpagB$+ws8@rD0Z^4
zGUJd#R_xqX!>79W@(#Q)$orQCXV9n!*jd*3V<%*U^dCQ%xg}F&%eSv0x~wLvEO1}m
zFj^>OhUN13L<$48o8FeeP`{4_X-g?#)sy~Go}+R-WsAbgLXInw+2>N{cssTC+&4a5
z{-G)zC%Z{JRrG3q)w|5NAh)Jx&mrw{?8CiY%`G_UgS;d0x$kB~cb^buRDt^IUpXsz
zoGMw`4E8baYI$s$kM0a=AT9o_n$)OypG!~PJ&t1*P=ye69=(?eRY;ClZvHS{y?g$t
z69e&Y55s1Y*p;fWrx|Ka@ec!$o7-BT+?IG=AR#rG+n7gC*$e1U(~TM%_H^%(sL6;(
z?mwn)HnLH~ZMzHicr5zGP^-+m2yT+r8|e1=_al%TMXWV5ubviENcD(nd{NnIl(tU9
zO$6uIDZda<4oLvUZ2DIojCb}KRB$A|N`2$Fr}q7Q`^dc?SnT)jG@GXB*LKkUNUbUJ
zRr@H5PeazG;M?kNnIAD79CpfxEb3?Nc)t0K!VLV)WTwvTr^lnj-)=A2&Qv3>5nul>
z(bh{dJCc!_ivT6;2-H(n+WEn478vU51D#<DB4UlWjhsBz9Kw`uUud?92OxZ!7cRfE
zyrvoO^f2s&;MT_RtuK`+0@w=!d)Ol<*-rX2S6Ou#Ct|!3(5=t;haE!u?iDd+L|r?c
z$VVHjtkwEBn?EJDo0m@4z4_LK7b)W%*a{y0)Hg+sGUmD1K8tKNKJbjSraF0SodzEh
ztFY$=xbcS>If{}Y@yQw7hc9slIWDsmW++ri<DDp*n=f7OYH{3IKN2$a_+76DjYuA+
z%OPmKob7;uJ9i^x;`({(t)GMsTQWUj7*vTKbgIZ|z{_FhuiXx)>*05KU%L>ZNdM}L
zW5$gu!}2%jTOo?F29(}L3i6L11aTEXa(u*H>^eM7Lop#`*RZP2p|ncR<gZpn$sLd2
z)9HHtp2f3CtJq`Rt_!n}A>-Msgk5eDn)V(vIrAGmkogy$M=^3vWF8FE9DGq<6f2$k
z{z;yR;rZ5yjc7l#ri6pdx$!Yf#(<a2i_1cfw$X{WL4<`B*vikf<jOV42I^FlGsA(=
zD8l*4-dl$)Xz85cai>PK{W9s*G^3cH1TA^0vtdssXOsuvE!Ii?`KI-gRN3`>hiK_e
zL>d~tN#<|Z>M5?Rto6>*LY^{BFfRCZ^`T1zDF@inQmeDJy6~H#sYBglozR3`=;6(+
z%`Cg38lppRN+!J%Z^Xl0LIjO2rz<~~RX0UPzYnAjqZ>T2C1O0ua%XPXM{1#UTy=WJ
z*mmZdv#-sm_cwB<CmSMDXI0mqwDHS0of)tB&OnLVJ3Ihhaw3!WkVqbr6jL1YyD{S<
z+aBkaRboe|EhGA#ipPIIZTCcE`W+b6@_2mOs;-9-ZJ*<#qqQJzHGkd0>RGb|{4Vw0
ze(R?c26aVlO+fRCmae}G4|ETR4OqZ=<2&#jt_QXvZB_K0JwCAQ>uApEfB9gP3iF8d
zik!q1Q|ZwLPJE47dKVqLVdo`VgKYYe6J3&wnA8zZmYip^ra`CBDvxKpo9B`vBm)w1
z7g_Dxu9((msx!SF0hUgcaTG__J+JQ9s_V<J@y+q^-8DT)f$ZH&xX&5JWZgBYhA+b}
zggwZDCxp1n=o@7gHHEP6y;mN+u6BR{opRDo^Ah7*1)GVcxXfwOj0Vn|z3RsCKznM=
zIA(Wq=O@9NW7_$*5@}to@vzLBh+drwX}$1Cwq-+o2-3E?=wimDJT}7Br<cvT#DZmb
zd-#e3R2PLDqKAEU+I&0=Yt1_yUW5@ePw0ddiSnaa=zGP3U-DFBsbg>N8GX>FPE!)Z
zd*YfYj`kETpduILu8>odZpw>yOPyotlMz}svc00gIX&BO>71_Z)?s5)JX<o)x#LgQ
z*Q;hTmuL)N24RGaIfo7%>Jf`MY+4gE-)~jk$U~^VDe~H<YZ{N(ax`u`B5tEl0QY5}
z-3Dhc4=A9fWGP!4n<;|BwgeJB2MCl5StrRlocPMx-YO9k+^YW4vGT1sXZS-4R(2LM
zrnv1TU8%RH{X*pwqsCxMIRTkvea0$#-z!E%S{pp>Rvk8Ok-&%CtHGXGH#;LA`>`4(
zB5>n1(iYaQuYEe=V95#AE^q!Jl*hh0G0NA{p=#aAJ;qB~3u>3QC)OUKY;79VVq`QJ
z?gdsr?p!ffQ)$9x8|ZJf^H^I$-Br7dkL>jt`@(u-Ml+1C1+%9}TIu0tm2VO!dHAau
zH$=@Bgm&H85G%mW-cy`1`QUOy(*TEU!%?JdaL~}ReJzR<(?**P?^GLBj!NZp&kvnF
zlbR#vs69Em<9J$I3dPXwSK7|KPHv$os3biI=1B*K$-@+iyZNX2wH56PUVdQQ$X(W>
z6(el1c#z|;tOFO82|7NC3ws@doATd}`BZ1M|Gq#p(iwkCWAcOuk}}NFYmf^w7-rXk
z)18#Lq?h5b@pJAgivjOu1q~HFh%fAlwDu*WDn%mWqT80|g)Of9b=ErGFK(X7m=4E3
zMoopt_mxxg9KjvWfo4_d)^hAJ7y)8XGFPfcCNBK0aA_c8)XSp@-mJ5nE>WhElD0SX
z6Kkmhw_$F~q;BzHcA+2l4}hyPUR`Ha5N#@%#ayy4N3qIEuvKLc_VIC5`Pbq>TYqi#
zkl+O?r7B;m<`Hq!)M6g@2RhDpibb`@YUf%%4)U7eJ3TYh<EI6>2Skv)P7?c{PT|j?
z9->$U@z@L0!cbouaRv8ak8KoRDcescgi5AAkvt&y0e<_Hq;sfHu43A#h5A`Wl}s;{
zehSZrLsG%AB?oK$w`9<u@bZ~y*3MBM>|Ur;c%2=5G!lVlGV(PP3G>E_SQu;yQA=}_
z8i=DgbJg?32ItD2YwKeiEe#m15ggN7*|~3ZM&7YHooK5RWuLp{xswgct4)3oFNW}Y
zQ}|Q(u9BfFT`^kjV>Y>6P0(ShUG9jQX=st_@mcSjx31S&*Y6ibJ4ckmTa3FI8a0`s
zC`CTW;M_VqY|(tvCgv<>Lo~W#tBu5CDy~nLdf@2@>vG;2Pw3vAe8$5s-XUfAtl~1B
z%bj~ao0?w_E<wIOuQA-9F$!rgbLaYY^$R)NMJysOA8Mv4`n=&AY@oF}*L1&Y-!>Jk
zZOF8R;Oj{`lX;q{<}6-pvwY)Py7?Duk3!R}{3}zh-WfY2Ryx9>3xlTHbUz>VZf2KG
zYI#`+-_5e4QfB51eLGxfV_eM5cX_uD8S|?ZGqVaezpyzuU0FywTi~&`32DpbvhQjC
zMGo~o;|&WIN>NGDx=%eSD(M57KV{ln)y}~(2nvr(Z>m&LR;LftlahXi%=;jlg>ybX
zjxJ^{9YT~0IpNb<yUrYo^=45lvq<8jRa*$z2&~I5-gYk9A-FZN*q>HHu*Ckz@VW^q
z+?hlebqTL|G3U6;HGXStsT56xyaU#|Z$)YGarzcrWL2?!_Eb}J><0Gs*pTu1sIwWZ
zv6^)?e9E6yaTwE%jb`k1H{P7Igr3>F$W(k~@!jKFeb-)>$}zFlj|J`vX;_EhIk`ik
zIn!;nyYYj1jxwdnZWW<jh5775QOI&-t@Qg%^f=AQV&CTShp6$)85?^ZpJ3_`dUZ@N
zMlIm|VD|IQD+5nHzszBpP!!%Im8cWwSTe-P8*%<Cznw+8HT4;JfkJ&-anF#vEO>gV
zgs&@D0sJ{W!X9rwM#&eHT;O#WQki#)rp05=&^`+Agf(r2L^!IYaqV}K80UDZp(E_u
ze9PjQ)A`X!VMYso_BeuZ*L8w&lx*&oSVgM9his{@4l^mzD?YgW&I&a(K<hXn8gJLa
zq!{JeI@fs|wSB^{7HfHqw|}h4ABJJ@2Uh%JHcH7?Tn^DB9FyEZH>>2bN55^jWC%su
z{ut|Up%nY^Q>MW5XrrPQtzwj4K$gn8PZsE|(DMRy*6eSltmCgSUYN-Yw=<!WNieli
z*4;lcV4M?n{MOj9X})LOhxALbcncs4I-}!M+am<n9=K|$*weT(SaYJBBepE?j~7!o
z$}!w>4Q23Zro`WN-1>#HRmF15=q#O!9me9`bY_bP&T6c&-(@TB<uQjnI`3K9=AdJp
zB}L5bRS5~W#ij=@a-~Ep!-XUuBN4YBbM-W#Ei|d(m9&@=Yh~hgwr+Mgc_<ep;zluk
z#R`EKH5N(Fw%5nmFi16Lm0eFev!h8rvp5cCJqafaci%b{$X>i_{i)Q;?R;EZ^Vp+I
zO^uBj?^zfbCFNGXtXQJ1K3SS9bXcbp0{nEfky`gO&_P?kBYyyB$nvrNYQLqWrT>rr
z1Na+11VX?GfI7)N4nQu+y*eoKH+=mK{s0#>0Q|&j4gd=PrU57cFb1$hgb6Wknkci5
zsKW=^_%HJB1MnHZ5dhvKe5Z+6?cRr|1M2qur}zWD1OONUpa8&3!sk!HLbM6m7Wg;v
zKTq`61t8-u^3NdJ1h3Ek8~F$PMb4`s;BWE=?D-Sx=Olo;YxrFRPyyg9F%BdFAcz33
z4FLE7cubUC%}x%{7wFUfFYqT9CrJQM0Q!mdkpMRSOuZ3paso&s>NWt_10b7RT>S<9
zC&}2QAwCQJ-u`};JBi(GMBSsrdoeP8PW}#m#Bx7#o*3^rWbA^^b^v$>p!HX|6Met|
zOcCo}ca_-8A#woy{i9#{0e{0^Xm3fs!=LD<WQDDTHT)R<0)MbC?jmEOkN9rn|I+ve
zj=yI>eIVrpu!-nnrC*Q>#V_z@Cf9EN#@y;><jJ*TkkgO&BbMhg<jVisAX7I-{=go{
zO>GVS;QRdi@8S>Kv;CocP?vA5`1!;7`4NA!KeTt`2l2BGu{<~Yckz$?Lwg{%b>#RX
zme(HS`mdg!Y-9h!ca3-Z{6}Ra+WxYJ9LUj$3?Fc9G)+d{er3P+BmOJjF_Am#D)sXn
z{v_qxy@njfQGJ#8Q6f_YncwBVqTh-BL2O8@kRMuwyV4r*Z$gIu|C-zUYWx8CH9z3q
z1pvB&fBP!@O;(BjTr%=s$kpXq{C^V%$-cDZa?FyE&n3ejM@DYu-^?Fu4@b!PAmLB0
zP2yIGA7e7|bpPi1j|V`z3U_WY@ncLbeu(nQWcZIDmglb<e}?}r&TGD-3;;C=Zy5lo
z0OrZ?S0=|FLB9W-08mN1o&&JwXZWwQPvo>7z`ZrfaE>VFM!cUQ#`Mbh2HE}-L4N#F
zCfW=m-uwM5|KDggV~FK7O%m}QP4vBT&OvtkBFch$Xr%j48pQl7h~+VH^Uv@H<yL^7
znBTbue-PmOPKkK!MfB}L@*L#Gv0D5S<&Tia&j4upfzQ7MFkUE$9G(*MR+jfi^EZAn
z@%Ep>4U#%ET}1}u#=i#tzrKF?NxTQJfrP*DDspSCUr6-Ht{?wRcme=H;v1a953Z2;
zsr4g?4GIML_4}Ir`|pCpFBM{We{Q8;kjt;E-`Cnd0rzRBAiwZi%hw9-d29InmHiWN
zkK`O;dGCnazETkY)?X>ZT0g{czgbMi&pjdskjqc+U#+lBZvPNO4*;z-^e6$G0$}z7
z?m7SntN3tOP45@@|EL{<W4!DN9dI1IO(GLS#;y#4{G9h6?e;J5_ecEP{`oTio&dH3
zNFe5Alf*?h07atAi#6>0)&27oW%-r!iwcr=(ftd00YAg#H~F7O{Hs6vQCxvz64;ju
zA(rO`YsLxUKXZQctLJy%Im_3dko%9E-;pWL@1CFfBK`~Kr)2oAJineN@&wm$|L4!I
z$&}~6_Wi*B$A1mq!slP<SO4X--~L<r6;0*;Erme7r346snl!!1JWdIwupNs#!8FAG
zYd4TC!u-GP+ySHz|E~}*WnNku2UEn-(kzgULm;yd=5OgZn9hPJ;#*1pQ^FZ$!bWN!
zU1TPx0_pf7GhUVXTN(hS_(gyZd^uf$gZaQc_*@l`2T}shvVM0W^Ef*O0+~x>CUD>Q
zW*@Q<@y#!UXW2glln2xyUZgy!mzD@%3SU~n1L;!W67Ua5A!pPf-^#sl<F|4XpaImR
z>Gyj2UT@#)@qg;|pY;uXr?nZtPRRfL@3em92lNvPh~@KXD1bO3pu{|d-{~uU!Y2cO
zSBT{~X*#j*Eg%^K^NDFXQ3jM{_*4Ig<^6g~0II(*&-o5jqVDcL@E=aJ^)qArN_^J|
z|5g9QcL}~%JQ=&-I?@ZVd^Rsd1bFR<_~#n)`yL~nXe;y={Kt{lNhi)@z;8Oxt5(*(
zbiuU^IFAO`jihU@xF7i^zVGlA<p%euY>8t$-%t1l+XuMk=YUvVi!G7VLpW(XknwN1
zqOPZibx{YP^hdslHo$UM6U!cs_}_cCmgM{s+nDN#Sj+#FK7?F8N!$D$ld9j_<_iC>
zej~=0Nc@0vu8E)2dqu{-&Y$=va`;(29a8_qm`VR#|3v<!zn};DQXugky3*!a<yzTh
zfjnvepUC(D=f~i;Bjom;LP_j{<3|C>Gda>2CFdWp+$Vt80N^Sa`~4*R>{mPkeL+e5
z$E|qIy_Wx<ge!@E@EaP770=^V_$O_5>;KR{xL>yN+;iO;{#VxjbpRrNSbk3u-ztcI
z?#ZmIf719H0B{q)mtTlKw$<c_`QRB9_$}bbD)C3!{w@&fqxTp5Z~TG(7eu)<1ex}?
zqW=NckuAh)uuaYUX8nI}C-eY5BK~>i@sIxJPx{|AFic{5W#2}w|79S?$?wc{RsyU)
z8KPZj#J}butByZJ*~6>7!{3=x1NuCO|GkHLn6z#G#QdWRz&6M){s5h=h<~0n{BZt3
zqPwy`1lx~4f@Dq&T+;!_LM(qj0w>7_;|<*NS^0g!59ePbHddQ|jw6=OJoOOE^NMH0
zxCMED-|9vo{@KRAm;0CIpCmkfH2)R{pt;Jk-=2Sy`2W%R1N@eyXO(Avy#65J@uT(E
z_p#%zuD@2{^4Hg&|79#K%^z7>YNTIU!o$C9Gt5#G5VJ?-5#vYZna2^c%;QT-%y<X^
zPJj@o@en*5gLxeI1QS?^34nKls0@Ht24cDct1;cT2oNX+4}qQ=hrlC2y>b7q%(Loe
z5VI7U5nrJJ{-BR<zCfSA58S5!Kg8M$S$m&?%zKbWEPo>d_A&EBbP@C9*U)1^{PPUw
z`<S=#8x2r~iHz>|GkkDt1kcZe0l<h5Cgy#gi#{c_LE;x|H><AY5X)<c@85~tCMoZC
zZs1(|<_d@)mj8Yrj(ATxAOBugYmHeu5zGA-xo6+&8N3Gf$VvCq!SCeJh~;_kYm&al
z1ArsqUt`F(J#1oGSV;7Hh<qQB<l#x`Vw&Xr&XLh4hhrrAb0o0=J`-A@51zShMl7F!
zd|$6G67z&e_<ygzW&l+r`rw+c5wYCokoMEy-=+kT)F0{lTMOX06-4CoJ&xp8#LqBd
zx!>PR1`I^qHUvrhkcr<(#PYeDFv)WvB4@JkyGHw&C)V?t?dMP0?<}}?OAUckRze_=
m6A(ziV<0mC0+GG|fk**8y%f*#HG~Gprd^f+WkDTK_x}N6gCe;A
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/doc/index.html
@@ -0,0 +1,1 @@
+<meta http-equiv=refresh content=0;url=num/index.html>
new file mode 100644
index 0000000000000000000000000000000000000000..74b4bd695045ebc52c21af95301adc9311ca881c
GIT binary patch
literal 5758
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
new file mode 100644
--- /dev/null
+++ b/third_party/rust/num/src/lib.rs
@@ -0,0 +1,111 @@
+// Copyright 2014-2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A collection of numeric types and traits for Rust.
+//!
+//! This includes new types for big integers, rationals, and complex numbers,
+//! new traits for generic programming on numeric properties like `Integer`,
+//! and generic range iterators.
+//!
+//! ## Example
+//!
+//! This example uses the BigRational type and [Newton's method][newt] to
+//! approximate a square root to arbitrary precision:
+//!
+//! ```
+//! extern crate num;
+//! # #[cfg(all(feature = "bigint", feature="rational"))]
+//! # mod test {
+//!
+//! use num::FromPrimitive;
+//! use num::bigint::BigInt;
+//! use num::rational::{Ratio, BigRational};
+//!
+//! # pub
+//! fn approx_sqrt(number: u64, iterations: usize) -> BigRational {
+//!     let start: Ratio<BigInt> = Ratio::from_integer(FromPrimitive::from_u64(number).unwrap());
+//!     let mut approx = start.clone();
+//!
+//!     for _ in 0..iterations {
+//!         approx = (&approx + (&start / &approx)) /
+//!             Ratio::from_integer(FromPrimitive::from_u64(2).unwrap());
+//!     }
+//!
+//!     approx
+//! }
+//! # }
+//! # #[cfg(not(all(feature = "bigint", feature="rational")))]
+//! # mod test { pub fn approx_sqrt(n: u64, _: usize) -> u64 { n } }
+//! # use test::approx_sqrt;
+//!
+//! fn main() {
+//!     println!("{}", approx_sqrt(10, 4)); // prints 4057691201/1283082416
+//! }
+//!
+//! ```
+//!
+//! [newt]: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
+#![doc(html_logo_url = "https://rust-num.github.io/num/rust-logo-128x128-blk-v2.png",
+       html_favicon_url = "https://rust-num.github.io/num/favicon.ico",
+       html_root_url = "https://rust-num.github.io/num/",
+       html_playground_url = "http://play.integer32.com/")]
+
+extern crate num_traits;
+extern crate num_integer;
+extern crate num_iter;
+#[cfg(feature = "num-complex")]
+extern crate num_complex;
+#[cfg(feature = "num-bigint")]
+extern crate num_bigint;
+#[cfg(feature = "num-rational")]
+extern crate num_rational;
+
+#[cfg(feature = "num-bigint")]
+pub use num_bigint::{BigInt, BigUint};
+#[cfg(feature = "num-rational")]
+pub use num_rational::Rational;
+#[cfg(all(feature = "num-rational", feature="num-bigint"))]
+pub use num_rational::BigRational;
+#[cfg(feature = "num-complex")]
+pub use num_complex::Complex;
+pub use num_integer::Integer;
+pub use num_iter::{range, range_inclusive, range_step, range_step_inclusive};
+pub use num_traits::{Num, Zero, One, Signed, Unsigned, Bounded,
+                     one, zero, abs, abs_sub, signum,
+                     Saturating, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv,
+                     PrimInt, Float, ToPrimitive, FromPrimitive, NumCast, cast,
+                     pow, checked_pow, clamp};
+
+#[cfg(feature = "num-bigint")]
+pub mod bigint {
+    pub use num_bigint::*;
+}
+
+#[cfg(feature = "num-complex")]
+pub mod complex {
+    pub use num_complex::*;
+}
+
+pub mod integer {
+    pub use num_integer::*;
+}
+
+pub mod iter {
+    pub use num_iter::*;
+}
+
+pub mod traits {
+    pub use num_traits::*;
+}
+
+#[cfg(feature = "num-rational")]
+pub mod rational {
+    pub use num_rational::*;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"0af3f4bf9dc2552d438c9b275f989aa8cfefc9083c4734d33876c276070ec3c8","Cargo.toml":"4dec40bd969f50f658bb49ffd1d311ecf9ab1424aeb45a15980d1461d560eb35","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"892ad0db8a971b86db947bae64542aa67d91cfae768b3ed3ea281c54844a4ae9","README.md":"4b66e3517754d9aabe44c17b224f1d1e72a6fb50507d49536e6825a3e4d0b347","appveyor.yml":"d89e888e666ae00cf5424db695254fb134829562156ca68c736ccc9b8ba36af2","benches/benchmark.rs":"0adade342f2046c8d6f669097209f23b4d8a35c6b5dc2c3687addf2f4444aa40","script/doc-upload.cfg":"273e9501d95820583705e9f4c4f84afefba4fd227223fc3d165dfb1aba91c5d1","src/lib.rs":"4e85226ca3aa902f1623bdc4ea9df4f9ec1f807ca61bc978f0a67d78f5d6023d","tests/bytes.rs":"1cb1979745f35086a785df207f3b0f660cf6720e123c3e0042fb924d5795aa37","tests/io.rs":"19e4699082d0a0432dfa23bda2a54ed426d23bf7f07a579ba4305a1926d952ec"},"package":"e5422a1ee1bc57cc47ae717b0137314258138f38fd5f3cea083f43a9725383a0"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/.travis.yml
@@ -0,0 +1,29 @@
+language: rust
+
+rust:
+    - stable
+    - nightly
+
+sudo: false
+
+addons:
+    apt:
+        packages:
+            - libcurl4-openssl-dev
+            - libelf-dev
+            - libdw-dev
+
+notifications:
+    email:
+        on_success: never
+        on_failure: always
+
+script:
+    - cargo build
+    - cargo test
+    - '[ "$TRAVIS_RUST_VERSION" != "nightly" ] || cargo bench'
+    - cargo doc --no-deps
+    - rustdoc --test README.md -L target/debug
+
+after_success:
+    - curl https://mvdnes.github.io/rust-docs/travis-doc-upload.sh | bash
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+
+name = "podio"
+version = "0.1.5"
+authors = ["Mathijs van de Nes <git@mathijs.vd-nes.nl>"]
+license = "MIT OR Apache-2.0"
+keywords = ["byte", "byteorder", "io"]
+repository = "https://github.com/mvdnes/podio.git"
+documentation = "http://mvdnes.github.io/rust-docs/podio/podio/index.html"
+description = """
+Additional trait for Read and Write to read and write Plain Old Data
+"""
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/LICENSE-APACHE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/LICENSE-MIT
@@ -0,0 +1,19 @@
+Copyright (c) 2015 The podio Developers
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/README.md
@@ -0,0 +1,56 @@
+podio
+=====
+
+[![Build Status](https://travis-ci.org/mvdnes/podio.svg?branch=master)](https://travis-ci.org/mvdnes/podio)
+[![Build status](https://ci.appveyor.com/api/projects/status/hjc3icfjob7mocc9/branch/master?svg=true)](https://ci.appveyor.com/project/mvdnes/podio/branch/master)
+[![Crates.io version](https://img.shields.io/crates/v/podio.svg)](https://crates.io/crates/podio)
+
+[Documentation](http://mvdnes.github.io/rust-docs/podio/podio/index.html)
+
+Implementation for reading and writing POD (plain old data) values in Rust. The name stands for POD I/O.
+
+Keywords: byte, be, le, big-endian, little-endian
+
+Usage
+-----
+
+Include the following code:
+
+```toml
+[dependencies]
+podio = "0.1"
+```
+
+Example
+-------
+
+```rust
+extern crate podio;
+
+use podio::{ReadPodExt, BigEndian};
+
+fn main() {
+    let slice: &[u8] = &[0x10, 0x20, 0x30, 0x40];
+    let mut reader = std::io::Cursor::new(slice);
+
+    let value = reader.read_u32::<BigEndian>().unwrap();
+
+    assert_eq!(value, 0x10203040);
+}
+```
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally
+submitted for inclusion in the work by you, as defined in the Apache-2.0
+license, shall be dual licensed as above, without any additional terms or
+conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/appveyor.yml
@@ -0,0 +1,49 @@
+environment:
+    matrix:
+        - RUST_INSTALL_TOOLCHAIN: gnu
+          RUST_CHANNEL: stable
+        - RUST_INSTALL_TOOLCHAIN: msvc
+          RUST_CHANNEL: nightly
+
+matrix:
+    allow_failures:
+        - RUST_CHANNEL: nightly
+
+platform:
+    - x86
+    - x64
+
+install:
+    - ps: Start-FileDownload "http://static.rust-lang.org/dist/channel-rust-${env:RUST_CHANNEL}"
+    - ps: |
+          if ($env:PLATFORM -eq "x86") {
+            $env:RUST_INSTALLER = Select-String "i686-pc-windows-${env:RUST_INSTALL_TOOLCHAIN}.*exe" "channel-rust-${env:RUST_CHANNEL}" | select -exp line
+          } else {
+            $env:RUST_INSTALLER = Select-String "x86_64-pc-windows-${env:RUST_INSTALL_TOOLCHAIN}.*exe" "channel-rust-${env:RUST_CHANNEL}" | select -exp line
+          }
+    - ps: Start-FileDownload "http://static.rust-lang.org/dist/${env:RUST_INSTALLER}"
+    - '%RUST_INSTALLER% /VERYSILENT /NORESTART /DIR="C:\Rust"'
+    - ps: $env:path = "C:\Rust\bin;" + $env:path
+    - ps: |
+        if ($env:RUST_INSTALL_TOOLCHAIN -eq "gnu" -And $env:PLATFORM -eq "x64") {
+            Start-FileDownload "http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/5.1.0/threads-win32/seh/x86_64-5.1.0-release-win32-seh-rt_v4-rev0.7z/download" -FileName mingw64.7z
+            7z x -oC:\ mingw64.7z > $null
+            $env:path = "C:\mingw64\bin;" + $env:path
+            gcc --version
+        }
+        elseif ($env:RUST_INSTALL_TOOLCHAIN -eq "gnu") {
+            $env:path = "C:\mingw\bin;" + $env:path
+            gcc --version
+        }
+    - ps: |
+        if ($env:PLATFORM -eq "x64") { $env:vcargs = "amd64" }
+        else { $env:vcargs = "x86" }
+    - call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" %vcargs%
+    - rustc --version --verbose
+    - cargo --version
+
+build: false
+
+test_script:
+    - cargo build
+    - cargo test
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/benches/benchmark.rs
@@ -0,0 +1,49 @@
+// bench.rs
+#![feature(test)]
+
+extern crate podio;
+extern crate test;
+
+use test::Bencher;
+use podio::{Endianness, BigEndian, LittleEndian, WritePodExt, ReadPodExt};
+
+// bench: find the `BENCH_SIZE` first terms of the fibonacci sequence
+const BENCH_SIZE: usize = 2000;
+
+#[bench]
+fn write_u64_be(b: &mut Bencher) {
+    write_u64::<BigEndian>(b);
+}
+
+#[bench]
+fn write_u64_le(b: &mut Bencher) {
+    write_u64::<LittleEndian>(b);
+}
+
+fn write_u64<T: Endianness>(b: &mut Bencher) {
+    b.iter(|| {
+        let mut writer : &mut[u8] = &mut [0; BENCH_SIZE * 8];
+        for _ in 0..BENCH_SIZE {
+            writer.write_u64::<T>(0x012345678u64).unwrap();
+        }
+    })
+}
+
+#[bench]
+fn read_u64_be(b: &mut Bencher) {
+    read_u64::<BigEndian>(b);
+}
+
+#[bench]
+fn read_u64_le(b: &mut Bencher) {
+    read_u64::<LittleEndian>(b);
+}
+
+fn read_u64<T: Endianness>(b: &mut Bencher) {
+    b.iter(|| {
+        let mut reader : &[u8] = &[0; BENCH_SIZE * 8];
+        for _ in 0..BENCH_SIZE {
+            reader.read_u64::<T>().unwrap();
+        }
+    })
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/script/doc-upload.cfg
@@ -0,0 +1,3 @@
+PROJECT_NAME=podio
+DOCS_REPO=mvdnes/rust-docs.git
+DOC_RUST_VERSION=stable
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/src/lib.rs
@@ -0,0 +1,336 @@
+//! Additional methods for Read and Write
+//!
+//! The additional methods implemented allow reading and writing integers and floats
+//! in the specified endianness.
+//!
+//! # Usage
+//!
+//! Basically, you need to `use` the trait WritePodExt or ReadPodExt.
+//!
+//! # Examples
+//!
+//! ## Reading
+//!
+//! To read some value from a reader, import ReadPodExt and the needed endianness.
+//!
+//! ```
+//! use podio::{ReadPodExt, BigEndian};
+//!
+//! let slice: &[u8] = &[0x10, 0x20, 0x30, 0x40];
+//! let mut reader = std::io::Cursor::new(slice);
+//!
+//! let value = reader.read_u32::<BigEndian>().unwrap();
+//!
+//! assert_eq!(value, 0x10203040);
+//! ```
+//!
+//! ## Writing
+//!
+//! For writing, you need to import the trait WritePodExt.
+//!
+//! ```
+//! use podio::{WritePodExt, LittleEndian};
+//!
+//! let slice: &mut [u8] = &mut [0; 2];
+//! let mut writer = std::io::Cursor::new(slice);
+//!
+//! writer.write_u16::<LittleEndian>(0x8802).unwrap();
+//!
+//! assert_eq!(writer.into_inner(), &[0x02, 0x88]);
+//! ```
+//!
+//! ## Read exact
+//!
+//! One additional method, not really dealing with POD, is `read_exact`.
+//!
+//! ```
+//! use podio::ReadPodExt;
+//!
+//! let slice: &[u8] = &[0, 1, 2, 3];
+//! let mut reader = std::io::Cursor::new(slice);
+//!
+//! assert_eq!(reader.read_exact(1).unwrap(), [0]);
+//! assert_eq!(reader.read_exact(2).unwrap(), [1,2]);
+//! assert_eq!(reader.read_exact(0).unwrap(), []);
+//! assert_eq!(reader.read_exact(1).unwrap(), [3]);
+//! assert!(reader.read_exact(1).is_err());
+
+#![warn(missing_docs)]
+
+use std::io;
+use std::io::prelude::*;
+
+/// Little endian. The number `0xABCD` is stored `[0xCD, 0xAB]`
+pub enum LittleEndian {}
+/// Big endian. The number `0xABCD` is stored `[0xAB, 0xCD]`
+pub enum BigEndian {}
+
+/// Trait implementing conversion methods for a specific endianness
+pub trait Endianness {
+    /// Converts a value from the platform type to the specified endianness
+    fn int_to_target<T: EndianConvert>(val: T) -> T;
+    /// Converts a value from the sepcified endianness to the platform type
+    fn int_from_target<T: EndianConvert>(val: T) -> T;
+}
+
+/// Generic trait for endian conversions on integers
+pub trait EndianConvert {
+    /// Convert self to a big-endian value
+    fn to_be(self) -> Self;
+    /// Convert self to a little-endian value
+    fn to_le(self) -> Self;
+    /// Convert a big-endian value to the target endianness
+    fn from_be(x: Self) -> Self;
+    /// Convert a little-endian value to the target endiannes
+    fn from_le(x: Self) -> Self;
+}
+
+/// Additional write methods for a io::Write
+pub trait WritePodExt {
+    /// Write a u64
+    fn write_u64<T: Endianness>(&mut self, u64) -> io::Result<()>;
+    /// Write a u32
+    fn write_u32<T: Endianness>(&mut self, u32) -> io::Result<()>;
+    /// Write a u16
+    fn write_u16<T: Endianness>(&mut self, u16) -> io::Result<()>;
+    /// Write a u8
+    fn write_u8(&mut self, u8) -> io::Result<()>;
+    /// Write a i64
+    fn write_i64<T: Endianness>(&mut self, i64) -> io::Result<()>;
+    /// Write a i32
+    fn write_i32<T: Endianness>(&mut self, i32) -> io::Result<()>;
+    /// Write a i16
+    fn write_i16<T: Endianness>(&mut self, i16) -> io::Result<()>;
+    /// Write a i8
+    fn write_i8(&mut self, i8) -> io::Result<()>;
+    /// Write a f32
+    fn write_f32<T: Endianness>(&mut self, f32) -> io::Result<()>;
+    /// Write a f64
+    fn write_f64<T: Endianness>(&mut self, f64) -> io::Result<()>;
+}
+
+/// Additional read methods for a io::Read
+pub trait ReadPodExt {
+    /// Read a u64
+    fn read_u64<T: Endianness>(&mut self) -> io::Result<u64>;
+    /// Read a u32
+    fn read_u32<T: Endianness>(&mut self) -> io::Result<u32>;
+    /// Read a u16
+    fn read_u16<T: Endianness>(&mut self) -> io::Result<u16>;
+    /// Read a u8
+    fn read_u8(&mut self) -> io::Result<u8>;
+    /// Read a i64
+    fn read_i64<T: Endianness>(&mut self) -> io::Result<i64>;
+    /// Read a i32
+    fn read_i32<T: Endianness>(&mut self) -> io::Result<i32>;
+    /// Read a i16
+    fn read_i16<T: Endianness>(&mut self) -> io::Result<i16>;
+    /// Read a i8
+    fn read_i8(&mut self) -> io::Result<i8>;
+    /// Read a f32
+    fn read_f32<T: Endianness>(&mut self) -> io::Result<f32>;
+    /// Read a f64
+    fn read_f64<T: Endianness>(&mut self) -> io::Result<f64>;
+    /// Read a specific number of bytes
+    fn read_exact(&mut self, usize) -> io::Result<Vec<u8>>;
+}
+
+impl Endianness for LittleEndian {
+    #[inline]
+    fn int_to_target<T: EndianConvert>(val: T) -> T {
+        val.to_le()
+    }
+    #[inline]
+    fn int_from_target<T: EndianConvert>(val: T) -> T {
+        <T as EndianConvert>::from_le(val)
+    }
+}
+
+impl Endianness for BigEndian {
+    #[inline]
+    fn int_to_target<T: EndianConvert>(val: T) -> T {
+        val.to_be()
+    }
+    #[inline]
+    fn int_from_target<T: EndianConvert>(val: T) -> T {
+        <T as EndianConvert>::from_be(val)
+    }
+}
+
+macro_rules! impl_platform_convert {
+    ($T:ty) => {
+        impl EndianConvert for $T {
+            #[inline]
+            fn to_be(self) -> $T {
+                self.to_be()
+            }
+
+            #[inline]
+            fn to_le(self) -> $T {
+                self.to_le()
+            }
+
+            #[inline]
+            fn from_be(x: $T) -> $T {
+                if cfg!(target_endian = "big") { x } else { x.swap_bytes() }
+            }
+
+            #[inline]
+            fn from_le(x: $T) -> $T {
+                if cfg!(target_endian = "little") { x } else { x.swap_bytes() }
+            }
+        }
+    };
+}
+
+impl_platform_convert!(u8);
+impl_platform_convert!(u16);
+impl_platform_convert!(u32);
+impl_platform_convert!(u64);
+
+macro_rules! val_to_buf {
+    ($val:ident, $T:expr) => {
+        {
+            let mut buf = [0; $T];
+            for i in 0..buf.len() {
+                buf[i] = ($val >> (i * 8)) as u8;
+            }
+            buf
+        }
+    };
+}
+
+impl<W: Write> WritePodExt for W {
+    fn write_u64<T: Endianness>(&mut self, val: u64) -> io::Result<()> {
+        let tval = <T as Endianness>::int_to_target(val);
+        let buf = val_to_buf!(tval, 8);
+        self.write_all(&buf)
+    }
+
+    fn write_u32<T: Endianness>(&mut self, val: u32) -> io::Result<()> {
+        let tval = <T as Endianness>::int_to_target(val);
+        let buf = val_to_buf!(tval, 4);
+        self.write_all(&buf)
+    }
+
+    fn write_u16<T: Endianness>(&mut self, val: u16) -> io::Result<()> {
+        let tval = <T as Endianness>::int_to_target(val);
+        let buf = val_to_buf!(tval, 2);
+        self.write_all(&buf)
+    }
+
+    fn write_u8(&mut self, val: u8) -> io::Result<()> {
+        self.write_all(&[val])
+    }
+
+    fn write_i64<T: Endianness>(&mut self, val: i64) -> io::Result<()> {
+        self.write_u64::<T>(val as u64)
+    }
+
+    fn write_i32<T: Endianness>(&mut self, val: i32) -> io::Result<()> {
+        self.write_u32::<T>(val as u32)
+    }
+
+    fn write_i16<T: Endianness>(&mut self, val: i16) -> io::Result<()> {
+        self.write_u16::<T>(val as u16)
+    }
+
+    fn write_i8(&mut self, val: i8) -> io::Result<()> {
+        self.write_u8(val as u8)
+    }
+
+    fn write_f32<T: Endianness>(&mut self, val: f32) -> io::Result<()> {
+        let tval: u32 = unsafe { std::mem::transmute::<f32, u32>(val) };
+        self.write_u32::<T>(tval)
+    }
+
+    fn write_f64<T: Endianness>(&mut self, val: f64) -> io::Result<()> {
+        let tval: u64 = unsafe { std::mem::transmute::<f64, u64>(val) };
+        self.write_u64::<T>(tval)
+    }
+}
+
+#[inline]
+fn fill_buf<R: Read>(reader: &mut R, buf: &mut [u8]) -> io::Result<()> {
+    let mut idx = 0;
+    while idx != buf.len() {
+        match reader.read(&mut buf[idx..]) {
+            Ok(0) => return Err(io::Error::new(io::ErrorKind::Other, "Could not read enough bytes")),
+            Ok(v) => { idx += v; }
+            Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {}
+            Err(e) => return Err(e),
+        }
+    }
+    Ok(())
+}
+
+macro_rules! buf_to_val {
+    ($buf:ident, $T:ty) => {
+        {
+            let mut val: $T = 0;
+            for i in 0..$buf.len() {
+                val |= ($buf[i] as $T) << (i * 8);
+            }
+            val
+        }
+    };
+}
+
+impl<R: Read> ReadPodExt for R {
+    fn read_u64<T: Endianness>(&mut self) -> io::Result<u64> {
+        let buf = &mut [0u8; 8];
+        try!(fill_buf(self, buf));
+        let tval = buf_to_val!(buf, u64);
+        Ok(<T as Endianness>::int_from_target(tval))
+    }
+
+    fn read_u32<T: Endianness>(&mut self) -> io::Result<u32> {
+        let buf = &mut [0u8; 4];
+        try!(fill_buf(self, buf));
+        let tval = buf_to_val!(buf, u32);
+        Ok(<T as Endianness>::int_from_target(tval))
+    }
+
+    fn read_u16<T: Endianness>(&mut self) -> io::Result<u16> {
+        let buf = &mut [0u8; 2];
+        try!(fill_buf(self, buf));
+        let tval = buf_to_val!(buf, u16);
+        Ok(<T as Endianness>::int_from_target(tval))
+    }
+
+    fn read_u8(&mut self) -> io::Result<u8> {
+        let buf = &mut [0u8; 1];
+        try!(fill_buf(self, buf));
+        Ok(buf[0])
+    }
+
+    fn read_i64<T: Endianness>(&mut self) -> io::Result<i64> {
+        self.read_u64::<T>().map(|v| v as i64)
+    }
+
+    fn read_i32<T: Endianness>(&mut self) -> io::Result<i32> {
+        self.read_u32::<T>().map(|v| v as i32)
+    }
+
+    fn read_i16<T: Endianness>(&mut self) -> io::Result<i16> {
+        self.read_u16::<T>().map(|v| v as i16)
+    }
+
+    fn read_i8(&mut self) -> io::Result<i8> {
+        self.read_u8().map(|v| v as i8)
+    }
+
+    fn read_f64<T: Endianness>(&mut self) -> io::Result<f64> {
+        self.read_u64::<T>().map(|v| unsafe { std::mem::transmute::<u64, f64>(v) })
+    }
+
+    fn read_f32<T: Endianness>(&mut self) -> io::Result<f32> {
+        self.read_u32::<T>().map(|v| unsafe { std::mem::transmute::<u32, f32>(v) })
+    }
+
+    fn read_exact(&mut self, len: usize) -> io::Result<Vec<u8>> {
+        let mut res = vec![0; len];
+        try!(fill_buf(self, &mut res));
+        Ok(res)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/tests/bytes.rs
@@ -0,0 +1,139 @@
+extern crate podio;
+
+use std::io;
+use podio::{LittleEndian, BigEndian};
+use podio::{ReadPodExt, WritePodExt};
+
+#[test]
+fn write_be() {
+    let buf: &mut [u8] = &mut [0u8; 8];
+    let mut writer = io::Cursor::new(buf);
+
+    writer.set_position(0);
+    writer.write_u64::<BigEndian>(0x01_23_45_67_89_ab_cd_ef).unwrap();
+    assert_eq!(&writer.get_ref()[0..8], &[0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]);
+
+    writer.set_position(0);
+    writer.write_u32::<BigEndian>(0x01_23_45_67).unwrap();
+    assert_eq!(&writer.get_ref()[0..4], &[0x01, 0x23, 0x45, 0x67]);
+
+    writer.set_position(0);
+    writer.write_u16::<BigEndian>(0x01_23).unwrap();
+    assert_eq!(&writer.get_ref()[0..2], &[0x01, 0x23]);
+}
+
+#[test]
+fn write_le() {
+    let buf: &mut [u8] = &mut [0u8; 8];
+    let mut writer = io::Cursor::new(buf);
+
+    writer.set_position(0);
+    writer.write_u64::<LittleEndian>(0x01_23_45_67_89_ab_cd_ef).unwrap();
+    assert_eq!(&writer.get_ref()[0..8], &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]);
+
+    writer.set_position(0);
+    writer.write_u32::<LittleEndian>(0x01_23_45_67).unwrap();
+    assert_eq!(&writer.get_ref()[0..4], &[0x67, 0x45, 0x23, 0x01]);
+
+    writer.set_position(0);
+    writer.write_u16::<LittleEndian>(0x01_23).unwrap();
+    assert_eq!(&writer.get_ref()[0..2], &[0x23, 0x01]);
+}
+
+#[test]
+fn write_octet() {
+    let buf: &mut [u8] = &mut [0u8; 8];
+    let mut writer = io::Cursor::new(buf);
+
+    writer.set_position(0);
+    writer.write_u8(0x01).unwrap();
+    assert_eq!(&writer.get_ref()[0..1], &[0x01]);
+}
+
+#[test]
+fn write_float() {
+    let buf: &mut [u8] = &mut [0u8; 8];
+    let mut writer = io::Cursor::new(buf);
+
+    writer.set_position(0);
+    writer.write_f32::<LittleEndian>(10.12f32).unwrap();
+    assert_eq!(&writer.get_ref()[0..4], &[0x85, 0xEB, 0x21, 0x41]);
+
+    writer.set_position(0);
+    writer.write_f32::<BigEndian>(10.12f32).unwrap();
+    assert_eq!(&writer.get_ref()[0..4], &[0x41, 0x21, 0xEB, 0x85]);
+
+    writer.set_position(0);
+    writer.write_f64::<LittleEndian>(10.12f64).unwrap();
+    assert_eq!(&writer.get_ref()[0..8], &[0x3D, 0x0A, 0xD7, 0xA3, 0x70, 0x3D, 0x24, 0x40]);
+
+    writer.set_position(0);
+    writer.write_f64::<BigEndian>(10.12f64).unwrap();
+    assert_eq!(&writer.get_ref()[0..8], &[0x40, 0x24, 0x3D, 0x70, 0xA3, 0xD7, 0x0A, 0x3D]);
+}
+
+#[test]
+fn read_be() {
+    let buf: &[u8] = &[0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef];
+    let mut reader = io::Cursor::new(buf);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u64::<BigEndian>().unwrap(), 0x0123456789abcdef);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u32::<BigEndian>().unwrap(), 0x01234567);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u16::<BigEndian>().unwrap(), 0x0123);
+}
+
+#[test]
+fn read_le() {
+    let buf: &[u8] = &[0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef];
+    let mut reader = io::Cursor::new(buf);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u64::<LittleEndian>().unwrap(), 0xefcdab8967452301);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u32::<LittleEndian>().unwrap(), 0x67452301);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u16::<LittleEndian>().unwrap(), 0x2301);
+}
+
+#[test]
+fn read_octet() {
+    let buf: &[u8] = &[0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef];
+    let mut reader = io::Cursor::new(buf);
+
+    reader.set_position(0);
+    assert_eq!(reader.read_u8().unwrap(), 0x01);
+}
+
+#[test]
+fn read_float() {
+    let mut buf: &[u8] = &[0x41, 0x21, 0xEB, 0x85];
+    assert_eq!(buf.read_f32::<BigEndian>().unwrap(), 10.12f32);
+
+    let mut buf: &[u8] = &[0x85, 0xEB, 0x21, 0x41];
+    assert_eq!(buf.read_f32::<LittleEndian>().unwrap(), 10.12f32);
+
+    let mut buf: &[u8] = &[0x40, 0x24, 0x3D, 0x70, 0xA3, 0xD7, 0x0A, 0x3D];
+    assert_eq!(buf.read_f64::<BigEndian>().unwrap(), 10.12f64);
+
+    let mut buf: &[u8] = &[0x3D, 0x0A, 0xD7, 0xA3, 0x70, 0x3D, 0x24, 0x40];
+    assert_eq!(buf.read_f64::<LittleEndian>().unwrap(), 10.12f64);
+}
+
+#[test]
+fn read_exact() {
+    let mut buf: &[u8] = &[1, 2, 3, 4, 5, 6, 7, 8];
+    assert_eq!(buf.read_exact(2).unwrap(), [1,2]);
+    assert_eq!(buf.read_exact(1).unwrap(), [3]);
+    assert_eq!(buf.read_exact(0).unwrap(), []);
+    assert_eq!(buf.read_exact(5).unwrap(), [4,5,6,7,8]);
+    assert_eq!(buf.read_exact(0).unwrap(), []);
+    assert!(buf.read_exact(1).is_err());
+    assert_eq!(buf.read_exact(0).unwrap(), []);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/podio/tests/io.rs
@@ -0,0 +1,57 @@
+extern crate podio;
+
+use std::io::{self, Read};
+use podio::ReadPodExt;
+
+struct TestReader {
+    state: Option<io::Result<usize>>,
+}
+
+impl TestReader {
+    fn new(first_return: io::Result<usize>) -> TestReader {
+        TestReader { state: Some(first_return) }
+    }
+
+    fn get(&mut self) -> io::Result<u32> {
+        self.read_u32::<podio::LittleEndian>()
+    }
+
+    fn test(first_return: io::Result<usize>) -> io::Result<u32> {
+        TestReader::new(first_return).get()
+    }
+}
+
+impl Read for TestReader {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match self.state.take().unwrap_or(Ok(1)) {
+            Ok(n) => {
+                for i in buf.iter_mut().take(n) {
+                    *i = 0xA5;
+                }
+                Ok(n)
+            },
+            e @ Err(..) => e,
+        }
+    }
+}
+
+#[test]
+fn interrupted() {
+    // Getting an io::ErrorKind::Interrupted should be retried, and thus succeed
+    let first_read = Err(io::Error::new(io::ErrorKind::Interrupted, "Interrupted"));
+    assert_eq!(TestReader::test(first_read).unwrap(), 0xA5A5A5A5);
+}
+
+#[test]
+fn eof() {
+    // Getting a Ok(0) implies an unexpected EOF
+    let first_read = Ok(0);
+    assert!(TestReader::test(first_read).is_err());
+}
+
+#[test]
+fn err() {
+    // Getting any other error is still an error
+    let first_read = Err(io::Error::new(io::ErrorKind::Other, "Other"));
+    assert!(TestReader::test(first_read).is_err());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"7019aad65c581d7933496e686d490e1ea7241416874034198f992d4465f42a49",".travis.yml":"ea2f6250c91c6c4e7f361319c8c65773925f8e3f2b1e4ee3658bca6f8a64f956","Cargo.toml":"82306a61d85c13b8ecb00a7cb1089affb31cabd7a47af6cddf5ea361115b032e","README.rst":"d63c2de5b7e3096e48e76c873b9d405071fa9ae617107ca51398fd653efd48ed","examples/test.rs":"7ab1303e0a2c8205459f80f482279ee946fcc65e7d7a1d2d4434c0340782aa29","src/ini.rs":"71f94060c22da65a62e7c0e84cd1972de97da6ee34fe7924668863cc052b38b4","src/lib.rs":"80fa5b6db977af8bb248c18b16791517e3b63bd260cd590ce3229903fe9982a8"},"package":"06d4e8b0b50e7e7f827d609fa9746e1cf6371a1fa15404a1a0a86152a801079f"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/.gitignore
@@ -0,0 +1,5 @@
+/target/
+Cargo.lock
+
+.DS_Store
+Thumbs.db
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/.travis.yml
@@ -0,0 +1,12 @@
+sudo: false
+language: rust
+rust:
+    - nightly
+    - beta
+    - stable
+
+cache: cargo
+
+script:
+    - cargo test -v --no-fail-fast
+    - cargo doc --no-deps
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "rust-ini"
+version = "0.10.0"
+authors = ["Y. T. Chung <zonyitoo@gmail.com>"]
+description = "An Ini configuration file parsing library in Rust"
+repository = "https://github.com/zonyitoo/rust-ini"
+documentation = "https://docs.rs/rust-ini/"
+keywords = ["ini", "configuration", "conf", "cfg"]
+license = "MIT"
+
+[lib]
+name = "ini"
+test = true
+
+[dependencies]
+log = "^0.3.5"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/README.rst
@@ -0,0 +1,109 @@
+INI in Rust
+-----------
+
+.. image:: https://travis-ci.org/zonyitoo/rust-ini.svg?branch=master
+    :target: https://travis-ci.org/zonyitoo/rust-ini
+
+.. image:: https://img.shields.io/crates/v/rust-ini.svg
+    :target: https://crates.io/crates/rust-ini
+
+INI_ is an informal standard for configuration files for some platforms or software. INI files are simple text files with a basic structure composed of "sections" and "properties".
+
+.. _INI: http://en.wikipedia.org/wiki/INI_file
+
+This is an INI file parser in Rust_.
+
+.. _Rust: http://www.rust-lang.org/
+
+.. code:: toml
+
+    [dependencies]
+    rust-ini = "0.9"
+
+Usage
+=====
+
+* Create a Ini configuration file.
+
+.. code:: rust
+
+    extern crate ini;
+    use ini::Ini;
+
+    fn main() {
+        let mut conf = Ini::new();
+        conf.with_section(None)
+            .set("encoding", "utf-8");
+        conf.with_section(Some("User".to_owned()))
+            .set("given_name", "Tommy")
+            .set("family_name", "Green")
+            .set("unicode", "Raspberry树莓");
+        conf.with_section(Some("Book".to_owned()))
+            .set("name", "Rust cool");
+        conf.write_to_file("conf.ini").unwrap();
+    }
+
+Then you will get ``conf.ini``
+
+.. code:: ini
+
+    encoding=utf-8
+
+    [User]
+    given_name=Tommy
+    family_name=Green
+    unicode=Raspberry\x6811\x8393
+
+    [Book]
+    name=Rust cool
+
+* Read from file ``conf.ini``
+
+.. code:: rust
+
+    extern crate ini;
+    use ini::Ini;
+
+    fn main() {
+        let conf = Ini::load_from_file("conf.ini").unwrap();
+
+        let section = conf.section(Some("User".to_owned())).unwrap();
+        let tommy = section.get("given_name").unwrap();
+        let green = section.get("family_name").unwrap();
+
+        println!("{:?} {:?}", tommy, green);
+
+        // iterating
+        for (sec, prop) in &conf {
+            println!("Section: {:?}", sec);
+            for (key, value) in &prop {
+                println!("{:?}:{:?}", key, value);
+            }
+        }
+    }
+
+* More details could be found in `examples`.
+
+License
+=======
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Y. T. CHUNG
+
+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 AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/examples/test.rs
@@ -0,0 +1,50 @@
+extern crate ini;
+
+use std::io::stdout;
+
+use ini::Ini;
+
+const CONF_FILE_NAME: &'static str = "test.ini";
+
+fn main() {
+
+    let mut conf = Ini::new();
+    conf.with_section(None::<String>)
+        .set("encoding", "utf-8");
+    conf.with_section(Some("User"))
+        .set("name", "Raspberry树莓")
+        .set("value", "Pi");
+    conf.with_section(Some("Library"))
+        .set("name", "Sun Yat-sen U")
+        .set("location", "Guangzhou=world\x0ahahaha");
+
+    conf.section_mut(Some("Library"))
+        .unwrap()
+        .insert("seats".into(), "42".into());
+
+    println!("---------------------------------------");
+    println!("Writing to file {:?}\n", CONF_FILE_NAME);
+    conf.write_to(&mut stdout()).unwrap();
+
+    conf.write_to_file(CONF_FILE_NAME).unwrap();
+
+    println!("----------------------------------------");
+    println!("Reading from file {:?}", CONF_FILE_NAME);
+    let i = Ini::load_from_file(CONF_FILE_NAME).unwrap();
+
+    println!("Iterating");
+    let general_section_name = "__General__".into();
+    for (sec, prop) in i.iter() {
+        let section_name = sec.as_ref().unwrap_or(&general_section_name);
+        println!("-- Section: {:?} begins", section_name);
+        for (k, v) in prop.iter() {
+            println!("{}: {:?}", *k, *v);
+        }
+    }
+    println!("");
+
+    let section = i.section(Some("User")).unwrap();
+    println!("name={}", section.get("name").unwrap());
+    println!("conf[{}][{}]={}", "User", "name", i["User"]["name"]);
+    println!("General Section: {:?}", i.general_section());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/src/ini.rs
@@ -0,0 +1,1060 @@
+// The MIT License (MIT)
+
+// Copyright (c) 2014 Y. T. CHUNG
+
+// 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 AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+//! Ini
+
+use std::collections::HashMap;
+use std::collections::hash_map::{Iter, IterMut, IntoIter, Keys};
+use std::collections::hash_map::Entry;
+use std::fs::{OpenOptions, File};
+use std::ops::{Index, IndexMut};
+use std::char;
+use std::io::{self, Write, Read};
+use std::fmt::{self, Display};
+use std::path::Path;
+use std::str::Chars;
+use std::borrow::Borrow;
+use std::hash::Hash;
+use std::cmp::Eq;
+use std::error;
+
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub enum EscapePolicy {
+    /// escape absolutely nothing (dangerous)
+    Nothing,
+    /// only escape the most necessary things
+    Basics,
+    /// escape basics and non-ascii characters
+    BasicsUnicode,
+    /// Escape reserved symbols.
+    Reserved,
+    /// Escape reserved symbols and non-ascii characters
+    ReservedUnicode,
+    /// Escape everything that some INI implementations assume
+    Everything,
+}
+
+impl EscapePolicy {
+    fn escape_basics(&self) -> bool {
+        match *self {
+            EscapePolicy::Nothing => false,
+            _ => true,
+        }
+    }
+
+    fn escape_reserved(&self) -> bool {
+        match *self {
+            EscapePolicy::Reserved => true,
+            EscapePolicy::ReservedUnicode => true,
+            EscapePolicy::Everything => true,
+            _ => false,
+        }
+    }
+
+    fn escape_unicode(&self) -> bool {
+        match *self {
+            EscapePolicy::BasicsUnicode => true,
+            EscapePolicy::ReservedUnicode => true,
+            EscapePolicy::Everything => true,
+            _ => false,
+        }
+    }
+
+    /// Given a character this returns true if it should be escaped as
+    /// per this policy or false if not.
+    pub fn should_escape(&self, c: char) -> bool {
+        match c {
+            '\\' |
+            '\x00'...'\x1f' |
+            '\x7f'...'\u{00ff}' => self.escape_basics(),
+            ';' | '#' | '=' | ':' => self.escape_reserved(),
+            '\u{0080}'...'\u{FFFF}' => self.escape_unicode(),
+            _ => false,
+        }
+    }
+}
+
+// Escape non-INI characters
+//
+// Common escape sequences: https://en.wikipedia.org/wiki/INI_file#Escape_characters
+//
+// * `\\` \ (a single backslash, escaping the escape character)
+// * `\0` Null character
+// * `\a` Bell/Alert/Audible
+// * `\b` Backspace, Bell character for some applications
+// * `\t` Tab character
+// * `\r` Carriage return
+// * `\n` Line feed
+// * `\;` Semicolon
+// * `\#` Number sign
+// * `\=` Equals sign
+// * `\:` Colon
+// * `\x????` Unicode character with hexadecimal code point corresponding to ????
+fn escape_str(s: &str, policy: EscapePolicy) -> String {
+    let mut escaped: String = String::with_capacity(s.len());
+    for c in s.chars() {
+        // if we know this is not something to escape as per policy, we just
+        // write it and continue.
+        if !policy.should_escape(c) {
+            escaped.push(c);
+            continue;
+        }
+
+        match c {
+            '\\' => escaped.push_str("\\\\"),
+            '\0' => escaped.push_str("\\0"),
+            '\x01'...'\x06' |
+            '\x0e'...'\x1f' |
+            '\x7f'...'\u{00ff}' => escaped.push_str(&format!("\\x{:04x}", c as isize)[..]),
+            '\x07' => escaped.push_str("\\a"),
+            '\x08' => escaped.push_str("\\b"),
+            '\x0c' => escaped.push_str("\\f"),
+            '\x0b' => escaped.push_str("\\v"),
+            '\n' => escaped.push_str("\\n"),
+            '\t' => escaped.push_str("\\t"),
+            '\r' => escaped.push_str("\\r"),
+            '\u{0080}'...'\u{FFFF}' => escaped.push_str(&format!("\\x{:04x}", c as isize)[..]),
+            _ => {
+                escaped.push('\\');
+                escaped.push(c);
+            }
+        }
+    }
+    escaped
+}
+
+/// A setter which could be used to set key-value pair in a specified section
+pub struct SectionSetter<'a> {
+    ini: &'a mut Ini,
+    section_name: Option<String>,
+}
+
+impl<'a> SectionSetter<'a> {
+    fn new(ini: &'a mut Ini, section_name: Option<String>) -> SectionSetter<'a> {
+        SectionSetter {
+            ini: ini,
+            section_name: section_name,
+        }
+    }
+
+    /// Set key-value pair in this section
+    pub fn set<K, V>(&'a mut self, key: K, value: V) -> &'a mut SectionSetter<'a>
+        where K: Into<String>,
+              V: Into<String>
+    {
+        {
+            let prop = match self.ini.sections.entry(self.section_name.clone()) {
+                Entry::Vacant(entry) => entry.insert(HashMap::new()),
+                Entry::Occupied(entry) => entry.into_mut(),
+            };
+            prop.insert(key.into(), value.into());
+        }
+        self
+    }
+
+    /// Delete the entry in this section with `key`
+    pub fn delete<K>(&'a mut self, key: &K) -> &'a mut SectionSetter<'a>
+        where String: Borrow<K>,
+              K: Hash + Eq
+    {
+        if let Some(prop) = self.ini.sections.get_mut(&self.section_name) {
+            prop.remove(key);
+        }
+        self
+    }
+
+    /// Get the entry in this section with `key`
+    pub fn get<K>(&'a mut self, key: &K) -> Option<&'a str>
+        where String: Borrow<K>,
+              K: Hash + Eq
+    {
+        self.ini
+            .sections
+            .get(&self.section_name)
+            .and_then(|prop| prop.get(key).map(|s| &s[..]))
+    }
+}
+
+/// Properties type (key-value pairs)
+pub type Properties = HashMap<String, String>; // Key-value pairs
+
+/// Ini struct
+#[derive(Clone)]
+pub struct Ini {
+    sections: HashMap<Option<String>, Properties>,
+}
+
+impl Ini {
+    /// Create an instance
+    pub fn new() -> Ini {
+        Ini { sections: HashMap::new() }
+    }
+
+    /// Set with a specified section, `None` is for the general section
+    pub fn with_section<'b, S>(&'b mut self, section: Option<S>) -> SectionSetter<'b>
+        where S: Into<String>
+    {
+        SectionSetter::new(self, section.map(|s| s.into()))
+    }
+
+    /// Get the immmutable general section
+    pub fn general_section(&self) -> &Properties {
+        self.section(None::<String>).expect("There is no general section in this Ini")
+    }
+
+    /// Get the mutable general section
+    pub fn general_section_mut(&mut self) -> &mut Properties {
+        self.section_mut(None::<String>).expect("There is no general section in this Ini")
+    }
+
+    /// Get a immutable section
+    pub fn section<'a, S>(&'a self, name: Option<S>) -> Option<&'a Properties>
+        where S: Into<String>
+    {
+        self.sections.get(&name.map(|s| s.into()))
+    }
+
+    /// Get a mutable section
+    pub fn section_mut<'a, S>(&'a mut self, name: Option<S>) -> Option<&'a mut Properties>
+        where S: Into<String>
+    {
+        self.sections.get_mut(&name.map(|s| s.into()))
+    }
+
+    /// Get the entry
+    pub fn entry<'a>(&'a mut self, name: Option<String>) -> Entry<Option<String>, Properties> {
+        self.sections.entry(name.map(|s| s.into()))
+    }
+
+    /// Clear all entries
+    pub fn clear<'a>(&mut self) {
+        self.sections.clear()
+    }
+
+    /// Iterate with sections
+    pub fn sections<'a>(&'a self) -> Keys<'a, Option<String>, Properties> {
+        self.sections.keys()
+    }
+
+    /// Set key-value to a section
+    pub fn set_to<S>(&mut self, section: Option<S>, key: String, value: String)
+        where S: Into<String>
+    {
+        self.with_section(section).set(key, value);
+    }
+
+    /// Get the value from a section with key
+    ///
+    /// Example:
+    ///
+    /// ```
+    /// use ini::Ini;
+    /// let input = "[sec]\nabc = def\n";
+    /// let ini = Ini::load_from_str(input).unwrap();
+    /// assert_eq!(ini.get_from(Some("sec"), "abc"), Some("def"));
+    /// ```
+    pub fn get_from<'a, S>(&'a self, section: Option<S>, key: &str) -> Option<&'a str>
+        where S: Into<String>
+    {
+        match self.sections.get(&section.map(|s| s.into())) {
+            None => None,
+            Some(ref prop) => {
+                match prop.get(key) {
+                    Some(p) => Some(&p[..]),
+                    None => None,
+                }
+            }
+        }
+    }
+
+    /// Get the value from a section with key, return the default value if it does not exist
+    ///
+    /// Example:
+    ///
+    /// ```
+    /// use ini::Ini;
+    /// let input = "[sec]\n";
+    /// let ini = Ini::load_from_str(input).unwrap();
+    /// assert_eq!(ini.get_from_or(Some("sec"), "key", "default"), "default");
+    /// ```
+    pub fn get_from_or<'a, S>(&'a self, section: Option<S>, key: &str, default: &'a str) -> &'a str
+        where S: Into<String>
+    {
+        match self.sections.get(&section.map(|s| s.into())) {
+            None => default,
+            Some(ref prop) => {
+                match prop.get(key) {
+                    Some(p) => &p[..],
+                    None => default,
+                }
+            }
+        }
+    }
+
+    /// Get the mutable from a section with key
+    pub fn get_from_mut<'a, S>(&'a mut self, section: Option<S>, key: &str) -> Option<&'a str>
+        where S: Into<String>
+    {
+        match self.sections.get_mut(&section.map(|s| s.into())) {
+            None => None,
+            Some(mut prop) => prop.get_mut(key).map(|s| &s[..]),
+        }
+    }
+
+    /// Delete a section, return the properties if it exists
+    pub fn delete<S>(&mut self, section: Option<S>) -> Option<Properties>
+        where S: Into<String>
+    {
+        self.sections.remove(&section.map(|s| s.into()))
+    }
+
+    pub fn delete_from<S>(&mut self, section: Option<S>, key: &str) -> Option<String>
+        where S: Into<String>
+    {
+        match self.section_mut(section) {
+            None => return None,
+            Some(prop) => prop.remove(key),
+        }
+    }
+}
+
+impl<'q> Index<&'q Option<String>> for Ini {
+    type Output = Properties;
+
+    fn index<'a>(&'a self, index: &'q Option<String>) -> &'a Properties {
+        match self.sections.get(index) {
+            Some(p) => p,
+            None => panic!("Section `{:?}` does not exist", index),
+        }
+    }
+}
+
+impl<'i> IndexMut<&'i Option<String>> for Ini {
+    fn index_mut<'a>(&'a mut self, index: &Option<String>) -> &'a mut Properties {
+        match self.sections.get_mut(index) {
+            Some(p) => p,
+            None => panic!("Section `{:?}` does not exist", index),
+        }
+    }
+}
+
+impl<'q> Index<&'q str> for Ini {
+    type Output = Properties;
+
+    fn index<'a>(&'a self, index: &'q str) -> &'a Properties {
+        match self.sections.get(&Some(index.into())) {
+            Some(p) => p,
+            None => panic!("Section `{}` does not exist", index),
+        }
+    }
+}
+
+impl<'q> IndexMut<&'q str> for Ini {
+    fn index_mut<'a>(&'a mut self, index: &'q str) -> &'a mut Properties {
+        match self.sections.get_mut(&Some(index.into())) {
+            Some(p) => p,
+            None => panic!("Section `{}` does not exist", index),
+        }
+    }
+}
+
+impl Ini {
+    /// Write to a file
+    pub fn write_to_file<P: AsRef<Path>>(&self, filename: P) -> io::Result<()> {
+        self.write_to_file_policy(filename, EscapePolicy::Basics)
+    }
+
+    /// Write to a file
+    pub fn write_to_file_policy<P: AsRef<Path>>(&self,
+                                                filename: P,
+                                                policy: EscapePolicy)
+                                                -> io::Result<()> {
+        let mut file = try!(OpenOptions::new()
+            .write(true)
+            .truncate(true)
+            .create(true)
+            .open(filename.as_ref()));
+        self.write_to_policy(&mut file, policy)
+    }
+
+    /// Write to a writer
+    pub fn write_to<W: Write>(&self, writer: &mut W) -> io::Result<()> {
+        self.write_to_policy(writer, EscapePolicy::Basics)
+    }
+
+    /// Write to a writer
+    pub fn write_to_policy<W: Write>(&self,
+                                     writer: &mut W,
+                                     policy: EscapePolicy)
+                                     -> io::Result<()> {
+        let mut firstline = true;
+
+        match self.sections.get(&None) {
+            Some(props) => {
+                for (k, v) in props.iter() {
+                    let k_str = escape_str(&k[..], policy);
+                    let v_str = escape_str(&v[..], policy);
+                    try!(write!(writer, "{}={}\n", k_str, v_str));
+                }
+                firstline = false;
+            }
+            None => {}
+        }
+
+        for (section, props) in self.sections.iter().filter(|&(ref s, _)| s.is_some()) {
+            if firstline {
+                firstline = false;
+            } else {
+                try!(writer.write_all(b"\n"));
+            }
+
+            if let &Some(ref section) = section {
+                try!(write!(writer, "[{}]\n", escape_str(&section[..], policy)));
+
+                for (k, v) in props.iter() {
+                    let k_str = escape_str(&k[..], policy);
+                    let v_str = escape_str(&v[..], policy);
+                    try!(write!(writer, "{}={}\n", k_str, v_str));
+                }
+            }
+        }
+        Ok(())
+    }
+}
+
+impl Ini {
+    /// Load from a string
+    pub fn load_from_str(buf: &str) -> Result<Ini, Error> {
+        let mut parser = Parser::new(buf.chars());
+        parser.parse()
+    }
+
+    /// Load from a reader
+    pub fn read_from<R: Read>(reader: &mut R) -> Result<Ini, Error> {
+        let mut s = String::new();
+        try!(reader.read_to_string(&mut s).map_err(|err| {
+            Error {
+                line: 0,
+                col: 0,
+                msg: format!("{}", err),
+            }
+        }));
+        let mut parser = Parser::new(s.chars());
+        parser.parse()
+    }
+
+    /// Load from a file
+    pub fn load_from_file<P: AsRef<Path>>(filename: P) -> Result<Ini, Error> {
+        let mut reader = match File::open(filename.as_ref()) {
+            Err(e) => {
+                return Err(Error {
+                    line: 0,
+                    col: 0,
+                    msg: format!("Unable to open `{:?}`: {}", filename.as_ref(), e),
+                })
+            }
+            Ok(r) => r,
+        };
+        Ini::read_from(&mut reader)
+    }
+}
+
+/// Iterator for sections
+pub struct SectionIterator<'a> {
+    mapiter: Iter<'a, Option<String>, Properties>,
+}
+
+/// Iterator for mutable sections
+pub struct SectionMutIterator<'a> {
+    mapiter: IterMut<'a, Option<String>, Properties>,
+}
+
+impl<'a> Ini {
+    /// Immutable iterate though sections
+    pub fn iter(&'a self) -> SectionIterator<'a> {
+        SectionIterator { mapiter: self.sections.iter() }
+    }
+
+    /// Mutable iterate though sections
+    /// *Deprecated! Use `iter_mut` instead!*
+    pub fn mut_iter(&'a mut self) -> SectionMutIterator<'a> {
+        SectionMutIterator { mapiter: self.sections.iter_mut() }
+    }
+
+    /// Mutable iterate though sections
+    pub fn iter_mut(&'a mut self) -> SectionMutIterator<'a> {
+        SectionMutIterator { mapiter: self.sections.iter_mut() }
+    }
+}
+
+impl<'a> Iterator for SectionIterator<'a> {
+    type Item = (&'a Option<String>, &'a Properties);
+
+    #[inline]
+    fn next(&mut self) -> Option<(&'a Option<String>, &'a Properties)> {
+        self.mapiter.next()
+    }
+}
+
+impl<'a> Iterator for SectionMutIterator<'a> {
+    type Item = (&'a Option<String>, &'a mut Properties);
+
+    #[inline]
+    fn next(&mut self) -> Option<(&'a Option<String>, &'a mut Properties)> {
+        self.mapiter.next()
+    }
+}
+
+impl<'a> IntoIterator for &'a Ini {
+    type Item = (&'a Option<String>, &'a Properties);
+    type IntoIter = SectionIterator<'a>;
+
+    fn into_iter(self) -> SectionIterator<'a> {
+        self.iter()
+    }
+}
+
+impl<'a> IntoIterator for &'a mut Ini {
+    type Item = (&'a Option<String>, &'a mut Properties);
+    type IntoIter = SectionMutIterator<'a>;
+
+    fn into_iter(self) -> SectionMutIterator<'a> {
+        self.iter_mut()
+    }
+}
+
+pub struct SectionIntoIter {
+    iter: IntoIter<Option<String>, Properties>,
+}
+
+impl Iterator for SectionIntoIter {
+    type Item = (Option<String>, Properties);
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next()
+    }
+}
+
+impl IntoIterator for Ini {
+    type Item = (Option<String>, Properties);
+    type IntoIter = SectionIntoIter;
+
+    fn into_iter(self) -> SectionIntoIter {
+        SectionIntoIter { iter: self.sections.into_iter() }
+    }
+}
+
+// Ini parser
+struct Parser<'a> {
+    ch: Option<char>,
+    rdr: Chars<'a>,
+    line: usize,
+    col: usize,
+}
+
+#[derive(Debug)]
+/// Parse error
+pub struct Error {
+    pub line: usize,
+    pub col: usize,
+    pub msg: String,
+}
+
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}:{} {}", self.line, self.col, self.msg)
+    }
+}
+
+impl error::Error for Error {
+    fn description(&self) -> &str {
+        self.msg.as_str()
+    }
+
+    fn cause(&self) -> Option<&error::Error> {
+        None
+    }
+}
+
+impl<'a> Parser<'a> {
+    // Create a parser
+    pub fn new(rdr: Chars<'a>) -> Parser<'a> {
+        let mut p = Parser {
+            ch: None,
+            line: 0,
+            col: 0,
+            rdr: rdr,
+        };
+        p.bump();
+        p
+    }
+
+    fn eof(&self) -> bool {
+        self.ch.is_none()
+    }
+
+    fn bump(&mut self) {
+        self.ch = self.rdr.next();
+        match self.ch {
+            Some('\n') => {
+                self.line += 1;
+                self.col = 0;
+            }
+            Some(..) => {
+                self.col += 1;
+            }
+            None => {}
+        }
+    }
+
+    fn error<U>(&self, msg: String) -> Result<U, Error> {
+        Err(Error {
+            line: self.line,
+            col: self.col,
+            msg: msg.clone(),
+        })
+    }
+
+    /// Consume all the white space until the end of the line or a tab
+    fn parse_whitespace(&mut self) {
+        while let Some(c) = self.ch {
+            if !c.is_whitespace() && c != '\n' && c != '\t' && c != '\r' {
+                break;
+            }
+            self.bump();
+        }
+    }
+
+    /// Consume all the white space except line break
+    fn parse_whitespace_except_line_break(&mut self) {
+        while let Some(c) = self.ch {
+            if (c == '\n' || c == '\r' || !c.is_whitespace()) && c != '\t' {
+                break;
+            }
+            self.bump();
+        }
+    }
+
+    /// Parse the whole INI input
+    pub fn parse(&mut self) -> Result<Ini, Error> {
+        let mut result = Ini::new();
+        let mut curkey: String = "".into();
+        let mut cursec: Option<String> = None;
+
+        self.parse_whitespace();
+        while let Some(cur_ch) = self.ch {
+            debug!("line:{}, col:{}", self.line, self.col);
+            match cur_ch {
+                ';' | '#' => {
+                    self.parse_comment();
+                    debug!("parse comment");
+                }
+                '[' => {
+                    match self.parse_section() {
+                        Ok(sec) => {
+                            let msec = &sec[..].trim();
+                            debug!("Got section: {}", msec);
+                            cursec = Some(msec.to_string());
+                            result.sections.entry(cursec.clone()).or_insert(HashMap::new());
+                            self.bump();
+                        }
+                        Err(e) => return Err(e),
+                    }
+                }
+                '=' | ':' => {
+                    if (&curkey[..]).is_empty() {
+                        return self.error("Missing key".to_string());
+                    }
+                    match self.parse_val() {
+                        Ok(val) => {
+                            let mval = val[..].trim().to_owned();
+                            debug!("Got value: {}", mval);
+                            let sec = result.sections
+                                .entry(cursec.clone())
+                                .or_insert(HashMap::new());
+                            sec.insert(curkey, mval);
+                            curkey = "".into();
+                        }
+                        Err(e) => return Err(e),
+                    }
+                }
+                _ => {
+                    match self.parse_key() {
+                        Ok(key) => {
+                            let mkey: String = key[..].trim().to_owned();
+                            debug!("Got key: {}", mkey);
+                            curkey = mkey.into();
+                        }
+                        Err(e) => return Err(e),
+                    }
+                }
+            }
+
+            self.parse_whitespace();
+        }
+
+        Ok(result)
+    }
+
+    fn parse_comment(&mut self) {
+        while let Some(c) = self.ch {
+            self.bump();
+            if c == '\n' {
+                break;
+            }
+        }
+    }
+
+    fn parse_str_until(&mut self, endpoint: &[Option<char>]) -> Result<String, Error> {
+        let mut result: String = String::new();
+
+        while !endpoint.contains(&self.ch) {
+            match self.ch {
+                None => {
+                    return self.error(format!("Expecting \"{:?}\" but found EOF.", endpoint));
+                }
+                Some('\\') => {
+                    self.bump();
+                    if self.eof() {
+                        return self.error(format!("Expecting \"{:?}\" but found EOF.", endpoint));
+                    }
+                    match self.ch.unwrap() {
+                        '0' => result.push('\0'),
+                        'a' => result.push('\x07'),
+                        'b' => result.push('\x08'),
+                        't' => result.push('\t'),
+                        'r' => result.push('\r'),
+                        'n' => result.push('\n'),
+                        '\n' => (),
+                        'x' => {
+                            // Unicode 4 character
+                            let mut code: String = String::with_capacity(4);
+                            for _ in 0..4 {
+                                self.bump();
+                                if self.eof() {
+                                    return self.error(format!("Expecting \"{:?}\" but found EOF.",
+                                                              endpoint));
+                                } else if let Some('\\') = self.ch {
+                                    self.bump();
+                                    if self.ch != Some('\n') {
+                                        return self.error(format!("Expecting \"\\\\n\" but \
+                                                                   found \"{:?}\".",
+                                                                  self.ch));
+                                    }
+                                }
+                                code.push(self.ch.unwrap());
+                            }
+                            let r = u32::from_str_radix(&code[..], 16);
+                            match r {
+                                Ok(c) => result.push(char::from_u32(c).unwrap()),
+                                Err(_) => return self.error("Unknown character.".to_string()),
+                            }
+                        }
+                        c => result.push(c),
+                    }
+                }
+                Some(c) => {
+                    result.push(c);
+                }
+            }
+            self.bump();
+        }
+        Ok(result)
+    }
+
+    fn parse_section(&mut self) -> Result<String, Error> {
+        // Skip [
+        self.bump();
+        self.parse_str_until(&[Some(']')])
+    }
+
+    fn parse_key(&mut self) -> Result<String, Error> {
+        self.parse_str_until(&[Some('='), Some(':')])
+    }
+
+    fn parse_val(&mut self) -> Result<String, Error> {
+        self.bump();
+        // Issue #35: Allow empty value
+        self.parse_whitespace_except_line_break();
+
+        match self.ch {
+            None => Ok(String::new()),
+            Some('"') => {
+                self.bump();
+                self.parse_str_until(&[Some('"')]).and_then(|s| {
+                    self.bump(); // Eats the last "
+                    Ok(s)
+                })
+            }
+            Some('\'') => {
+                self.bump();
+                self.parse_str_until(&[Some('\'')]).and_then(|s| {
+                    self.bump(); // Eats the last '
+                    Ok(s)
+                })
+            }
+            _ => self.parse_str_until(&[Some('\n'), Some('\r'), Some(';'), Some('#'), None]),
+        }
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+#[cfg(test)]
+mod test {
+    use ini::*;
+
+    #[test]
+    fn load_from_str_with_valid_input() {
+        let input = "[sec1]\nkey1=val1\nkey2=377\n[sec2]foo=bar\n";
+        let opt = Ini::load_from_str(input);
+        assert!(opt.is_ok());
+
+        let output = opt.unwrap();
+        assert_eq!(output.sections.len(), 2);
+        assert!(output.sections.contains_key(&Some("sec1".into())));
+
+        let sec1 = &output.sections[&Some("sec1".into())];
+        assert_eq!(sec1.len(), 2);
+        let key1: String = "key1".into();
+        assert!(sec1.contains_key(&key1));
+        let key2: String = "key2".into();
+        assert!(sec1.contains_key(&key2));
+        let val1: String = "val1".into();
+        assert_eq!(sec1[&key1], val1);
+        let val2: String = "377".into();
+        assert_eq!(sec1[&key2], val2);
+
+    }
+
+    #[test]
+    fn load_from_str_without_ending_newline() {
+        let input = "[sec1]\nkey1=val1\nkey2=377\n[sec2]foo=bar";
+        let opt = Ini::load_from_str(input);
+        assert!(opt.is_ok());
+    }
+
+    #[test]
+    fn test_parse_comment() {
+        let input = "; abcdefghijklmn\n";
+        let opt = Ini::load_from_str(input);
+        assert!(opt.is_ok());
+    }
+
+    #[test]
+    fn test_inline_comment() {
+        let input = "
+[section name]
+name = hello # abcdefg
+gender = mail ; abdddd
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "name").unwrap(), "hello");
+    }
+
+    #[test]
+    fn test_sharp_comment() {
+        let input = "
+[section name]
+name = hello
+# abcdefg
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "name").unwrap(), "hello");
+    }
+
+    #[test]
+    fn test_iter() {
+        let input = "
+[section name]
+name = hello # abcdefg
+gender = mail ; abdddd
+";
+        let mut ini = Ini::load_from_str(input).unwrap();
+
+        for (_, _) in &mut ini {}
+        for (_, _) in &ini {}
+        for (_, _) in ini {}
+    }
+
+    #[test]
+    fn test_colon() {
+        let input = "
+[section name]
+name: hello # abcdefg
+gender : mail ; abdddd
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "name").unwrap(), "hello");
+        assert_eq!(ini.get_from(Some("section name"), "gender").unwrap(),
+                   "mail");
+    }
+
+    #[test]
+    fn test_string() {
+        let input = "
+[section name]
+# This is a comment
+Key = \"Value\"
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "Key").unwrap(), "Value");
+    }
+
+    #[test]
+    fn test_string_multiline() {
+        let input = "
+[section name]
+# This is a comment
+Key = \"Value
+Otherline\"
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "Key").unwrap(),
+                   "Value\nOtherline");
+    }
+
+    #[test]
+    fn test_string_comment() {
+        let input = "
+[section name]
+# This is a comment
+Key = \"Value   # This is not a comment ; at all\"
+Stuff = Other
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "Key").unwrap(),
+                   "Value   # This is not a comment ; at all");
+    }
+
+    #[test]
+    fn test_string_single() {
+        let input = "
+[section name]
+# This is a comment
+Key = 'Value'
+Stuff = Other
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "Key").unwrap(), "Value");
+    }
+
+    #[test]
+    fn test_string_includes_quote() {
+        let input = "
+[Test]
+Comment[tr]=Ä°nternet'e eriÅŸin
+Comment[uk]=ДоÑтуп до Інтернету
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("Test"), "Comment[tr]").unwrap(),
+                   "Ä°nternet'e eriÅŸin");
+    }
+
+    #[test]
+    fn test_string_single_multiline() {
+        let input = "
+[section name]
+# This is a comment
+Key = 'Value
+Otherline'
+Stuff = Other
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "Key").unwrap(),
+                   "Value\nOtherline");
+    }
+
+    #[test]
+    fn test_string_single_comment() {
+        let input = "
+[section name]
+# This is a comment
+Key = 'Value   # This is not a comment ; at all'
+";
+        let ini = Ini::load_from_str(input).unwrap();
+        assert_eq!(ini.get_from(Some("section name"), "Key").unwrap(),
+                   "Value   # This is not a comment ; at all");
+    }
+
+    #[test]
+    fn load_from_str_with_valid_empty_input() {
+        let input = "key1=\nkey2=val2\n";
+        let opt = Ini::load_from_str(input);
+        assert!(opt.is_ok());
+
+        let output = opt.unwrap();
+        assert_eq!(output.sections.len(), 1);
+        assert!(output.sections.contains_key(&None::<String>));
+
+        let sec1 = &output.sections[&None::<String>];
+        assert_eq!(sec1.len(), 2);
+        let key1: String = "key1".into();
+        assert!(sec1.contains_key(&key1));
+        let key2: String = "key2".into();
+        assert!(sec1.contains_key(&key2));
+        let val1: String = "".into();
+        assert_eq!(sec1[&key1], val1);
+        let val2: String = "val2".into();
+        assert_eq!(sec1[&key2], val2);
+    }
+
+    #[test]
+    fn load_from_str_with_crlf() {
+        let input = "key1=val1\r\nkey2=val2\r\n";
+        let opt = Ini::load_from_str(input);
+        assert!(opt.is_ok());
+
+        let output = opt.unwrap();
+        assert_eq!(output.sections.len(), 1);
+        assert!(output.sections.contains_key(&None::<String>));
+        let sec1 = &output.sections[&None::<String>];
+        assert_eq!(sec1.len(), 2);
+        let key1: String = "key1".into();
+        assert!(sec1.contains_key(&key1));
+        let key2: String = "key2".into();
+        assert!(sec1.contains_key(&key2));
+        let val1: String = "val1".into();
+        assert_eq!(sec1[&key1], val1);
+        let val2: String = "val2".into();
+        assert_eq!(sec1[&key2], val2);
+    }
+
+    #[test]
+    fn load_from_str_with_cr() {
+        let input = "key1=val1\rkey2=val2\r";
+        let opt = Ini::load_from_str(input);
+        assert!(opt.is_ok());
+
+        let output = opt.unwrap();
+        assert_eq!(output.sections.len(), 1);
+        assert!(output.sections.contains_key(&None::<String>));
+        let sec1 = &output.sections[&None::<String>];
+        assert_eq!(sec1.len(), 2);
+        let key1: String = "key1".into();
+        assert!(sec1.contains_key(&key1));
+        let key2: String = "key2".into();
+        assert!(sec1.contains_key(&key2));
+        let val1: String = "val1".into();
+        assert_eq!(sec1[&key1], val1);
+        let val2: String = "val2".into();
+        assert_eq!(sec1[&key2], val2);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rust-ini/src/lib.rs
@@ -0,0 +1,49 @@
+// The MIT License (MIT)
+
+// Copyright (c) 2014 Y. T. CHUNG
+
+// 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 AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+//! Ini parser for Rust
+//!
+//! ```no_run
+//! use ini::Ini;
+//!
+//! let mut conf = Ini::new();
+//! conf.with_section(Some("User".to_owned()))
+//!     .set("name", "Raspberry树莓")
+//!     .set("value", "Pi");
+//! conf.with_section(Some("Library".to_owned()))
+//!     .set("name", "Sun Yat-sen U")
+//!     .set("location", "Guangzhou=world");
+//! conf.write_to_file("conf.ini").unwrap();
+//!
+//!
+//! let i = Ini::load_from_file("conf.ini").unwrap();
+//! for (sec, prop) in i.iter() {
+//!    println!("Section: {:?}", *sec);
+//!    for (k, v) in prop.iter() {
+//!        println!("{}:{}", *k, *v);
+//!    }
+//! }
+//! ```
+
+#[macro_use] extern crate log;
+
+pub use ini::Ini;
+pub mod ini;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"ff608da9edb53d86860db37ca32b87abb9423785544d763b0776eb654e1896c0","Cargo.toml":"f36d04ef66479455b1adb0a96e7c7ee16282f526dfa241ee878c9f810a11e93f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"2ab3793abfd94209549d28f157f223ff43a7f3bfeefe90cf5572ed49c69c52fd","src/lib.rs":"60a242b81e0bbe06dfeec2640a31d5d71458a35c187b5b3c3ee30fc9a2d0ddd5"},"package":"3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/.travis.yml
@@ -0,0 +1,20 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+before_script:
+  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
+script:
+  - cargo build
+  - cargo test
+  - cargo doc
+after_success:
+  - travis-cargo --only nightly doc-upload
+notifications:
+  email:
+    on_success: never
+env:
+  global:
+    secure: "VWE8DaftZLOj34USRPiq2jyFV1xWrPJP0lgMVWPGF52soyWV6L5FyMlbk00GvKH8y5h0urtuVFmInsLKz1E96eTLbD7Efa2snjSlOWMsTaWy3yq0NNuPraMWiXUkjDBxW3DTV47HN9thYA7TbrM35A0XGr7fXKl4CPT/UKEo2nNZPb2Y2XYaD6RID1sXMOvemOERGu7Lnq8dQ/PdGWWkpTV4FVsmq2wTyyZnzsEFsK0r/wqEPPHSl8r3NH6Rid9kCMw3h1d9s1eYSqzP09/fYfjy+X/6iGV9dL5WUQFL7xG7WjfZZG/e87lAxbXx+jXTlncdvXjm4BmIOYHeEMK9N5D3qE5C1gIIU+tk6ZuVKBLWMQJnAIDJKCsVdUhAXtWqbFK4djvNJUml1rIOF/CVUeynBVtacJ8nlxyh61XvDHbZGSBFBR2odEkhUaLzw/t/zqOIYd0u+mjtM4pX1nZ+ZFIMqVFsNTfVWWMDLyRVBNiAoHCdn/ug+mJJaYE3mZ2q1wPPqJVFffyaZVyg97zFO0y9v5ASHjb/7nYlIPoDGDPDUuoscuw5IYf+6CoCi7EgGqg5v7X1BsBXSYK+XfzOvrAqP31ixNGyVJEcBjAaJXwopx6KVIqWe71eHJDX68VeI0ncfCPDDQIReKA7MBhq5PzRDzr4iRHZAhNyuKgo+Fo="
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "rustc-demangle"
+version = "0.1.4"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+license = "MIT/Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/alexcrichton/rustc-demangle"
+homepage = "https://github.com/alexcrichton/rustc-demangle"
+documentation = "http://alexcrichton.com/rustc-demangle"
+description = """
+Rust compiler symbol demangling.
+"""
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/README.md
@@ -0,0 +1,15 @@
+# rustc-demangle
+
+Symbol demangling for Rust
+
+[![Build Status](https://travis-ci.org/alexcrichton/rustc-demangle.svg?branch=master)](https://travis-ci.org/alexcrichton/rustc-demangle)
+
+[Documentation](http://alexcrichton.com/rustc-demangle)
+
+# License
+
+`rustc-demangle` is primarily distributed under the terms of both the MIT license and
+the Apache License (Version 2.0), with portions covered by various BSD-like
+licenses.
+
+See LICENSE-APACHE, and LICENSE-MIT for details.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc-demangle/src/lib.rs
@@ -0,0 +1,350 @@
+//! Demangle Rust compiler symbol names.
+//!
+//! This crate provides a `demangle` function which will return a `Demangle`
+//! sentinel value that can be used to learn about the demangled version of a
+//! symbol name. The demangled representation will be the same as the original
+//! if it doesn't look like a mangled symbol name.
+//!
+//! `Demangle` can be formatted with the `Display` trait. The alternate
+//! modifier (`#`) can be used to format the symbol name without the
+//! trailing hash value.
+//!
+//! # Examples
+//!
+//! ```
+//! use rustc_demangle::demangle;
+//!
+//! assert_eq!(demangle("_ZN4testE").to_string(), "test");
+//! assert_eq!(demangle("_ZN3foo3barE").to_string(), "foo::bar");
+//! assert_eq!(demangle("foo").to_string(), "foo");
+//! // With hash
+//! assert_eq!(format!("{}", demangle("_ZN3foo17h05af221e174051e9E")), "foo::h05af221e174051e9");
+//! // Without hash
+//! assert_eq!(format!("{:#}", demangle("_ZN3foo17h05af221e174051e9E")), "foo");
+//! ```
+
+#![no_std]
+#![deny(missing_docs)]
+
+#[cfg(test)]
+#[macro_use]
+extern crate std;
+
+use core::fmt;
+
+/// Representation of a demangled symbol name.
+pub struct Demangle<'a> {
+    original: &'a str,
+    inner: &'a str,
+    valid: bool,
+    /// The number of ::-separated elements in the original name.
+    elements: usize,
+}
+
+/// De-mangles a Rust symbol into a more readable version
+///
+/// All rust symbols by default are mangled as they contain characters that
+/// cannot be represented in all object files. The mangling mechanism is similar
+/// to C++'s, but Rust has a few specifics to handle items like lifetimes in
+/// symbols.
+///
+/// This function will take a **mangled** symbol (typically acquired from a
+/// `Symbol` which is in turn resolved from a `Frame`) and then writes the
+/// de-mangled version into the given `writer`. If the symbol does not look like
+/// a mangled symbol, it is still written to `writer`.
+///
+/// # Examples
+///
+/// ```
+/// use rustc_demangle::demangle;
+///
+/// assert_eq!(demangle("_ZN4testE").to_string(), "test");
+/// assert_eq!(demangle("_ZN3foo3barE").to_string(), "foo::bar");
+/// assert_eq!(demangle("foo").to_string(), "foo");
+/// ```
+
+// All rust symbols are in theory lists of "::"-separated identifiers. Some
+// assemblers, however, can't handle these characters in symbol names. To get
+// around this, we use C++-style mangling. The mangling method is:
+//
+// 1. Prefix the symbol with "_ZN"
+// 2. For each element of the path, emit the length plus the element
+// 3. End the path with "E"
+//
+// For example, "_ZN4testE" => "test" and "_ZN3foo3barE" => "foo::bar".
+//
+// We're the ones printing our backtraces, so we can't rely on anything else to
+// demangle our symbols. It's *much* nicer to look at demangled symbols, so
+// this function is implemented to give us nice pretty output.
+//
+// Note that this demangler isn't quite as fancy as it could be. We have lots
+// of other information in our symbols like hashes, version, type information,
+// etc. Additionally, this doesn't handle glue symbols at all.
+pub fn demangle(s: &str) -> Demangle {
+    // First validate the symbol. If it doesn't look like anything we're
+    // expecting, we just print it literally. Note that we must handle non-rust
+    // symbols because we could have any function in the backtrace.
+    let mut valid = true;
+    let mut inner = s;
+    if s.len() > 4 && s.starts_with("_ZN") && s.ends_with('E') {
+        inner = &s[3..s.len() - 1];
+    } else if s.len() > 3 && s.starts_with("ZN") && s.ends_with('E') {
+        // On Windows, dbghelp strips leading underscores, so we accept "ZN...E"
+        // form too.
+        inner = &s[2..s.len() - 1];
+    } else {
+        valid = false;
+    }
+
+    let mut elements = 0;
+    if valid {
+        let mut chars = inner.chars();
+        while valid {
+            let mut i = 0;
+            for c in chars.by_ref() {
+                if c.is_digit(10) {
+                    i = i * 10 + c as usize - '0' as usize;
+                } else {
+                    break;
+                }
+            }
+            if i == 0 {
+                valid = chars.next().is_none();
+                break;
+            } else if chars.by_ref().take(i - 1).count() != i - 1 {
+                valid = false;
+            } else {
+                elements += 1;
+            }
+        }
+    }
+
+    Demangle {
+        inner: inner,
+        valid: valid,
+        elements: elements,
+        original: s,
+    }
+}
+
+/// Error returned from the `try_demangle` function below when demangling fails.
+#[derive(Debug, Clone)]
+pub struct TryDemangleError {
+    _priv: (),
+}
+
+/// The same as `demangle`, except return an `Err` if the string does not appear
+/// to be a Rust symbol, rather than "demangling" the given string as a no-op.
+///
+/// ```
+/// extern crate rustc_demangle;
+///
+/// let not_a_rust_symbol = "la la la";
+///
+/// // The `try_demangle` function will reject strings which are not Rust symbols.
+/// assert!(rustc_demangle::try_demangle(not_a_rust_symbol).is_err());
+///
+/// // While `demangle` will just pass the non-symbol through as a no-op.
+/// assert_eq!(rustc_demangle::demangle(not_a_rust_symbol).as_str(), not_a_rust_symbol);
+/// ```
+pub fn try_demangle(s: &str) -> Result<Demangle, TryDemangleError> {
+    let sym = demangle(s);
+    if sym.valid {
+        Ok(sym)
+    } else {
+        Err(TryDemangleError { _priv: () })
+    }
+}
+
+impl<'a> Demangle<'a> {
+    /// Returns the underlying string that's being demangled.
+    pub fn as_str(&self) -> &'a str {
+        self.original
+    }
+}
+
+// Rust hashes are hex digits with an `h` prepended.
+fn is_rust_hash(s: &str) -> bool {
+    s.starts_with('h') && s[1..].chars().all(|c| c.is_digit(16))
+}
+
+impl<'a> fmt::Display for Demangle<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        // Alright, let's do this.
+        if !self.valid {
+            return f.write_str(self.inner);
+        }
+
+        let mut inner = self.inner;
+        for element in 0..self.elements {
+            let mut rest = inner;
+            while rest.chars().next().unwrap().is_digit(10) {
+                rest = &rest[1..];
+            }
+            let i: usize = inner[..(inner.len() - rest.len())].parse().unwrap();
+            inner = &rest[i..];
+            rest = &rest[..i];
+            // Skip printing the hash if alternate formatting
+            // was requested.
+            if f.alternate() && element+1 == self.elements && is_rust_hash(&rest) {
+                break;
+            }
+            if element != 0 {
+                try!(f.write_str("::"));
+            }
+            if rest.starts_with("_$") {
+                rest = &rest[1..];
+            }
+            while !rest.is_empty() {
+                if rest.starts_with('.') {
+                    if let Some('.') = rest[1..].chars().next() {
+                        try!(f.write_str("::"));
+                        rest = &rest[2..];
+                    } else {
+                        try!(f.write_str("."));
+                        rest = &rest[1..];
+                    }
+                } else if rest.starts_with('$') {
+                    macro_rules! demangle {
+                        ($($pat:expr => $demangled:expr),*) => ({
+                            $(if rest.starts_with($pat) {
+                                try!(f.write_str($demangled));
+                                rest = &rest[$pat.len()..];
+                              } else)*
+                            {
+                                try!(f.write_str(rest));
+                                break;
+                            }
+
+                        })
+                    }
+
+                    // see src/librustc/back/link.rs for these mappings
+                    demangle! {
+                        "$SP$" => "@",
+                        "$BP$" => "*",
+                        "$RF$" => "&",
+                        "$LT$" => "<",
+                        "$GT$" => ">",
+                        "$LP$" => "(",
+                        "$RP$" => ")",
+                        "$C$" => ",",
+
+                        // in theory we can demangle any Unicode code point, but
+                        // for simplicity we just catch the common ones.
+                        "$u7e$" => "~",
+                        "$u20$" => " ",
+                        "$u27$" => "'",
+                        "$u5b$" => "[",
+                        "$u5d$" => "]",
+                        "$u7b$" => "{",
+                        "$u7d$" => "}",
+                        "$u3b$" => ";",
+                        "$u2b$" => "+",
+                        "$u22$" => "\""
+                    }
+                } else {
+                    let idx = match rest.char_indices().find(|&(_, c)| c == '$' || c == '.') {
+                        None => rest.len(),
+                        Some((i, _)) => i,
+                    };
+                    try!(f.write_str(&rest[..idx]));
+                    rest = &rest[idx..];
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl<'a> fmt::Debug for Demangle<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::prelude::v1::*;
+
+    macro_rules! t {
+        ($a:expr, $b:expr) => ({
+            assert_eq!(super::demangle($a).to_string(), $b);
+        })
+    }
+
+    macro_rules! t_nohash {
+        ($a:expr, $b:expr) => ({
+            assert_eq!(format!("{:#}", super::demangle($a)), $b);
+        })
+    }
+
+    #[test]
+    fn demangle() {
+        t!("test", "test");
+        t!("_ZN4testE", "test");
+        t!("_ZN4test", "_ZN4test");
+        t!("_ZN4test1a2bcE", "test::a::bc");
+    }
+
+    #[test]
+    fn demangle_dollars() {
+        t!("_ZN4$RP$E", ")");
+        t!("_ZN8$RF$testE", "&test");
+        t!("_ZN8$BP$test4foobE", "*test::foob");
+        t!("_ZN9$u20$test4foobE", " test::foob");
+        t!("_ZN35Bar$LT$$u5b$u32$u3b$$u20$4$u5d$$GT$E", "Bar<[u32; 4]>");
+    }
+
+    #[test]
+    fn demangle_many_dollars() {
+        t!("_ZN13test$u20$test4foobE", "test test::foob");
+        t!("_ZN12test$BP$test4foobE", "test*test::foob");
+    }
+
+    #[test]
+    fn demangle_windows() {
+        t!("ZN4testE", "test");
+        t!("ZN13test$u20$test4foobE", "test test::foob");
+        t!("ZN12test$RF$test4foobE", "test&test::foob");
+    }
+
+    #[test]
+    fn demangle_elements_beginning_with_underscore() {
+        t!("_ZN13_$LT$test$GT$E", "<test>");
+        t!("_ZN28_$u7b$$u7b$closure$u7d$$u7d$E", "{{closure}}");
+        t!("_ZN15__STATIC_FMTSTRE", "__STATIC_FMTSTR");
+    }
+
+    #[test]
+    fn demangle_trait_impls() {
+        t!("_ZN71_$LT$Test$u20$$u2b$$u20$$u27$static$u20$as$u20$foo..Bar$LT$Test$GT$$GT$3barE",
+           "<Test + 'static as foo::Bar<Test>>::bar");
+    }
+
+    #[test]
+    fn demangle_without_hash() {
+        let s = "_ZN3foo17h05af221e174051e9E";
+        t!(s, "foo::h05af221e174051e9");
+        t_nohash!(s, "foo");
+    }
+
+    #[test]
+    fn demangle_without_hash_edgecases() {
+        // One element, no hash.
+        t_nohash!("_ZN3fooE", "foo");
+        // Two elements, no hash.
+        t_nohash!("_ZN3foo3barE", "foo::bar");
+        // Longer-than-normal hash.
+        t_nohash!("_ZN3foo20h05af221e174051e9abcE", "foo");
+        // Shorter-than-normal hash.
+        t_nohash!("_ZN3foo5h05afE", "foo");
+        // Valid hash, but not at the end.
+        t_nohash!("_ZN17h05af221e174051e93fooE", "h05af221e174051e9::foo");
+        // Not a valid hash, missing the 'h'.
+        t_nohash!("_ZN3foo16ffaf221e174051e9E", "foo::ffaf221e174051e9");
+        // Not a valid hash, has a non-hex-digit.
+        t_nohash!("_ZN3foo17hg5af221e174051e9E", "foo::hg5af221e174051e9");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"8d53e23f58f8a03e60b672e7f95116d460fa07088f7f79b519eed425d6195fbe","Cargo.toml":"da5362f4dbb92819294321cca160d67acda7d5950c803577729623ccf4df1c0f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"9cfa2d130fcb833e436c35c92d9843dcc7660ff944e63638b86e96f29cc8009e","src/lib.rs":"00ad5b5776e357732445e483983f6c7efa4054164f36000501edb8910a182db5"},"package":"c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/.travis.yml
@@ -0,0 +1,25 @@
+language: rust
+rust:
+- nightly
+- beta
+- stable
+before_script:
+- |
+  pip install 'travis-cargo<0.2' --user &&
+  ln -s /bin/false $HOME/.local/bin/rustc &&
+  ln -s $HOME/rust/bin/rustc $HOME/.local/bin/real_rustc &&
+  export PATH=$HOME/.local/bin:$PATH &&
+  export RUSTC=real_rustc
+script:
+- |
+  travis-cargo build &&
+  travis-cargo test &&
+  rustdoc --test README.md -L dependency=./target/debug/deps --extern rustc_version=./target/debug/librustc_version.rlib &&
+  travis-cargo bench &&
+  travis-cargo --only stable doc
+after_success:
+- travis-cargo --only stable doc-upload
+env:
+  global:
+  - TRAVIS_CARGO_NIGHTLY_FEATURE=""
+  - secure: mxQyrd6tyvcC10H7crLgKSSRHwquSnLb5mjzaj8iXf4mkooKpoRaffIiwmGf0IACQUN3nKlA6D6irfD2CqaFiUiUav8RqeAd8FjHFTlYu0nKZkqB1iGZBA7/JrW7mlGJIdmNIbzVRoPRQI/lY/730M/eqxIAb+9/xaSktkD2cJYGUikdiyeTm8idezkB+BOOWIN20yopLWzmBIVs7doQJOA0ewqMlEduwn6axvEk17r9qlSgucywDsTvDWkXSAuYldyJU4PdFez4t10sGsXx+TKfbwcaRmwaOj/MImZUVCtQvutEW9Hb/2hJXjCN2uefZ64BfodKn3wyB7ie7PgOixsLkqoR01d/qbfDsWGg/4iLi3DCq5bVtWJoCCT4lS8kfwi8D8HmvcoCQnT+CdU4LhlV9aHTSEMx0SEJW0DHYE/RnoqJjCj+QsK4ji7HAnyYWVwSGYJfnrL0EAwKararAzKY/vABStJKu1IlBzKCsjIQ+0hMpqnFiWldhfRHt/rYhBtK+HYXElamc8xpF/taK8E40NSHDgC+4TciTAZtyAXOWiMhXS0653U3hvJqYY/LtHmobpIqc1XkHe53gQ0QrBd6UsyUN9FjWOLxvPUx4zcyNFJHXcFiwevfK6gYF+OXepVu8TznAQLSP7ToA7KXbhSSVQDM+7UFVcT41VgDbGY=
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "rustc_version"
+version = "0.1.7"
+authors = ["Marvin Löbel <loebel.marvin@gmail.com>"]
+license = "MIT OR Apache-2.0"
+
+description = "A library for querying the version of a installed rustc compiler"
+readme = "README.md"
+documentation = "http://kimundi.github.io/rustc-version-rs/rustc_version/index.html"
+
+repository = "https://github.com/Kimundi/rustc-version-rs"
+keywords = ["version", "rustc"]
+
+[dependencies]
+semver = "0.1"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2016 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/README.md
@@ -0,0 +1,75 @@
+rustc-version-rs
+==============
+
+[![Travis-CI Status](https://travis-ci.org/Kimundi/rustc-version-rs.png?branch=master)](https://travis-ci.org/Kimundi/rustc-version-rs)
+
+A library for querying the version of a installed rustc compiler.
+
+For more details, see the [docs](http://kimundi.github.io/rustc-version-rs/rustc_version/index.html).
+
+# Getting Started
+
+[rustc-version-rs is available on crates.io](https://crates.io/crates/rustc_version).
+Add the following dependency to your Cargo manifest to get the latest version of the 0.1 branch:
+```toml
+[dependencies]
+
+rustc_version = "0.1.*"
+```
+
+To always get the latest version, add this git repository to your
+Cargo manifest:
+
+```toml
+[dependencies.rustc_version]
+git = "https://github.com/Kimundi/rustc-version-rs"
+```
+# Example
+
+```rust
+// This could be a cargo build script
+
+extern crate rustc_version;
+use rustc_version::{version, version_matches, version_meta, Channel};
+
+fn main() {
+    // Assert we haven't travelled back in time
+    assert!(version().major >= 1);
+
+    // Set cfg flags depending on release channel
+    match version_meta().channel {
+        Channel::Stable => {
+            println!("cargo:rustc-cfg=RUSTC_IS_STABLE");
+        }
+        Channel::Beta => {
+            println!("cargo:rustc-cfg=RUSTC_IS_BETA");
+        }
+        Channel::Nightly => {
+            println!("cargo:rustc-cfg=RUSTC_IS_NIGHTLY");
+        }
+        Channel::Dev => {
+            println!("cargo:rustc-cfg=RUSTC_IS_DEV");
+        }
+    }
+
+    // Directly check a semver version requirment
+    if version_matches(">= 1.4.0") {
+        println!("cargo:rustc-cfg=compiler_has_important_bugfix");
+    }
+}
+```
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
+additional terms or conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/rustc_version/src/lib.rs
@@ -0,0 +1,292 @@
+// Copyright 2016 rustc-version-rs developers
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![warn(missing_docs)]
+
+//! Simple library for getting the version information of a `rustc`
+//! compiler.
+//!
+//! This calls `$RUSTC --version` and parses the output, falling
+//! back to `rustc` if `$RUSTC` is not set.
+//!
+//! # Example
+//!
+//! ```rust
+//! // This could be a cargo build script
+//!
+//! extern crate rustc_version;
+//! use rustc_version::{version, version_matches, version_meta, Channel};
+//!
+//! fn main() {
+//!     // Assert we haven't travelled back in time
+//!     assert!(version().major >= 1);
+//!
+//!     // Set cfg flags depending on release channel
+//!     match version_meta().channel {
+//!         Channel::Stable => {
+//!             println!("cargo:rustc-cfg=RUSTC_IS_STABLE");
+//!         }
+//!         Channel::Beta => {
+//!             println!("cargo:rustc-cfg=RUSTC_IS_BETA");
+//!         }
+//!         Channel::Nightly => {
+//!             println!("cargo:rustc-cfg=RUSTC_IS_NIGHTLY");
+//!         }
+//!         Channel::Dev => {
+//!             println!("cargo:rustc-cfg=RUSTC_IS_DEV");
+//!         }
+//!     }
+//!
+//!     // Directly check a semver version requirment
+//!     if version_matches(">= 1.4.0") {
+//!         println!("cargo:rustc-cfg=compiler_has_important_bugfix");
+//!     }
+//! }
+//! ```
+
+extern crate semver;
+use semver::{Version, VersionReq, Identifier};
+use std::process::Command;
+use std::env;
+use std::ffi::OsString;
+
+/// Release channel of the compiler.
+#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
+pub enum Channel {
+    /// Development release channel
+    Dev,
+    /// Nightly release channel
+    Nightly,
+    /// Beta release channel
+    Beta,
+    /// Stable release channel
+    Stable,
+}
+
+/// Rustc version plus metada like git short hash and build date.
+#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
+pub struct VersionMeta {
+    /// Version of the compiler
+    pub semver: Version,
+
+    /// Git short hash of the build of the compiler
+    pub commit_hash: Option<String>,
+
+    /// Commit date of the compiler
+    pub commit_date: Option<String>,
+
+    /// Build date of the compiler; this was removed between Rust 1.0.0 and 1.1.0.
+    pub build_date: Option<String>,
+
+    /// Release channel of the compiler
+    pub channel: Channel,
+
+    /// Host target triple of the compiler
+    pub host: String,
+
+    /// Short version string of the compiler
+    pub short_version_string: String,
+}
+
+/// Returns the `rustc` SemVer version.
+pub fn version() -> Version {
+    version_meta().semver
+}
+
+/// Returns the `rustc` SemVer version and additional metadata
+/// like the git short hash and build date.
+pub fn version_meta() -> VersionMeta {
+    let cmd = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
+
+    let out = Command::new(&cmd)
+        .arg("-vV")
+        .output()
+        .unwrap_or_else(|e| { panic!("failed to execute `RUSTC -vV`: {}", e) });
+
+    let out = String::from_utf8(out.stdout)
+        .ok()
+        .expect("non utf8 output from RUSTC -vV");
+
+    version_meta_for(&out)
+}
+
+/// Parses a "rustc -vV" output string and returns
+/// the SemVer version and additional metadata
+/// like the git short hash and build date.
+pub fn version_meta_for(verbose_version_string: &str) -> VersionMeta {
+    let out: Vec<_> = verbose_version_string.lines().collect();
+
+    const ERR_MSG: &'static str = "unexpected -vV format";
+
+    assert!(out.len() == 6 || out.len() == 7, ERR_MSG);
+
+    let short_version_string = out[0];
+
+    fn expect_prefix<'a>(line: &'a str, prefix: &str) -> &'a str {
+        assert!(line.starts_with(prefix), ERR_MSG);
+        &line[prefix.len()..]
+    }
+
+    let commit_hash = match expect_prefix(out[2], "commit-hash: ") {
+        "unknown" => None,
+        hash => Some(hash.to_owned()),
+    };
+
+    let commit_date = match expect_prefix(out[3], "commit-date: ") {
+        "unknown" => None,
+        hash => Some(hash.to_owned()),
+    };
+
+    // Handle that the build date may or may not be present.
+    let mut idx = 4;
+    let mut build_date = None;
+    if out[idx].starts_with("build-date") {
+        build_date = match expect_prefix(out[idx], "build-date: ") {
+            "unknown" => None,
+            s => Some(s.to_owned()),
+        };
+        idx = idx + 1;
+    }
+
+
+    let host = expect_prefix(out[idx], "host: ");
+    idx = idx +1;
+    let release = expect_prefix(out[idx], "release: ");
+
+    let semver = Version::parse(release).unwrap();
+
+    let channel = if semver.pre.is_empty() {
+        Channel::Stable
+    } else {
+        match semver.pre[0] {
+            Identifier::AlphaNumeric(ref s)
+                if s == "dev" => Channel::Dev,
+            Identifier::AlphaNumeric(ref s)
+                if s == "beta" => Channel::Beta,
+            Identifier::AlphaNumeric(ref s)
+                if s == "nightly" => Channel::Nightly,
+            ref x => panic!("Unknown pre-release tag {}", x),
+        }
+    };
+
+    VersionMeta {
+        semver: semver,
+        commit_hash: commit_hash,
+        commit_date: commit_date,
+        build_date: build_date,
+        channel: channel,
+        host: host.into(),
+        short_version_string: short_version_string.into(),
+    }
+}
+
+/// Check wether the `rustc` version matches the given SemVer
+/// version requirement.
+pub fn version_matches(req: &str) -> bool {
+    VersionReq::parse(req).unwrap().matches(&version())
+}
+
+#[test]
+fn smoketest() {
+    let v = version();
+    assert!(v.major >= 1);
+
+    let v = version_meta();
+    assert!(v.semver.major >= 1);
+
+    assert!(version_matches(">= 1.0.0"));
+}
+
+#[test]
+#[should_panic(expected = "unexpected")]
+// Characterization test for behavior on an unexpected key.
+fn parse_unexpected() {
+    version_meta_for(
+"rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
+binary: rustc
+commit-hash: a59de37e99060162a2674e3ff45409ac73595c0e
+commit-date: 2015-05-13
+rust-birthday: 2015-05-14
+host: x86_64-unknown-linux-gnu
+release: 1.0.0");
+}
+
+#[test]
+fn parse_1_0_0() {
+    let version = version_meta_for(
+"rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
+binary: rustc
+commit-hash: a59de37e99060162a2674e3ff45409ac73595c0e
+commit-date: 2015-05-13
+build-date: 2015-05-14
+host: x86_64-unknown-linux-gnu
+release: 1.0.0");
+
+    assert_eq!(version.semver, Version::parse("1.0.0").unwrap());
+    assert_eq!(version.commit_hash, Some("a59de37e99060162a2674e3ff45409ac73595c0e".into()));
+    assert_eq!(version.commit_date, Some("2015-05-13".into()));
+    assert_eq!(version.build_date, Some("2015-05-14".into()));
+    assert_eq!(version.channel, Channel::Stable);
+    assert_eq!(version.host, "x86_64-unknown-linux-gnu");
+    assert_eq!(version.short_version_string, "rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)");
+}
+
+
+#[test]
+fn parse_unknown() {
+    let version = version_meta_for(
+"rustc 1.3.0
+binary: rustc
+commit-hash: unknown
+commit-date: unknown
+host: x86_64-unknown-linux-gnu
+release: 1.3.0");
+
+    assert_eq!(version.semver, Version::parse("1.3.0").unwrap());
+    assert_eq!(version.commit_hash, None);
+    assert_eq!(version.commit_date, None);
+    assert_eq!(version.channel, Channel::Stable);
+    assert_eq!(version.host, "x86_64-unknown-linux-gnu");
+    assert_eq!(version.short_version_string, "rustc 1.3.0");
+}
+
+#[test]
+fn parse_nightly() {
+    let version = version_meta_for(
+"rustc 1.5.0-nightly (65d5c0833 2015-09-29)
+binary: rustc
+commit-hash: 65d5c083377645a115c4ac23a620d3581b9562b6
+commit-date: 2015-09-29
+host: x86_64-unknown-linux-gnu
+release: 1.5.0-nightly");
+
+    assert_eq!(version.semver, Version::parse("1.5.0-nightly").unwrap());
+    assert_eq!(version.commit_hash, Some("65d5c083377645a115c4ac23a620d3581b9562b6".into()));
+    assert_eq!(version.commit_date, Some("2015-09-29".into()));
+    assert_eq!(version.channel, Channel::Nightly);
+    assert_eq!(version.host, "x86_64-unknown-linux-gnu");
+    assert_eq!(version.short_version_string, "rustc 1.5.0-nightly (65d5c0833 2015-09-29)");
+}
+
+#[test]
+fn parse_stable() {
+    let version = version_meta_for(
+"rustc 1.3.0 (9a92aaf19 2015-09-15)
+binary: rustc
+commit-hash: 9a92aaf19a64603b02b4130fe52958cc12488900
+commit-date: 2015-09-15
+host: x86_64-unknown-linux-gnu
+release: 1.3.0");
+
+    assert_eq!(version.semver, Version::parse("1.3.0").unwrap());
+    assert_eq!(version.commit_hash, Some("9a92aaf19a64603b02b4130fe52958cc12488900".into()));
+    assert_eq!(version.commit_date, Some("2015-09-15".into()));
+    assert_eq!(version.channel, Channel::Stable);
+    assert_eq!(version.host, "x86_64-unknown-linux-gnu");
+    assert_eq!(version.short_version_string, "rustc 1.3.0 (9a92aaf19 2015-09-15)");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"9659c8f11da8480d67f59d6a5c5efcca98a55540af290691e1e4ac291d260c3f",".travis.yml":"b7ffa089fb467f8afaa9fc30f805d98316b5f1760ef20c8cbe50ef0b2f3e4256","Cargo.toml":"63791ada50820b81fbb92874b91a9ae710001c81c8119736811341a06e014b1b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"0b0ccc05312192ceddfb0c5ce6ea3fd339286775fbe14b381bb51436e3275546","src/lib.rs":"a7e0aa6048f1fbdeb9f36181492de91fff9544c52747e50474f3a6935940887d","src/version.rs":"2405e3461a6ae5a58972bc5abf638c22801eed13a7b787961bc48c8aeba88201","src/version_req.rs":"c8188011acb803900eb3da512d9ede8cca7f4e2cfb647ff2b4d6d24dfe81fe8a"},"package":"d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/.gitignore
@@ -0,0 +1,3 @@
+target/
+*.sw?
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/.travis.yml
@@ -0,0 +1,26 @@
+language: rust
+rust:
+  - 1.0.0
+  - 1.1.0
+  - beta
+  - nightly
+sudo: false
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo doc
+after_success: |
+  [ $TRAVIS_BRANCH = master ] &&
+  [ $TRAVIS_PULL_REQUEST = false ] &&
+  [ $TRAVIS_RUST_VERSION = nightly ] &&
+  echo '<meta http-equiv=refresh content=0;url=semver/index.html>' > target/doc/index.html &&
+  pip install ghp-import --user $USER &&
+  $HOME/.local/bin/ghp-import -n target/doc &&
+  git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
+language: rust
+env:
+  global:
+    secure: fFDquImTSjxHvuQw3QEZbOVfFMrtg9Ek0t7baAAVW29wf74IIrppBrUX8SPrWb4cuD5mI1gC7AZnaeq2FDAJ0EKKax/XrAtDL2Q42tnoIWpDJxOUBJ+js2v2l+hMpUBlX42vBcFJcOS56w8Nm7ru4bThP1ZL7BogoiBmi1Q7HYs=
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+
+name = "semver"
+version = "0.1.20"
+authors = ["The Rust Project Developers"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/rust-lang/semver"
+homepage = "https://github.com/rust-lang/semver"
+documentation = "http://doc.rust-lang.org/semver"
+description = """
+Semantic version parsing and comparison.
+"""
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/README.md
@@ -0,0 +1,104 @@
+semver
+======
+
+Semantic version parsing and comparison.
+
+[![Build Status](https://travis-ci.org/rust-lang/semver.svg?branch=master)](https://travis-ci.org/rust-lang/semver)
+
+[Documentation](http://doc.rust-lang.org/semver)
+
+Semantic versioning (see http://semver.org/) is a set of rules for
+assigning version numbers.
+
+## SemVer and the Rust ecosystem
+
+Rust itself follows the SemVer specification, as does its standard libraries. The two are
+not tied together.
+
+[Cargo](http://crates.io), Rust's package manager, uses SemVer to determine which versions of
+packages you need installed.
+
+## Installation
+
+To use `semver`, add these lines to your `Cargo.toml`:
+
+```toml
+[dependencies]
+semver = "*"
+```
+
+And this to your crate root:
+
+```rust
+extern crate semver;
+```
+
+## Versions
+
+At its simplest, the `semver` crate allows you to construct `Version` objects using the `parse`
+method:
+
+```{rust}
+use semver::Version;
+
+assert!(Version::parse("1.2.3") == Ok(Version {
+   major: 1,
+   minor: 2,
+   patch: 3,
+   pre: vec!(),
+   build: vec!(),
+}));
+```
+
+If you have multiple `Version`s, you can use the usual comparison operators to compare them:
+
+```{rust}
+use semver::Version;
+
+assert!(Version::parse("1.2.3-alpha")  != Version::parse("1.2.3-beta"));
+assert!(Version::parse("1.2.3-alpha2") >  Version::parse("1.2.0"));
+```
+
+## Requirements
+
+The `semver` crate also provides the ability to compare requirements, which are more complex
+comparisons.
+
+For example, creating a requirement that only matches versions greater than or
+equal to 1.0.0:
+
+```{rust}
+use semver::Version;
+use semver::VersionReq;
+
+let r = VersionReq::parse(">= 1.0.0").unwrap();
+let v = Version::parse("1.0.0").unwrap();
+
+assert!(r.to_string() == ">= 1.0.0".to_string());
+assert!(r.matches(&v))
+```
+
+It also allows parsing of `~x.y.z` and `^x.y.z` requirements as defined at
+https://www.npmjs.org/doc/misc/semver.html
+
+**Tilde requirements** specify a minimal version with some updates:
+
+```notrust
+~1.2.3 := >=1.2.3 <1.3.0
+~1.2   := >=1.2.0 <1.3.0
+~1     := >=1.0.0 <2.0.0
+```
+
+**Caret requirements** allow SemVer compatible updates to a specified version,
+`0.x` and `0.x+1` are not considered compatible, but `1.x` and `1.x+1` are.
+
+`0.0.x` is not considered compatible with any other version.
+Missing minor and patch versions are desugared to `0` but allow flexibility for that value.
+
+```notrust
+^1.2.3 := >=1.2.3 <2.0.0
+^0.2.3 := >=0.2.3 <0.3.0
+^0.0.3 := >=0.0.3 <0.0.4
+^0.0   := >=0.0.0 <0.1.0
+^0     := >=0.0.0 <1.0.0
+```
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/src/lib.rs
@@ -0,0 +1,176 @@
+// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Semantic version parsing and comparison.
+//!
+//! Semantic versioning (see http://semver.org/) is a set of rules for
+//! assigning version numbers.
+//!
+//! ## SemVer overview
+//!
+//! Given a version number MAJOR.MINOR.PATCH, increment the:
+//!
+//! 1. MAJOR version when you make incompatible API changes,
+//! 2. MINOR version when you add functionality in a backwards-compatible
+//!    manner, and
+//! 3. PATCH version when you make backwards-compatible bug fixes.
+//!
+//! Additional labels for pre-release and build metadata are available as
+//! extensions to the MAJOR.MINOR.PATCH format.
+//!
+//! Any references to 'the spec' in this documentation refer to [version 2.0 of
+//! the SemVer spec](http://semver.org/spec/v2.0.0.html).
+//!
+//! ## SemVer and the Rust ecosystem
+//!
+//! Rust itself follows the SemVer specification, as does its standard
+//! libraries. The two are not tied together.
+//!
+//! [Cargo](http://crates.io), Rust's package manager, uses SemVer to determine
+//! which versions of packages you need installed.
+//!
+//! ## Versions
+//!
+//! At its simplest, the `semver` crate allows you to construct `Version`
+//! objects using the `parse` method:
+//!
+//! ```{rust}
+//! use semver::Version;
+//!
+//! assert!(Version::parse("1.2.3") == Ok(Version {
+//!    major: 1,
+//!    minor: 2,
+//!    patch: 3,
+//!    pre: vec!(),
+//!    build: vec!(),
+//! }));
+//! ```
+//!
+//! If you have multiple `Version`s, you can use the usual comparison operators
+//! to compare them:
+//!
+//! ```{rust}
+//! use semver::Version;
+//!
+//! assert!(Version::parse("1.2.3-alpha")  != Version::parse("1.2.3-beta"));
+//! assert!(Version::parse("1.2.3-alpha2") >  Version::parse("1.2.0"));
+//! ```
+//!
+//! If you explicitly need to modify a Version, SemVer also allows you to 
+//! increment the major, minor, and patch numbers in accordance with the spec.
+//! 
+//! Please note that in order to do this, you must use a mutable Version:
+//!
+//! ```{rust}
+//! use semver::Version;
+//!
+//! let mut bugfix_release = Version::parse("1.0.0").unwrap();
+//! bugfix_release.increment_patch();
+//!
+//! assert_eq!(bugfix_release, Version::parse("1.0.1").unwrap());
+//! ```
+//!
+//! When incrementing the minor version number, the patch number resets to zero 
+//! (in accordance with section 7 of the spec)
+//!
+//! ```{rust}
+//! use semver::Version;
+//!
+//! let mut feature_release = Version::parse("1.4.6").unwrap();
+//! feature_release.increment_minor();
+//!
+//! assert_eq!(feature_release, Version::parse("1.5.0").unwrap());
+//! ```
+//!
+//! Similarly, when incrementing the major version number, the patch and minor
+//! numbers reset to zero (in accordance with section 8 of the spec)
+//!
+//! ```{rust}
+//! use semver::Version;
+//!
+//! let mut chrome_release = Version::parse("41.5.5377").unwrap();
+//! chrome_release.increment_major();
+//!
+//! assert_eq!(chrome_release, Version::parse("42.0.0").unwrap());
+//! ```
+//!
+//! ## Requirements
+//!
+//! The `semver` crate also provides the ability to compare requirements, which
+//! are more complex comparisons.
+//!
+//! For example, creating a requirement that only matches versions greater than
+//! or equal to 1.0.0:
+//!
+//! ```{rust}
+//! # #![allow(unstable)]
+//! use semver::Version;
+//! use semver::VersionReq;
+//!
+//! let r = VersionReq::parse(">= 1.0.0").unwrap();
+//! let v = Version::parse("1.0.0").unwrap();
+//!
+//! assert!(r.to_string() == ">= 1.0.0".to_string());
+//! assert!(r.matches(&v))
+//! ```
+//!
+//! It also allows parsing of `~x.y.z` and `^x.y.z` requirements as defined at
+//! https://www.npmjs.org/doc/misc/semver.html
+//!
+//! **Tilde requirements** specify a minimal version with some updates:
+//!
+//! ```notrust
+//! ~1.2.3 := >=1.2.3 <1.3.0
+//! ~1.2   := >=1.2.0 <1.3.0
+//! ~1     := >=1.0.0 <2.0.0
+//! ```
+//!
+//! **Caret requirements** allow SemVer compatible updates to a specified
+//! verion, `0.x` and `0.x+1` are not considered compatible, but `1.x` and
+//! `1.x+1` are.
+//!
+//! `0.0.x` is not considered compatible with any other version.
+//! Missing minor and patch versions are desugared to `0` but allow flexibility
+//! for that value.
+//!
+//! ```notrust
+//! ^1.2.3 := >=1.2.3 <2.0.0
+//! ^0.2.3 := >=0.2.3 <0.3.0
+//! ^0.0.3 := >=0.0.3 <0.0.4
+//! ^0.0   := >=0.0.0 <0.1.0
+//! ^0     := >=0.0.0 <1.0.0
+//! ```
+//!
+//! **Wildcard requirements** allows parsing of version requirements of the
+//! formats `*`, `x.*` and `x.y.*`.
+//!
+//! ```notrust
+//! *     := >=0.0.0
+//! 1.*   := >=1.0.0 <2.0.0
+//! 1.2.* := >=1.2.0 <1.3.0
+//! ```
+
+#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
+       html_favicon_url = "http://www.rust-lang.org/favicon.ico")]
+#![deny(missing_docs)]
+#![cfg_attr(test, deny(warnings))]
+
+// We take the common approach of keeping our own module system private, and
+// just re-exporting the interface that we want.
+
+pub use version::{Version, Identifier, ParseError};
+pub use version::Identifier::{Numeric, AlphaNumeric};
+pub use version_req::{VersionReq, ReqParseError};
+
+// SemVer-compliant versions.
+mod version;
+
+// advanced version comparisons
+mod version_req;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/src/version.rs
@@ -0,0 +1,594 @@
+// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! The `version` module gives you tools to create and compare SemVer-compliant
+//! versions.
+
+use std::ascii::AsciiExt;
+use std::cmp::{self, Ordering};
+use std::error::Error;
+use std::fmt;
+use std::hash;
+
+use self::Identifier::{Numeric, AlphaNumeric};
+use self::ParseError::{GenericFailure, IncorrectParse, NonAsciiIdentifier};
+
+/// An identifier in the pre-release or build metadata.
+///
+/// See sections 9 and 10 of the spec for more about pre-release identifers and
+/// build metadata.
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
+pub enum Identifier {
+    /// An identifier that's solely numbers.
+    Numeric(u64),
+    /// An identifier with letters and numbers.
+    AlphaNumeric(String)
+}
+
+impl fmt::Display for Identifier {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Numeric(ref n) => fmt::Display::fmt(n, f),
+            AlphaNumeric(ref s) => fmt::Display::fmt(s, f),
+        }
+    }
+}
+
+
+/// Represents a version number conforming to the semantic versioning scheme.
+#[derive(Clone, Eq, Debug)]
+pub struct Version {
+    /// The major version, to be incremented on incompatible changes.
+    pub major: u64,
+    /// The minor version, to be incremented when functionality is added in a
+    /// backwards-compatible manner.
+    pub minor: u64,
+    /// The patch version, to be incremented when backwards-compatible bug
+    /// fixes are made.
+    pub patch: u64,
+    /// The pre-release version identifier, if one exists.
+    pub pre: Vec<Identifier>,
+    /// The build metadata, ignored when determining version precedence.
+    pub build: Vec<Identifier>,
+}
+
+/// A `ParseError` is returned as the `Err` side of a `Result` when a version is
+/// attempted to be parsed.
+#[derive(Clone,PartialEq,Debug,PartialOrd)]
+pub enum ParseError {
+    /// All identifiers must be ASCII.
+    NonAsciiIdentifier,
+    /// The version was mis-parsed.
+    IncorrectParse(Version, String),
+    /// Any other failure.
+    GenericFailure,
+}
+
+impl Version {
+    /// Parse a string into a semver object.
+    pub fn parse(s: &str) -> Result<Version, ParseError> {
+        if !s.is_ascii() {
+            return Err(NonAsciiIdentifier)
+        }
+        let s = s.trim();
+        let v = parse_iter(&mut s.chars());
+        match v {
+            Some(v) => {
+                if v.to_string() == s {
+                    Ok(v)
+                } else {
+                    Err(IncorrectParse(v, s.to_string()))
+                }
+            }
+            None => Err(GenericFailure)
+        }
+    }
+
+    /// Clears the build metadata
+    fn clear_metadata(&mut self) {
+        self.build = Vec::new();
+        self.pre = Vec::new();
+    }
+
+    /// Increments the patch number for this Version (Must be mutable)
+    pub fn increment_patch(&mut self) {
+        self.patch += 1;
+        self.clear_metadata();
+    }
+
+    /// Increments the minor version number for this Version (Must be mutable)
+    ///
+    /// As instructed by section 7 of the spec, the patch number is reset to 0.
+    pub fn increment_minor(&mut self) {
+        self.minor += 1;
+        self.patch = 0;
+        self.clear_metadata();
+    }
+
+    /// Increments the major version number for this Version (Must be mutable)
+    ///
+    /// As instructed by section 8 of the spec, the minor and patch numbers are
+    /// reset to 0
+    pub fn increment_major(&mut self) {
+        self.major += 1;
+        self.minor = 0;
+        self.patch = 0;
+        self.clear_metadata();
+    }
+}
+
+
+impl fmt::Display for Version {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(write!(f, "{}.{}.{}", self.major, self.minor, self.patch));
+        if !self.pre.is_empty() {
+            try!(write!(f, "-"));
+            for (i, x) in self.pre.iter().enumerate() {
+                if i != 0 { try!(write!(f, ".")) };
+                try!(write!(f, "{}", x));
+            }
+        }
+        if !self.build.is_empty() {
+            try!(write!(f, "+"));
+            for (i, x) in self.build.iter().enumerate() {
+                if i != 0 { try!(write!(f, ".")) };
+                try!(write!(f, "{}", x));
+            }
+        }
+        Ok(())
+    }
+}
+
+impl cmp::PartialEq for Version {
+    #[inline]
+    fn eq(&self, other: &Version) -> bool {
+        // We should ignore build metadata here, otherwise versions v1 and v2
+        // can exist such that !(v1 < v2) && !(v1 > v2) && v1 != v2, which
+        // violate strict total ordering rules.
+        self.major == other.major &&
+            self.minor == other.minor &&
+            self.patch == other.patch &&
+            self.pre == other.pre
+    }
+}
+
+impl cmp::PartialOrd for Version {
+    fn partial_cmp(&self, other: &Version) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl cmp::Ord for Version {
+    fn cmp(&self, other: &Version) -> Ordering {
+        match self.major.cmp(&other.major) {
+            Ordering::Equal => {}
+            r => return r,
+        }
+
+        match self.minor.cmp(&other.minor) {
+            Ordering::Equal => {}
+            r => return r,
+        }
+
+        match self.patch.cmp(&other.patch) {
+            Ordering::Equal => {}
+            r => return r,
+        }
+
+        // NB: semver spec says 0.0.0-pre < 0.0.0
+        // but the version of ord defined for vec
+        // says that [] < [pre] so we alter it here
+        match (self.pre.len(), other.pre.len()) {
+            (0, 0) => Ordering::Equal,
+            (0, _) => Ordering::Greater,
+            (_, 0) => Ordering::Less,
+            (_, _) => self.pre.cmp(&other.pre)
+        }
+    }
+}
+
+impl Error for ParseError {
+    fn description(&self) -> &str {
+        match *self {
+            ParseError::NonAsciiIdentifier
+                => "identifiers can only contain ascii characters",
+            ParseError::GenericFailure
+                | ParseError::IncorrectParse(..)
+                => "failed to parse semver from string",
+        }
+    }
+}
+
+impl fmt::Display for ParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            ParseError::NonAsciiIdentifier => {
+                write!(f, "{}", self.description())
+            }
+            ParseError::GenericFailure => {
+                write!(f, "{}", self.description())
+            }
+            ParseError::IncorrectParse(ref a, ref b) => {
+                write!(f, "{}: {} could not be parsed from {:?}", self.description(), a, b)
+            }
+        }
+    }
+}
+
+impl hash::Hash for Version {
+    fn hash<H: hash::Hasher>(&self, into: &mut H) {
+        self.major.hash(into);
+        self.minor.hash(into);
+        self.patch.hash(into);
+        self.pre.hash(into);
+    }
+}
+
+fn take_nonempty_prefix<T, F>(rdr: &mut T, pred: F) -> (String, Option<char>) where
+    T: Iterator<Item = char>,
+    F: Fn(char) -> bool
+{
+    let mut buf = String::new();
+    let mut ch = rdr.next();
+    loop {
+        match ch {
+            None => break,
+            Some(c) if !pred(c) => break,
+            Some(c) => {
+                buf.push(c);
+                ch = rdr.next();
+            }
+        }
+    }
+    (buf, ch)
+}
+
+fn take_num<T: Iterator<Item=char>>(rdr: &mut T) -> Option<(u64, Option<char>)> {
+    let (s, ch) = take_nonempty_prefix(rdr, |c| c.is_digit(10));
+    match s.parse::<u64>().ok() {
+        None => None,
+        Some(i) => Some((i, ch))
+    }
+}
+
+fn take_ident<T: Iterator<Item=char>>(rdr: &mut T) -> Option<(Identifier, Option<char>)> {
+    let (s,ch) = take_nonempty_prefix(rdr, |c| c.is_alphanumeric());
+
+    if s.len() == 0 {
+        None
+    } else if s.chars().all(|c| c.is_digit(10)) && s.chars().next() != Some('0') {
+        match s.parse::<u64>().ok() {
+            None => None,
+            Some(i) => Some((Numeric(i), ch))
+        }
+    } else {
+        Some((AlphaNumeric(s), ch))
+    }
+}
+
+fn expect(ch: Option<char>, c: char) -> Option<()> {
+    if ch != Some(c) {
+        None
+    } else {
+        Some(())
+    }
+}
+
+fn parse_iter<T: Iterator<Item=char>>(rdr: &mut T) -> Option<Version> {
+    let maybe_vers = take_num(rdr).and_then(|(major, ch)| {
+        expect(ch, '.').and_then(|_| Some(major))
+    }).and_then(|major| {
+        take_num(rdr).and_then(|(minor, ch)| {
+            expect(ch, '.').and_then(|_| Some((major, minor)))
+        })
+    }).and_then(|(major, minor)| {
+        take_num(rdr).and_then(|(patch, ch)| {
+           Some((major, minor, patch, ch))
+        })
+    });
+
+    let (major, minor, patch, ch) = match maybe_vers {
+        Some((a, b, c, d)) => (a, b, c, d),
+        None => return None
+    };
+
+    let mut pre = vec!();
+    let mut build = vec!();
+
+    let mut ch = ch;
+    if ch == Some('-') {
+        loop {
+            let (id, c) = match take_ident(rdr) {
+                Some((id, c)) => (id, c),
+                None => return None
+            };
+            pre.push(id);
+            ch = c;
+            if ch != Some('.') { break; }
+        }
+    }
+
+    if ch == Some('+') {
+        loop {
+            let (id, c) = match take_ident(rdr) {
+                Some((id, c)) => (id, c),
+                None => return None
+            };
+            build.push(id);
+            ch = c;
+            if ch != Some('.') { break; }
+        }
+    }
+
+    Some(Version {
+        major: major,
+        minor: minor,
+        patch: patch,
+        pre: pre,
+        build: build,
+    })
+}
+
+#[cfg(test)]
+mod test {
+    use super::{Version};
+    use super::ParseError::{IncorrectParse, GenericFailure};
+    use super::Identifier::{AlphaNumeric, Numeric};
+
+    #[test]
+    fn test_parse() {
+        assert_eq!(Version::parse(""), Err(GenericFailure));
+        assert_eq!(Version::parse("  "), Err(GenericFailure));
+        assert_eq!(Version::parse("1"), Err(GenericFailure));
+        assert_eq!(Version::parse("1.2"), Err(GenericFailure));
+        assert_eq!(Version::parse("1.2.3-"), Err(GenericFailure));
+        assert_eq!(Version::parse("a.b.c"), Err(GenericFailure));
+
+        let version = Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(),
+            build: vec!(),
+        };
+        let error = Err(IncorrectParse(version, "1.2.3 abc".to_string()));
+        assert_eq!(Version::parse("1.2.3 abc"), error);
+
+        assert!(Version::parse("1.2.3") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(),
+            build: vec!(),
+        }));
+        assert!(Version::parse("  1.2.3  ") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(),
+            build: vec!(),
+        }));
+        assert!(Version::parse("1.2.3-alpha1") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(AlphaNumeric("alpha1".to_string())),
+            build: vec!(),
+        }));
+        assert!(Version::parse("  1.2.3-alpha1  ") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(AlphaNumeric("alpha1".to_string())),
+            build: vec!()
+        }));
+        assert!(Version::parse("1.2.3+build5") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(),
+            build: vec!(AlphaNumeric("build5".to_string()))
+        }));
+        assert!(Version::parse("  1.2.3+build5  ") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(),
+            build: vec!(AlphaNumeric("build5".to_string()))
+        }));
+        assert!(Version::parse("1.2.3-alpha1+build5") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(AlphaNumeric("alpha1".to_string())),
+            build: vec!(AlphaNumeric("build5".to_string()))
+        }));
+        assert!(Version::parse("  1.2.3-alpha1+build5  ") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(AlphaNumeric("alpha1".to_string())),
+            build: vec!(AlphaNumeric("build5".to_string()))
+        }));
+        assert!(Version::parse("1.2.3-1.alpha1.9+build5.7.3aedf  ") == Ok(Version {
+            major: 1,
+            minor: 2,
+            patch: 3,
+            pre: vec!(Numeric(1),AlphaNumeric("alpha1".to_string()),Numeric(9)),
+            build: vec!(AlphaNumeric("build5".to_string()),
+                     Numeric(7),
+                     AlphaNumeric("3aedf".to_string()))
+        }));
+        assert_eq!(Version::parse("0.4.0-beta.1+0851523"), Ok(Version {
+            major: 0,
+            minor: 4,
+            patch: 0,
+            pre: vec![AlphaNumeric("beta".to_string()), Numeric(1)],
+            build: vec![AlphaNumeric("0851523".to_string())],
+        }));
+
+    }
+
+    #[test]
+    fn test_increment_patch() {
+        let mut buggy_release = Version::parse("0.1.0").unwrap();
+        buggy_release.increment_patch();
+        assert_eq!(buggy_release, Version::parse("0.1.1").unwrap());
+    }
+
+    #[test]
+    fn test_increment_minor() {
+        let mut feature_release = Version::parse("1.4.6").unwrap();
+        feature_release.increment_minor();
+        assert_eq!(feature_release, Version::parse("1.5.0").unwrap());
+    }
+
+    #[test]
+    fn test_increment_major() {
+        let mut chrome_release = Version::parse("46.1.246773").unwrap();
+        chrome_release.increment_major();
+        assert_eq!(chrome_release, Version::parse("47.0.0").unwrap());
+    }
+
+    #[test]
+    fn test_increment_keep_prerelease() {
+        let mut release = Version::parse("1.0.0-alpha").unwrap();
+        release.increment_patch();
+
+        assert_eq!(release, Version::parse("1.0.1").unwrap());
+
+        release.increment_minor();
+
+        assert_eq!(release, Version::parse("1.1.0").unwrap());
+
+        release.increment_major();
+
+        assert_eq!(release, Version::parse("2.0.0").unwrap());
+    }
+
+
+    #[test]
+    fn test_increment_clear_metadata() {
+        let mut release = Version::parse("1.0.0+4442").unwrap();
+        release.increment_patch();
+
+        assert_eq!(release, Version::parse("1.0.1").unwrap());
+        release = Version::parse("1.0.1+hello").unwrap();
+
+        release.increment_minor();
+
+        assert_eq!(release, Version::parse("1.1.0").unwrap());
+        release = Version::parse("1.1.3747+hello").unwrap();
+
+        release.increment_major();
+
+        assert_eq!(release, Version::parse("2.0.0").unwrap());
+    }
+
+    #[test]
+    fn test_eq() {
+        assert_eq!(Version::parse("1.2.3"), Version::parse("1.2.3"));
+        assert_eq!(Version::parse("1.2.3-alpha1"), Version::parse("1.2.3-alpha1"));
+        assert_eq!(Version::parse("1.2.3+build.42"), Version::parse("1.2.3+build.42"));
+        assert_eq!(Version::parse("1.2.3-alpha1+42"), Version::parse("1.2.3-alpha1+42"));
+        assert_eq!(Version::parse("1.2.3+23"), Version::parse("1.2.3+42"));
+    }
+
+    #[test]
+    fn test_ne() {
+        assert!(Version::parse("0.0.0")       != Version::parse("0.0.1"));
+        assert!(Version::parse("0.0.0")       != Version::parse("0.1.0"));
+        assert!(Version::parse("0.0.0")       != Version::parse("1.0.0"));
+        assert!(Version::parse("1.2.3-alpha") != Version::parse("1.2.3-beta"));
+    }
+
+    #[test]
+    fn test_show() {
+        assert_eq!(format!("{}", Version::parse("1.2.3").unwrap()),
+                   "1.2.3".to_string());
+        assert_eq!(format!("{}", Version::parse("1.2.3-alpha1").unwrap()),
+                   "1.2.3-alpha1".to_string());
+        assert_eq!(format!("{}", Version::parse("1.2.3+build.42").unwrap()),
+                   "1.2.3+build.42".to_string());
+        assert_eq!(format!("{}", Version::parse("1.2.3-alpha1+42").unwrap()),
+                   "1.2.3-alpha1+42".to_string());
+    }
+
+    #[test]
+    fn test_to_string() {
+        assert_eq!(Version::parse("1.2.3").unwrap().to_string(), "1.2.3".to_string());
+        assert_eq!(Version::parse("1.2.3-alpha1").unwrap().to_string(), "1.2.3-alpha1".to_string());
+        assert_eq!(Version::parse("1.2.3+build.42").unwrap().to_string(), "1.2.3+build.42".to_string());
+        assert_eq!(Version::parse("1.2.3-alpha1+42").unwrap().to_string(), "1.2.3-alpha1+42".to_string());
+    }
+
+    #[test]
+    fn test_lt() {
+        assert!(Version::parse("0.0.0")          < Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.0.0")          < Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.0")          < Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.3-alpha1")   < Version::parse("1.2.3"));
+        assert!(Version::parse("1.2.3-alpha1")   < Version::parse("1.2.3-alpha2"));
+        assert!(!(Version::parse("1.2.3-alpha2") < Version::parse("1.2.3-alpha2")));
+        assert!(!(Version::parse("1.2.3+23")     < Version::parse("1.2.3+42")));
+    }
+
+    #[test]
+    fn test_le() {
+        assert!(Version::parse("0.0.0")        <= Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.0.0")        <= Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.0")        <= Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.3-alpha1") <= Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.3-alpha2") <= Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.3+23")     <= Version::parse("1.2.3+42"));
+    }
+
+    #[test]
+    fn test_gt() {
+        assert!(Version::parse("1.2.3-alpha2")   > Version::parse("0.0.0"));
+        assert!(Version::parse("1.2.3-alpha2")   > Version::parse("1.0.0"));
+        assert!(Version::parse("1.2.3-alpha2")   > Version::parse("1.2.0"));
+        assert!(Version::parse("1.2.3-alpha2")   > Version::parse("1.2.3-alpha1"));
+        assert!(Version::parse("1.2.3")          > Version::parse("1.2.3-alpha2"));
+        assert!(!(Version::parse("1.2.3-alpha2") > Version::parse("1.2.3-alpha2")));
+        assert!(!(Version::parse("1.2.3+23")     > Version::parse("1.2.3+42")));
+    }
+
+    #[test]
+    fn test_ge() {
+        assert!(Version::parse("1.2.3-alpha2") >= Version::parse("0.0.0"));
+        assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.0.0"));
+        assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.2.0"));
+        assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.2.3-alpha1"));
+        assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.2.3-alpha2"));
+        assert!(Version::parse("1.2.3+23")     >= Version::parse("1.2.3+42"));
+    }
+
+    #[test]
+    fn test_spec_order() {
+        let vs = ["1.0.0-alpha",
+                  "1.0.0-alpha.1",
+                  "1.0.0-alpha.beta",
+                  "1.0.0-beta",
+                  "1.0.0-beta.2",
+                  "1.0.0-beta.11",
+                  "1.0.0-rc.1",
+                  "1.0.0"];
+        let mut i = 1;
+        while i < vs.len() {
+            let a = Version::parse(vs[i-1]).unwrap();
+            let b = Version::parse(vs[i]).unwrap();
+            assert!(a < b);
+            i += 1;
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/semver-0.1.20/src/version_req.rs
@@ -0,0 +1,877 @@
+// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::error::Error;
+use std::fmt;
+use std::str::CharIndices;
+
+use super::version::Version;
+
+use self::VersionComponent::{NumericVersionComponent, WildcardVersionComponent};
+use self::Op::{Ex, Gt, GtEq, Lt, LtEq, Tilde, Compatible, Wildcard};
+use self::LexState::{LexInit, LexStart, LexVersionComponent, LexSigil, LexErr};
+use self::Token::{Sigil, AlphaNum, Comma, Dot};
+use self::WildcardVersion::{Major, Minor, Patch};
+use self::ReqParseError::{
+    InvalidVersionRequirement,
+    OpAlreadySet,
+    InvalidSigil,
+    VersionComponentsMustBeNumeric,
+    MajorVersionRequired,
+    UnimplementedVersionRequirement
+};
+
+/// A `VersionReq` is a struct containing a list of predicates that can apply to ranges of version
+/// numbers. Matching operations can then be done with the `VersionReq` against a particular
+/// version to see if it satisfies some or all of the constraints.
+#[derive(PartialEq,Clone,Debug)]
+pub struct VersionReq {
+    predicates: Vec<Predicate>
+}
+
+enum VersionComponent {
+    NumericVersionComponent(u64),
+    WildcardVersionComponent
+}
+
+#[derive(Clone, PartialEq, Debug)]
+enum WildcardVersion {
+    Major,
+    Minor,
+    Patch
+}
+
+#[derive(PartialEq,Clone,Debug)]
+enum Op {
+    Ex,   // Exact
+    Gt,   // Greater than
+    GtEq, // Greater than or equal to
+    Lt,   // Less than
+    LtEq, // Less than or equal to
+    Tilde, // e.g. ~1.0.0
+    Compatible, // compatible by definition of semver, indicated by ^
+    Wildcard(WildcardVersion), // x.y.*, x.*, *
+}
+
+#[derive(PartialEq,Clone,Debug)]
+struct Predicate {
+    op: Op,
+    major: u64,
+    minor: Option<u64>,
+    patch: Option<u64>
+}
+
+struct PredBuilder {
+    op: Option<Op>,
+    major: Option<u64>,
+    minor: Option<u64>,
+    patch: Option<u64>
+}
+
+/// A `ReqParseError` is returned from methods which parse a string into a `VersionReq`. Each
+/// enumeration is one of the possible errors that can occur.
+#[derive(Copy, Clone, Debug, PartialEq)]
+pub enum ReqParseError {
+    /// The given version requirement is invalid.
+    InvalidVersionRequirement,
+    /// You have already provided an operation, such as `=`, `~`, or `^`. Only use one.
+    OpAlreadySet,
+    /// The sigil you have written is not correct.
+    InvalidSigil,
+    /// All components of a version must be numeric.
+    VersionComponentsMustBeNumeric,
+    /// At least a major version is required.
+    MajorVersionRequired,
+    /// An unimplemented version requirement.
+    UnimplementedVersionRequirement,
+}
+
+impl fmt::Display for ReqParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.description().fmt(f)
+    }
+}
+
+impl Error for ReqParseError {
+    fn description(&self) -> &str {
+        match *self {
+            InvalidVersionRequirement => "the given version requirement is invalid",
+            OpAlreadySet => "you have already provided an operation, such as =, ~, or ^; only use one",
+            InvalidSigil => "the sigil you have written is not correct",
+            VersionComponentsMustBeNumeric => "version components must be numeric",
+            MajorVersionRequired => "at least a major version number is required",
+            UnimplementedVersionRequirement => "the given version requirement is not implemented, yet",
+        }
+    }
+}
+
+impl VersionReq {
+    /// `any()` is a factory method which creates a `VersionReq` with no constraints. In other
+    /// words, any version will match against it.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use semver::VersionReq;
+    ///
+    /// let anything = VersionReq::any();
+    /// ```
+    pub fn any() -> VersionReq {
+        VersionReq { predicates: vec!() }
+    }
+
+    /// `parse()` is the main constructor of a `VersionReq`. It turns a string like `"^1.2.3"`
+    /// and turns it into a `VersionReq` that matches that particular constraint.
+    ///
+    /// A `Result` is returned which contains a `ReqParseError` if there was a problem parsing the
+    /// `VersionReq`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use semver::VersionReq;
+    ///
+    /// let version = VersionReq::parse("=1.2.3");
+    /// let version = VersionReq::parse(">1.2.3");
+    /// let version = VersionReq::parse("<1.2.3");
+    /// let version = VersionReq::parse("~1.2.3");
+    /// let version = VersionReq::parse("^1.2.3");
+    /// let version = VersionReq::parse("<=1.2.3");
+    /// let version = VersionReq::parse(">=1.2.3");
+    /// ```
+    ///
+    /// This example demonstrates error handling, and will panic.
+    ///
+    /// ```should-panic
+    /// use semver::VersionReq;
+    ///
+    /// let version = match VersionReq::parse("not a version") {
+    ///     Ok(version) => version,
+    ///     Err(e) => panic!("There was a problem parsing: {}", e),
+    /// }
+    /// ```
+    pub fn parse(input: &str) -> Result<VersionReq, ReqParseError> {
+        let mut lexer = Lexer::new(input);
+        let mut builder = PredBuilder::new();
+        let mut predicates = Vec::new();
+
+        for token in lexer.by_ref() {
+            let result = match token {
+                Sigil(x) => builder.set_sigil(x),
+                AlphaNum(x) => builder.set_version_part(x),
+                Dot => Ok(()), // Nothing to do for now
+                Comma => {
+                    let result = builder.build().map(|p| predicates.push(p));
+                    builder = PredBuilder::new();
+                    result
+                }
+            };
+
+            match result {
+                Ok(_) => (),
+                Err(e) => return Err(e),
+            }
+        }
+
+        if lexer.is_error() {
+            return Err(InvalidVersionRequirement);
+        }
+
+        match builder.build() {
+            Ok(e) => predicates.push(e),
+            Err(e) => return Err(e),
+        }
+
+        Ok(VersionReq { predicates: predicates })
+    }
+
+    /// `exact()` is a factory method which creates a `VersionReq` with one exact constraint.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use semver::VersionReq;
+    /// use semver::Version;
+    ///
+    /// let version = Version { major: 1, minor: 1, patch: 1, pre: vec![], build: vec![] };
+    /// let exact = VersionReq::exact(&version);
+    /// ```
+    pub fn exact(version: &Version) -> VersionReq {
+        VersionReq { predicates: vec!(Predicate::exact(version)) }
+    }
+
+    /// `matches()` matches a given `Version` against this `VersionReq`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use semver::VersionReq;
+    /// use semver::Version;
+    ///
+    /// let version = Version { major: 1, minor: 1, patch: 1, pre: vec![], build: vec![] };
+    /// let exact = VersionReq::exact(&version);
+    ///
+    /// assert!(exact.matches(&version));
+    /// ```
+    pub fn matches(&self, version: &Version) -> bool {
+        self.predicates.iter().all(|p| p.matches(version))
+    }
+}
+
+impl Predicate {
+    fn exact(version: &Version) -> Predicate {
+        Predicate {
+            op: Ex,
+            major: version.major,
+            minor: Some(version.minor),
+            patch: Some(version.patch)
+        }
+    }
+
+    /// `matches()` takes a `Version` and determines if it matches this particular `Predicate`.
+    pub fn matches(&self, ver: &Version) -> bool {
+        match self.op {
+            Ex => self.is_exact(ver),
+            Gt => self.is_greater(ver),
+            GtEq => self.is_exact(ver) || self.is_greater(ver),
+            Lt => !self.is_exact(ver) && !self.is_greater(ver),
+            LtEq => !self.is_greater(ver),
+            Tilde => self.matches_tilde(ver),
+            Compatible => self.is_compatible(ver),
+            Wildcard(_) => self.matches_wildcard(ver)
+        }
+    }
+
+    fn is_exact(&self, ver: &Version) -> bool {
+        if self.major != ver.major {
+            return false;
+        }
+
+        match self.minor {
+            Some(minor) => {
+                if minor != ver.minor {
+                    return false;
+                }
+            }
+            None => return true
+        }
+
+        match self.patch {
+            Some(patch) => {
+                if patch != ver.patch {
+                    return false;
+                }
+            }
+            None => return true
+        }
+
+        true
+    }
+
+    fn is_greater(&self, ver: &Version) -> bool {
+        if self.major != ver.major {
+            return ver.major > self.major;
+        }
+
+        match self.minor {
+            Some(minor) => {
+                if minor != ver.minor {
+                    return ver.minor > minor
+                }
+            }
+            None => return false
+        }
+
+        match self.patch {
+            Some(patch) => {
+                if patch != ver.patch {
+                    return ver.patch > patch
+                }
+            }
+            None => return false
+        }
+
+        false
+    }
+
+    // see https://www.npmjs.org/doc/misc/semver.html for behavior
+    fn matches_tilde(&self, ver: &Version) -> bool {
+        let minor = match self.minor {
+            Some(n) => n,
+            None => return self.major == ver.major
+        };
+
+        match self.patch {
+            Some(patch) => {
+                self.major == ver.major && minor == ver.minor && ver.patch >= patch
+            }
+            None => {
+                self.major == ver.major && minor == ver.minor
+            }
+        }
+    }
+
+    // see https://www.npmjs.org/doc/misc/semver.html for behavior
+    fn is_compatible(&self, ver: &Version) -> bool {
+        if self.major != ver.major {
+            return false;
+        }
+
+        let minor = match self.minor {
+            Some(n) => n,
+            None => return self.major == ver.major
+        };
+
+        match self.patch {
+            Some(patch) => if self.major == 0 {
+                if minor == 0 {
+                    ver.minor == minor && ver.patch == patch
+                } else {
+                    ver.minor == minor && ver.patch >= patch
+                }
+            } else {
+                ver.minor > minor || (ver.minor == minor && ver.patch >= patch)
+            },
+            None => if self.major == 0 {
+                ver.minor == minor
+            } else {
+                ver.minor >= minor
+            }
+        }
+    }
+
+    // see https://www.npmjs.org/doc/misc/semver.html for behavior
+    fn matches_wildcard(&self, ver: &Version) -> bool {
+        match self.op {
+            Wildcard(Major) => true,
+            Wildcard(Minor) => self.major == ver.major,
+            Wildcard(Patch) => {
+                match self.minor {
+                    Some(minor) => self.major == ver.major && minor == ver.minor,
+                    None => false  // unreachable
+                }
+            }
+            _ => false  // unreachable
+        }
+    }
+}
+
+impl PredBuilder {
+    fn new() -> PredBuilder {
+        PredBuilder {
+            op: None,
+            major: None,
+            minor: None,
+            patch: None
+        }
+    }
+
+    fn set_sigil(&mut self, sigil: &str) -> Result<(), ReqParseError> {
+        if self.op.is_some() {
+            return Err(OpAlreadySet);
+        }
+
+        match Op::from_sigil(sigil) {
+            Some(op) => self.op = Some(op),
+            _ => return Err(InvalidSigil),
+        }
+
+        Ok(())
+    }
+
+    fn set_version_part(&mut self, part: &str) -> Result<(), ReqParseError> {
+        if self.op.is_none() {
+            // If no op is specified, then the predicate is an exact match on
+            // the version
+            self.op = Some(Compatible);
+        }
+
+        if self.major.is_none() {
+            match parse_version_part(part) {
+                Ok(NumericVersionComponent(e)) => self.major = Some(e),
+                Ok(WildcardVersionComponent) => {
+                    self.major = Some(0);
+                    self.op = Some(Wildcard(Major))
+                }
+                Err(e) => return Err(e),
+            }
+        } else if self.minor.is_none() {
+            match parse_version_part(part) {
+                Ok(NumericVersionComponent(e)) => self.minor = Some(e),
+                Ok(WildcardVersionComponent) => self.op = Some(Wildcard(Minor)),
+                Err(e) => return Err(e),
+            }
+        }
+        else if self.patch.is_none() {
+            match parse_version_part(part) {
+                Ok(NumericVersionComponent(e)) => self.patch = Some(e),
+                Ok(WildcardVersionComponent) => self.op = Some(Wildcard(Patch)),
+                Err(e) => return Err(e),
+            }
+        }
+
+        Ok(())
+    }
+
+    /// Validates that a version predicate can be created given the present
+    /// information.
+    fn build(&self) -> Result<Predicate, ReqParseError> {
+        let op = match self.op {
+            Some(ref x) => x.clone(),
+            None => return Err(InvalidVersionRequirement),
+        };
+
+        let major = match self.major {
+            Some(x) => x,
+            None => return Err(MajorVersionRequired),
+        };
+
+        Ok(Predicate {
+            op: op,
+            major: major,
+            minor: self.minor,
+            patch: self.patch
+        })
+    }
+}
+
+struct Lexer<'a> {
+    c: char,
+    idx: usize,
+    iter: CharIndices<'a>,
+    mark: Option<usize>,
+    input: &'a str,
+    state: LexState
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+enum LexState {
+    LexInit,
+    LexStart,
+    LexVersionComponent,
+    LexSigil,
+    LexErr,
+}
+
+#[derive(Debug)]
+enum Token<'a> {
+    Sigil(&'a str),
+    AlphaNum(&'a str),
+    Comma,
+    Dot
+}
+
+impl<'a> Lexer<'a> {
+    fn new(input: &'a str) -> Lexer<'a> {
+        Lexer {
+            c: '\0',
+            idx: 0,
+            iter: input.char_indices(),
+            mark: None,
+            input: input,
+            state: LexInit
+        }
+    }
+
+    fn is_error(&self) -> bool {
+        self.state == LexErr
+    }
+
+    fn mark(&mut self, at: usize) {
+        self.mark = Some(at)
+    }
+
+    fn flush(&mut self, to: usize, kind: LexState) -> Option<Token<'a>> {
+        match self.mark {
+            Some(mark) => {
+                if to <= mark {
+                    return None;
+                }
+
+                let s = &self.input[mark..to];
+
+                self.mark = None;
+
+                match kind {
+                    LexVersionComponent => Some(AlphaNum(s)),
+                    LexSigil => Some(Sigil(s)),
+                    _ => None // bug
+                }
+            }
+            None => None
+        }
+    }
+}
+
+impl<'a> Iterator for Lexer<'a> {
+    type Item = Token<'a>;
+
+    fn next(&mut self) -> Option<Token<'a>> {
+        let mut c;
+        let mut idx = 0;
+
+        macro_rules! next {
+            () => (
+                match self.iter.next() {
+                    Some((n_idx, n_char)) => {
+                        c = n_char;
+                        idx = n_idx;
+                    }
+                    _ => {
+                      let s = self.state;
+                      return self.flush(idx + 1, s)
+                    }
+                }
+            )
+        }
+
+        macro_rules! flush {
+            ($s:expr) => ({
+                self.c = c;
+                self.idx = idx;
+                self.flush(idx, $s)
+            })
+        }
+
+
+        if self.state == LexInit {
+            self.state = LexStart;
+            next!();
+        } else {
+            c = self.c;
+            idx = self.idx;
+        }
+
+        loop {
+            match self.state {
+                LexStart => {
+                    if c.is_whitespace() {
+                        next!(); // Ignore
+                    }
+                    else if c.is_alphanumeric() || c == '*' {
+                        self.mark(idx);
+                        self.state = LexVersionComponent;
+                        next!();
+                    }
+                    else if is_sigil(c) {
+                        self.mark(idx);
+                        self.state = LexSigil;
+                        next!();
+                    }
+                    else if c == '.' {
+                        self.state = LexInit;
+                        return Some(Dot);
+                    }
+                    else if c == ',' {
+                        self.state = LexInit;
+                        return Some(Comma);
+                    } else {
+                        self.state = LexErr;
+                        return None;
+                    }
+                }
+                LexVersionComponent => {
+                    if c.is_alphanumeric() {
+                        next!();
+                    } else {
+                        self.state = LexStart;
+                        return flush!(LexVersionComponent);
+                    }
+                }
+                LexSigil => {
+                    if is_sigil(c) {
+                        next!();
+                    } else {
+                        self.state = LexStart;
+                        return flush!(LexSigil);
+                    }
+                }
+                LexErr => return None,
+                LexInit => return None // bug
+            }
+        }
+    }
+}
+
+impl Op {
+    fn from_sigil(sigil: &str) -> Option<Op> {
+        match sigil {
+            "=" => Some(Ex),
+            ">" => Some(Gt),
+            ">=" => Some(GtEq),
+            "<" => Some(Lt),
+            "<=" => Some(LtEq),
+            "~" => Some(Tilde),
+            "^" => Some(Compatible),
+            _ => None
+        }
+    }
+}
+
+fn parse_version_part(s: &str) -> Result<VersionComponent, ReqParseError> {
+    let mut ret = 0;
+
+    if s == "*" {
+        return Ok(WildcardVersionComponent)
+    }
+
+    for c in s.chars() {
+        let n = (c as u64) - ('0' as u64);
+
+        if n > 9 {
+            return Err(VersionComponentsMustBeNumeric);
+        }
+
+        ret *= 10;
+        ret +=  n;
+    }
+
+    Ok(NumericVersionComponent(ret))
+}
+
+fn is_sigil(c: char) -> bool {
+    match c {
+        '>' | '<' | '=' | '~' | '^' => true,
+        _ => false
+    }
+}
+
+impl fmt::Display for VersionReq {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        if self.predicates.is_empty() {
+            try!(write!(fmt, "*"));
+        } else {
+            for (i, ref pred) in self.predicates.iter().enumerate() {
+                if i == 0 {
+                    try!(write!(fmt, "{}", pred));
+                } else {
+                    try!(write!(fmt, ", {}", pred));
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl fmt::Display for Predicate {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        match self.op {
+            Wildcard(Major) => try!(write!(fmt, "*")),
+            Wildcard(Minor) => try!(write!(fmt, "{}.*", self.major)),
+            Wildcard(Patch) => try!(write!(fmt, "{}.{}.*", self.major, self.minor.unwrap())),
+            _ => {
+                try!(write!(fmt, "{}{}", self.op, self.major));
+
+                match self.minor {
+                    Some(v) => try!(write!(fmt, ".{}", v)),
+                    None => ()
+                }
+
+                match self.patch {
+                    Some(v) => try!(write!(fmt, ".{}", v)),
+                    None => ()
+                }
+            },
+        }
+
+        Ok(())
+    }
+}
+
+impl fmt::Display for Op {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Ex          => try!(write!(fmt, "= ")),
+            Gt          => try!(write!(fmt, "> ")),
+            GtEq        => try!(write!(fmt, ">= ")),
+            Lt          => try!(write!(fmt, "< ")),
+            LtEq        => try!(write!(fmt, "<= ")),
+            Tilde       => try!(write!(fmt, "~")),
+            Compatible  => try!(write!(fmt, "^")),
+             // gets handled specially in Predicate::fmt
+            Wildcard(_) => try!(write!(fmt, "")),
+        }
+        Ok(())
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::VersionReq;
+    use super::super::version::Version;
+    use super::ReqParseError::{
+        InvalidVersionRequirement,
+        OpAlreadySet,
+        InvalidSigil,
+        VersionComponentsMustBeNumeric,
+        MajorVersionRequired,
+    };
+
+    fn req(s: &str) -> VersionReq {
+        VersionReq::parse(s).unwrap()
+    }
+
+    fn version(s: &str) -> Version {
+        match Version::parse(s) {
+            Ok(v) => v,
+            Err(e) => panic!("`{}` is not a valid version. Reason: {}", s, e)
+        }
+    }
+
+    fn assert_match(req: &VersionReq, vers: &[&str]) {
+        for ver in vers.iter() {
+            assert!(req.matches(&version(*ver)), "did not match {}", ver);
+        }
+    }
+
+    fn assert_not_match(req: &VersionReq, vers: &[&str]) {
+        for ver in vers.iter() {
+            assert!(!req.matches(&version(*ver)), "matched {}", ver);
+        }
+    }
+
+    #[test]
+    fn test_parsing_default() {
+        let r = req("1.0.0");
+
+        assert_eq!(r.to_string(), "^1.0.0".to_string());
+
+        assert_match(&r, &["1.0.0", "1.0.1"]);
+        assert_not_match(&r, &["0.9.9", "0.10.0", "0.1.0"]);
+    }
+
+    #[test]
+    fn test_parsing_exact() {
+        let r = req("=1.0.0");
+
+        assert!(r.to_string() == "= 1.0.0".to_string());
+        assert_eq!(r.to_string(), "= 1.0.0".to_string());
+
+        assert_match(&r, &["1.0.0"]);
+        assert_not_match(&r, &["1.0.1", "0.9.9", "0.10.0", "0.1.0"]);
+
+        let r = req("=0.9.0");
+
+        assert_eq!(r.to_string(), "= 0.9.0".to_string());
+
+        assert_match(&r, &["0.9.0"]);
+        assert_not_match(&r, &["0.9.1", "1.9.0", "0.0.9"]);
+    }
+
+    #[test]
+    pub fn test_parsing_greater_than() {
+        let r = req(">= 1.0.0");
+
+        assert_eq!(r.to_string(), ">= 1.0.0".to_string());
+
+        assert_match(&r, &["1.0.0"]);
+    }
+
+    #[test]
+    pub fn test_multiple() {
+        let r = req("> 0.0.9, <= 2.5.3");
+        assert_eq!(r.to_string(), "> 0.0.9, <= 2.5.3".to_string());
+        assert_match(&r, &["0.0.10", "1.0.0", "2.5.3"]);
+        assert_not_match(&r, &["0.0.8", "2.5.4"]);
+
+        let r = req("0.3.0, 0.4.0");
+        assert_eq!(r.to_string(), "^0.3.0, ^0.4.0".to_string());
+        assert_not_match(&r, &["0.0.8", "0.3.0", "0.4.0"]);
+
+        let r = req("<= 0.2.0, >= 0.5.0");
+        assert_eq!(r.to_string(), "<= 0.2.0, >= 0.5.0".to_string());
+        assert_not_match(&r, &["0.0.8", "0.3.0", "0.5.1"]);
+
+        let r = req("0.1.0, 0.1.4, 0.1.6");
+        assert_eq!(r.to_string(), "^0.1.0, ^0.1.4, ^0.1.6".to_string());
+        assert_match(&r, &["0.1.6", "0.1.9"]);
+        assert_not_match(&r, &["0.1.0", "0.1.4", "0.2.0"]);
+
+        assert!(VersionReq::parse("> 0.1.0,").is_err());
+        assert!(VersionReq::parse("> 0.3.0, ,").is_err());
+    }
+
+    #[test]
+    pub fn test_parsing_tilde() {
+        let r = req("~1");
+        assert_match(&r, &["1.0.0", "1.0.1", "1.1.1"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "0.0.9"]);
+
+        let r = req("~1.2");
+        assert_match(&r, &["1.2.0", "1.2.1"]);
+        assert_not_match(&r, &["1.1.1", "1.3.0", "0.0.9"]);
+
+        let r = req("~1.2.2");
+        assert_match(&r, &["1.2.2", "1.2.4"]);
+        assert_not_match(&r, &["1.2.1", "1.9.0", "1.0.9", "2.0.1", "0.1.3"]);
+    }
+
+    #[test]
+    pub fn test_parsing_compatible() {
+        let r = req("^1");
+        assert_match(&r, &["1.1.2", "1.1.0", "1.2.1", "1.0.1"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "0.1.4"]);
+
+        let r = req("^1.1");
+        assert_match(&r, &["1.1.2", "1.1.0", "1.2.1"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "1.0.1", "0.1.4"]);
+
+        let r = req("^1.1.2");
+        assert_match(&r, &["1.1.2", "1.1.4", "1.2.1"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1"]);
+
+        let r = req("^0.1.2");
+        assert_match(&r, &["0.1.2", "0.1.4"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1"]);
+
+        let r = req("^0.0.2");
+        assert_match(&r, &["0.0.2"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1", "0.1.4"]);
+
+        let r = req("^0.0");
+        assert_match(&r, &["0.0.2", "0.0.0"]);
+        assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.1.4"]);
+
+        let r = req("^0");
+        assert_match(&r, &["0.9.1", "0.0.2", "0.0.0"]);
+        assert_not_match(&r, &["2.9.0", "1.1.1"]);
+    }
+
+    #[test]
+    pub fn test_parsing_wildcard() {
+        let r = req("*");
+        assert_match(&r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]);
+        assert_not_match(&r, &[]);
+
+        let r = req("1.*");
+        assert_match(&r, &["1.2.0", "1.2.1", "1.1.1", "1.3.0"]);
+        assert_not_match(&r, &["0.0.9"]);
+
+        let r = req("1.2.*");
+        assert_match(&r, &["1.2.0", "1.2.2", "1.2.4"]);
+        assert_not_match(&r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3"]);
+    }
+
+
+    #[test]
+    pub fn test_parse_errors() {
+        assert_eq!(Err(InvalidVersionRequirement), VersionReq::parse("0-0.1"));
+        assert_eq!(Err(OpAlreadySet), VersionReq::parse(">= >= 0.0.2"));
+        assert_eq!(Err(InvalidSigil), VersionReq::parse(">== 0.0.2"));
+        assert_eq!(Err(VersionComponentsMustBeNumeric), VersionReq::parse("a.0.0"));
+        assert_eq!(Err(MajorVersionRequired), VersionReq::parse(">="));
+    }
+
+
+    /* TODO:
+     * - Handle pre releases
+     */
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"2fc996c6292077edce4c427726bf849c151b7665f6113c3001cc227e097d461e",".travis.yml":"4b02f83b1737cb2149dce4ceb26f0f2bb638ca82babfb343119c9fea0e472248","CHANGELOG.md":"0c6701474b807ee3738fa9d06ed9fbea7d07531b209a9da75fbf5bcf172f9b94","Cargo.toml":"1815b813a7345aea82031ed4e7c7b588fd1b3abc97c895421ce2374e7e97a763","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"3da4fe444a3d6052a721dc79930499b43155fee58460e2bd66d07d35a8f2abf7","examples/signal.rs":"799625fe867f896dddeb06a04049128b297526364414351f947976842a1b1405","lib.rs":"1ca3897552e020d754ff809367c0cbe3f9ece094f5a48a5002c94e7cb6340e67"},"package":"d6f5a4e4908d6818fe553b6126ba5377801556ab885c65ebf960b722a6778864"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/.gitignore
@@ -0,0 +1,4 @@
+target
+Cargo.lock
+/tags
+.cargo
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/.travis.yml
@@ -0,0 +1,25 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+
+script:
+  - make all
+  - make travistest
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
+
+env:
+  global:
+    - RUST_BACKTRACE=1
+  matrix:
+    -
+    - RELEASE=true
+
+notifications:
+  webhooks:
+    urls:
+      - https://webhooks.gitter.im/e/6d8e17dd2fa83b143168
+    on_success: change  # options: [always|never|change] default: always
+    on_failure: change  # options: [always|never|change] default: always
+    on_start: false     # default: false
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/CHANGELOG.md
@@ -0,0 +1,10 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## 0.4.3 - 2016-11-30
+### Changed
+
+* Moved to own repository
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/Cargo.toml
@@ -0,0 +1,25 @@
+[package]
+name = "slog-atomic"
+version = "0.4.3"
+authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
+description = "Atomic run-time controllable drain for slog-rs"
+keywords = ["slog", "logging", "log",  "atomic"]
+license = "MPL-2.0"
+documentation = "https://docs.rs/slog-atomic"
+homepage = "https://github.com/slog-rs/slog"
+repository = "https://github.com/slog-rs/atomic"
+readme = "README.md"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+slog = "1"
+crossbeam = "0.2.9"
+
+[dev-dependencies]
+lazy_static = "0.1.16"
+nix = "0.6.0"
+slog-term = "1"
+slog-json = "1"
+slog-stream = "1"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/LICENSE-MPL2
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/Makefile
@@ -0,0 +1,68 @@
+PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
+DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
+ifeq (, $(shell which cargo-check 2> /dev/null))
+DEFAULT_TARGET=build
+else
+DEFAULT_TARGET=build
+endif
+
+default: $(DEFAULT_TARGET)
+
+ALL_TARGETS += build $(EXAMPLES) test doc
+ifneq ($(RELEASE),)
+$(info RELEASE BUILD: $(PKG_NAME))
+CARGO_FLAGS += --release
+else
+$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
+endif
+
+EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
+
+all: $(ALL_TARGETS)
+
+.PHONY: run test build doc clean clippy
+run test build clean:
+	cargo $@ $(CARGO_FLAGS)
+
+check:
+	$(info Running check; use `make build` to actually build)
+	cargo $@ $(CARGO_FLAGS)
+
+clippy:
+	cargo build --features clippy
+
+.PHONY: bench
+bench:
+	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
+
+.PHONY: travistest
+travistest: test
+
+.PHONY: longtest
+longtest:
+	@echo "Running longtest. Press Ctrl+C to stop at any time"
+	@sleep 2
+	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
+
+.PHONY: $(EXAMPLES)
+$(EXAMPLES):
+	cargo build --example $@ $(CARGO_FLAGS)
+
+.PHONY: doc
+doc: FORCE
+	cargo doc
+
+.PHONY: publishdoc
+publishdoc:
+	rm -rf target/doc
+	make doc
+	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
+	ghp-import -n target/doc
+	git push -f origin gh-pages
+
+.PHONY: docview
+docview: doc
+	xdg-open target/doc/$(PKG_NAME)/index.html
+
+.PHONY: FORCE
+FORCE:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/README.md
@@ -0,0 +1,27 @@
+<p align="center">
+
+  <a href="https://github.com/slog-rs/slog">
+  <img src="https://cdn.rawgit.com/slog-rs/misc/master/media/slog.svg" alt="slog-rs logo">
+  </a>
+  <br>
+
+  <a href="https://travis-ci.org/slog-rs/atomic">
+      <img src="https://img.shields.io/travis/slog-rs/atomic/master.svg" alt="Travis CI Build Status">
+  </a>
+
+  <a href="https://crates.io/crates/slog-atomic">
+      <img src="https://img.shields.io/crates/d/slog-atomic.svg" alt="slog-atomic on crates.io">
+  </a>
+
+  <a href="https://gitter.im/slog-rs/slog">
+      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
+  </a>
+</p>
+
+# slog-atomic - Atomic run-time controllable drain for [slog-rs]
+
+[slog-rs]: //github.com/slog-rs/slog
+
+Using `slog-atomic` you can create a `slog::Drain` that can change behaviour
+in a thread-safe way, in runtime. This is useful eg. for triggering different
+logging levels from a signal handler.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/examples/signal.rs
@@ -0,0 +1,70 @@
+#[macro_use]
+extern crate slog;
+extern crate slog_term;
+extern crate slog_atomic;
+extern crate slog_json;
+extern crate slog_stream;
+extern crate nix;
+
+#[macro_use]
+extern crate lazy_static;
+
+use nix::sys::signal;
+use std::sync::atomic::AtomicBool;
+use std::sync::atomic::Ordering::SeqCst;
+use std::time::Duration;
+
+use std::{thread, io};
+use slog::*;
+use slog_atomic::*;
+use slog_stream::*;
+
+lazy_static! {
+    // global atomic switch drain control
+    static ref ATOMIC_DRAIN_SWITCH : AtomicSwitchCtrl<io::Error> = AtomicSwitch::new(
+        Discard.map_err(|_| io::Error::new(io::ErrorKind::Other, "should no happen"))
+    ).ctrl();
+
+    // track current state of the atomic switch drain
+    static ref ATOMIC_DRAIN_SWITCH_STATE : AtomicBool = AtomicBool::new(false);
+}
+
+fn atomic_drain_switch() {
+    // XXX: Not atomic. Race?
+    let new = !ATOMIC_DRAIN_SWITCH_STATE.load(SeqCst);
+    ATOMIC_DRAIN_SWITCH_STATE.store(new, SeqCst);
+
+    if new {
+        ATOMIC_DRAIN_SWITCH.set(stream(io::stdout(), slog_json::default()))
+    } else {
+        ATOMIC_DRAIN_SWITCH.set(slog_term::streamer().full().stdout().build())
+    }
+}
+
+extern "C" fn handle_sigusr1(_: i32) {
+    atomic_drain_switch();
+}
+
+fn main() {
+    unsafe {
+        let sig_action = signal::SigAction::new(signal::SigHandler::Handler(handle_sigusr1),
+                                                signal::SaFlags::empty(),
+                                                signal::SigSet::empty());
+        signal::sigaction(signal::SIGUSR1, &sig_action).unwrap();
+    }
+
+    let drain = slog::duplicate(slog_term::streamer().stderr().full().build(), ATOMIC_DRAIN_SWITCH.drain()).fuse();
+
+    atomic_drain_switch();
+
+    let log = Logger::root(drain, o!());
+
+    info!(log, "logging a message every 3s");
+    info!(log, "send SIGUSR1 signal to switch output with");
+    let pid = nix::unistd::getpid();
+    info!(log, "kill -SIGUSR1 {}", pid);
+    loop {
+        info!(log, "tick");
+        thread::sleep(Duration::from_millis(3000));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-atomic/lib.rs
@@ -0,0 +1,73 @@
+//! Slog atomic switching drain
+//!
+//! `AtomicSwitch` allows swapping drain that it wraps atomically, race-free, in
+//! runtime. This can be useful eg. for turning on debug logging
+//! in production.
+//!
+//! See [`slog` `signal.rs`
+//! example](https://github.com/dpc/slog-rs/blob/master/examples/signal.rs)
+#![warn(missing_docs)]
+
+#[macro_use]
+extern crate slog;
+extern crate crossbeam;
+
+use slog::*;
+use std::sync::Arc;
+use crossbeam::sync::ArcCell;
+
+/// Handle to `AtomicSwitch` that controls it.
+pub struct AtomicSwitchCtrl<E>(Arc<ArcCell<Box<Drain<Error=E>+Send+Sync>>>);
+
+/// Drain wrapping another drain, allowing atomic substitution in runtime
+pub struct AtomicSwitch<E>(Arc<ArcCell<Box<Drain<Error=E>+Send+Sync>>>);
+
+impl<E> AtomicSwitch<E> {
+    /// Wrap `drain` in `AtomicSwitch` to allow swapping it later
+    ///
+    /// Use `AtomicSwitch::ctrl()` to get a handle to it
+    pub fn new<D: Drain<Error=E> + 'static + Send+Sync>(drain: D) -> Self {
+        AtomicSwitch::new_from_arc(Arc::new(ArcCell::new(Arc::new(Box::new(drain) as Box<Drain<Error=E>+Send+Sync>))))
+    }
+
+    /// Create new `AtomicSwitch` from an existing `Arc<...>`
+    ///
+    /// See `AtomicSwitch::new()`
+    pub fn new_from_arc(d: Arc<ArcCell<Box<Drain<Error=E>+Send+Sync>>>) -> Self {
+        AtomicSwitch(d)
+    }
+
+    /// Get a `AtomicSwitchCtrl` handle to control this `AtomicSwitch` drain
+    pub fn ctrl(&self) -> AtomicSwitchCtrl<E> {
+        AtomicSwitchCtrl(self.0.clone())
+    }
+}
+
+impl<E> AtomicSwitchCtrl<E> {
+    /// Get Arc to the currently wrapped drain
+    pub fn get(&self) -> Arc<Box<Drain<Error=E>+Send+Sync>> {
+        self.0.get()
+    }
+
+    /// Set the current wrapped drain
+    pub fn set<D: Drain<Error=E>+Send+Sync>(&self, drain: D) {
+        let _ = self.0.set(Arc::new(Box::new(drain)));
+    }
+
+    /// Swap the existing drain with a new one
+    pub fn swap(&self, drain: Arc<Box<Drain<Error=E>+Send+Sync>>) -> Arc<Box<Drain<Error=E>+Send+Sync>> {
+        self.0.set(drain)
+    }
+
+    /// Get a `AtomicSwitch` drain controlled by this `AtomicSwitchCtrl`
+    pub fn drain(&self) -> AtomicSwitch<E> {
+        AtomicSwitch(self.0.clone())
+    }
+}
+
+impl<E> Drain for AtomicSwitch<E> {
+    type Error = E;
+    fn log(&self, info: &Record, logger_values: &OwnedKeyValueList) -> std::result::Result<(), E> {
+        self.0.get().log(info, logger_values)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"4b02f83b1737cb2149dce4ceb26f0f2bb638ca82babfb343119c9fea0e472248","CHANGELOG.md":"4de7cbce3846d61e5063e5cc6c64db5fc1c6e0a63c3c4b30206a8441d4b63fef","Cargo.toml":"d3d3f41b9c410ddf2abe7eca75a7e04ed8a8e5d31234778a8dc0adb638e26cae","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"da16c3f07d252efcad1bfb5a31a01d9b21cb05771b928a84ec1b489b8d0cc373","lib.rs":"4cbd62e5b20c363f4f5232b307b7ba78f89141a2518ca1b110bab6c9f7657c8a"},"package":"511581f4dd1dc90e4eca99b60be8a692d9c975e8757558aa774f16007d27492a"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/.travis.yml
@@ -0,0 +1,25 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+
+script:
+  - make all
+  - make travistest
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
+
+env:
+  global:
+    - RUST_BACKTRACE=1
+  matrix:
+    -
+    - RELEASE=true
+
+notifications:
+  webhooks:
+    urls:
+      - https://webhooks.gitter.im/e/6d8e17dd2fa83b143168
+    on_success: change  # options: [always|never|change] default: always
+    on_failure: change  # options: [always|never|change] default: always
+    on_start: false     # default: false
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/CHANGELOG.md
@@ -0,0 +1,15 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## 0.1.2 - 2017-02-17
+### Changed
+
+* Small fixes
+* Bumped versions of internal deps.
+
+## 0.1.0 - 2016-10-20
+### Added
+* `Async` drain
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "slog-extra"
+version = "0.1.2"
+authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
+description = "Standard slog-rs extensions"
+keywords = ["slog", "logging", "log"]
+license = "MPL-2.0"
+documentation = "https://docs.rs/slog-extra"
+homepage = "https://github.com/slog-rs/slog"
+repository = "https://github.com/slog-rs/extra"
+readme = "README.md"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+slog = "1.2.0"
+thread_local = { version = "0.3.2" }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/LICENSE-MPL2
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/Makefile
@@ -0,0 +1,68 @@
+PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
+DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
+ifeq (, $(shell which cargo-check 2> /dev/null))
+DEFAULT_TARGET=build
+else
+DEFAULT_TARGET=build
+endif
+
+default: $(DEFAULT_TARGET)
+
+ALL_TARGETS += build $(EXAMPLES) test doc
+ifneq ($(RELEASE),)
+$(info RELEASE BUILD: $(PKG_NAME))
+CARGO_FLAGS += --release
+else
+$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
+endif
+
+EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
+
+all: $(ALL_TARGETS)
+
+.PHONY: run test build doc clean clippy
+run test build clean:
+	cargo $@ $(CARGO_FLAGS)
+
+check:
+	$(info Running check; use `make build` to actually build)
+	cargo $@ $(CARGO_FLAGS)
+
+clippy:
+	cargo build --features clippy
+
+.PHONY: bench
+bench:
+	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
+
+.PHONY: travistest
+travistest: test
+
+.PHONY: longtest
+longtest:
+	@echo "Running longtest. Press Ctrl+C to stop at any time"
+	@sleep 2
+	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
+
+.PHONY: $(EXAMPLES)
+$(EXAMPLES):
+	cargo build --example $@ $(CARGO_FLAGS)
+
+.PHONY: doc
+doc: FORCE
+	cargo doc
+
+.PHONY: publishdoc
+publishdoc:
+	rm -rf target/doc
+	make doc
+	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
+	ghp-import -n target/doc
+	git push -f origin gh-pages
+
+.PHONY: docview
+docview: doc
+	xdg-open target/doc/$(PKG_NAME)/index.html
+
+.PHONY: FORCE
+FORCE:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/README.md
@@ -0,0 +1,23 @@
+# slog-extra - Standard [slog-rs] extensions
+
+<p align="center">
+  <a href="https://travis-ci.org/slog-rs/std">
+      <img src="https://img.shields.io/travis/slog-rs/std/master.svg" alt="Travis CI Build Status">
+  </a>
+
+  <a href="https://crates.io/crates/slog-std">
+      <img src="https://img.shields.io/crates/d/slog-std.svg" alt="slog-std on crates.io">
+  </a>
+
+  <a href="https://gitter.im/dpc/slog-std">
+      <img src="https://img.shields.io/gitter/room/dpc/slog-rs.svg" alt="slog-rs Gitter Chat">
+  </a>
+</p>
+
+[slog-rs]: //github.com/slog-rs/core
+
+This crates contains slog-rs extensions that don't belong to the core `slog` crate due to:
+
+* not supporting `no_std`
+* having additional dependencies
+* other problems
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-extra/lib.rs
@@ -0,0 +1,237 @@
+//! Standard slog-rs extensions.
+#![warn(missing_docs)]
+
+extern crate slog;
+extern crate thread_local;
+
+use slog::Drain;
+
+use std::sync::{mpsc, Mutex};
+use std::fmt;
+use std::{io, thread};
+use slog::{Record, RecordStatic, Level};
+use slog::ser::{self, Serialize, Serializer};
+
+use slog::OwnedKeyValueList;
+
+
+/// `Async` drain
+///
+/// `Async` will send all the logging records to a wrapped drain running in another thread.
+///
+/// Note: Dropping `Async` waits for it's worker-thread to finish (thus handle all previous
+/// requests). If you can't tolerate the delay, make sure you drop `Async` drain instance eg. in
+/// another thread.
+pub struct Async {
+    ref_sender: Mutex<mpsc::Sender<AsyncMsg>>,
+    tl_sender: thread_local::ThreadLocal<mpsc::Sender<AsyncMsg>>,
+    join: Mutex<Option<thread::JoinHandle<()>>>,
+}
+
+impl Async {
+    /// Create `Async` drain
+    ///
+    /// The wrapped drain must handle all error conditions (`Drain<Error=Never>`). See
+    /// `slog::DrainExt::fuse()` and `slog::DrainExt::ignore_err()` for typical error handling
+    /// strategies.
+    pub fn new<D: slog::Drain<Error=slog::Never> + Send + 'static>(drain: D) -> Self {
+        let (tx, rx) = mpsc::channel();
+        let join = thread::spawn(move || {
+                loop {
+                    match rx.recv().unwrap() {
+                        AsyncMsg::Record(r) => {
+                            let rs = RecordStatic {
+                                level: r.level,
+                                file: r.file,
+                                line: r.line,
+                                column: r.column,
+                                function: r.function,
+                                module: r.module,
+                                target: &r.target,
+                            };
+                            let record_values: Vec<_> = r.record_values
+                                .iter()
+                                .map(|&(k, ref v)| (k, v as &Serialize))
+                                .collect();
+
+                            drain.log(
+                                &Record::new(&rs,
+                                             format_args!("{}", r.msg),
+                                             record_values.as_slice()
+                                            ),
+                                            &r.logger_values
+                                            ).unwrap();
+                        }
+                        AsyncMsg::Finish => return,
+                    }
+                }
+        });
+
+        Async{
+            ref_sender: Mutex::new(tx),
+            tl_sender: thread_local::ThreadLocal::new(),
+            join: Mutex::new(Some(join)),
+        }
+    }
+
+    fn get_sender(&self) -> &mpsc::Sender<AsyncMsg> {
+        self.tl_sender.get_or(|| {
+            // TODO: Change to `get_or_try` https://github.com/Amanieu/thread_local-rs/issues/2
+            Box::new(self.ref_sender.lock().unwrap().clone())
+        })
+    }
+
+    /// Send `AsyncRecord` to a worker thread.
+    fn send(&self, r: AsyncRecord) -> io::Result<()> {
+        let sender = self.get_sender();
+
+        sender.send(AsyncMsg::Record(r))
+            .map_err(|_| io::Error::new(io::ErrorKind::BrokenPipe, "Send failed"))
+    }
+
+}
+
+type RecordValues = Vec<(&'static str, Box<Serialize + Send>)>;
+
+struct ToSendSerializer {
+    record_values: RecordValues,
+}
+
+impl ToSendSerializer {
+    fn new() -> Self {
+        ToSendSerializer { record_values: Vec::new() }
+    }
+
+    fn finish(self) -> RecordValues {
+        self.record_values
+    }
+}
+
+impl Serializer for ToSendSerializer {
+    fn emit_bool(&mut self, key: &'static str, val: bool) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_unit(&mut self, key: &'static str) -> ser::Result {
+        self.record_values.push((key, Box::new(())));
+        Ok(())
+    }
+    fn emit_none(&mut self, key: &'static str) -> ser::Result {
+        let val: Option<()> = None;
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_char(&mut self, key: &'static str, val: char) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_u8(&mut self, key: &'static str, val: u8) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_i8(&mut self, key: &'static str, val: i8) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_u16(&mut self, key: &'static str, val: u16) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_i16(&mut self, key: &'static str, val: i16) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_u32(&mut self, key: &'static str, val: u32) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_i32(&mut self, key: &'static str, val: i32) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_f32(&mut self, key: &'static str, val: f32) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_u64(&mut self, key: &'static str, val: u64) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_i64(&mut self, key: &'static str, val: i64) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_f64(&mut self, key: &'static str, val: f64) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_usize(&mut self, key: &'static str, val: usize) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_isize(&mut self, key: &'static str, val: isize) -> ser::Result {
+        self.record_values.push((key, Box::new(val)));
+        Ok(())
+    }
+    fn emit_str(&mut self, key: &'static str, val: &str) -> ser::Result {
+        self.record_values.push((key, Box::new(String::from(val))));
+        Ok(())
+    }
+    fn emit_arguments(&mut self, key: &'static str, val: &fmt::Arguments) -> ser::Result {
+        self.record_values.push((key, Box::new(fmt::format(*val))));
+        Ok(())
+    }
+}
+
+
+impl Drain for Async {
+    type Error = io::Error;
+
+    fn log(&self, record: &Record, logger_values: &OwnedKeyValueList) -> io::Result<()> {
+
+        let mut ser = ToSendSerializer::new();
+        for &(k, v) in record.values() {
+            try!(v.serialize(record, k, &mut ser))
+        }
+
+        self.send(AsyncRecord {
+            msg: fmt::format(record.msg()),
+            level: record.level(),
+            file: record.file(),
+            line: record.line(),
+            column: record.column(),
+            function: record.function(),
+            module: record.module(),
+            target: String::from(record.target()),
+            logger_values: logger_values.clone(),
+            record_values: ser.finish(),
+        })
+    }
+}
+
+struct AsyncRecord {
+    msg: String,
+    level: Level,
+    file: &'static str,
+    line: u32,
+    column: u32,
+    function: &'static str,
+    module: &'static str,
+    target: String,
+    logger_values: OwnedKeyValueList,
+    record_values: Vec<(&'static str, Box<Serialize + Send>)>,
+}
+
+enum AsyncMsg {
+    Record(AsyncRecord),
+    Finish,
+}
+
+impl Drop for Async {
+    fn drop(&mut self) {
+        let sender = self.get_sender();
+
+        let _ = sender.send(AsyncMsg::Finish);
+        let _ = self.join.lock().unwrap().take().unwrap().join();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stdlog/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","CHANGELOG.md":"af163c2e549e8f0afa1a9045aa1a9a9f75d0c76eef19a9e13d696751a4befb67","Cargo.toml":"8db2e82b704d6b92c1a63723c5d2ec684fd60745d0706908dbe5d259a61c67a6","lib.rs":"bfffab260c34f0714054d51d2ac3a7fd0cd127fe07059d9327b988599408b8f0"},"package":"56cc08f40c45e0ab41dcfde0a19a22c5b7176d3827fc7d078450ebfdc080a37c"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stdlog/CHANGELOG.md
@@ -0,0 +1,21 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## 1.1.0
+### Changed
+
+* BREAKING: Rewrite handling of owned values.
+
+## 1.0.1 - 2016-10-02
+### Changed
+
+* Fixed `StdLog` not serializing the key-value pairs.
+* `StdLog` message to `log` crate is lazily-evaluated.
+
+
+## 1.0.0 - 2016-09-21
+
+First stable release.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stdlog/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "slog-stdlog"
+version = "1.1.0"
+authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
+description = "Standard Rust log crate adapter to slog-rs"
+keywords = ["slog", "logging", "json", "log"]
+license = "MPL-2.0"
+documentation = "https://dpc.github.io/slog-rs/"
+homepage = "https://github.com/dpc/slog-rs"
+repository = "https://github.com/dpc/slog-rs"
+readme = "../../README.md"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+slog = { version = "1.1", path = "../.." }
+slog-term = { version = "1", path = "../term" }
+log = "0.3.6"
+lazy_static = "0.2.1"
+crossbeam = "0.2.9"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stdlog/lib.rs
@@ -0,0 +1,430 @@
+//! Standard Rust log crate adapter to slog-rs
+//!
+//! This crate allows using `slog` features with code
+//! using legacy `log` statements.
+//!
+//! `log` crate expects a global logger to be registered
+//! (popular one is `env_logger`) as a handler for all
+//! `info!(...)` and similar.
+//!
+//! `slog-stdlog` will register itself as `log` global handler and forward all
+//! legacy logging statements to `slog`'s `Logger`. That means existing logging
+//! `debug!` (even in dependencies crates) work and utilize `slog` composable
+//! drains.
+//!
+//! See `init()` documentation for minimal working example.
+//!
+//! Note: Whilte `slog-scope` provides a similiar functionality, the `slog-scope` and `slog-stdlog`
+//! keep track of distinct logginc scopes.
+#![warn(missing_docs)]
+
+#[macro_use]
+extern crate slog;
+extern crate slog_term;
+extern crate log;
+#[macro_use]
+extern crate lazy_static;
+extern crate crossbeam;
+
+use slog::{DrainExt, ser};
+
+use log::LogMetadata;
+use std::sync::Arc;
+use std::cell::RefCell;
+use std::{io, fmt};
+use std::io::Write;
+
+use slog::Level;
+use crossbeam::sync::ArcCell;
+
+thread_local! {
+    static TL_SCOPES: RefCell<Vec<slog::Logger>> = RefCell::new(Vec::with_capacity(8))
+}
+
+lazy_static! {
+    static ref GLOBAL_LOGGER : ArcCell<slog::Logger> = ArcCell::new(
+        Arc::new(
+            slog::Logger::root(slog::Discard, o!())
+        )
+    );
+}
+
+fn set_global_logger(l: slog::Logger) {
+    let _ = GLOBAL_LOGGER.set(Arc::new(l));
+}
+
+struct Logger;
+
+
+fn log_to_slog_level(level: log::LogLevel) -> Level {
+    match level {
+        log::LogLevel::Trace => Level::Trace,
+        log::LogLevel::Debug => Level::Debug,
+        log::LogLevel::Info => Level::Info,
+        log::LogLevel::Warn => Level::Warning,
+        log::LogLevel::Error => Level::Error,
+    }
+}
+
+impl log::Log for Logger {
+    fn enabled(&self, _: &LogMetadata) -> bool {
+        true
+    }
+
+    fn log(&self, r: &log::LogRecord) {
+        let level = log_to_slog_level(r.metadata().level());
+
+        let args = r.args();
+        let target = r.target();
+        let module = r.location().__module_path;
+        let file = r.location().__file;
+        let line = r.location().line();
+        with_current_logger(|l| {
+            let s = slog::RecordStatic {
+                level: level,
+                file: file,
+                line: line,
+                column: 0,
+                function: "",
+                module: module,
+                target: target,
+            };
+            l.log(&slog::Record::new(&s, *args, &[]))
+        })
+    }
+}
+
+/// Set a `slog::Logger` as a global `log` create handler
+///
+/// This will forward all `log` records to `slog` logger.
+///
+/// ```
+/// // only use `o` macro from `slog` crate
+/// #[macro_use(o)]
+/// extern crate slog;
+/// #[macro_use]
+/// extern crate log;
+/// extern crate slog_stdlog;
+///
+/// fn main() {
+///     let root = slog::Logger::root(
+///         slog::Discard,
+///         o!("build-id" => "8dfljdf"),
+///     );
+///     slog_stdlog::set_logger(root).unwrap();
+///     // Note: this `info!(...)` macro comes from `log` crate
+///     info!("standard logging redirected to slog");
+/// }
+/// ```
+pub fn set_logger(logger: slog::Logger) -> Result<(), log::SetLoggerError> {
+    log::set_logger(|max_log_level| {
+        max_log_level.set(log::LogLevelFilter::max());
+        set_global_logger(logger);
+        Box::new(Logger)
+    })
+}
+
+/// Set a `slog::Logger` as a global `log` create handler
+///
+/// This will forward `log` records that satisfy `log_level_filter` to `slog` logger.
+pub fn set_logger_level(logger: slog::Logger,
+                        log_level_filter: log::LogLevelFilter)
+                        -> Result<(), log::SetLoggerError> {
+    log::set_logger(|max_log_level| {
+        max_log_level.set(log_level_filter);
+        set_global_logger(logger);
+        Box::new(Logger)
+    })
+}
+
+/// Minimal initialization with default drain
+///
+/// The exact default drain is unspecified and will
+/// change in future versions! Use `set_logger` instead
+/// to build customized drain.
+///
+/// ```
+/// #[macro_use]
+/// extern crate log;
+/// extern crate slog_stdlog;
+///
+/// fn main() {
+///     slog_stdlog::init().unwrap();
+///     // Note: this `info!(...)` macro comes from `log` crate
+///     info!("standard logging redirected to slog");
+/// }
+/// ```
+pub fn init() -> Result<(), log::SetLoggerError> {
+    let drain = slog::level_filter(Level::Info, slog_term::streamer().compact().build());
+    set_logger(slog::Logger::root(drain.fuse(), o!()))
+}
+
+struct ScopeGuard;
+
+
+impl ScopeGuard {
+    fn new(logger: slog::Logger) -> Self {
+        TL_SCOPES.with(|s| {
+            s.borrow_mut().push(logger);
+        });
+
+        ScopeGuard
+    }
+}
+
+impl Drop for ScopeGuard {
+    fn drop(&mut self) {
+        TL_SCOPES.with(|s| {
+            s.borrow_mut().pop().expect("TL_SCOPES should contain a logger");
+        })
+    }
+}
+
+
+/// Access the currently active logger
+///
+/// The reference logger will be either:
+/// * global logger, or
+/// * currently active scope logger
+///
+/// **Warning**: Calling `scope` inside `f`
+/// will result in a panic.
+pub fn with_current_logger<F, R>(f: F) -> R
+    where F: FnOnce(&slog::Logger) -> R
+{
+    TL_SCOPES.with(|s| {
+        let s = s.borrow();
+        if s.is_empty() {
+            f(&GLOBAL_LOGGER.get())
+        } else {
+            f(&s[s.len() - 1])
+        }
+    })
+}
+
+/// Access the `Logger` for the current logging scope
+pub fn logger() -> slog::Logger {
+    TL_SCOPES.with(|s| {
+        let s = s.borrow();
+        if s.is_empty() {
+            (*GLOBAL_LOGGER.get()).clone()
+        } else {
+            s[s.len() - 1].clone()
+        }
+    })
+}
+
+/// Execute code in a logging scope
+///
+/// Logging scopes allow using different logger for legacy logging
+/// statements in part of the code.
+///
+/// Logging scopes can be nested and are panic safe.
+///
+/// `logger` is the `Logger` to use during the duration of `f`.
+/// `with_current_logger` can be used to build it as a child of currently active
+/// logger.
+///
+/// `f` is a code to be executed in the logging scope.
+///
+/// Note: Thread scopes are thread-local. Each newly spawned thread starts
+/// with a global logger, as a current logger.
+pub fn scope<SF, R>(logger: slog::Logger, f: SF) -> R
+    where SF: FnOnce() -> R
+{
+    let _guard = ScopeGuard::new(logger);
+    f()
+}
+
+/// Drain logging `Record`s into `log` crate
+///
+/// Using `StdLog` is effectively the same as using `log::info!(...)` and
+/// other standard logging statements.
+///
+/// Caution needs to be taken to prevent circular loop where `Logger`
+/// installed via `slog-stdlog::set_logger` would log things to a `StdLog`
+/// drain, which would again log things to the global `Logger` and so on
+/// leading to an infinite recursion.
+pub struct StdLog;
+
+struct LazyLogString<'a> {
+    info: &'a slog::Record<'a>,
+    logger_values : &'a slog::OwnedKeyValueList
+}
+
+impl<'a> LazyLogString<'a> {
+
+    fn new(info : &'a slog::Record, logger_values : &'a slog::OwnedKeyValueList) -> Self {
+
+        LazyLogString {
+            info: info,
+            logger_values: logger_values,
+        }
+    }
+}
+
+impl<'a> fmt::Display for LazyLogString<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+
+        try!(write!(f, "{}", self.info.msg()));
+
+        let io = io::Cursor::new(Vec::new());
+        let mut ser = KSV::new(io, ": ".into());
+
+        let res = {
+            || -> io::Result<()> {
+
+            for (ref k, ref v) in self.logger_values.iter() {
+                try!(ser.io().write_all(", ".as_bytes()));
+                try!(v.serialize(self.info, k, &mut ser));
+            }
+
+            for &(ref k, ref v) in self.info.values().iter() {
+                try!(ser.io().write_all(", ".as_bytes()));
+                try!(v.serialize(self.info, k, &mut ser));
+            }
+            Ok(())
+        }
+        }().map_err(|_| fmt::Error);
+
+        try!(res);
+
+        let values = ser.into_inner().into_inner();
+
+
+        write!(f, "{}", String::from_utf8_lossy(&values))
+
+    }
+}
+
+impl slog::Drain for StdLog {
+    type Error = io::Error;
+    fn log(&self, info: &slog::Record, logger_values : &slog::OwnedKeyValueList) -> io::Result<()> {
+
+        let level = match info.level() {
+            slog::Level::Critical => log::LogLevel::Error,
+            slog::Level::Error => log::LogLevel::Error,
+            slog::Level::Warning => log::LogLevel::Warn,
+            slog::Level::Info => log::LogLevel::Info,
+            slog::Level::Debug => log::LogLevel::Debug,
+            slog::Level::Trace => log::LogLevel::Trace,
+        };
+
+        let target = info.target();
+
+        let location = log::LogLocation {
+            __module_path: info.module(),
+            __file: info.file(),
+            __line: info.line(),
+        };
+
+        let lazy = LazyLogString::new(info, logger_values);
+        // Please don't yell at me for this! :D
+        // https://github.com/rust-lang-nursery/log/issues/95
+        log::__log(level, target, &location, format_args!("{}", lazy));
+
+        Ok(())
+    }
+}
+
+/// Key-Separator-Value serializer
+struct KSV<W: io::Write> {
+    separator: String,
+    io: W,
+}
+
+impl<W: io::Write> KSV<W> {
+    fn new(io: W, separator: String) -> Self {
+        KSV {
+            io: io,
+            separator: separator,
+        }
+    }
+
+    fn io(&mut self) -> &mut W {
+        &mut self.io
+    }
+
+    fn into_inner(self) -> W {
+        self.io
+    }
+}
+
+impl<W: io::Write> ser::Serializer for KSV<W> {
+    fn emit_none(&mut self, key: &str) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, "None"));
+        Ok(())
+    }
+    fn emit_unit(&mut self, key: &str) -> ser::Result {
+        try!(write!(self.io, "{}", key));
+        Ok(())
+    }
+
+    fn emit_bool(&mut self, key: &str, val: bool) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+
+    fn emit_char(&mut self, key: &str, val: char) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+
+    fn emit_usize(&mut self, key: &str, val: usize) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_isize(&mut self, key: &str, val: isize) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+
+    fn emit_u8(&mut self, key: &str, val: u8) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_i8(&mut self, key: &str, val: i8) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_u16(&mut self, key: &str, val: u16) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_i16(&mut self, key: &str, val: i16) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_u32(&mut self, key: &str, val: u32) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_i32(&mut self, key: &str, val: i32) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_f32(&mut self, key: &str, val: f32) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_u64(&mut self, key: &str, val: u64) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_i64(&mut self, key: &str, val: i64) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_f64(&mut self, key: &str, val: f64) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_str(&mut self, key: &str, val: &str) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> ser::Result {
+        try!(write!(self.io, "{}{}{}", key, self.separator, val));
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"2fc996c6292077edce4c427726bf849c151b7665f6113c3001cc227e097d461e",".travis.yml":"abf49e9a9c5e47bccf61fc38a27486fa13ca5dd39eeffab145c072418bbd98aa","CHANGELOG.md":"aca50d5d669b3414a45410e8ff53f9a98761a149b81262f012884035fb619b90","Cargo.toml":"6a799822989ca386b272fd0982adc749401fb0df3fec6a6a9da501d15ff72fc7","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"40005693579af3edb05aa440b675094cbec955e62eeb0fe5ee43fc5fc47e99fa","format.rs":"1655b17acb3c94f3c5b20bc881de192e57d0570ba372fbd62f4b3d013a5b17ba","lib.rs":"90f57f61cc9ecc1f88f8b6fcbcc76fa4fbd15537be24e410879c50da20e9c9c5","rusty-tags.vi":"f939543b8f86aba0015d7d10be2a6786bb1a8ae3eef7ef4ff248739d8c4d4716"},"package":"3fac4af71007ddb7338f771e059a46051f18d1454d8ac556f234a0573e719daa"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/.gitignore
@@ -0,0 +1,4 @@
+target
+Cargo.lock
+/tags
+.cargo
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/.travis.yml
@@ -0,0 +1,30 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+  
+before_install:
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq graphviz
+
+script:
+  - make all
+  - make travistest
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo build --no-default-features; fi
+
+env:
+  global:
+    - RUST_BACKTRACE=1
+  matrix:
+    -
+    - RELEASE=true
+
+notifications:
+  webhooks:
+    urls:
+      - https://webhooks.gitter.im/e/87a331e1a21456b6e2ad
+    on_success: change  # options: [always|never|change] default: always
+    on_failure: change  # options: [always|never|change] default: always
+    on_start: false     # default: false
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/CHANGELOG.md
@@ -0,0 +1,34 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## 1.2.1 - 2017-05-10
+### Changed
+
+* Update dependencies
+
+## 1.1.0 - 2016-09-28
+### Changed
+
+* **BREAKING**: `RecordDecorator` API has been changed to allow formatting
+  without any allocation.
+
+## 1.0.0 - 2016-09-21
+
+First stable release.
+## 1.2.0 - [Unreleased]
+### Changed
+
+* **BREAKING**: Switched `AsyncStramer` to `slog_extra::Async`
+
+## 1.1.0 - 2016-09-28
+### Changed
+
+* **BREAKING**: `RecordDecorator` API has been changed to allow formatting
+  without any allocation.
+
+## 1.0.0 - 2016-09-21
+
+First stable release.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "slog-stream"
+version = "1.2.1"
+authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
+description = "`io::Write` streamer for slog-rs"
+keywords = ["log", "logging", "structured", "hierarchical", "stream"]
+license = "MPL-2.0"
+documentation = "https://docs.rs/slog-stream"
+homepage = "https://github.com/slog-rs/slog"
+repository = "https://github.com/slog-rs/stream"
+readme = "README.md"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+slog = "1.2"
+slog-extra = "0.1.1"
+thread_local = "0.3.2"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/LICENSE-MPL2
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/Makefile
@@ -0,0 +1,68 @@
+PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
+DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
+ifeq (, $(shell which cargo-check 2> /dev/null))
+DEFAULT_TARGET=build
+else
+DEFAULT_TARGET=build
+endif
+
+default: $(DEFAULT_TARGET)
+
+ALL_TARGETS += build $(EXAMPLES) test doc
+ifneq ($(RELEASE),)
+$(info RELEASE BUILD: $(PKG_NAME))
+CARGO_FLAGS += --release
+else
+$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
+endif
+
+EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
+
+all: $(ALL_TARGETS)
+
+.PHONY: run test build doc clean clippy
+run test build clean:
+	cargo $@ $(CARGO_FLAGS)
+
+check:
+	$(info Running check; use `make build` to actually build)
+	cargo $@ $(CARGO_FLAGS)
+
+clippy:
+	cargo build --features clippy
+
+.PHONY: bench
+bench:
+	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
+
+.PHONY: travistest
+travistest: test
+
+.PHONY: longtest
+longtest:
+	@echo "Running longtest. Press Ctrl+C to stop at any time"
+	@sleep 2
+	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
+
+.PHONY: $(EXAMPLES)
+$(EXAMPLES):
+	cargo build --example $@ $(CARGO_FLAGS)
+
+.PHONY: doc
+doc: FORCE
+	cargo doc
+
+.PHONY: publishdoc
+publishdoc:
+	rm -rf target/doc
+	make doc
+	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
+	ghp-import -n target/doc
+	git push -f origin gh-pages
+
+.PHONY: docview
+docview: doc
+	xdg-open target/doc/$(PKG_NAME)/index.html
+
+.PHONY: FORCE
+FORCE:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/README.md
@@ -0,0 +1,17 @@
+## slog-stream - `io::Write` streamer for [slog-rs]
+
+<p align="center">
+  <a href="https://travis-ci.org/slog-rs/stream">
+      <img src="https://img.shields.io/travis/slog-rs/stream/master.svg" alt="Travis CI Build Status">
+  </a>
+
+  <a href="https://crates.io/crates/slog-stream">
+      <img src="https://img.shields.io/crates/d/slog-stream.svg" alt="slog-stream on crates.io">
+  </a>
+
+  <a href="https://gitter.im/slog-rs/slog">
+      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
+  </a>
+</p>
+
+[slog-rs]: //github.com/slog-rs/slog
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/format.rs
@@ -0,0 +1,53 @@
+
+/// Formats `Record`-s into IO
+pub trait Format: Send + Sync + Sized {
+    /// Format one logging record and write into `io`
+    fn format(&self,
+              io: &mut io::Write,
+              info: &Record,
+              logger_values: &OwnedKeyValueList)
+              -> io::Result<()>;
+}
+
+/// Formatted stream decorator
+///
+/// Some `Format`s for which it make sense can use this to parametrize
+/// themselves on the exact behavior of formatting parts of the output. This
+/// can be used eg. to use color when displaying logger records on the terminal.
+pub trait Decorator: Send + Sync + Sized {
+    /// Per-record decorator
+    type RecordDecorator: RecordDecorator;
+
+    /// Get a `RecordDecorator` for a given `record`
+    fn decorate(&self, record: &Record) -> Self::RecordDecorator;
+}
+
+/// Per-record decorator
+// TODO 2.0: Make everything take `&mut self`.
+// TODO 2.0: Make everything take `f: &FnOnce`
+pub trait RecordDecorator {
+    /// Format a field
+    fn fmt_msg(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
+        f(io)
+    }
+    /// Format a key
+    fn fmt_key(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
+        f(io)
+    }
+    /// Format a separator
+    fn fmt_separator(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
+        f(io)
+    }
+    /// Format a value
+    fn fmt_value(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
+        f(io)
+    }
+    /// Format a timestamp
+    fn fmt_timestamp(&self, io: &mut io::Write, f : &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
+        f(io)
+    }
+    /// Format a level
+    fn fmt_level(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
+        f(io)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/lib.rs
@@ -0,0 +1,88 @@
+//! `io::Write` streamer for slog-rs
+//!
+//! One of the main drains not included in the core `slog-rs` create.
+//! `Streamer` drain serializes logging records into stream of bytes
+//! using given `Format` and writes it to a given `io::Write`.
+#![warn(missing_docs)]
+
+#[macro_use]
+extern crate slog;
+extern crate slog_extra;
+extern crate thread_local;
+
+use slog::{Drain, DrainExt};
+
+use std::cell::RefCell;
+
+use std::sync::Mutex;
+use std::io;
+use slog::Record;
+
+use slog_extra::Async;
+use slog::OwnedKeyValueList;
+
+include!("format.rs");
+
+thread_local! {
+    static TL_BUF: RefCell<Vec<u8>> = RefCell::new(Vec::with_capacity(128))
+}
+
+/// Drain formating records and writing them to a byte-stream (`io::Write`)
+///
+/// Uses mutex to serialize writes to `io`. Use `AsyncStreamer` for better
+/// performance, but without guarantee of immediate output.
+pub struct Streamer<W: io::Write, F: Format> {
+    io: Mutex<W>,
+    format: F,
+}
+
+impl<W: io::Write, F: Format> Streamer<W, F> {
+    /// Create new `Streamer` writing to `io` using `format`
+    pub fn new(io: W, format: F) -> Self {
+        Streamer {
+            io: Mutex::new(io),
+            format: format,
+        }
+    }
+}
+
+impl<W: 'static + io::Write + Send, F: Format + Send> Drain for Streamer<W, F> {
+    type Error = io::Error;
+
+    fn log(&self, info: &Record, logger_values: &OwnedKeyValueList) -> io::Result<()> {
+
+        TL_BUF.with(|buf| {
+            let mut buf = buf.borrow_mut();
+            let res = {
+                || {
+                    try!(self.format.format(&mut *buf, info, logger_values));
+                    {
+                        let mut io = try!(self.io
+                            .lock()
+                            .map_err(|_| io::Error::new(io::ErrorKind::Other, "lock error")));
+                        try!(io.write_all(&buf));
+                    }
+                    Ok(())
+                }
+            }();
+            buf.clear();
+            res
+        })
+    }
+}
+
+/// Stream logging records to IO
+///
+/// Create `Streamer` drain
+pub fn stream<W: io::Write + Send, F: Format>(io: W, format: F) -> Streamer<W, F> {
+    Streamer::new(io, format)
+}
+
+/// Stream logging records to IO asynchronously
+///
+/// Create `AsyncStreamer` drain
+pub fn async_stream<W: io::Write + Send + 'static, F: Format + Send + 'static>(io: W,
+                                                                               format: F)
+                                                                               -> Async {
+    Async::new(Streamer::new(io, format).fuse())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-stream/rusty-tags.vi
@@ -0,0 +1,341 @@
+!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
+ASCII_LOWERCASE_MAP	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^static ASCII_LOWERCASE_MAP: [u8; 256] = [$/;"	c
+AsFmtSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct AsFmtSerializer<F>(pub F)$/;"	s
+Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Async {$/;"	i
+Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^pub struct Async {$/;"	s
+AsyncMsg	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^enum AsyncMsg {$/;"	g
+AsyncRecord	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^struct AsyncRecord {$/;"	s
+BoxExt	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^trait BoxExt<T: ?Sized> {$/;"	t
+BoxExt for Box	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized> BoxExt<T> for Box<T> {$/;"	i
+CachedIntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub type CachedIntoIter<T> = Chain<OptionIter<Box<T>>, IntoIter<T>>;$/;"	T
+CachedIterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub type CachedIterMut<'a, T> = Chain<OptionIter<&'a mut Box<T>>, IterMut<'a, T>>;$/;"	T
+CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> CachedThreadLocal<T> {$/;"	i
+CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: Send + Default> CachedThreadLocal<T> {$/;"	i
+CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct CachedThreadLocal<T: ?Sized + Send> {$/;"	s
+CheckOwned	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^        struct CheckOwned;$/;"	s
+Clone for TableEntry	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Clone for TableEntry<T> {$/;"	i
+Default for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Default for CachedThreadLocal<T> {$/;"	i
+Default for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Default for ThreadLocal<T> {$/;"	i
+Discard	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Discard;$/;"	s
+Drain	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub trait Drain {$/;"	t
+Drain for Arc	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain+?Sized> Drain for Arc<D> {$/;"	i
+Drain for Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Drain for Async {$/;"	i
+Drain for Box	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain+?Sized> Drain for Box<D> {$/;"	i
+Drain for CheckOwned	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^        impl Drain for CheckOwned {$/;"	i
+Drain for Discard	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl Drain for Discard {$/;"	i
+Drain for Duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D1 : Drain, D2 : Drain> Drain for Duplicate<D1, D2> {$/;"	i
+Drain for Filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for Filter<D> {$/;"	i
+Drain for Fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for Fuse<D> where D::Error : fmt::Display {$/;"	i
+Drain for IgnoreErr	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for IgnoreErr<D> {$/;"	i
+Drain for LevelFilter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for LevelFilter<D> {$/;"	i
+Drain for Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^impl Drain for Logger {$/;"	i
+Drain for MapError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain, E> Drain for MapError<D, E> {$/;"	i
+Drain for Streamer	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^impl<W: 'static + io::Write + Send, F: Format + Send> Drain for Streamer<W, F> {$/;"	i
+DrainExt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub trait DrainExt: Sized + Drain {$/;"	t
+DrainExt for D	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D : Drain> DrainExt for D {}$/;"	i
+Drop for Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Drop for Async {$/;"	i
+Drop for PushFnSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Drop for PushFnSerializer<'a> {$/;"	i
+Drop for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Drop for ThreadLocal<T> {$/;"	i
+Duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D1: Drain, D2: Drain> Duplicate<D1, D2> {$/;"	i
+Duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Duplicate<D1: Drain, D2: Drain> {$/;"	s
+DuplicateError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub enum DuplicateError<E1, E2> {$/;"	g
+Err	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    type Err = ();$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    type Error = io::Error;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = D::Error;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = DuplicateError<D1::Error, D2::Error>;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = E;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = Never;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    type Error = Never;$/;"	T
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub enum Error {$/;"	g
+Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^            type Error = Never;$/;"	T
+Error	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    type Error = io::Error;$/;"	T
+ExactSizeIterator for IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> ExactSizeIterator for IntoIter<T> {}$/;"	i
+ExactSizeIterator for IterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> ExactSizeIterator for IterMut<'a, T> {}$/;"	i
+Filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Filter<D> {$/;"	i
+Filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Filter<D: Drain> {$/;"	s
+FilterLevel	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl FilterLevel {$/;"	i
+FilterLevel	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub enum FilterLevel {$/;"	g
+FnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct FnValue<V: 'static + Value, F>(pub F)$/;"	s
+Format	/home/dpc/lab/rust/slog/slog-stream/format.rs	/^pub trait Format: Send + Sync + Sized {$/;"	t
+From for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl From<core::fmt::Error> for Error {$/;"	i
+From for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl From<std::io::Error> for Error {$/;"	i
+From for std	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl From<Error> for std::io::Error {$/;"	i
+FromStr for FilterLevel	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl FromStr for FilterLevel {$/;"	i
+Fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Fuse<D> {$/;"	i
+Fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Fuse<D: Drain> {$/;"	s
+IgnoreErr	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> IgnoreErr<D> {$/;"	i
+IgnoreErr	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct IgnoreErr<D: Drain> {$/;"	s
+IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = CachedIntoIter<T>;$/;"	T
+IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = CachedIterMut<'a, T>;$/;"	T
+IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = IntoIter<T>;$/;"	T
+IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = IterMut<'a, T>;$/;"	T
+IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct IntoIter<T: ?Sized + Send> {$/;"	s
+IntoIterator	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> IntoIterator for &'a mut CachedThreadLocal<T> {$/;"	i
+IntoIterator	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> IntoIterator for &'a mut ThreadLocal<T> {$/;"	i
+IntoIterator for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> IntoIterator for CachedThreadLocal<T> {$/;"	i
+IntoIterator for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> IntoIterator for ThreadLocal<T> {$/;"	i
+Item	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    type Item = &'a KV;$/;"	T
+Item	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type Item = &'a mut Box<T>;$/;"	T
+Item	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type Item = Box<T>;$/;"	T
+IterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct IterMut<'a, T: ?Sized + Send + 'a> {$/;"	s
+Iterator for IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Iterator for IntoIter<T> {$/;"	i
+Iterator for IterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> Iterator for IterMut<'a, T> {$/;"	i
+Iterator for OwnedKVGroupIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> Iterator for OwnedKVGroupIterator<'a> {$/;"	i
+Iterator for OwnedKVIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> Iterator for OwnedKVIterator<'a> {$/;"	i
+KV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl KV for () {$/;"	i
+KV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T: KV, R: KV> KV for (T, R) {$/;"	i
+KV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait KV {$/;"	t
+KV for SingleKV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<K, V> KV for SingleKV<K, V>$/;"	i
+Key	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Key for &'a str {$/;"	i
+Key	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait Key {$/;"	t
+Key for String	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Key for String {$/;"	i
+Key for str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Key for str {$/;"	i
+LOG_LEVEL_NAMES	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub static LOG_LEVEL_NAMES: [&'static str; 7] = ["OFF", "CRITICAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"];$/;"	c
+LOG_LEVEL_SHORT_NAMES	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub static LOG_LEVEL_SHORT_NAMES: [&'static str; 7] = ["OFF", "CRIT", "ERRO", "WARN", "INFO", "DEBG", "TRCE"];$/;"	c
+Level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl Level {$/;"	i
+Level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub enum Level {$/;"	g
+LevelFilter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> LevelFilter<D> {$/;"	i
+LevelFilter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct LevelFilter<D: Drain> {$/;"	s
+Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^impl Logger {$/;"	i
+Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^pub struct Logger {$/;"	s
+MapError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain, E> MapError<D, E> {$/;"	i
+MapError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct MapError<D: Drain, E> {$/;"	s
+Never	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/lib.rs	/^pub type Never = ();$/;"	T
+OwnedKVGroup	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVGroup($/;"	s
+OwnedKVGroupIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> OwnedKVGroupIterator<'a> {$/;"	i
+OwnedKVGroupIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVGroupIterator<'a> {$/;"	s
+OwnedKVIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> OwnedKVIterator<'a> {$/;"	i
+OwnedKVIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVIterator<'a> {$/;"	s
+OwnedKVList	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl OwnedKVList {$/;"	i
+OwnedKVList	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVList {$/;"	s
+OwnedKVListNode	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^struct OwnedKVListNode {$/;"	s
+PushFnSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> PushFnSerializer<'a> {$/;"	i
+PushFnSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct PushFnSerializer<'a> {$/;"	s
+PushFnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct PushFnValue<F>(pub F)$/;"	s
+RS	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {$/;"	c
+RawIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> RawIter<T> {$/;"	i
+RawIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^struct RawIter<T: ?Sized + Send> {$/;"	s
+Record	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^impl<'a> Record<'a> {$/;"	i
+Record	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^pub struct Record<'a> {$/;"	s
+RecordStatic	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^pub struct RecordStatic<'a> {$/;"	s
+RecordValues	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^type RecordValues = Vec<Box<slog::KV+Send>>;$/;"	T
+Result	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub type Result<T=()> = result::Result<T, Error>;$/;"	T
+STATIC_TERMINATOR_UNIT	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^static STATIC_TERMINATOR_UNIT : () = ();$/;"	c
+Serializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait Serializer {$/;"	t
+Serializer for AsFmtSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<F> Serializer for AsFmtSerializer<F>$/;"	i
+Serializer for ToSendSerializer	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Serializer for ToSendSerializer {$/;"	i
+SingleKV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct SingleKV<K, V>(pub K, pub V)$/;"	s
+Streamer	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^impl<W: io::Write, F: Format> Streamer<W, F> {$/;"	i
+Streamer	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^pub struct Streamer<W: io::Write, F: Format> {$/;"	s
+Sync for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^unsafe impl<T: ?Sized + Send> Sync for CachedThreadLocal<T> {}$/;"	i
+Sync for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^unsafe impl<T: ?Sized + Send> Sync for ThreadLocal<T> {}$/;"	i
+TL_BUF	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    static TL_BUF: RefCell<Vec<u8>> = RefCell::new(Vec::with_capacity(128))$/;"	c
+Table	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^struct Table<T: ?Sized + Send> {$/;"	s
+TableEntry	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^struct TableEntry<T: ?Sized + Send> {$/;"	s
+ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> ThreadLocal<T> {$/;"	i
+ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: Send + Default> ThreadLocal<T> {$/;"	i
+ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct ThreadLocal<T: ?Sized + Send> {$/;"	s
+ToSendSerializer	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl ToSendSerializer {$/;"	i
+ToSendSerializer	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^struct ToSendSerializer {$/;"	s
+UncheckedOptionExt	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^trait UncheckedOptionExt<T> {$/;"	t
+UncheckedOptionExt for Option	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T> UncheckedOptionExt<T> for Option<T> {$/;"	i
+UncheckedOptionExt for Result	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T, E> UncheckedOptionExt<T> for Result<T, E> {$/;"	i
+Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^        impl Value for $t {$/;"	i
+Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for () {$/;"	i
+Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Value for &'a str {$/;"	i
+Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait Value {$/;"	t
+Value for Arc	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T> Value for Arc<T>$/;"	i
+Value for Box	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for Box<Value + Send + 'static> {$/;"	i
+Value for F	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<V: 'static + Value, F> Value for F$/;"	i
+Value for FnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<V: 'static + Value, F> Value for FnValue<V, F>$/;"	i
+Value for Option	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T: Value> Value for Option<T> {$/;"	i
+Value for PushFnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<F> Value for PushFnValue<F>$/;"	i
+Value for Rc	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T> Value for Rc<T>$/;"	i
+Value for String	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for String {$/;"	i
+Value for core	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T> Value for core::num::Wrapping<T>$/;"	i
+Value for fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Value for fmt::Arguments<'a> {$/;"	i
+Value for str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for str {$/;"	i
+Void	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    enum Void {}$/;"	g
+__slog_static_max_level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^pub fn __slog_static_max_level() -> FilterLevel {$/;"	f
+append	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn append(&self, other: &OwnedKVList) -> OwnedKVList {$/;"	f
+as_short_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn as_short_str(&self) -> &'static str {$/;"	f
+as_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn as_str(&self) -> &'static str {$/;"	f
+as_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn as_str(&self) -> &str {$/;"	f
+as_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn as_str(&self) -> &str;$/;"	f
+as_usize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn as_usize(&self) -> usize {$/;"	f
+async_stream	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^pub fn async_stream<W: io::Write + Send + 'static, F: Format + Send + 'static>(io: W,$/;"	f
+cause	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn cause(&self) -> Option<&std::error::Error> {$/;"	f
+clear	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn clear(&mut self) {$/;"	f
+clone	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn clone(&self) -> TableEntry<T> {$/;"	f
+column	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn column(&self) -> u32 {$/;"	f
+core::fmt::Display for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl core::fmt::Display for Error {$/;"	i
+crit	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! crit($/;"	d
+debug	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! debug($/;"	d
+default	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn default() -> CachedThreadLocal<T> {$/;"	f
+default	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn default() -> ThreadLocal<T> {$/;"	f
+description	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn description(&self) -> &str {$/;"	f
+different_thread	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn different_thread() {$/;"	f
+different_thread_cached	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn different_thread_cached() {$/;"	f
+drop	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn drop(&mut self) {$/;"	f
+drop	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn drop(&mut self) {$/;"	f
+drop	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn drop(&mut self) {$/;"	f
+duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub fn duplicate<D1: Drain, D2: Drain>(d1: D1, d2: D2) -> Duplicate<D1, D2> {$/;"	f
+emit_arguments	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> slog::Result {$/;"	f
+emit_arguments	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> Result {$/;"	f
+emit_arguments	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> Result;$/;"	f
+emit_bool	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_bool(&mut self, key: &str, val: bool) -> slog::Result {$/;"	f
+emit_char	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_char(&mut self, key: &str, val: char) -> slog::Result {$/;"	f
+emit_f32	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_f32(&mut self, key: &str, val: f32) -> slog::Result {$/;"	f
+emit_f64	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_f64(&mut self, key: &str, val: f64) -> slog::Result {$/;"	f
+emit_i16	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i16(&mut self, key: &str, val: i16) -> slog::Result {$/;"	f
+emit_i32	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i32(&mut self, key: &str, val: i32) -> slog::Result {$/;"	f
+emit_i64	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i64(&mut self, key: &str, val: i64) -> slog::Result {$/;"	f
+emit_i8	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i8(&mut self, key: &str, val: i8) -> slog::Result {$/;"	f
+emit_isize	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_isize(&mut self, key: &str, val: isize) -> slog::Result {$/;"	f
+emit_none	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_none(&mut self, key: &str) -> slog::Result {$/;"	f
+emit_none	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_none(&mut self, key: &str) -> Result {$/;"	f
+emit_str	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_str(&mut self, key: &str, val: &str) -> slog::Result {$/;"	f
+emit_u16	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u16(&mut self, key: &str, val: u16) -> slog::Result {$/;"	f
+emit_u32	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u32(&mut self, key: &str, val: u32) -> slog::Result {$/;"	f
+emit_u64	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u64(&mut self, key: &str, val: u64) -> slog::Result {$/;"	f
+emit_u8	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u8(&mut self, key: &str, val: u8) -> slog::Result {$/;"	f
+emit_unit	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_unit(&mut self, key: &str) -> slog::Result {$/;"	f
+emit_unit	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_unit(&mut self, key: &str) -> Result {$/;"	f
+emit_usize	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_usize(&mut self, key: &str, val: usize) -> slog::Result {$/;"	f
+error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! error($/;"	d
+file	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn file(&self) -> &'static str {$/;"	f
+filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub fn filter<D: Drain, F: 'static + Send + Sync + Fn(&Record) -> bool>($/;"	f
+filterlevel_sanity	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^fn filterlevel_sanity() {$/;"	f
+finish	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn finish(self) -> RecordValues {$/;"	f
+fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
+fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
+fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
+fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
+fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn fmt(&self, fmt: &mut core::fmt::Formatter) -> std::fmt::Result {$/;"	f
+fmt	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
+fmt::Debug for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send + fmt::Debug> fmt::Debug for CachedThreadLocal<T> {$/;"	i
+fmt::Debug for Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^impl fmt::Debug for Logger {$/;"	i
+fmt::Debug for OwnedKVList	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl fmt::Debug for OwnedKVList {$/;"	i
+fmt::Debug for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send + fmt::Debug> fmt::Debug for ThreadLocal<T> {$/;"	i
+fmt::Display for DuplicateError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<E1 : fmt::Display, E2 : fmt::Display> fmt::Display for DuplicateError<E1, E2> {$/;"	i
+fmt::Display for Level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl fmt::Display for Level {$/;"	i
+foo	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^        fn foo<T: Sync>() {}$/;"	f
+format	/home/dpc/lab/rust/slog/slog-stream/format.rs	/^    fn format(&self,$/;"	f
+from	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn from(_: core::fmt::Error) -> Error {$/;"	f
+from	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn from(e: Error) -> std::io::Error {$/;"	f
+from	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn from(err: std::io::Error) -> Error {$/;"	f
+from_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn from_raw(raw: *mut T) -> Self {$/;"	f
+from_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn from_raw(raw: *mut T) -> Self;$/;"	f
+from_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    fn from_str(level: &str) -> core::result::Result<FilterLevel, ()> {$/;"	f
+from_usize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn from_usize(u: usize) -> Option<FilterLevel> {$/;"	f
+from_usize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn from_usize(u: usize) -> Option<Level> {$/;"	f
+function	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn function(&self) -> &'static str {$/;"	f
+fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn fuse(self) -> Fuse<Self> where <Self as Drain>::Error : fmt::Display {$/;"	f
+get	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get(&self) -> Option<&T> {$/;"	f
+get_default	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get_default(&self) -> &T {$/;"	f
+get_fast	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn get_fast(&self, id: usize) -> Option<&T> {$/;"	f
+get_or	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get_or<F>(&self, create: F) -> &T$/;"	f
+get_or_try	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get_or_try<F, E>(&self, create: F) -> Result<&T, E>$/;"	f
+get_or_try_slow	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn get_or_try_slow<F, E>(&self, id: usize, owner: usize, create: F) -> Result<&T, E>$/;"	f
+get_sender	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn get_sender(&self) -> &mpsc::Sender<AsyncMsg> {$/;"	f
+get_slow	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn get_slow(&self, id: usize, table_top: &Table<T>) -> Option<&T> {$/;"	f
+hash	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^fn hash(id: usize, bits: usize) -> usize {$/;"	f
+ignore_err	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn ignore_err(self) -> IgnoreErr<Self> {$/;"	f
+impl_default_as_fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^macro_rules! impl_default_as_fmt{$/;"	d
+impl_value_for	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^macro_rules! impl_value_for{$/;"	d
+info	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! info($/;"	d
+insert	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn insert(&self, id: usize, data: Box<T>, new: bool) -> &T {$/;"	f
+into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> CachedIntoIter<T> {$/;"	f
+into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> CachedIterMut<'a, T> {$/;"	f
+into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> IntoIter<T> {$/;"	f
+into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> IterMut<'a, T> {$/;"	f
+into_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_raw(b: Self) -> *mut T;$/;"	f
+into_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_raw(mut b: Self) -> *mut T {$/;"	f
+is_at_least	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn is_at_least(&self, level : Self) -> bool {$/;"	f
+is_sync	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn is_sync() {$/;"	f
+iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn iter() {$/;"	f
+iter_cached	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn iter_cached() {$/;"	f
+iter_groups	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    pub fn iter_groups(&self) -> OwnedKVGroupIterator {$/;"	f
+iter_mut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn iter_mut(&mut self) -> CachedIterMut<T> {$/;"	f
+iter_mut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn iter_mut(&mut self) -> IterMut<T> {$/;"	f
+iter_single	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    pub fn iter_single(&self) -> OwnedKVIterator {$/;"	f
+level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn level(&self) -> Level {$/;"	f
+level_at_least	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^fn level_at_least() {$/;"	f
+level_filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub fn level_filter<D: Drain>(level: Level, d: D) -> LevelFilter<D> {$/;"	f
+level_from_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^fn level_from_str() {$/;"	f
+line	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn line(&self) -> u32 {$/;"	f
+log	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn log(&self, record: &Record, logger_values: &OwnedKVList) -> io::Result<()> {$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self, _: &Record, _: &OwnedKVList) -> result::Result<(), Never> {$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self, info: &Record, o: &OwnedKVList) -> result::Result<(), D::Error> {$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self, record: &Record, values : &OwnedKVList) -> result::Result<(), Self::Error>;$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self,$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    fn log(&self, record: &Record, values : &OwnedKVList) -> result::Result<(), Self::Error> {$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    pub fn log(&self, record: &Record) {$/;"	f
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! log($/;"	d
+log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^            fn log(&self,$/;"	f
+log	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    fn log(&self, info: &Record, logger_values: &OwnedKVList) -> io::Result<()> {$/;"	f
+logger_fmt_debug_sanity	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn logger_fmt_debug_sanity() {$/;"	f
+lookup	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn lookup(id: usize, table: &Table<T>) -> Option<&UnsafeCell<Option<Box<T>>>> {$/;"	f
+make_create	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn make_create() -> Arc<Fn() -> Box<usize> + Send + Sync> {$/;"	f
+map_err	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn map_err<F, E>(self, f : F) -> MapError<Self, E> where F : 'static + Sync + Send + Fn(<Self as Drain>::Error) -> E {$/;"	f
+max	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn max() -> Self {$/;"	f
+min	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn min() -> Self {$/;"	f
+module	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn module(&self) -> &'static str {$/;"	f
+msg	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn msg(&self) -> fmt::Arguments {$/;"	f
+multichain	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn multichain() {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn new() -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    pub fn new<D: slog::Drain<Error=slog::Never> + Send + 'static>(drain: D) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new(drain1: D1, drain2: D2) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new(drain: D) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new(drain: D, level: Level) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new<F: 'static + Sync + Send + Fn(&Record) -> bool>(drain: D, cond: F) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new<F: 'static + Sync + Send + Fn(<D as Drain>::Error) -> E>(drain: D, map_fn: F) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn new(list: &'a OwnedKVList) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn new(values: OwnedKVGroup, parent: &OwnedKVList) -> Self {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    pub fn new(&self, values: OwnedKVGroup) -> Logger {$/;"	f
+new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn new($/;"	f
+new	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn new() -> CachedThreadLocal<T> {$/;"	f
+new	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn new() -> ThreadLocal<T> {$/;"	f
+new	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    pub fn new(io: W, format: F) -> Self {$/;"	f
+next	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn next(&mut self) -> Option<Self::Item> {$/;"	f
+next	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn next(&mut self) -> Option<&'a mut Box<T>> {$/;"	f
+next	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn next(&mut self) -> Option<*mut Option<Box<T>>> {$/;"	f
+next	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn next(&mut self) -> Option<Box<T>> {$/;"	f
+no_imports	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^mod no_imports {$/;"	m
+o	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! o($/;"	d
+root	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn root(values: OwnedKVGroup) -> Self {$/;"	f
+root	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    pub fn root<D>(d: D, values: OwnedKVGroup) -> Logger$/;"	f
+same_thread	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn same_thread() {$/;"	f
+same_thread_cached	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn same_thread_cached() {$/;"	f
+send	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn send(&self, r: AsyncRecord) -> io::Result<()> {$/;"	f
+serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^            fn serialize(&self, _record : &Record, key : &str, serializer : &mut Serializer)$/;"	f
+serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn serialize(&self, record: &Record, key: &str, serializer: &mut Serializer)$/;"	f
+serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn serialize(&self,$/;"	f
+serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    pub fn serialize<'b, S: 'b + Value>(mut self, s: S) -> Result {$/;"	f
+size_hint	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn size_hint(&self) -> (usize, Option<usize>) {$/;"	f
+slog_crit	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_crit($/;"	d
+slog_debug	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_debug($/;"	d
+slog_error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_error($/;"	d
+slog_info	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_info($/;"	d
+slog_log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_log($/;"	d
+slog_o	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_o($/;"	d
+slog_trace	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_trace($/;"	d
+slog_warn	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_warn($/;"	d
+split_first	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn split_first(&self) -> Option<(&KV, &KV)> {$/;"	f
+split_first	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn split_first(&self) -> Option<(&KV, &KV)>;$/;"	f
+std::error::Error for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl std::error::Error for Error {$/;"	i
+std_only	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^mod std_only {$/;"	m
+stream	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^pub fn stream<W: io::Write + Send, F: Format>(io: W, format: F) -> Streamer<W, F> {$/;"	f
+target	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn target(&self) -> &str {$/;"	f
+test_o_macro_expansion	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn test_o_macro_expansion() {$/;"	f
+test_slog_o_macro_expansion	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn test_slog_o_macro_expansion() {$/;"	f
+tests	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/lib.rs	/^mod tests;$/;"	m
+tests	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^mod tests {$/;"	m
+trace	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! trace($/;"	d
+unchecked_unwrap	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn unchecked_unwrap(self) -> T {$/;"	f
+unchecked_unwrap	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn unchecked_unwrap(self) -> T;$/;"	f
+unreachable	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^unsafe fn unreachable() -> ! {$/;"	f
+values	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn values(&self) -> &'a [&KV] {$/;"	f
+warn	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! warn($/;"	d
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"2fc996c6292077edce4c427726bf849c151b7665f6113c3001cc227e097d461e",".travis.yml":"88727d3c65d8328457560104264358b567a339dcebc3f6c4df3ba308f1944acc","CHANGELOG.md":"44eba7dd11980076bfc44fb83fc3b23aee1b82812530e64aac88ccb2b1d9325d","Cargo.toml":"973e07ab059f6448873cea70433c7212b39aff0a53062c1da401a2ab9bb60799","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"134ae4eb1e4799f9aeab997b3e9b5dc1fdc5170b897f9722844d2245c1f6a4c9","lib.rs":"7065ed5a7c9ec2252f1b5f58c7f339502c28f54edc6b444c2f3f0e168714cc19"},"package":"cb53c0bae0745898fd5a7b75b1c389507333470ac4c645ae431890c0f828b6ca"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/.gitignore
@@ -0,0 +1,4 @@
+target
+Cargo.lock
+/tags
+.cargo
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/.travis.yml
@@ -0,0 +1,26 @@
+language: rust
+rust:
+  - stable
+  - 1.12.0
+  - beta
+  - nightly
+
+script:
+  - make all
+  - make travistest
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
+
+env:
+  global:
+    - RUST_BACKTRACE=1
+  matrix:
+    -
+    - RELEASE=true
+
+notifications:
+  webhooks:
+    urls:
+      - https://webhooks.gitter.im/e/6d8e17dd2fa83b143168
+    on_success: change  # options: [always|never|change] default: always
+    on_failure: change  # options: [always|never|change] default: always
+    on_start: false     # default: false
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/CHANGELOG.md
@@ -0,0 +1,66 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## 1.5.0 - 2017-02-05
+### Change
+
+* Reverse the order of record values in full mode to match slog 1.5
+  definition
+
+## 1.4.0 - 2017-01-29
+### Changed
+
+* Fix a bug in `new_plain` that would make it still use colors.
+* No comma will be printed after an empty "msg" field
+* Changed order of full format values
+
+## 1.3.5 - 2016-01-13
+### Fixed
+
+* [1.3.4 with `?` operator breaks semver](https://github.com/slog-rs/term/issues/6) - fix allows builds on stable Rust back to 1.11
+
+## 1.3.4 - 2016-12-27
+### Fixed
+
+* [Fix compact formatting grouping messages incorrectly](https://github.com/slog-rs/slog/issues/90)
+
+## 1.3.3 - 2016-10-31
+### Changed
+
+* Added `Send+Sync` to `Drain` returned on `build`
+
+## 1.3.2 - 2016-10-22
+### Changed
+
+* Fix compact format, repeating some values unnecessarily.
+
+## 1.3.1 - 2016-10-22
+### Changed
+
+* Make `Format` public so it can be reused
+
+## 1.3.0 - 2016-10-21
+### Changed
+
+* **BREAKING**: Switched `AsyncStramer` to `slog_extra::Async`
+
+## 1.2.0 - 2016-10-17
+### Changed
+
+* **BREAKING**: Rewrite handling of owned values.
+
+## 1.1.0 - 2016-09-28
+### Added
+
+* Custom timestamp function support
+
+### Changed
+
+* Logging level color uses only first 8 ANSI terminal colors for better compatibility
+
+## 1.0.0 - 2016-09-21
+
+First stable release.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "slog-term"
+version = "1.5.0"
+authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
+description = "Unix terminal drain and formatter for slog-rs"
+keywords = ["slog", "logging", "log", "term"]
+license = "MPL-2.0"
+documentation = "https://docs.rs/slog-term"
+homepage = "https://github.com/slog-rs/slog"
+repository = "https://github.com/slog-rs/term"
+readme = "README.md"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+slog = "1.5.0"
+slog-stream = "1.2"
+isatty = "0.1"
+chrono = "0.2"
+thread_local = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/LICENSE-MPL2
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/Makefile
@@ -0,0 +1,68 @@
+PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
+DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
+ifeq (, $(shell which cargo-check 2> /dev/null))
+DEFAULT_TARGET=build
+else
+DEFAULT_TARGET=build
+endif
+
+default: $(DEFAULT_TARGET)
+
+ALL_TARGETS += build $(EXAMPLES) test doc
+ifneq ($(RELEASE),)
+$(info RELEASE BUILD: $(PKG_NAME))
+CARGO_FLAGS += --release
+else
+$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
+endif
+
+EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
+
+all: $(ALL_TARGETS)
+
+.PHONY: run test build doc clean clippy
+run test build clean:
+	cargo $@ $(CARGO_FLAGS)
+
+check:
+	$(info Running check; use `make build` to actually build)
+	cargo $@ $(CARGO_FLAGS)
+
+clippy:
+	cargo build --features clippy
+
+.PHONY: bench
+bench:
+	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
+
+.PHONY: travistest
+travistest: test
+
+.PHONY: longtest
+longtest:
+	@echo "Running longtest. Press Ctrl+C to stop at any time"
+	@sleep 2
+	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
+
+.PHONY: $(EXAMPLES)
+$(EXAMPLES):
+	cargo build --example $@ $(CARGO_FLAGS)
+
+.PHONY: doc
+doc: FORCE
+	cargo doc
+
+.PHONY: publishdoc
+publishdoc:
+	rm -rf target/doc
+	make doc
+	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
+	ghp-import -n target/doc
+	git push -f origin gh-pages
+
+.PHONY: docview
+docview: doc
+	xdg-open target/doc/$(PKG_NAME)/index.html
+
+.PHONY: FORCE
+FORCE:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/README.md
@@ -0,0 +1,23 @@
+<p align="center">
+
+  <a href="https://github.com/slog-rs/slog">
+  <img src="https://cdn.rawgit.com/slog-rs/misc/master/media/slog.svg" alt="slog-rs logo">
+  </a>
+  <br>
+
+  <a href="https://travis-ci.org/slog-rs/term">
+      <img src="https://img.shields.io/travis/slog-rs/term/master.svg" alt="Travis CI Build Status">
+  </a>
+
+  <a href="https://crates.io/crates/slog-term">
+      <img src="https://img.shields.io/crates/d/slog-term.svg" alt="slog-term on crates.io">
+  </a>
+
+  <a href="https://gitter.im/slog-rs/slog">
+      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
+  </a>
+</p>
+
+# slog-term  - Unix terminal drain for [slog-rs]
+
+[slog-rs]: //github.com/slog-rs/slog
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog-term/lib.rs
@@ -0,0 +1,699 @@
+//! Unix terminal formatter and drain for slog-rs
+//!
+//! ```
+//! #[macro_use]
+//! extern crate slog;
+//! extern crate slog_term;
+//!
+//! use slog::*;
+//!
+//! fn main() {
+//!     let root = Logger::root(slog_term::streamer().build().fuse(), o!("build-id" => "8dfljdf"));
+//! }
+//! ```
+#![warn(missing_docs)]
+
+extern crate slog;
+extern crate slog_stream;
+extern crate isatty;
+extern crate chrono;
+extern crate thread_local;
+
+use std::{io, fmt, sync, cell};
+use std::io::Write;
+
+use isatty::{stderr_isatty, stdout_isatty};
+
+use slog::Record;
+use slog::ser;
+use slog::{Level, OwnedKeyValueList};
+use slog_stream::Format as StreamFormat;
+use slog_stream::{Decorator, RecordDecorator, stream, async_stream};
+
+thread_local! {
+    static TL_BUF: cell::RefCell<Vec<u8>> = cell::RefCell::new(Vec::with_capacity(128));
+}
+
+// Wrapper for `Write` types that counts total bytes written.
+struct CountingWriter<'a> {
+    wrapped: &'a mut io::Write,
+    count: usize,
+}
+
+impl<'a> CountingWriter<'a> {
+    fn new(wrapped: &'a mut io::Write) -> CountingWriter {
+        CountingWriter {
+            wrapped: wrapped,
+            count: 0,
+        }
+    }
+
+    fn count(&self) -> usize {
+        self.count
+    }
+}
+
+impl<'a> Write for CountingWriter<'a> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.wrapped.write(buf).map(|n| {
+            self.count += n;
+            n
+        })
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.wrapped.flush()
+    }
+
+    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
+        self.wrapped.write_all(buf).map(|_| {
+            self.count += buf.len();
+            ()
+        })
+    }
+}
+
+type WriterFn = Fn(&mut io::Write) -> io::Result<()>;
+
+// Wrapper for `Write` types that executes a closure before writing anything,
+// but only if the write isn't empty. A `finish` call executes a closure after
+// writing, but again, only if something has been written.
+struct SurroundingWriter<'a> {
+    wrapped: &'a mut io::Write,
+    before: Option<&'a WriterFn>,
+    after: Option<&'a WriterFn>,
+}
+
+impl<'a> SurroundingWriter<'a> {
+    fn new(wrapped: &'a mut io::Write,
+           before: &'a WriterFn,
+           after: &'a WriterFn)
+           -> SurroundingWriter<'a> {
+        SurroundingWriter {
+            wrapped: wrapped,
+            before: Some(before),
+            after: Some(after),
+        }
+    }
+
+    fn do_before(&mut self, buf: &[u8]) -> io::Result<()> {
+        if buf.len() > 0 {
+            if let Some(before) = self.before.take() {
+                try!(before(self.wrapped));
+            }
+        }
+        Ok(())
+    }
+
+    fn finish(&mut self) -> io::Result<()> {
+        if let Some(after) = self.after.take() {
+            if self.before.is_none() {
+                try!(after(self.wrapped));
+            }
+        }
+        Ok(())
+    }
+}
+
+impl<'a> Drop for SurroundingWriter<'a> {
+    fn drop(&mut self) {
+        let _ = self.finish();
+    }
+}
+
+impl<'a> Write for SurroundingWriter<'a> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        try!(self.do_before(buf));
+        self.wrapped.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.wrapped.flush()
+    }
+
+    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
+        try!(self.do_before(buf));
+        self.wrapped.write_all(buf)
+    }
+}
+
+
+/// Timestamp function type
+pub type TimestampFn = Fn(&mut io::Write) -> io::Result<()> + Send + Sync;
+
+/// Formatting mode
+pub enum FormatMode {
+    /// Compact logging format
+    Compact,
+    /// Full logging format
+    Full,
+}
+
+/// Full formatting with optional color support
+pub struct Format<D: Decorator> {
+    mode: FormatMode,
+    decorator: D,
+    history: sync::Mutex<Vec<Vec<u8>>>,
+    fn_timestamp: Box<TimestampFn>,
+}
+
+impl<D: Decorator> Format<D> {
+    /// New Format format that prints using color
+    pub fn new(mode: FormatMode, d: D, fn_timestamp: Box<TimestampFn>) -> Self {
+        Format {
+            decorator: d,
+            mode: mode,
+            history: sync::Mutex::new(vec![]),
+            fn_timestamp: fn_timestamp,
+        }
+    }
+
+    // Returns `true` if message was not empty
+    fn print_msg_header(&self,
+                        io: &mut io::Write,
+                        rd: &D::RecordDecorator,
+                        record: &Record)
+                        -> io::Result<bool> {
+        try!(rd.fmt_timestamp(io, &*self.fn_timestamp));
+        try!(rd.fmt_level(io,
+                          &|io: &mut io::Write| write!(io, " {} ", record.level().as_short_str())));
+
+        let mut writer = CountingWriter::new(io);
+        try!(rd.fmt_msg(&mut writer, &|io| write!(io, "{}", record.msg())));
+        Ok(writer.count() > 0)
+    }
+
+    fn format_full(&self,
+                   io: &mut io::Write,
+                   record: &Record,
+                   logger_values: &OwnedKeyValueList)
+                   -> io::Result<()> {
+
+        let r_decorator = self.decorator.decorate(record);
+
+
+        let mut comma_needed = try!(self.print_msg_header(io, &r_decorator, record));
+        let mut serializer = Serializer::new(io, r_decorator);
+
+        for &(k, v) in record.values().iter().rev() {
+            if comma_needed {
+                try!(serializer.print_comma());
+            }
+            try!(v.serialize(record, k, &mut serializer));
+            comma_needed |= true;
+        }
+
+        for (k, v) in logger_values.iter() {
+            if comma_needed {
+                try!(serializer.print_comma());
+            }
+            try!(v.serialize(record, k, &mut serializer));
+            comma_needed |= true;
+        }
+
+        let (mut io, _decorator_r) = serializer.finish();
+
+        try!(write!(io, "\n"));
+
+        Ok(())
+    }
+
+
+    fn format_compact(&self,
+                      io: &mut io::Write,
+                      record: &Record,
+                      logger_values: &OwnedKeyValueList)
+                      -> io::Result<()> {
+
+
+        let indent = try!(self.format_recurse(io, record, logger_values));
+
+        try!(self.print_indent(io, indent));
+
+        let r_decorator = self.decorator.decorate(record);
+        let mut ser = Serializer::new(io, r_decorator);
+        let mut comma_needed = try!(self.print_msg_header(ser.io, &ser.decorator, record));
+
+        for &(k, v) in record.values() {
+            if comma_needed {
+                try!(ser.print_comma());
+            }
+            try!(v.serialize(record, k, &mut ser));
+            comma_needed |= true;
+        }
+        try!(write!(&mut ser.io, "\n"));
+
+        Ok(())
+    }
+
+    fn print_indent(&self, io: &mut io::Write, indent: usize) -> io::Result<()> {
+        for _ in 0..indent {
+            try!(write!(io, "  "));
+        }
+        Ok(())
+    }
+
+    // record in the history, and check if should print
+    // given set of values
+    fn should_print(&self, line: &[u8], indent: usize) -> bool {
+        let mut history = self.history.lock().unwrap();
+        if history.len() <= indent {
+            debug_assert_eq!(history.len(), indent);
+            history.push(line.into());
+            true
+        } else {
+            let should = history[indent] != line;
+            if should {
+                history[indent] = line.into();
+                history.truncate(indent + 1);
+            }
+            should
+        }
+    }
+
+    /// Recursively format given `logger_values_ref`
+    ///
+    /// Returns it's indent level
+    fn format_recurse(&self,
+                      io : &mut io::Write,
+                      record: &slog::Record,
+                      logger_values_ref: &slog::OwnedKeyValueList)
+                                    -> io::Result<usize> {
+        let mut indent = if logger_values_ref.parent().is_none() {
+            0
+        } else {
+            try!(self.format_recurse(io, record, logger_values_ref.parent().as_ref().unwrap()))
+        };
+
+
+        if let Some(logger_values) = logger_values_ref.values() {
+            let res : io::Result<()> = TL_BUF.with(|line| {
+                let mut line = line.borrow_mut();
+                line.clear();
+                let r_decorator = self.decorator.decorate(record);
+                let mut ser = Serializer::new(&mut *line, r_decorator);
+
+                try!(self.print_indent(&mut ser.io, indent));
+                let mut clean = true;
+                let mut logger_values = logger_values;
+                let mut kvs = vec!();
+                loop {
+                    let (k, v) = logger_values.head();
+                    kvs.push((k, v));
+
+                    logger_values = if let Some(v) = logger_values.tail() {
+                        v
+                    } else {
+                        break;
+                    }
+                }
+
+                for &(k, v) in kvs.iter().rev() {
+                    if !clean {
+                        try!(ser.print_comma());
+                    }
+                    try!(v.serialize(record, k, &mut ser));
+                    clean = false;
+                }
+
+                let (mut line, _) = ser.finish();
+
+                if self.should_print(line, indent) {
+                    try!(write!(line, "\n"));
+                    try!(io.write_all(line));
+                }
+                Ok(())
+            });
+            try!(res);
+            indent += 1;
+        }
+
+        Ok(indent)
+    }
+}
+
+fn severity_to_color(lvl: Level) -> u8 {
+    match lvl {
+        Level::Critical => 5,
+        Level::Error => 1,
+        Level::Warning => 3,
+        Level::Info => 2,
+        Level::Debug => 6,
+        Level::Trace => 4,
+    }
+}
+
+/// Record decorator (color) for terminal output
+pub struct ColorDecorator {
+    use_color: bool,
+}
+
+impl ColorDecorator {
+    /// New decorator that does color records
+    pub fn new_colored() -> Self {
+        ColorDecorator { use_color: true }
+    }
+    /// New decorator that does not color records
+    pub fn new_plain() -> Self {
+        ColorDecorator { use_color: false }
+    }
+}
+
+/// Particular record decorator (color) for terminal output
+pub struct ColorRecordDecorator {
+    level_color: Option<u8>,
+    key_bold: bool,
+}
+
+
+impl Decorator for ColorDecorator {
+    type RecordDecorator = ColorRecordDecorator;
+
+    fn decorate(&self, record: &Record) -> ColorRecordDecorator {
+        if self.use_color {
+            ColorRecordDecorator {
+                level_color: Some(severity_to_color(record.level())),
+                key_bold: true,
+            }
+        } else {
+            ColorRecordDecorator {
+                level_color: None,
+                key_bold: false,
+            }
+        }
+    }
+}
+
+
+impl RecordDecorator for ColorRecordDecorator {
+    fn fmt_level(&self,
+                 io: &mut io::Write,
+                 f: &Fn(&mut io::Write) -> io::Result<()>)
+                 -> io::Result<()> {
+        if let Some(level_color) = self.level_color {
+            try!(write!(io, "\x1b[3{}m", level_color));
+            try!(f(io));
+            try!(write!(io, "\x1b[39m"));
+        } else {
+            try!(f(io));
+        }
+        Ok(())
+    }
+
+
+    fn fmt_msg(&self,
+               io: &mut io::Write,
+               f: &Fn(&mut io::Write) -> io::Result<()>)
+               -> io::Result<()> {
+        if self.key_bold {
+            let before = |io: &mut io::Write| write!(io, "\x1b[1m");
+            let after = |io: &mut io::Write| write!(io, "\x1b[0m");
+            let mut wrapper = SurroundingWriter::new(io, &before, &after);
+            try!(f(&mut wrapper));
+            try!(wrapper.finish());
+        } else {
+            try!(f(io));
+        }
+        Ok(())
+    }
+
+    fn fmt_key(&self,
+               io: &mut io::Write,
+               f: &Fn(&mut io::Write) -> io::Result<()>)
+               -> io::Result<()> {
+        self.fmt_msg(io, f)
+    }
+}
+
+struct Serializer<W, D: RecordDecorator> {
+    io: W,
+    decorator: D,
+}
+
+impl<W: io::Write, D: RecordDecorator> Serializer<W, D> {
+    fn new(io: W, d: D) -> Self {
+        Serializer {
+            io: io,
+            decorator: d,
+        }
+    }
+
+    fn print_comma(&mut self) -> io::Result<()> {
+        try!(self.decorator.fmt_separator(&mut self.io, &|io: &mut io::Write| write!(io, ", ")));
+        Ok(())
+    }
+
+    fn finish(self) -> (W, D) {
+        (self.io, self.decorator)
+    }
+}
+
+macro_rules! s(
+    ($s:expr, $k:expr, $v:expr) => {
+        try!($s.decorator.fmt_key(&mut $s.io, &|io : &mut io::Write| write!(io, "{}", $k)));
+        try!($s.decorator.fmt_separator(&mut $s.io, &|io : &mut io::Write| write!(io, ": ")));
+        try!($s.decorator.fmt_value(&mut $s.io, &|io : &mut io::Write| write!(io, "{}", $v)));
+    };
+);
+
+
+impl<W: io::Write, D: RecordDecorator> slog::ser::Serializer for Serializer<W, D> {
+    fn emit_none(&mut self, key: &str) -> ser::Result {
+        s!(self, key, "None");
+        Ok(())
+    }
+    fn emit_unit(&mut self, key: &str) -> ser::Result {
+        s!(self, key, "()");
+        Ok(())
+    }
+
+    fn emit_bool(&mut self, key: &str, val: bool) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+
+    fn emit_char(&mut self, key: &str, val: char) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+
+    fn emit_usize(&mut self, key: &str, val: usize) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_isize(&mut self, key: &str, val: isize) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+
+    fn emit_u8(&mut self, key: &str, val: u8) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_i8(&mut self, key: &str, val: i8) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_u16(&mut self, key: &str, val: u16) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_i16(&mut self, key: &str, val: i16) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_u32(&mut self, key: &str, val: u32) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_i32(&mut self, key: &str, val: i32) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_f32(&mut self, key: &str, val: f32) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_u64(&mut self, key: &str, val: u64) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_i64(&mut self, key: &str, val: i64) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_f64(&mut self, key: &str, val: f64) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_str(&mut self, key: &str, val: &str) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> ser::Result {
+        s!(self, key, val);
+        Ok(())
+    }
+}
+
+impl<D: Decorator + Send + Sync> StreamFormat for Format<D> {
+    fn format(&self,
+              io: &mut io::Write,
+              record: &Record,
+              logger_values: &OwnedKeyValueList)
+              -> io::Result<()> {
+        match self.mode {
+            FormatMode::Compact => self.format_compact(io, record, logger_values),
+            FormatMode::Full => self.format_full(io, record, logger_values),
+        }
+    }
+}
+
+const TIMESTAMP_FORMAT: &'static str = "%b %d %H:%M:%S%.3f";
+
+/// Default local timestamp function used by `Format`
+///
+/// The exact format used, is still subject to change.
+pub fn timestamp_local(io: &mut io::Write) -> io::Result<()> {
+    write!(io, "{}", chrono::Local::now().format(TIMESTAMP_FORMAT))
+}
+
+/// Default UTC timestamp function used by `Format`
+///
+/// The exact format used, is still subject to change.
+pub fn timestamp_utc(io: &mut io::Write) -> io::Result<()> {
+    write!(io, "{}", chrono::UTC::now().format(TIMESTAMP_FORMAT))
+}
+
+/// Streamer builder
+pub struct StreamerBuilder {
+    color: Option<bool>, // None = auto
+    stdout: bool,
+    async: bool,
+    mode: FormatMode,
+    fn_timestamp: Box<TimestampFn>,
+}
+
+impl StreamerBuilder {
+    /// New `StreamerBuilder`
+    pub fn new() -> Self {
+        StreamerBuilder {
+            color: None,
+            stdout: true,
+            async: false,
+            mode: FormatMode::Full,
+            fn_timestamp: Box::new(timestamp_local),
+        }
+    }
+
+    /// Force colored output
+    pub fn color(mut self) -> Self {
+        self.color = Some(true);
+        self
+    }
+
+    /// Force plain output
+    pub fn plain(mut self) -> Self {
+        self.color = Some(false);
+        self
+    }
+
+    /// Auto detect color (default)
+    pub fn auto_color(mut self) -> Self {
+        self.color = None;
+        self
+    }
+
+    /// Output to stderr
+    pub fn stderr(mut self) -> Self {
+        self.stdout = false;
+        self
+    }
+
+    /// Output to stdout (default)
+    pub fn stdout(mut self) -> Self {
+        self.stdout = true;
+        self
+    }
+
+    /// Output using full mode
+    pub fn full(mut self) -> Self {
+        self.mode = FormatMode::Full;
+        self
+    }
+
+    /// Output using compact mode (default)
+    pub fn compact(mut self) -> Self {
+        self.mode = FormatMode::Compact;
+        self
+    }
+
+    /// Use asynchronous streamer
+    pub fn async(mut self) -> Self {
+        self.async = true;
+        self
+    }
+
+    /// Use synchronous streamer (default)
+    pub fn sync(mut self) -> Self {
+        self.async = false;
+        self
+    }
+
+    /// Use the UTC time zone for the timestamp
+    pub fn use_utc_timestamp(mut self) -> Self {
+        self.fn_timestamp = Box::new(timestamp_utc);
+        self
+    }
+
+    /// Use the local time zone for the timestamp (default)
+    pub fn use_local_timestamp(mut self) -> Self {
+        self.fn_timestamp = Box::new(timestamp_local);
+        self
+    }
+
+    /// Provide a custom function to generate the timestamp
+    pub fn use_custom_timestamp<F>(mut self, f: F) -> Self
+        where F: Fn(&mut io::Write) -> io::Result<()> + 'static + Send + Sync
+    {
+        self.fn_timestamp = Box::new(f);
+        self
+    }
+
+    /// Build the streamer
+    pub fn build(self) -> Box<slog::Drain<Error = io::Error> + Send + Sync> {
+        let color = self.color.unwrap_or(if self.stdout {
+            stdout_isatty()
+        } else {
+            stderr_isatty()
+        });
+
+        let format = Format::new(self.mode,
+                                 ColorDecorator { use_color: color },
+                                 self.fn_timestamp);
+
+        let io = if self.stdout {
+            Box::new(io::stdout()) as Box<io::Write + Send>
+        } else {
+            Box::new(io::stderr()) as Box<io::Write + Send>
+        };
+
+        if self.async {
+            Box::new(async_stream(io, format))
+        } else {
+            Box::new(stream(io, format))
+        }
+    }
+}
+
+impl Default for StreamerBuilder {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// Build `slog_stream::Streamer`/`slog_stream::AsyncStreamer` that
+/// will output logging records to stderr/stderr.
+pub fn streamer() -> StreamerBuilder {
+    StreamerBuilder::new()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".cargo/config":"b1d2b4fdf0d7fcfa75533a98408cfad4a537048ce0cd7ac72027d0feda4126b6",".gitignore":"2fc996c6292077edce4c427726bf849c151b7665f6113c3001cc227e097d461e",".travis.yml":"a9c415cf334e2a854281337d5287cad4990178ae1c4f7d4e17c3aed4f20ba0b4","CHANGELOG.md":"9f8c92f27f9e33501690064a8b749bd04bc7d45fae7c44d2e0a345bf1e26f2ff","Cargo.toml":"df5343247e18112ae3227c71306c4e58ab58a1db87b75b267c992b14f7a7c835","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"a8bb2d458c5e2a58be185209143165182e9bb353e097ef752caea500b2c46892","README.md":"350d15b5cf70a84fd1fc9be995881ae4d4bbfbafd825c42a4589aebf79cc4c25","benches.txt":"dd19c2f77e35973a0bf28ec289652436e9709dcb90536ac447c5ed62d9a8a68e","examples.txt":"6939adf8563bd6657a4194f02ed7aa04ce7e88a377351e90d32729a5bcfae3bb","src/_drain.rs":"7dee5308c5abd351dd77b10cdcc79f1fe5a6914cfd96d18ccce6f434f3ab52ad","src/_level.rs":"2d6eba54b7e7dc72c988e8205a0fda52570f41210e43325220286d05da01ef82","src/_logger.rs":"3cedb65d7718738e635bdb08addbfc1f878f28d0d83ef50badf25e52f3d92da5","src/lib.rs":"31c75daf335e35a634a0edfbac282beb4b7b524b3a1860de49815db8caef3faf","src/ser.rs":"4cb0d46f7ea8e5d0c8ff2a8469dcbd188d7232b1652014e82bf51c2b1cbfcf7e","src/tests.rs":"b34f2279d7d1111300bc1965c2760bd3485cf49cfda70dd10030b6a8abbfa842"},"package":"bab9d589681f7d6b9ca4ed5cc861779a392bca7beaae2f69f2341617415a78dc"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/.cargo/config
@@ -0,0 +1,1 @@
+paths = [ "." ]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/.gitignore
@@ -0,0 +1,4 @@
+target
+Cargo.lock
+/tags
+.cargo
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/.travis.yml
@@ -0,0 +1,31 @@
+language: rust
+rust:
+  - stable
+  - 1.12.0
+  - beta
+  - nightly
+  
+before_install:
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq graphviz
+
+script:
+  - make all
+  - make travistest
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
+  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo build --no-default-features; fi
+
+env:
+  global:
+    - RUST_BACKTRACE=1
+  matrix:
+    -
+    - RELEASE=true
+
+notifications:
+  webhooks:
+    urls:
+      - https://webhooks.gitter.im/e/87a331e1a21456b6e2ad
+    on_success: change  # options: [always|never|change] default: always
+    on_failure: change  # options: [always|never|change] default: always
+    on_start: false     # default: false
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/CHANGELOG.md
@@ -0,0 +1,64 @@
+**Note:** `slog-*` sub-crates have their own ChangeLog files under
+corresponding `crates/*/` directory.
+
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## 1.5.0 - 2017-01-19
+### Changed
+
+* Order of key-value pairs is now strictly defined
+
+## 1.4.1 - 2017-01-19
+### Changed
+
+* Fix an invalid syntax exposed by nightly rust change (Issue #103)
+
+## 1.4.0 - 2016-12-27
+### Changed
+
+* Deprecate `OwnedKeyValueList::id`
+* Updated documentation
+
+## 1.3.2 - 2016-11-19
+### Added
+
+* `slog_o` as an alternative name for `o`
+
+## 1.3.1 - 2016-11-19
+
+Cargo publishing mistake.
+
+## 1.3.0 - 2016-10-31
+### Changed
+
+* **BREAKING**: Removed `Send+Sync` from `Drain`
+
+## 1.2.1 - 2016-10-27
+### Added
+
+* `OwnedKeyValueList::id` for owned key value unique identification
+
+## 1.2.0 - 2016-10-21
+### Changed
+
+* **BREAKING**: `Serializer` takes `key : &'static str` now
+* Fixed corner cases in `info!(...)` and other macros
+
+## 1.1.0 - 2016-10-17
+### Changed
+
+* **BREAKING**: Rewrite handling of owned values.
+
+## 1.0.1
+### Changed
+
+* Fix `use std` in `o!`
+* Implement `fmt::Debug` for `Logger`
+
+## 1.0.0 - 2016-09-21
+
+First stable release.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/Cargo.toml
@@ -0,0 +1,48 @@
+[package]
+name = "slog"
+version = "1.5.2"
+authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
+description = "Structured, composable logging for Rust"
+keywords = ["log", "logging", "structured", "hierarchical"]
+categories = ["development-tools::debugging"]
+license = "MPL-2.0"
+documentation = "https://docs.rs/slog"
+homepage = "https://github.com/slog-rs/slog"
+repository = "https://github.com/slog-rs/slog"
+readme = "README.md"
+
+[profile.release]
+opt-level = 3
+debug = false
+lto = true
+debug-assertions = false
+
+[profile.bench]
+opt-level = 3
+debug = false
+lto = true
+debug-assertions = false
+
+[workspace]
+members = [
+"crates/nursery",
+]
+
+[features]
+
+std = []
+default = ["std"]
+
+max_level_off   = []
+max_level_error = []
+max_level_warn  = []
+max_level_info  = []
+max_level_debug = []
+max_level_trace = []
+
+release_max_level_off   = []
+release_max_level_error = []
+release_max_level_warn  = []
+release_max_level_info  = []
+release_max_level_debug = []
+release_max_level_trace = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/LICENSE-MPL2
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/Makefile
@@ -0,0 +1,79 @@
+PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
+DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
+ifeq (, $(shell which cargo-check 2> /dev/null))
+DEFAULT_TARGET=build
+else
+DEFAULT_TARGET=build
+endif
+
+default: $(DEFAULT_TARGET)
+
+CARGO_FLAGS += -v
+
+ALL_TARGETS += build $(EXAMPLES) test doc crates
+ifneq ($(RELEASE),)
+$(info RELEASE BUILD: $(PKG_NAME))
+CARGO_FLAGS += --release
+else
+$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
+endif
+
+EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
+CRATES = $(shell cd crates 2>/dev/null && ls 2>/dev/null)
+
+all: $(ALL_TARGETS)
+
+.PHONY: run test build doc clean clippy
+run test build clean:
+	cargo $@ $(CARGO_FLAGS)
+
+check:
+	$(info Running check; use `make build` to actually build)
+	cargo $@ $(CARGO_FLAGS)
+
+clippy:
+	cargo build --features clippy
+
+.PHONY: bench
+bench:
+	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
+
+.PHONY: travistest
+travistest: test
+
+.PHONY: longtest
+longtest:
+	@echo "Running longtest. Press Ctrl+C to stop at any time"
+	@sleep 2
+	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
+
+.PHONY: $(EXAMPLES)
+$(EXAMPLES):
+	cargo build --example $@ $(CARGO_FLAGS)
+
+.PHONY: crates
+crates: $(CRATES)
+
+.PHONY: $(CRATES)
+$(CRATES):
+	cd "crates/$@"; cargo build $(CARGO_FLAGS)
+	cd "crates/$@"; cargo test $(CARGO_FLAGS)
+
+.PHONY: doc
+doc: FORCE
+	cargo doc
+
+.PHONY: publishdoc
+publishdoc:
+	rm -rf target/doc
+	make doc
+	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
+	ghp-import -n target/doc
+	git push -f origin gh-pages
+
+.PHONY: docview
+docview: doc
+	xdg-open target/doc/$(PKG_NAME)/index.html
+
+.PHONY: FORCE
+FORCE:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/README.md
@@ -0,0 +1,164 @@
+<p align="center">
+
+  <a href="https://github.com/slog-rs/slog">
+  <img src="https://cdn.rawgit.com/slog-rs/misc/master/media/slog.svg" alt="slog-rs logo">
+  </a>
+  <br>
+
+  <a href="https://travis-ci.org/slog-rs/slog">
+      <img src="https://img.shields.io/travis/slog-rs/slog/master.svg" alt="Travis CI Build Status">
+  </a>
+
+  <a href="https://crates.io/crates/slog">
+      <img src="https://img.shields.io/crates/d/slog.svg" alt="slog-rs on crates.io">
+  </a>
+
+  <a href="https://gitter.im/slog-rs/slog">
+      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
+  </a>
+
+  <a href="https://docs.rs/releases/search?query=slog-">
+      <img src="https://docs.rs/slog/badge.svg" alt="docs-rs: release versions documentation">
+  </a>
+  <br>
+    <strong><a href="https://github.com/slog-rs/slog/wiki/Getting-started">Getting started</a></strong>
+
+  <a href="//github.com/slog-rs/slog/wiki/Introduction-to-structured-logging-with-slog">Introduction</a>
+
+  <a href="//github.com/slog-rs/slog/wiki/FAQ">FAQ</a>
+  <br>
+  <a href="https://crates.io/search?q=slog">Crate list</a>
+</p>
+
+# slog-rs - The Logging for [Rust][rust]
+
+### Table of Contents
+
+* [Status & news](#status--news)
+* [`slog` crate](#slog-crate)
+  * [Features](#features)
+  * [Advantages over log crate](#advantages-over-log-crate)
+  * [Terminal output example](#terminal-output-example)
+  * [Using & help](#using--help)
+  * [Compatibility Policy](#compatibility-policy)
+* [Slog community](#slog-community)
+  * [Overview](#overview)
+* [Slog related resources](#slog-related-resources)
+
+### Status & news
+
+`slog` is an ecosystem of reusable components for structured, extensible,
+composable logging for [Rust][rust].
+
+The ambition is to be The Logging Framework for Rust. `slog` should accommodate
+variety of logging features and requirements.
+
+### Features & technical documentation
+
+Most of interesting documentation is using rustdoc itself.
+
+You can view on [docs.rs/slog](https://docs.rs/slog/1/)
+
+### Terminal output example
+
+`slog-term` is only one of many `slog` features - useful showcase.
+
+Automatic TTY detection and colors:
+
+![slog-rs terminal full-format output](http://i.imgur.com/IUe80gU.png)
+
+Compact vs full mode:
+
+![slog-rs terminal compact output](http://i.imgur.com/P9u2sWP.png)
+![slog-rs terminal full output](http://i.imgur.com/ENiy5H9.png)
+
+
+## Using & help
+
+See
+[examples/features.rs](https://github.com/slog-rs/misc/blob/master/examples/features.rs)
+for full quick code example overview.
+
+See [faq] for answers to common questions and [wiki] for other documentation
+articles. If you want to say hi, or need help use [slog-rs gitter] channel.
+
+Read [Documentation](https://docs.rs/slog/) for details and features.
+
+To report a bug or ask for features use [github issues][issues].
+
+[faq]: https://github.com/slog-rs/slog/wiki/FAQ
+[wiki]: https://github.com/slog-rs/slog/wiki/
+[rust]: http://rust-lang.org
+[slog-rs gitter]: https://gitter.im/slog-rs/slog
+[issues]: //github.com/slog-rs/slog/issues
+
+#### In your project
+
+In Cargo.toml:
+
+```
+[dependencies]
+slog = "1.2"
+```
+
+In your `main.rs`:
+
+```
+#[macro_use]
+extern crate slog;
+```
+
+### Compatibility Policy
+
+`slog` follows SemVer: this is the official policy regarding breaking changes
+and minimum required versions of Rust.
+
+Slog crates should pin minimum required version of Rust to the CI builds.
+Bumping the minimum version of Rust is considered a minor breaking change,
+meaning *at a minimum* the minor version will be bumped.
+
+In order to keep from being surprised of breaking changes, it is **highly**
+recommended to use the `~major.minor.patch` style in your `Cargo.toml` if you
+wish to target a version of Rust that is *older* than current stable minus two
+releases:
+
+```toml
+[dependencies]
+slog = "~1.3.0"
+```
+
+This will cause *only* the patch version to be updated upon a `cargo update`
+call, and therefore cannot break due to new features, or bumped minimum
+versions of Rust.
+
+#### Minimum Version of Rust
+
+`slog` and it's ecosystem officially supports current stable Rust, minus
+two releases, but may work with prior releases as well. For example, current
+stable Rust at the time of this writing is 1.13.0, meaning `slog` is guaranteed
+to compile with 1.11.0 and beyond.  At the 1.14.0 release, `slog` will be
+guaranteed to compile with 1.12.0 and beyond, etc.
+
+Upon bumping the minimum version of Rust (assuming it's within the stable-2
+range), it *must* be clearly annotated in the `CHANGELOG.md`
+
+
+## Slog community
+
+### Overview
+
+Slog related crates are hosted under [slog github
+organization](https://github.com/slog-rs).
+
+Dawid Ciężarkiewicz is the original author and current maintainer of `slog` and
+therefore self-appointed benevolent dictator over the project. When working on
+slog Dawid follows and expects everyone to follow his [Code of
+Conduct](https://github.com/dpc/public/blob/master/COC.md).
+
+Any particular repositories under slog ecosystem might be created, controlled,
+maintained by other entities with various level of autonomy. Lets work together
+toward a common goal in respectful and welcoming atmosphere!
+
+## slog-related articles
+
+* [24 days of Rust - structured logging](https://siciarz.net/24-days-rust-structured-logging/) - review and tutorial by Zbigniew Siciarz 2016-12-05
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/benches.txt
@@ -0,0 +1,1 @@
+Benchmarks have been moved to: https://github.com/slog-rs/misc/tree/master/benches
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/examples.txt
@@ -0,0 +1,1 @@
+Examples have been moved to: https://github.com/slog-rs/misc/tree/master/examples
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/src/_drain.rs
@@ -0,0 +1,321 @@
+/// Logging drain
+///
+/// Drains generally mean destination for logs, but slog generalize the
+/// term. `Drain`s are responsible for filtering, modifying, formatting
+/// and writing the log records into given destination.
+///
+/// Implementing this trait allows writing own Drains, that can be combined
+/// with other drains.
+pub trait Drain {
+    /// Type of potential errors returned during logging
+    type Error;
+    /// Log one logging record
+    ///
+    /// Every logging `Record` built from a logging statement (eg.
+    /// `info!(...)`), and key-value lists of a `Logger` it was executed on
+    /// will be passed to the root drain registered during `Logger::root`.
+    ///
+    /// Typically `Drain`s:
+    ///
+    /// * pass this information (or not) to the sub-logger(s) (filters)
+    /// * format and write the information the a destination (writers)
+    /// * deal with the errors returned from the sub-logger(s)
+    fn log(&self, info: &Record, &OwnedKeyValueList) -> result::Result<(), Self::Error>;
+}
+
+impl<D: Drain+?Sized> Drain for Box<D> {
+    type Error = D::Error;
+    fn log(&self, info: &Record, o: &OwnedKeyValueList) -> result::Result<(), D::Error> {
+        (**self).log(info, o)
+    }
+}
+
+impl<D: Drain+?Sized> Drain for Arc<D> {
+    type Error = D::Error;
+    fn log(&self, info: &Record, o: &OwnedKeyValueList) -> result::Result<(), D::Error> {
+        (**self).log(info, o)
+    }
+}
+
+/// Convenience methods for building drains
+///
+/// `DrainExt` is implemented for every `Drain` and contains
+/// convenience methods.
+pub trait DrainExt: Sized + Drain {
+    /// Map logging errors returned by this drain
+    ///
+    /// `f` is a closure that takes `Drain::Error` returned by a given
+    /// drain, and returns new error of potentially different type
+    fn map_err<F, E>(self, f : F) -> MapError<Self, E> where F : 'static + Sync + Send + Fn(<Self as Drain>::Error) -> E {
+        MapError::new(self, f)
+    }
+
+    /// Make `Self` ignore and not report any error
+    fn ignore_err(self) -> IgnoreErr<Self> {
+        IgnoreErr::new(self)
+    }
+
+    /// Make `Self` panic when returning any errors
+    fn fuse(self) -> Fuse<Self> where <Self as Drain>::Error : fmt::Display {
+       Fuse::new(self)
+    }
+}
+
+impl<D : Drain> DrainExt for D {}
+
+/// `Drain` discarding everything
+///
+/// `/dev/null` of `Drain`s
+pub struct Discard;
+
+impl Drain for Discard {
+    type Error = Never;
+    fn log(&self, _: &Record, _: &OwnedKeyValueList) -> result::Result<(), Never> {
+        Ok(())
+    }
+}
+
+/// `Drain` filtering records
+///
+/// Wraps another `Drain` and passes `Record`s to it, only if they satisfy a
+/// given condition.
+pub struct Filter<D: Drain> {
+    drain: D,
+    // eliminated dynamic dispatch, after rust learns `-> impl Trait`
+    cond: Box<Fn(&Record) -> bool + 'static + Send + Sync>,
+}
+
+impl<D: Drain> Filter<D> {
+    /// Create `Filter` wrapping given `drain`
+    pub fn new<F: 'static + Sync + Send + Fn(&Record) -> bool>(drain: D, cond: F) -> Self {
+        Filter {
+            drain: drain,
+            cond: Box::new(cond),
+        }
+    }
+}
+
+impl<D: Drain> Drain for Filter<D> {
+    type Error = D::Error;
+    fn log(&self,
+           info: &Record,
+           logger_values: &OwnedKeyValueList)
+           -> result::Result<(), Self::Error> {
+        if (self.cond)(&info) {
+            self.drain.log(info, logger_values)
+        } else {
+            Ok(())
+        }
+    }
+}
+
+
+/// `Drain` mapping error returned by another `Drain`
+///
+/// See `DrainExt::map_err` for convenience function.
+pub struct MapError<D: Drain, E> {
+    drain: D,
+    // eliminated dynamic dispatch, after rust learns `-> impl Trait`
+    map_fn: Box<Fn(D::Error) -> E + 'static+ Send+Sync>,
+}
+
+impl<D: Drain, E> MapError<D, E> {
+    /// Create `Filter` wrapping given `drain`
+    pub fn new<F: 'static + Sync + Send + Fn(<D as Drain>::Error) -> E>(drain: D, map_fn: F) -> Self {
+        MapError {
+            drain: drain,
+            map_fn: Box::new(map_fn),
+        }
+    }
+}
+
+impl<D: Drain, E> Drain for MapError<D, E> {
+    type Error = E;
+    fn log(&self,
+           info: &Record,
+           logger_values: &OwnedKeyValueList)
+           -> result::Result<(), Self::Error> {
+            self.drain.log(info, logger_values).map_err(|e| (self.map_fn)(e))
+    }
+}
+
+
+/// `Drain` filtering records by `Record` logging level
+///
+/// Wraps a drain and passes records to it, only
+/// if their level is at least given level.
+///
+/// TODO: Remove this type. This drain is a special case of `Filter`, but
+/// because `Filter` can not use static dispatch ATM due to Rust limitations
+/// that will be lifted in the future, it is a standalone type.
+pub struct LevelFilter<D: Drain> {
+    level: Level,
+    drain: D,
+}
+
+impl<D: Drain> LevelFilter<D> {
+    /// Create `LevelFilter`
+    pub fn new(drain: D, level: Level) -> Self {
+        LevelFilter {
+            level: level,
+            drain: drain,
+        }
+    }
+}
+
+impl<D: Drain> Drain for LevelFilter<D> {
+    type Error = D::Error;
+    fn log(&self,
+           info: &Record,
+           logger_values: &OwnedKeyValueList)
+           -> result::Result<(), Self::Error> {
+        if info.level().is_at_least(self.level) {
+            self.drain.log(info, logger_values)
+        } else {
+            Ok(())
+        }
+    }
+}
+
+/// `Drain` duplicating records into two other `Drain`s
+///
+/// Can be nested for more than two outputs.
+pub struct Duplicate<D1: Drain, D2: Drain> {
+    drain1: D1,
+    drain2: D2,
+}
+
+
+impl<D1: Drain, D2: Drain> Duplicate<D1, D2> {
+    /// Create `Duplicate`
+    pub fn new(drain1: D1, drain2: D2) -> Self {
+        Duplicate {
+            drain1: drain1,
+            drain2: drain2,
+        }
+    }
+}
+
+/// Logging error returned by `Duplicate` drain
+pub enum DuplicateError<E1, E2> {
+    /// First `Drain` has returned error
+    First(E1),
+    /// Second `Drain` has returned error
+    Second(E2),
+    /// Both `Drain`s have returned error
+    Both((E1, E2))
+}
+
+impl<E1 : fmt::Display, E2 : fmt::Display> fmt::Display for DuplicateError<E1, E2> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            &DuplicateError::First(ref e) => write!(f, "{})", *e),
+            &DuplicateError::Second(ref e) => write!(f, "{})", *e),
+            &DuplicateError::Both((ref e1, ref e2)) => write!(f, "({}, {})", *e1, *e2),
+        }
+    }
+}
+
+impl<D1 : Drain, D2 : Drain> Drain for Duplicate<D1, D2> {
+    type Error = DuplicateError<D1::Error, D2::Error>;
+    fn log(&self,
+           info: &Record,
+           logger_values: &OwnedKeyValueList)
+           -> result::Result<(), Self::Error> {
+        let res1 = self.drain1.log(info, logger_values);
+        let res2 = self.drain2.log(info, logger_values);
+
+        match (res1, res2) {
+            (Ok(_), Ok(_)) => Ok(()),
+            (Err(e), Ok(_)) => Err(DuplicateError::First(e)),
+            (Ok(_), Err(e)) => Err(DuplicateError::Second(e)),
+            (Err(e1), Err(e2)) => Err(DuplicateError::Both((e1, e2))),
+        }
+    }
+}
+
+
+/// `Drain` panicking on error
+///
+/// `Logger` requires a root drain to handle all errors (`Drain::Error == ()`),
+/// `Fuse` will wrap a `Drain` and panic if it returns any errors.
+///
+/// Note: `Drain::Error` must implement `Display`. It's easy to create own
+/// `Fuse` drain if this requirement can't be fulfilled.
+pub struct Fuse<D: Drain> {
+    drain: D,
+}
+
+impl<D: Drain> Fuse<D> {
+    /// Create `Fuse` wrapping given `drain`
+    pub fn new(drain: D) -> Self {
+        Fuse {
+            drain: drain,
+        }
+    }
+}
+
+impl<D: Drain> Drain for Fuse<D> where D::Error : fmt::Display {
+    type Error = Never;
+    fn log(&self,
+           info: &Record,
+           logger_values: &OwnedKeyValueList)
+        -> result::Result<(), Never> {
+            Ok(
+                self.drain.log(info, logger_values).unwrap_or_else(
+                    |e| panic!("Fuse: {}", e)
+                    )
+                )
+        }
+}
+
+
+/// `Drain` ignoring errors
+///
+/// `Logger` requires a root drain to handle all errors (`Drain::Error == ()`),
+/// `IgnoreErr` will ignore all errors of the drain it wraps.
+pub struct IgnoreErr<D: Drain> {
+    drain: D,
+}
+
+impl<D: Drain> IgnoreErr<D> {
+    /// Create `IgnoreErr` wrapping `drain`
+    pub fn new(drain: D) -> Self {
+        IgnoreErr {
+            drain: drain,
+        }
+    }
+}
+
+impl<D: Drain> Drain for IgnoreErr<D> {
+    type Error = Never;
+    fn log(&self,
+           info: &Record,
+           logger_values: &OwnedKeyValueList)
+        -> result::Result<(), Never> {
+            let _ = self.drain.log(info, logger_values);
+            Ok(())
+        }
+}
+
+/// Filter by `cond` closure
+pub fn filter<D: Drain, F: 'static + Send + Sync + Fn(&Record) -> bool>(
+    cond: F,
+    d: D
+    ) -> Filter<D> {
+    Filter::new(d, cond)
+}
+
+/// Filter by log level
+pub fn level_filter<D: Drain>(level: Level, d: D) -> LevelFilter<D> {
+    LevelFilter::new(d, level)
+}
+
+/// Duplicate records to two drains
+///
+/// Create `Duplicate` drain.
+///
+/// Can be nested for multiple outputs.
+pub fn duplicate<D1: Drain, D2: Drain>(d1: D1, d2: D2) -> Duplicate<D1, D2> {
+    Duplicate::new(d1, d2)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/src/_level.rs
@@ -0,0 +1,222 @@
+/// Official capitalized logging (and logging filtering) level names
+///
+/// In order of `as_usize()`.
+pub static LOG_LEVEL_NAMES: [&'static str; 7] = ["OFF", "CRITICAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"];
+
+/// Official capitalized logging (and logging filtering) short level names
+///
+/// In order of `as_usize()`.
+pub static LOG_LEVEL_SHORT_NAMES: [&'static str; 7] = ["OFF", "CRIT", "ERRO", "WARN", "INFO", "DEBG", "TRCE"];
+
+
+/// Logging level associated with a logging `Record`
+#[repr(usize)]
+#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
+pub enum Level {
+    /// Critical
+    Critical,
+    /// Error
+    Error,
+    /// Warning
+    Warning,
+    /// Info
+    Info,
+    /// Debug
+    Debug,
+    /// Trace
+    Trace
+}
+
+/// Logging filtering level
+#[repr(usize)]
+#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
+pub enum FilterLevel {
+    /// Log nothing
+    Off,
+    /// Log critical level only
+    Critical,
+    /// Log only error level and above
+    Error,
+    /// Log only warning level and above
+    Warning,
+    /// Log only info level and above
+    Info,
+    /// Log only debug level and above
+    Debug,
+    /// Log everything
+    Trace,
+}
+
+impl Level {
+    /// Convert to `str` from `LOG_LEVEL_SHORT_NAMES`
+    pub fn as_short_str(&self) -> &'static str {
+        LOG_LEVEL_SHORT_NAMES[self.as_usize()]
+    }
+
+    /// Convert to `str` from `LOG_LEVEL_NAMES`
+    pub fn as_str(&self) -> &'static str {
+        LOG_LEVEL_NAMES[self.as_usize()]
+    }
+
+    /// Cast `Level` to ordering integer 
+    ///
+    /// `Critical` is the smallest and `Trace` the biggest value
+    #[inline]
+    pub fn as_usize(&self) -> usize {
+        match *self {
+            Level::Critical => 1,
+            Level::Error => 2,
+            Level::Warning => 3,
+            Level::Info => 4,
+            Level::Debug => 5,
+            Level::Trace => 6,
+        }
+    }
+
+    /// Get a `Level` from an `usize`
+    ///
+    /// This complements `as_usize`
+    #[inline]
+    pub fn from_usize(u: usize) -> Option<Level> {
+        match u {
+            1 => Some(Level::Critical),
+            2 => Some(Level::Error),
+            3 => Some(Level::Warning),
+            4 => Some(Level::Info),
+            5 => Some(Level::Debug),
+            6 => Some(Level::Trace),
+            _ => None
+        }
+    }
+}
+
+impl FilterLevel {
+    /// Convert to `usize` value
+    ///
+    /// `Off` is 0, and `Trace` 6
+    #[inline]
+    pub fn as_usize(&self) -> usize {
+        match *self {
+            FilterLevel::Off => 0,
+            FilterLevel::Critical => 1,
+            FilterLevel::Error => 2,
+            FilterLevel::Warning => 3,
+            FilterLevel::Info => 4,
+            FilterLevel::Debug => 5,
+            FilterLevel::Trace => 6,
+        }
+    }
+
+    /// Get a `FilterLevel` from an `usize`
+    ///
+    /// This complements `as_usize`
+    #[inline]
+    pub fn from_usize(u: usize) -> Option<FilterLevel> {
+        match u {
+            0 => Some(FilterLevel::Off),
+            1 => Some(FilterLevel::Critical),
+            2 => Some(FilterLevel::Error),
+            3 => Some(FilterLevel::Warning),
+            4 => Some(FilterLevel::Info),
+            5 => Some(FilterLevel::Debug),
+            6 => Some(FilterLevel::Trace),
+            _ => None
+        }
+    }
+
+    /// Maximum logging level (log everything)
+    #[inline]
+    pub fn max() -> Self {
+        FilterLevel::Trace
+    }
+
+
+    /// Minimum logging level (log nothing)
+    #[inline]
+    pub fn min() -> Self {
+        FilterLevel::Off
+    }
+}
+
+static ASCII_LOWERCASE_MAP: [u8; 256] = [
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+    b' ', b'!', b'"', b'#', b'$', b'%', b'&', b'\'',
+    b'(', b')', b'*', b'+', b',', b'-', b'.', b'/',
+    b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7',
+    b'8', b'9', b':', b';', b'<', b'=', b'>', b'?',
+    b'@',
+
+    b'a', b'b', b'c', b'd', b'e', b'f', b'g',
+    b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o',
+    b'p', b'q', b'r', b's', b't', b'u', b'v', b'w',
+    b'x', b'y', b'z',
+
+    b'[', b'\\', b']', b'^', b'_',
+    b'`', b'a', b'b', b'c', b'd', b'e', b'f', b'g',
+    b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o',
+    b'p', b'q', b'r', b's', b't', b'u', b'v', b'w',
+    b'x', b'y', b'z', b'{', b'|', b'}', b'~', 0x7f,
+    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+    0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+    ];
+
+impl FromStr for FilterLevel {
+    type Err = ();
+    fn from_str(level: &str) -> core::result::Result<FilterLevel, ()> {
+        LOG_LEVEL_NAMES.iter()
+            .position(|&name| name.as_bytes().iter().zip(level.as_bytes().iter()).all(|(a, b)| {
+                ASCII_LOWERCASE_MAP[*a as usize] == ASCII_LOWERCASE_MAP[*b as usize]
+            }))
+            .map(|p| FilterLevel::from_usize(p).unwrap()).ok_or(())
+    }
+}
+
+impl fmt::Display for Level {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.as_short_str())
+    }
+}
+
+impl Level {
+    /// Returns true if `self` is at least `level` logging level
+    #[inline]
+    pub fn is_at_least(&self, level : Self) -> bool {
+        self.as_usize() <= level.as_usize()
+    }
+}
+
+#[test]
+fn level_at_least() {
+    assert!(Level::Debug.is_at_least(Level::Debug));
+    assert!(Level::Debug.is_at_least(Level::Trace));
+    assert!(!Level::Debug.is_at_least(Level::Info));
+}
+
+#[test]
+fn filterlevel_sanity() {
+    assert!(Level::Critical.as_usize() > FilterLevel::Off.as_usize());
+    assert!(Level::Critical.as_usize() == FilterLevel::Critical.as_usize());
+    assert!(Level::Trace.as_usize() == FilterLevel::Trace.as_usize());
+}
+
+#[test]
+fn level_from_str() {
+    assert_eq!("info".parse::<FilterLevel>().unwrap(), FilterLevel::Info);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/src/_logger.rs
@@ -0,0 +1,194 @@
+/// Logging handle used to execute logging statements
+///
+/// Logger handles logging context (key-value list) and handles logging
+/// statements.
+///
+/// Child loggers are build from existing loggers, and inherit existing
+/// key-value pairs from their parents, which can be supplemented with
+/// new ones.
+///
+/// Cloning existing loggers and creating new ones is cheap. Loggers can be
+/// freely passed around the code.
+#[derive(Clone)]
+pub struct Logger {
+    drain: Arc<Drain<Error=Never>+Send+Sync>,
+    values: OwnedKeyValueList,
+}
+
+impl Logger {
+    /// Build a root `Logger`
+    ///
+    /// All children and their children and so on form one hierarchy
+    /// sharing a common drain.
+    ///
+    /// Root logger starts a new hierarchy associated with a given `Drain`. Root
+    /// logger drain must return no errors. See `DrainExt::ignore_err()` and
+    ///
+    /// `DrainExt::fuse()`.
+    /// Use `o!` macro to help build key-value pairs with a nicer syntax.
+    ///
+    /// ```
+    /// #[macro_use]
+    /// extern crate slog;
+    ///
+    /// fn main() {
+    ///     let _root = slog::Logger::root(
+    ///         slog::Discard,
+    ///         o!("key1" => "value1", "key2" => "value2"),
+    ///     );
+    /// }
+    pub fn root<D: 'static + Drain<Error=Never> + Sized+Send+Sync>(d: D, values: Option<Box<ser::SyncMultiSerialize>>) -> Logger {
+        Logger {
+            drain: Arc::new(d),
+            values: OwnedKeyValueList::root(values),
+        }
+    }
+
+    /// Build a child logger
+    ///
+    /// Child logger inherits all existing key-value pairs from it's parent.
+    ///
+    /// All children, their children and so on, form one hierarchy sharing
+    /// a common drain.
+    ///
+    /// Use `o!` macro to help build key value pairs using nicer syntax.
+    ///
+    /// ```
+    /// #[macro_use]
+    /// extern crate slog;
+    ///
+    /// fn main() {
+    ///     let root = slog::Logger::root(slog::Discard,
+    ///         o!("key1" => "value1", "key2" => "value2"));
+    ///     let _log = root.new(o!("key" => "value"));
+    /// }
+    pub fn new(&self, values: Option<Box<ser::SyncMultiSerialize>>) -> Logger {
+        Logger {
+            drain: self.drain.clone(),
+            values: if let Some(v) = values {
+                OwnedKeyValueList::new(v, self.values.clone())
+            } else {
+                self.values.clone()
+            },
+        }
+    }
+
+    /// Log one logging record
+    ///
+    /// Use specific logging functions instead. See `log!` macro
+    /// documentation.
+    #[inline]
+    pub fn log(&self, record: &Record) {
+        let _ = self.drain.log(&record, &self.values);
+    }
+}
+
+impl fmt::Debug for Logger {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(write!(f, "Logger("));
+        for (i, (key, _)) in self.values.iter().enumerate() {
+            if i != 0 {
+                try!(write!(f, ", "));
+            }
+
+            try!(write!(f, "{}", key));
+        }
+        try!(write!(f, ")"));
+        Ok(())
+    }
+}
+
+#[doc(hidden)]
+pub struct RecordStatic<'a> {
+    /// Logging level
+    pub level: Level,
+    /// File
+    pub file: &'static str,
+    /// Line
+    pub line: u32,
+    /// Column (currently not implemented)
+    pub column: u32,
+    /// Function (currently not implemented)
+    pub function: &'static str,
+    /// Module
+    pub module: &'static str,
+    /// Target - for backward compatibility with `log`
+    pub target: &'a str,
+}
+
+/// One logging record
+///
+/// Corresponds to one logging statement like `info!(...)` and carries all it's
+/// data: eg. message, key-values, key-values of `Logger` used to execute it.
+///
+/// Record is passed to `Drain` associated with a given logger hierarchy.
+pub struct Record<'a> {
+    meta: &'a RecordStatic<'a>,
+    msg: fmt::Arguments<'a>,
+    values: &'a [BorrowedKeyValue<'a>],
+}
+
+
+impl<'a> Record<'a> {
+    /// Create a new `Record`
+    #[inline]
+    #[doc(hidden)]
+    pub fn new(
+        s : &'a RecordStatic<'a>,
+        msg: fmt::Arguments<'a>,
+        values: &'a [BorrowedKeyValue<'a>],
+        ) -> Self {
+        Record {
+            meta: s,
+            msg: msg,
+            values: values,
+        }
+    }
+
+    /// Get a log record message
+    pub fn msg(&self) -> fmt::Arguments {
+        self.msg
+    }
+
+    /// Get record logging level
+    pub fn level(&self) -> Level {
+        self.meta.level
+    }
+
+    /// Get line number
+    pub fn line(&self) -> u32 {
+        self.meta.line
+    }
+
+    /// Get error column
+    pub fn column(&self) -> u32 {
+        self.meta.column
+    }
+
+    /// Get file path
+    pub fn file(&self) -> &'static str {
+        self.meta.file
+    }
+
+    /// Get target
+    ///
+    /// Mostly for backward compatibility with `log`
+    pub fn target(&self) -> &str {
+        self.meta.target
+    }
+
+    /// Get module
+    pub fn module(&self) -> &'static str {
+        self.meta.module
+    }
+
+    /// Get function
+    pub fn function(&self) -> &'static str {
+        self.meta.function
+    }
+
+    /// Get Record's key-value pairs
+    pub fn values(&self) -> &'a [BorrowedKeyValue<'a>] {
+        self.values
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/src/lib.rs
@@ -0,0 +1,814 @@
+//! # Slog -  Structured, extensible, composable logging for Rust
+//!
+//! ## Features
+//!
+//! * easy to use
+//! * great performance; see: [slog bench log](https://github.com/dpc/slog-rs/wiki/Bench-log)
+//! * `#![no_std]` support (with opt-out `std` cargo feature flag)
+//! * hierarchical loggers
+//! * lazily evaluated values
+//! * modular, lightweight and very extensible
+//! 	* tiny core crate that does not pull any dependencies
+//! 	* feature-crates for specific functionality
+//! * backward compatibility for standard `log` crate (`slog-stdlog` crate)
+//! 	* supports logging-scopes
+//! 	* using slog in library does not force users of the library to use slog
+//! 	  (but gives benefits); see `crates/example-lib`
+//! * drains & output formatting
+//! 	* filtering
+//! 		* compile-time log level filter using cargo features (same as in `log` crate)
+//! 		* by level, msg, and any other meta-data
+//! 		* [`slog-envlogger`](https://github.com/slog-rs/envlogger) - port of `env_logger`
+//! 	* multiple outputs
+//! 	* asynchronous IO writing
+//! 	* terminal output, with color support (`slog-term` crate)
+//! 	* Json (`slog-json` crate)
+//! 		* Bunyan (`slog-bunyan` crate)
+//! 	* syslog (`slog-syslog` crate)
+//! 	* first class custom drains
+//!
+//! ## Advantages over `log` crate
+//!
+//! * **extensible** - `slog` provides core functionality, and some standard
+//!   feature-set. But using traits, anyone can easily implement as
+//!   powerful fully-custom features, publish separately and grow `slog` feature-set
+//!   for everyone.
+//! * **composable** - Wouldn't it be nice if you could use
+//!   [`env_logger`][env_logger], but output authentication messages to syslog,
+//!   while reporting errors over network in json format? With `slog` drains can
+//!   reuse other drains! You can combine them together, chain, wrap - you name it.
+//! * **context aware** - It's not just one global logger. Hierarchical
+//!   loggers carry information about context of logging. When logging an error
+//!   condition, you want to know which resource was being handled, on which
+//!   instance of your service, using which source code build, talking with what
+//!   peer, etc. In standard `log` you would have to repeat this information in
+//!   every log statement. In `slog` it will happen automatically. See
+//!   [slog-rs functional overview page][functional-overview] to understand better
+//!   logger and drain hierarchies and log record flow through them.
+//! * both **human and machine readable** - By keeping the key-value data format,
+//!   meaning of logging data is preserved. Dump your logging to a JSON file, and
+//!   send it to your data-mining system for further analysis. Don't parse it from
+//!   lines of text anymore!
+//! * **lazy evaluation** and **asynchronous IO** included. Waiting to
+//!   finish writing logging information to disk, or spending time calculating
+//!   data that will be thrown away at the current logging level, are sources of big
+//!   performance waste. Use `AsyncStreamer` drain, and closures to make your logging fast.
+//! * **run-time configuration** - [`AtomicSwitch`][atomic-switch] drain allows
+//!   changing logging behavior in the running program. You could use eg. signal
+//!   handlers to change logging level or logging destinations. See
+//!   [`signal` example][signal].
+//!
+//! [signal]: https://github.com/slog-rs/misc/blob/master/examples/signal.rs
+//! [env_logger]: https://crates.io/crates/env_logger
+//! [functional-overview]: https://github.com/slog-rs/slog/wiki/Functional-overview
+//!
+//! ## Notable details
+//!
+//! `slog` by default removes at compile time trace and debug level statements
+//! in release builds, and trace level records in debug builds. This makes
+//! `trace` and `debug` level logging records practically free, which should
+//! encourage using them freely. If you want to enable trace/debug messages
+//! or raise the compile time logging level limit, use the following in your
+//! `Cargo.toml`:
+//!
+//! ```norust
+//! slog = { version = "1.2", features = ["max_level_trace", "release_max_level_warn"] }
+//! ```
+//!
+//! Due to the `macro_rules` limitation log macros syntax comes in several
+//! versions. See `log!` macro, and pay attention to `;` and `,`
+//! details.
+//!
+//! Root drain (passed to `Logger::root`) must be one that does not ever
+//! return errors, which forces user to pick error handing strategy. You
+//! can use `.fuse()` or `.ignore_err()` methods from `DrainExt` to do
+//! it conveniently.
+//!
+//! [signal]: https://github.com/slog-rs/misc/blob/master/examples/signal.rs
+//! [env_logger]: https://crates.io/crates/env_logger
+//! [functional-overview]: https://github.com/dpc/slog-rs/wiki/Functional-overview
+//! [atomic-switch]: https://docs.rs/slog-atomic/0.4.3/slog_atomic/
+//!
+//! ## Examples & help
+//!
+//! Look at [slog-rs examples in `slog-misc`
+//! repository](https://github.com/slog-rs/misc/tree/master/examples)
+//!
+//! Read [slog-rs wiki pages](https://github.com/slog-rs/slog/wiki)
+//!
+//! Check sources of other [software using
+//! slog-rs](https://crates.io/crates/slog/reverse_dependencies)
+//!
+//! Visit [slog-rs gitter channel](https://gitter.im/slog-rs/slog) for immediate help.
+#![cfg_attr(not(feature = "std"), feature(alloc))]
+#![cfg_attr(not(feature = "std"), feature(collections))]
+#![warn(missing_docs)]
+
+#![no_std]
+
+#[macro_use]
+#[cfg(feature = "std")]
+extern crate std;
+#[cfg(not(feature = "std"))]
+extern crate alloc;
+#[cfg(not(feature = "std"))]
+extern crate collections;
+
+use core::str::FromStr;
+use core::fmt;
+use core::result;
+
+#[cfg(feature = "std")]
+use std::sync::Arc;
+#[cfg(not(feature = "std"))]
+use alloc::arc::Arc;
+
+
+#[cfg(feature = "std")]
+use std::boxed::Box;
+#[cfg(not(feature = "std"))]
+use alloc::boxed::Box;
+
+/// This type is here just to abstract away lack of `!` type support in stable
+/// rust during time of 1.0 release. It will be switched to `!` at some point
+/// and `Never` should not be considered "stable" API.
+#[doc(hidden)]
+pub type Never = ();
+
+/// Convenience macro for building `SyncMultiSerialize` trait object
+///
+/// ```
+/// #[macro_use]
+/// extern crate slog;
+///
+/// fn main() {
+///     let drain = slog::Discard;
+///     let _root = slog::Logger::root(drain, o!("key1" => "value1", "key2" => "value2"));
+/// }
+/// ```
+#[cfg(feature = "std")]
+#[macro_export]
+macro_rules! o(
+    (@ ; $k:expr => $v:expr) => {
+        o!(@ ($k, $v); )
+    };
+    (@ ; $k:expr => $v:expr, $($args:tt)*) => {
+        o!(@ ($k, $v); $($args)* )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr) => {
+        o!(@ ($k, $v, $args_ready); )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr, $($args:tt)* ) => {
+        o!(@ ($k, $v, $args_ready); $($args)* )
+    };
+    (@ $args_ready:expr; ) => {
+        $args_ready
+    };
+    (@ $args_ready:expr;, ) => {
+        $args_ready
+    };
+    () => {
+        None
+    };
+    ($($args:tt)+) => {
+        Some(::std::boxed::Box::new(o!(@ ; $($args)+)))
+    };
+);
+
+/// Convenience macro for building `SyncMultiSerialize` trait object
+///
+/// ```
+/// #[macro_use]
+/// extern crate slog;
+///
+/// fn main() {
+///     let drain = slog::Discard;
+///     let _root = slog::Logger::root(drain, o!("key1" => "value1", "key2" => "value2"));
+/// }
+/// ```
+#[cfg(not(feature = "std"))]
+#[macro_export]
+macro_rules! o(
+    (@ ; $k:expr => $v:expr) => {
+        o!(@ ($k, $v); )
+    };
+    (@ ; $k:expr => $v:expr, $($args:tt)*) => {
+        o!(@ ($k, $v); $($args)* )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr) => {
+        o!(@ ($k, $v, $args_ready); )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr, $($args:tt)* ) => {
+        o!(@ ($k, $v, $args_ready); $($args)* )
+    };
+    (@ $args_ready:expr; ) => {
+        $args_ready
+    };
+    (@ $args_ready:expr;, ) => {
+        $args_ready
+    };
+    () => {
+        None
+    };
+    ($($args:tt)+) => {
+        Some(::std::boxed::Box::new(o!(@ ; $($args)+)))
+    };
+);
+
+/// An alternative, longer-name version of `o` macro
+///
+/// Use in case of macro name collisions
+#[cfg(feature = "std")]
+#[macro_export]
+macro_rules! slog_o(
+    (@ ; $k:expr => $v:expr) => {
+        o!(@ ($k, $v); )
+    };
+    (@ ; $k:expr => $v:expr, $($args:tt)*) => {
+        o!(@ ($k, $v); $($args)* )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr) => {
+        o!(@ ($k, $v, $args_ready); )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr, $($args:tt)* ) => {
+        o!(@ ($k, $v, $args_ready); $($args)* )
+    };
+    (@ $args_ready:expr; ) => {
+        $args_ready
+    };
+    (@ $args_ready:expr;, ) => {
+        $args_ready
+    };
+    () => {
+        None
+    };
+    ($($args:tt)+) => {
+        Some(::std::boxed::Box::new(o!(@ ; $($args)+)))
+    };
+);
+
+/// An alternative, longer-name version of `o` macro
+///
+/// Use in case of macro name collisions
+#[cfg(not(feature = "std"))]
+#[macro_export]
+macro_rules! slog_o(
+    (@ ; $k:expr => $v:expr) => {
+        o!(@ ($k, $v); )
+    };
+    (@ ; $k:expr => $v:expr, $($args:tt)*) => {
+        o!(@ ($k, $v); $($args)* )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr) => {
+        o!(@ ($k, $v, $args_ready); )
+    };
+    (@ $args_ready:expr; $k:expr => $v:expr, $($args:tt)* ) => {
+        o!(@ ($k, $v, $args_ready); $($args)* )
+    };
+    (@ $args_ready:expr; ) => {
+        $args_ready
+    };
+    (@ $args_ready:expr;, ) => {
+        $args_ready
+    };
+    () => {
+        None
+    };
+    ($($args:tt)+) => {
+        Some(::std::boxed::Box::new(o!(@ ; $($args)+)))
+    };
+);
+
+
+/// Log message of a given level
+///
+/// Use wrappers `error!`, `warn!` etc. instead
+///
+/// The `max_level_*` features can be used to statically disable logging at
+/// various levels.
+///
+/// Use longer name version macros if you want to prevent clash with legacy `log`
+/// crate macro names (see `examples/alternative_names.rs`).
+///
+/// The following invocations are supported.
+///
+/// Simple:
+///
+/// ```
+/// #[macro_use]
+/// extern crate slog;
+///
+/// fn main() {
+///     let drain = slog::Discard;
+///     let root = slog::Logger::root(drain, o!("key1" => "value1", "key2" => "value2"));
+///     info!(root, "test info log"; "log-key" => true);
+/// }
+/// ```
+///
+/// Note that `"key" => value` part is optional.
+///
+/// ```
+/// #[macro_use]
+/// extern crate slog;
+///
+/// fn main() {
+///     let drain = slog::Discard;
+///     let root = slog::Logger::root(drain, o!("key1" => "value1", "key2" => "value2"));
+///     info!(root, "test info log");
+/// }
+/// ```
+///
+/// Formatting support:
+///
+/// ```
+/// #[macro_use]
+/// extern crate slog;
+///
+/// fn main() {
+///     let drain = slog::Discard;
+///     let root = slog::Logger::root(drain, o!("key1" => "value1", "key2" => "value2"));
+///     info!(root, "log-key" => true; "formatted: {}", 1);
+/// }
+/// ```
+///
+/// Again, `"key" => value` is optional.
+///
+/// ```
+/// #[macro_use]
+/// extern crate slog;
+///
+/// fn main() {
+///     let drain = slog::Discard;
+///     let root = slog::Logger::root(drain, o!("key1" => "value1", "key2" => "value2"));
+///     info!(root, "formatted: {}", 1);
+/// }
+/// ```
+
+#[macro_export]
+macro_rules! log(
+    ($lvl:expr, $l:expr, $($k:expr => $v:expr),+; $($args:tt)+ ) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!($($args)+), &[$(($k, &$v)),+]))
+        }
+    };
+    ($lvl:expr, $l:expr, $msg:expr) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!("{}", $msg), &[]))
+        }
+    };
+    ($lvl:expr, $l:expr, $msg:expr; $($k:expr => $v:expr),+) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!("{}", $msg), &[$(($k, &$v)),+]))
+        }
+    };
+    ($lvl:expr, $l:expr, $msg:expr; $($k:expr => $v:expr),+,) => {
+        log!($lvl, $l, $msg; $($k => $v),+)
+    };
+    ($lvl:expr, $l:expr, $($args:tt)+) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!($($args)+), &[]))
+        }
+    };
+);
+
+/// Log message of a given level (alias)
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `log` for format documentation.
+///
+/// ```
+/// #[macro_use(o,slog_log,slog_info)]
+/// extern crate slog;
+///
+/// fn main() {
+///     let log = slog::Logger::root(slog::Discard, o!());
+///
+///     slog_info!(log, "some interesting info"; "where" => "right here");
+/// }
+/// ```
+#[macro_export]
+macro_rules! slog_log(
+    ($lvl:expr, $l:expr, $($k:expr => $v:expr),+; $($args:tt)+ ) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!($($args)+), &[$(($k, &$v)),+]))
+        }
+    };
+    ($lvl:expr, $l:expr, $msg:expr) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!("{}", $msg), &[]))
+        }
+    };
+    ($lvl:expr, $l:expr, $msg:expr; $($k:expr => $v:expr),+) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!("{}", $msg), &[$(($k, &$v)),+]))
+        }
+    };
+    ($lvl:expr, $l:expr, $msg:expr; $($k:expr => $v:expr),+,) => {
+        log!($lvl, $l, $msg; $($k => $v),+)
+    };
+    ($lvl:expr, $l:expr, $($args:tt)+) => {
+        if $lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
+            // prevent generating big `Record` over and over
+            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {
+                level: $lvl,
+                file: file!(),
+                line: line!(),
+                column: column!(),
+                function: "",
+                module: module_path!(),
+                target: module_path!(),
+            };
+            $l.log(&$crate::Record::new(&RS, format_args!($($args)+), &[]))
+        }
+    };
+);
+
+/// Log critical level record
+///
+/// See `log` for documentation.
+#[macro_export]
+macro_rules! crit(
+    ($($args:tt)+) => {
+        log!($crate::Level::Critical, $($args)+)
+    };
+);
+
+/// Log critical level record (alias)
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! slog_crit(
+    ($($args:tt)+) => {
+        slog_log!($crate::Level::Critical, $($args)+)
+    };
+);
+
+/// Log error level record
+///
+/// See `log` for documentation.
+#[macro_export]
+macro_rules! error(
+    ($($args:tt)+) => {
+        log!($crate::Level::Error, $($args)+)
+    };
+);
+
+/// Log error level record
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! slog_error(
+    ($($args:tt)+) => {
+        slog_log!($crate::Level::Error, $($args)+)
+    };
+);
+
+
+/// Log warning level record
+///
+/// See `log` for documentation.
+#[macro_export]
+macro_rules! warn(
+    ($($args:tt)+) => {
+        log!($crate::Level::Warning, $($args)+)
+    };
+);
+
+/// Log warning level record (alias)
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! slog_warn(
+    ($($args:tt)+) => {
+        slog_log!($crate::Level::Warning, $($args)+)
+    };
+);
+
+/// Log info level record
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! info(
+    ($($args:tt)+) => {
+        log!($crate::Level::Info, $($args)+)
+    };
+);
+
+/// Log info level record (alias)
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! slog_info(
+    ($($args:tt)+) => {
+        slog_log!($crate::Level::Info, $($args)+)
+    };
+);
+
+/// Log debug level record
+///
+/// See `log` for documentation.
+#[macro_export]
+macro_rules! debug(
+    ($($args:tt)+) => {
+        log!($crate::Level::Debug, $($args)+)
+    };
+);
+
+/// Log debug level record (alias)
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! slog_debug(
+    ($($args:tt)+) => {
+        slog_log!($crate::Level::Debug, $($args)+)
+    };
+);
+
+
+/// Log trace level record
+///
+/// See `log` for documentation.
+#[macro_export]
+macro_rules! trace(
+    ($($args:tt)+) => {
+        log!($crate::Level::Trace, $($args)+)
+    };
+);
+
+/// Log trace level record (alias)
+///
+/// Prefer shorter version, unless it clashes with
+/// existing `log` crate macro.
+///
+/// See `slog_log` for documentation.
+#[macro_export]
+macro_rules! slog_trace(
+    ($($args:tt)+) => {
+        slog_log!($crate::Level::Trace, $($args)+)
+    };
+);
+
+/// Serialization
+pub mod ser;
+
+pub use ser::{PushLazy, ValueSerializer, Serializer, Serialize};
+
+include!("_level.rs");
+include!("_logger.rs");
+include!("_drain.rs");
+
+/// Key value pair that can be part of a logging record
+pub type BorrowedKeyValue<'a> = (&'static str, &'a ser::Serialize);
+
+/// Key value pair that can be owned by `Logger`
+///
+/// See `o!(...)` macro.
+pub type OwnedKeyValue<'a> = (&'static str, &'a ser::SyncSerialize);
+
+struct OwnedKeyValueListInner {
+    parent: Option<OwnedKeyValueList>,
+    values: Option<Box<ser::SyncMultiSerialize>>,
+}
+
+/// Chain of `SyncMultiSerialize`-s of a `Logger` and its ancestors
+#[derive(Clone)]
+pub struct OwnedKeyValueList {
+    inner : Arc<OwnedKeyValueListInner>,
+}
+
+impl OwnedKeyValueList {
+    /// New `OwnedKeyValueList` node with an existing parent
+    pub fn new(values: Box<ser::SyncMultiSerialize>, parent: OwnedKeyValueList) -> Self {
+        OwnedKeyValueList {
+            inner: Arc::new(OwnedKeyValueListInner {
+                parent: Some(parent),
+                values: Some(values),
+            })
+        }
+    }
+
+    /// New `OwnedKeyValue` node without a parent (root)
+    pub fn root(values: Option<Box<ser::SyncMultiSerialize>>) -> Self {
+        OwnedKeyValueList {
+            inner: Arc::new(OwnedKeyValueListInner {
+                parent: None,
+                values: values,
+            })
+        }
+    }
+
+    /// Get the parent node element on the chain of values
+    ///
+    /// Since `OwnedKeyValueList` is just a chain of `SyncMultiSerialize` instances: each
+    /// containing one more more `OwnedKeyValue`, it's possible to iterate through the whole list
+    /// group-by-group with `parent()` and `values()`.
+    pub fn parent(&self) -> &Option<OwnedKeyValueList> {
+        &self.inner.parent
+    }
+
+    /// Get the head node `SyncMultiSerialize` values
+    pub fn values(&self) -> Option<&ser::SyncMultiSerialize> {
+        self.inner.values.as_ref().map(|b| &**b)
+    }
+
+    /// Iterator over all `OwnedKeyValue`-s in every `SyncMultiSerialize` of the list
+    ///
+    /// The order is reverse to how it was built. Eg.
+    ///
+    /// ```
+    /// #[macro_use]
+    /// extern crate slog;
+    ///
+    /// fn main() {
+    ///     let drain = slog::Discard;
+    ///     let root = slog::Logger::root(drain, o!("k1" => "v1", "k2" => "k2"));
+    ///     let _log = root.new(o!("k3" => "v3", "k4" => "v4"));
+    /// }
+    /// ```
+    ///
+    /// Will produce `OwnedKeyValueList.iter()` that returns `k4, k3, k2, k1`.
+    pub fn iter(&self) -> OwnedKeyValueListIterator {
+        OwnedKeyValueListIterator::new(self)
+    }
+
+    /// Get a unique stable identifier for this node
+    ///
+    /// This function is buggy and will be removed at some point.
+    /// Please see https://github.com/slog-rs/slog/issues/90
+    #[deprecated]
+    pub fn id(&self) -> usize {
+        &*self.inner as *const _ as usize
+    }
+}
+
+/// Iterator over `OwnedKeyValue`-s
+pub struct OwnedKeyValueListIterator<'a> {
+    next_node: Option<&'a OwnedKeyValueList>,
+    cur: Option<&'a ser::SyncMultiSerialize>,
+}
+
+impl<'a> OwnedKeyValueListIterator<'a> {
+    fn new(node: &'a OwnedKeyValueList) -> Self {
+        OwnedKeyValueListIterator {
+            next_node: Some(node),
+            cur: None,
+        }
+    }
+}
+
+impl<'a> Iterator for OwnedKeyValueListIterator<'a> {
+    type Item = OwnedKeyValue<'a>;
+    fn next(&mut self) -> Option<Self::Item> {
+        loop {
+            let cur = self.cur;
+            match cur {
+                Some(x) => {
+                    let tail = x.tail();
+                    self.cur = tail;
+                    return Some(x.head())
+                },
+                None => {
+                    self.next_node = match self.next_node {
+                        Some(ref node) => {
+                            self.cur = node.inner.values.as_ref().map(|v| &**v);
+                            node.inner.parent.as_ref()
+                        }
+                        None => return None,
+                    };
+                }
+            }
+        }
+    }
+}
+
+#[allow(unknown_lints)]
+#[allow(inline_always)]
+#[inline(always)]
+#[doc(hidden)]
+/// Not an API
+pub fn __slog_static_max_level() -> FilterLevel {
+    if !cfg!(debug_assertions) {
+        if cfg!(feature = "release_max_level_off") {
+            return FilterLevel::Off;
+        } else if cfg!(feature = "release_max_level_error") {
+            return FilterLevel::Error;
+        } else if cfg!(feature = "release_max_level_warn") {
+            return FilterLevel::Warning;
+        } else if cfg!(feature = "release_max_level_info") {
+            return FilterLevel::Info;
+        } else if cfg!(feature = "release_max_level_debug") {
+            return FilterLevel::Debug;
+        } else if cfg!(feature = "release_max_level_trace") {
+            return FilterLevel::Trace;
+        }
+    }
+    if cfg!(feature = "max_level_off") {
+        FilterLevel::Off
+    } else if cfg!(feature = "max_level_error") {
+        FilterLevel::Error
+    } else if cfg!(feature = "max_level_warn") {
+        FilterLevel::Warning
+    } else if cfg!(feature = "max_level_info") {
+        FilterLevel::Info
+    } else if cfg!(feature = "max_level_debug") {
+        FilterLevel::Debug
+    } else if cfg!(feature = "max_level_trace") {
+        FilterLevel::Trace
+    } else {
+        if !cfg!(debug_assertions) {
+            FilterLevel::Info
+        } else {
+            FilterLevel::Debug
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/src/ser.rs
@@ -0,0 +1,383 @@
+
+#[cfg(feature = "std")]
+use std;
+use core;
+use core::{result, fmt};
+
+#[cfg(feature = "std")]
+use std::sync::Arc;
+#[cfg(not(feature = "std"))]
+use alloc::arc::Arc;
+
+#[cfg(feature = "std")]
+use std::rc::Rc;
+#[cfg(not(feature = "std"))]
+use alloc::rc::Rc;
+
+#[cfg(feature = "std")]
+use std::boxed::Box;
+#[cfg(not(feature = "std"))]
+use alloc::boxed::Box;
+
+
+#[cfg(feature = "std")]
+use std::string::String;
+#[cfg(not(feature = "std"))]
+use collections::string::String;
+
+use super::Record;
+
+#[derive(Debug)]
+#[cfg(feature = "std")]
+/// Serialization Error
+pub enum Error {
+    /// `io::Error`
+    Io(std::io::Error),
+    /// Other error
+    Other
+}
+
+#[derive(Debug)]
+#[cfg(not(feature = "std"))]
+/// Serialization Error
+pub enum Error {
+    /// Other error
+    Other
+}
+
+/// Serialization `Result`
+pub type Result = result::Result<(), Error>;
+
+#[cfg(feature = "std")]
+impl From<std::io::Error> for Error {
+    fn from(err: std::io::Error) -> Error {
+        Error::Io(err)
+    }
+}
+
+impl From<core::fmt::Error> for Error {
+    fn from(_ : core::fmt::Error) -> Error {
+        Error::Other
+    }
+}
+
+#[cfg(feature = "std")]
+impl From<Error> for std::io::Error {
+    fn from(e : Error) -> std::io::Error {
+        match e {
+            Error::Io(e) => e,
+            Error::Other => std::io::Error::new(std::io::ErrorKind::Other, "other error"),
+        }
+    }
+}
+
+#[cfg(feature = "std")]
+impl std::error::Error for Error {
+    fn description(&self) -> &str {
+        match *self {
+            Error::Io(ref e) => e.description(),
+            Error::Other => "serialization error"
+        }
+    }
+
+    fn cause(&self) -> Option<&std::error::Error> {
+        match *self {
+            Error::Io(ref e) => Some(e),
+            Error::Other => None
+        }
+    }
+}
+
+#[cfg(feature = "std")]
+impl core::fmt::Display for Error {
+    fn fmt(&self, fmt: &mut core::fmt::Formatter) -> std::fmt::Result {
+        match *self {
+            Error::Io(ref e) => e.fmt(fmt),
+            Error::Other => fmt.write_str("Other serialization error")
+        }
+    }
+
+}
+
+/// Value that can be serialized
+///
+/// Loggers require values in key-value pairs to
+/// implement this trait.
+///
+pub trait Serialize {
+    /// Serialize self into `Serializer`
+    ///
+    /// Structs implementing this trait should generally
+    /// only call respective methods of `serializer`.
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error>;
+}
+
+/// Value that can be serialized and stored
+/// in `Logger` itself.
+///
+/// As Loggers itself must be thread-safe, they can only
+/// store values implementing this trait.
+pub trait SyncSerialize: Send + Sync + 'static + Serialize {}
+
+
+/// Multiple key-values pairs that can be serialized
+pub trait SyncMultiSerialize : Send + Sync + 'static {
+    /// Key and value of the first key-value pair
+    fn head(&self) -> (&'static str, &SyncSerialize);
+    /// Next key-value pair (and all following ones)
+    fn tail(&self) -> Option<&SyncMultiSerialize>;
+}
+
+/// Serializer
+///
+/// Drains using `Format` will internally use
+/// types implementing this trait.
+pub trait Serializer {
+    /// Emit bool
+    fn emit_bool(&mut self, key: &'static str, val: bool) -> Result;
+    /// Emit `()`
+    fn emit_unit(&mut self, key: &'static str) -> Result;
+    /// Emit `None`
+    fn emit_none(&mut self, key: &'static str) -> Result;
+    /// Emit char
+    fn emit_char(&mut self, key: &'static str, val: char) -> Result;
+    /// Emit u8
+    fn emit_u8(&mut self, key: &'static str, val: u8) -> Result;
+    /// Emit i8
+    fn emit_i8(&mut self, key: &'static str, val: i8) -> Result;
+    /// Emit u16
+    fn emit_u16(&mut self, key: &'static str, val: u16) -> Result;
+    /// Emit i16
+    fn emit_i16(&mut self, key: &'static str, val: i16) -> Result;
+    /// Emit u32
+    fn emit_u32(&mut self, key: &'static str, val: u32) -> Result;
+    /// Emit i32
+    fn emit_i32(&mut self, key: &'static str, val: i32) -> Result;
+    /// Emit f32
+    fn emit_f32(&mut self, key: &'static str, val: f32) -> Result;
+    /// Emit u64
+    fn emit_u64(&mut self, key: &'static str, val: u64) -> Result;
+    /// Emit i64
+    fn emit_i64(&mut self, key: &'static str, val: i64) -> Result;
+    /// Emit f64
+    fn emit_f64(&mut self, key: &'static str, val: f64) -> Result;
+    /// Emit usize
+    fn emit_usize(&mut self, key: &'static str, val: usize) -> Result;
+    /// Emit isize
+    fn emit_isize(&mut self, key: &'static str, val: isize) -> Result;
+    /// Emit str
+    fn emit_str(&mut self, key: &'static str, val: &str) -> Result;
+    /// Emit `fmt::Arguments`
+    fn emit_arguments(&mut self, key: &'static str, val: &fmt::Arguments) -> Result;
+}
+
+macro_rules! impl_serialize_for{
+    ($t:ty, $f:ident) => {
+        impl Serialize for $t {
+            fn serialize(&self, _record : &Record, key : &'static str, serializer : &mut Serializer)
+                         -> result::Result<(), Error> {
+                serializer.$f(key, *self)
+            }
+        }
+
+        impl SyncSerialize for $t where $t : Send+Sync+'static { }
+    };
+}
+
+impl_serialize_for!(usize, emit_usize);
+impl_serialize_for!(isize, emit_isize);
+impl_serialize_for!(bool, emit_bool);
+impl_serialize_for!(char, emit_char);
+impl_serialize_for!(u8, emit_u8);
+impl_serialize_for!(i8, emit_i8);
+impl_serialize_for!(u16, emit_u16);
+impl_serialize_for!(i16, emit_i16);
+impl_serialize_for!(u32, emit_u32);
+impl_serialize_for!(i32, emit_i32);
+impl_serialize_for!(f32, emit_f32);
+impl_serialize_for!(u64, emit_u64);
+impl_serialize_for!(i64, emit_i64);
+impl_serialize_for!(f64, emit_f64);
+
+impl Serialize for () {
+    fn serialize(&self, _record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        serializer.emit_unit(key)
+    }
+}
+
+impl SyncSerialize for () {}
+
+impl Serialize for str {
+    fn serialize(&self, _record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        serializer.emit_str(key, self)
+    }
+}
+
+impl<'a> Serialize for &'a str {
+    fn serialize(&self, _record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        serializer.emit_str(key, self)
+    }
+}
+
+impl<'a> Serialize for fmt::Arguments<'a>{
+    fn serialize(&self, _record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        serializer.emit_arguments(key, self)
+    }
+}
+
+impl SyncSerialize for fmt::Arguments<'static> {}
+
+impl SyncSerialize for &'static str {}
+
+impl Serialize for String {
+    fn serialize(&self, _record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        serializer.emit_str(key, self.as_str())
+    }
+}
+
+impl SyncSerialize for String {}
+
+impl<T: Serialize> Serialize for Option<T> {
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        match *self {
+            Some(ref s) => s.serialize(record, key, serializer),
+            None => serializer.emit_none(key),
+        }
+    }
+}
+
+impl<T: Serialize + Send + Sync + 'static> SyncSerialize for Option<T> {}
+
+
+impl Serialize for Box<Serialize+Send+'static> {
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        (**self).serialize(record, key, serializer)
+    }
+}
+
+impl<T> Serialize for Arc<T>
+    where T: Serialize
+{
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        (**self).serialize(record, key, serializer)
+    }
+}
+
+impl<T> SyncSerialize for Arc<T> where T: SyncSerialize {}
+
+impl<T> Serialize for Rc<T>
+    where T: Serialize
+{
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        (**self).serialize(record, key, serializer)
+    }
+}
+
+impl<T> Serialize for core::num::Wrapping<T>
+    where T: Serialize
+{
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        self.0.serialize(record, key, serializer)
+    }
+}
+
+impl<T> SyncSerialize for core::num::Wrapping<T> where T: SyncSerialize {}
+
+impl<S: 'static + Serialize, F> Serialize for F
+    where F: 'static + for<'c, 'd> Fn(&'c Record<'d>) -> S
+{
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        (*self)(record).serialize(record, key, serializer)
+    }
+}
+
+impl<S: 'static + Serialize, F> SyncSerialize for F
+    where F: 'static + Sync + Send + for<'c, 'd> Fn(&'c Record<'d>) -> S
+{
+}
+
+/// A newtype for non-return based lazy values
+///
+/// It's more natural for closures used as lazy values to return `Serialize`
+/// implementing type, but sometimes that forces an allocation (eg. Strings)
+///
+/// In some cases it might make sense for another closure form to be used - one
+/// taking a serializer as an argument, which avoids lifetimes / allocation issues.
+///
+/// Unfortunately, as one `struct` can implement many different closure traits,
+/// a newtype has to be used to prevent ambiguity.
+///
+/// Generally this method should be used only if it avoids a big allocation of
+/// `Serialize`-implementing type in performance-critical logging statement.
+///
+/// TODO: Can `PushLazy` be avoided?
+pub struct PushLazy<F>(pub F);
+
+/// A handle to `Serializer` for `PushLazy` closure
+pub struct ValueSerializer<'a> {
+    record: &'a Record<'a>,
+    key: &'static str,
+    serializer: &'a mut Serializer,
+    done: bool,
+}
+
+impl<'a> ValueSerializer<'a> {
+    /// Serialize a value
+    ///
+    /// This consumes `self` to prevent serializing one value multiple times
+    pub fn serialize<'b, S: 'b + Serialize>(mut self, s: S) -> result::Result<(), Error> {
+        self.done = true;
+        s.serialize(self.record, self.key, self.serializer)
+    }
+}
+
+impl<'a> Drop for ValueSerializer<'a> {
+    fn drop(&mut self) {
+        if !self.done {
+            // unfortunately this gives no change to return serialization errors
+            let _ = self.serializer.emit_unit(self.key);
+        }
+    }
+}
+
+impl<F> Serialize for PushLazy<F>
+    where F: 'static + for<'c, 'd> Fn(&'c Record<'d>, ValueSerializer<'c>) -> result::Result<(), Error>
+{
+    fn serialize(&self, record: &Record, key: &'static str, serializer: &mut Serializer) -> result::Result<(), Error> {
+        let ser = ValueSerializer {
+            record: record,
+            key: key,
+            serializer: serializer,
+            done: false,
+        };
+        (self.0)(record, ser)
+    }
+}
+
+impl<F> SyncSerialize for PushLazy<F>
+     where F: 'static + Sync + Send + for<'c, 'd> Fn(&'c Record<'d>, ValueSerializer<'c>)
+     -> result::Result<(), Error> {
+}
+
+impl<A : SyncSerialize> SyncMultiSerialize for (&'static str, A) {
+    fn tail(&self) -> Option<&SyncMultiSerialize> {
+        None
+    }
+
+    fn head(&self) -> (&'static str, &SyncSerialize) {
+        let (ref key, ref val) = *self;
+        (key, val)
+    }
+}
+
+impl<A : SyncSerialize, R : SyncMultiSerialize> SyncMultiSerialize for (&'static str, A, R) {
+    fn tail(&self) -> Option<&SyncMultiSerialize> {
+        let (_, _, ref tail) = *self;
+        Some(tail)
+    }
+
+    fn head(&self) -> (&'static str, &SyncSerialize) {
+        let (ref key, ref val, _) = *self;
+        (key, val)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/slog/src/tests.rs
@@ -0,0 +1,20 @@
+use super::{Logger, Discard};
+
+#[test]
+fn logger_fmt_debug_sanity() {
+
+    let root = Logger::root(Discard, o!("a" => "aa"));
+    let log = root.new(o!("b" => "bb", "c" => "cc"));
+
+    assert_eq!(format!("{:?}", log), "Logger(c, b, a)");
+}
+
+#[cfg(test)]
+mod tests {
+    use {Logger, Discard};
+    /// ensure o! macro expands without error inside a module
+    #[test]
+    fn test_o_macro_expansion() {
+        let _ = Logger::root(Discard, o!("a" => "aa"));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"a4229a7e2eaa72b54020926415d7715144a291fe433380d371bbb0e1207f8326","Cargo.toml":"a6c08b72f1ed2a2ab14761024d023eb1c270c272cd6cd62b42041ea30e112824","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"fe89569b23ecd71d60148f1356c286b4a8614327cec4ff8518dfab17e57c5487","src/lib.rs":"2235297adddfa32e4ab3a4506c538717d89f2c0bdf196893132dc65f52a991c9","tests/smoke.rs":"b2b2ed4a10c1d1965b1effee0995da73cb7b1480aefcd77ba4ad5456651253e4"},"package":"87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/.travis.yml
@@ -0,0 +1,24 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo doc --no-deps
+after_success: |
+  [ $TRAVIS_BRANCH = master ] &&
+  [ $TRAVIS_PULL_REQUEST = false ] &&
+  [ $TRAVIS_RUST_VERSION = nightly ] &&
+  echo '<meta http-equiv=refresh content=0;url=tempdir/index.html>' > target/doc/index.html &&
+  pip install ghp-import --user $USER &&
+  $HOME/.local/bin/ghp-import -n target/doc &&
+  git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
+env:
+  global:
+    secure: GzgRe6TWVJLBly53nUwyvYnap6vlq3stS5iYnE51n305CxOinA9sKbNev4g/nYegfAvKM12Tmy4hySBVyWaHL43rTMivoBTqHMyVohf5xR9avi/em198GlL0AM005j6w67fiWgmbb0iDC2NcKN358ga8AnIWB6KNd4C4Jm5X+ew=
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+
+name = "tempdir"
+version = "0.3.5"
+authors = ["The Rust Project Developers"]
+license = "MIT/Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/rust-lang/tempdir"
+homepage = "https://github.com/rust-lang/tempdir"
+documentation = "https://doc.rust-lang.org/tempdir"
+description = """
+A library for managing a temporary directory and deleting all contents when it's
+dropped.
+"""
+
+[dependencies]
+rand = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/README.md
@@ -0,0 +1,53 @@
+tempdir
+=======
+
+A Rust library for creating a temporary directory and deleting its entire
+contents when the directory is dropped.
+
+[![Build Status](https://travis-ci.org/rust-lang-nursery/tempdir.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/tempdir)
+
+[Documentation](https://doc.rust-lang.org/tempdir)
+
+## Usage
+
+Add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+tempdir = "0.3"
+```
+
+and this to your crate root:
+
+```rust
+extern crate tempdir;
+```
+
+## Example
+
+This sample method does the following:
+
+1. Create a temporary directory in the default location with the given prefix.
+2. Determine a file path in the directory and print it out.
+3. Create a file inside the temp folder.
+4. Write to the file and sync it to disk.
+5. Close the directory, deleting the contents in the process.
+
+```rust
+fn write_temp_folder_with_files() -> Result<(), io::Error> {
+    if let Ok(dir) = TempDir::new("my_directory_prefix") {
+        let file_path = dir.path().join("foo.txt");
+        println!("{:?}", file_path);
+
+        let mut f = try!(File::create(file_path));
+        try!(f.write_all(b"Hello, world!"));
+        try!(f.sync_all());
+        try!(dir.close());
+    }
+    Ok(())
+}
+```
+
+**Note:** Closing the directory is actually optional, as it would be done on
+drop. The benefit of closing here is that it allows possible errors to be
+handled.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/src/lib.rs
@@ -0,0 +1,330 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
+       html_favicon_url = "https://www.rust-lang.org/favicon.ico",
+       html_root_url = "https://doc.rust-lang.org/tempdir/")]
+#![cfg_attr(test, deny(warnings))]
+
+//! Temporary directories of files.
+//!
+//! The [`TempDir`] type creates a directory on the file system that
+//! is deleted once it goes out of scope. At construction, the
+//! `TempDir` creates a new directory with a randomly generated name
+//! and a prefix of your choosing.
+//!
+//! [`TempDir`]: struct.TempDir.html
+//! [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+//!
+//! # Examples
+//!
+//! ```
+//! extern crate tempdir;
+//!
+//! use std::fs::File;
+//! use std::io::Write;
+//! use tempdir::TempDir;
+//!
+//! fn main() {
+//!     // Create a directory inside of `std::env::temp_dir()`, named with
+//!     // the prefix "example".
+//!     let tmp_dir = TempDir::new("example").expect("create temp dir");
+//!     let file_path = tmp_dir.path().join("my-temporary-note.txt");
+//!     let mut tmp_file = File::create(file_path).expect("create temp file");
+//!     writeln!(tmp_file, "Brian was here. Briefly.").expect("write temp file");
+//!
+//!     // By closing the `TempDir` explicitly, we can check that it has
+//!     // been deleted successfully. If we don't close it explicitly,
+//!     // the directory will still be deleted when `tmp_dir` goes out
+//!     // of scope, but we won't know whether deleting the directory
+//!     // succeeded.
+//!     drop(tmp_file);
+//!     tmp_dir.close().expect("delete temp dir");
+//! }
+//! ```
+
+extern crate rand;
+
+use std::env;
+use std::io::{self, Error, ErrorKind};
+use std::fmt;
+use std::fs;
+use std::path::{self, PathBuf, Path};
+use rand::{thread_rng, Rng};
+
+/// A directory in the filesystem that is automatically deleted when
+/// it goes out of scope.
+///
+/// The [`TempDir`] type creates a directory on the file system that
+/// is deleted once it goes out of scope. At construction, the
+/// `TempDir` creates a new directory with a randomly generated name,
+/// and with a prefix of your choosing.
+///
+/// The default constructor, [`TempDir::new`], creates directories in
+/// the location returned by [`std::env::temp_dir()`], but `TempDir`
+/// can be configured to manage a temporary directory in any location
+/// by constructing with [`TempDir::new_in`].
+///
+/// After creating a `TempDir`, work with the file system by doing
+/// standard [`std::fs`] file system operations on its [`Path`],
+/// which can be retrieved with [`TempDir::path`]. Once the `TempDir`
+/// value is dropped, the directory at the path will be deleted, along
+/// with any files and directories it contains. It is your responsibility
+/// to ensure that no further file system operations are attempted
+/// inside the temporary directory once it has been deleted.
+///
+/// Various platform-specific conditions may cause `TempDir` to fail
+/// to delete the underlying directory. It's important to ensure that
+/// handles (like [`File`] and [`ReadDir`]) to files inside the
+/// directory are dropped before the `TempDir` goes out of scope. The
+/// `TempDir` destructor will silently ignore any errors in deleting
+/// the directory; to instead handle errors call [`TempDir::close`].
+///
+/// Note that if the program exits before the `TempDir` destructor is
+/// run, such as via [`std::process::exit`], by segfaulting, or by
+/// receiving a signal like `SIGINT`, then the temporary directory
+/// will not be deleted.
+/// 
+/// [`File`]: http://doc.rust-lang.org/std/fs/struct.File.html
+/// [`Path`]: http://doc.rust-lang.org/std/path/struct.Path.html
+/// [`ReadDir`]: http://doc.rust-lang.org/std/fs/struct.ReadDir.html
+/// [`TempDir::close`]: struct.TempDir.html#method.close
+/// [`TempDir::new`]: struct.TempDir.html#method.new
+/// [`TempDir::new_in`]: struct.TempDir.html#method.new_in
+/// [`TempDir::path`]: struct.TempDir.html#method.path
+/// [`TempDir`]: struct.TempDir.html
+/// [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+/// [`std::fs`]: http://doc.rust-lang.org/std/fs/index.html
+/// [`std::process::exit`]: http://doc.rust-lang.org/std/process/fn.exit.html
+pub struct TempDir {
+    path: Option<PathBuf>,
+}
+
+// How many times should we (re)try finding an unused random name? It should be
+// enough that an attacker will run out of luck before we run out of patience.
+const NUM_RETRIES: u32 = 1 << 31;
+// How many characters should we include in a random file name? It needs to
+// be enough to dissuade an attacker from trying to preemptively create names
+// of that length, but not so huge that we unnecessarily drain the random number
+// generator of entropy.
+const NUM_RAND_CHARS: usize = 12;
+
+impl TempDir {
+    /// Attempts to make a temporary directory inside of `env::temp_dir()` whose
+    /// name will have the prefix, `prefix`. The directory and
+    /// everything inside it will be automatically deleted once the
+    /// returned `TempDir` is destroyed.
+    ///
+    /// # Errors
+    ///
+    /// If the directory can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::File;
+    /// use std::io::Write;
+    /// use tempdir::TempDir;
+    ///
+    /// // Create a directory inside of `std::env::temp_dir()`, named with
+    /// // the prefix, "example".
+    /// let tmp_dir = TempDir::new("example").expect("create temp dir");
+    /// let file_path = tmp_dir.path().join("my-temporary-note.txt");
+    /// let mut tmp_file = File::create(file_path).expect("create temp file");
+    /// writeln!(tmp_file, "Brian was here. Briefly.").expect("write temp file");
+    ///
+    /// // `tmp_dir` goes out of scope, the directory as well as
+    /// // `tmp_file` will be deleted here.
+    /// ```
+    pub fn new(prefix: &str) -> io::Result<TempDir> {
+        TempDir::new_in(&env::temp_dir(), prefix)
+    }
+
+    /// Attempts to make a temporary directory inside of `tmpdir`
+    /// whose name will have the prefix `prefix`. The directory and
+    /// everything inside it will be automatically deleted once the
+    /// returned `TempDir` is destroyed.
+    ///
+    /// # Errors
+    ///
+    /// If the directory can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::{self, File};
+    /// use std::io::Write;
+    /// use tempdir::TempDir;
+    ///
+    /// // Create a directory inside of the current directory, named with
+    /// // the prefix, "example".
+    /// let tmp_dir = TempDir::new_in(".", "example").expect("create temp dir");
+    /// let file_path = tmp_dir.path().join("my-temporary-note.txt");
+    /// let mut tmp_file = File::create(file_path).expect("create temp file");
+    /// writeln!(tmp_file, "Brian was here. Briefly.").expect("write temp file");
+    /// ```
+    pub fn new_in<P: AsRef<Path>>(tmpdir: P, prefix: &str) -> io::Result<TempDir> {
+        let storage;
+        let mut tmpdir = tmpdir.as_ref();
+        if !tmpdir.is_absolute() {
+            let cur_dir = try!(env::current_dir());
+            storage = cur_dir.join(tmpdir);
+            tmpdir = &storage;
+            // return TempDir::new_in(&cur_dir.join(tmpdir), prefix);
+        }
+
+        let mut rng = thread_rng();
+        for _ in 0..NUM_RETRIES {
+            let suffix: String = rng.gen_ascii_chars().take(NUM_RAND_CHARS).collect();
+            let leaf = if prefix.len() > 0 {
+                format!("{}.{}", prefix, suffix)
+            } else {
+                // If we're given an empty string for a prefix, then creating a
+                // directory starting with "." would lead to it being
+                // semi-invisible on some systems.
+                suffix
+            };
+            let path = tmpdir.join(&leaf);
+            match fs::create_dir(&path) {
+                Ok(_) => return Ok(TempDir { path: Some(path) }),
+                Err(ref e) if e.kind() == ErrorKind::AlreadyExists => {}
+                Err(e) => return Err(e),
+            }
+        }
+
+        Err(Error::new(ErrorKind::AlreadyExists,
+                       "too many temporary directories already exist"))
+    }
+
+    /// Accesses the [`Path`] to the temporary directory.
+    ///
+    /// [`Path`]: http://doc.rust-lang.org/std/path/struct.Path.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use tempdir::TempDir;
+    ///
+    /// let tmp_path;
+    ///
+    /// {
+    ///    let tmp_dir = TempDir::new("example").expect("create temp dir");
+    ///    tmp_path = tmp_dir.path().to_owned();
+    ///
+    ///    // Check that the temp directory actually exists.
+    ///    assert!(tmp_path.exists());
+    ///
+    ///    // End of `tmp_dir` scope, directory will be deleted
+    /// }
+    ///
+    /// // Temp directory should be deleted by now
+    /// assert_eq!(tmp_path.exists(), false);
+    /// ```
+    pub fn path(&self) -> &path::Path {
+        self.path.as_ref().unwrap()
+    }
+
+    /// Unwraps the [`Path`] contained in the `TempDir` and
+    /// returns it. This destroys the `TempDir` without deleting the
+    /// directory represented by the returned `Path`.
+    ///
+    /// [`Path`]: http://doc.rust-lang.org/std/path/struct.Path.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs;
+    /// use tempdir::TempDir;
+    ///
+    /// let tmp_dir = TempDir::new("example").expect("create temp dir");
+    ///
+    /// // Convert `tmp_dir` into a `Path`, destroying the `TempDir`
+    /// // without deleting the directory.
+    /// let tmp_path = tmp_dir.into_path();
+    ///
+    /// // Delete the temporary directory ourselves.
+    /// fs::remove_dir_all(tmp_path).expect("remove temp dir");
+    /// ```
+    pub fn into_path(mut self) -> PathBuf {
+        self.path.take().unwrap()
+    }
+
+    /// Closes and removes the temporary directory, returing a `Result`.
+    ///
+    /// Although `TempDir` removes the directory on drop, in the destructor
+    /// any errors are ignored. To detect errors cleaning up the temporary
+    /// directory, call `close` instead.
+    ///
+    /// # Errors
+    ///
+    /// This function may return a variety of [`std::io::Error`]s that result from deleting
+    /// the files and directories contained with the temporary directory,
+    /// as well as from deleting the temporary directory itself. These errors
+    /// may be platform specific.
+    ///
+    /// [`std::io::Error`]: http://doc.rust-lang.org/std/io/struct.Error.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::File;
+    /// use std::io::Write;
+    /// use tempdir::TempDir;
+    ///
+    /// // Create a directory inside of `std::env::temp_dir()`, named with
+    /// // the prefix, "example".
+    /// let tmp_dir = TempDir::new("example").expect("create temp dir");
+    /// let file_path = tmp_dir.path().join("my-temporary-note.txt");
+    /// let mut tmp_file = File::create(file_path).expect("create temp file");
+    /// writeln!(tmp_file, "Brian was here. Briefly.").expect("write temp file");
+    ///
+    /// // By closing the `TempDir` explicitly we can check that it has
+    /// // been deleted successfully. If we don't close it explicitly,
+    /// // the directory will still be deleted when `tmp_dir` goes out
+    /// // of scope, but we won't know whether deleting the directory
+    /// // succeeded.
+    /// drop(tmp_file);
+    /// tmp_dir.close().expect("delete temp dir");
+    /// ```
+    pub fn close(mut self) -> io::Result<()> {
+        self.cleanup_dir()
+    }
+
+    fn cleanup_dir(&mut self) -> io::Result<()> {
+        match self.path {
+            Some(ref p) => fs::remove_dir_all(p),
+            None => Ok(()),
+        }
+    }
+}
+
+impl AsRef<Path> for TempDir {
+    fn as_ref(&self) -> &Path {
+        self.path()
+    }
+}
+
+impl fmt::Debug for TempDir {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("TempDir")
+            .field("path", &self.path())
+            .finish()
+    }
+}
+
+impl Drop for TempDir {
+    fn drop(&mut self) {
+        let _ = self.cleanup_dir();
+    }
+}
+
+// the tests for this module need to change the path using change_dir,
+// and this doesn't play nicely with other tests so these unit tests are located
+// in src/test/run-pass/tempfile.rs
new file mode 100644
--- /dev/null
+++ b/third_party/rust/tempdir/tests/smoke.rs
@@ -0,0 +1,229 @@
+// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+extern crate tempdir;
+
+use std::env;
+use std::fs;
+use std::path::Path;
+use std::sync::mpsc::channel;
+use std::thread;
+
+use tempdir::TempDir;
+
+macro_rules! t {
+    ($e:expr) => (match $e { Ok(n) => n, Err(e) => panic!("error: {}", e) })
+}
+
+trait PathExt {
+    fn exists(&self) -> bool;
+    fn is_dir(&self) -> bool;
+}
+
+impl PathExt for Path {
+    fn exists(&self) -> bool { fs::metadata(self).is_ok() }
+    fn is_dir(&self) -> bool {
+        fs::metadata(self).map(|m| m.is_dir()).unwrap_or(false)
+    }
+}
+
+fn test_tempdir() {
+    let path = {
+        let p = t!(TempDir::new_in(&Path::new("."), "foobar"));
+        let p = p.path();
+        assert!(p.to_str().unwrap().contains("foobar"));
+        p.to_path_buf()
+    };
+    assert!(!path.exists());
+}
+
+fn test_rm_tempdir() {
+    let (tx, rx) = channel();
+    let f = move|| -> () {
+        let tmp = t!(TempDir::new("test_rm_tempdir"));
+        tx.send(tmp.path().to_path_buf()).unwrap();
+        panic!("panic to unwind past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    let path = rx.recv().unwrap();
+    assert!(!path.exists());
+
+    let tmp = t!(TempDir::new("test_rm_tempdir"));
+    let path = tmp.path().to_path_buf();
+    let f = move|| -> () {
+        let _tmp = tmp;
+        panic!("panic to unwind past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    assert!(!path.exists());
+
+    let path;
+    {
+        let f = move || {
+            t!(TempDir::new("test_rm_tempdir"))
+        };
+        // FIXME(#16640) `: TempDir` annotation shouldn't be necessary
+        let tmp: TempDir = thread::spawn(f).join().unwrap();
+        path = tmp.path().to_path_buf();
+        assert!(path.exists());
+    }
+    assert!(!path.exists());
+
+    let path;
+    {
+        let tmp = t!(TempDir::new("test_rm_tempdir"));
+        path = tmp.into_path();
+    }
+    assert!(path.exists());
+    t!(fs::remove_dir_all(&path));
+    assert!(!path.exists());
+}
+
+fn test_rm_tempdir_close() {
+    let (tx, rx) = channel();
+    let f = move|| -> () {
+        let tmp = t!(TempDir::new("test_rm_tempdir"));
+        tx.send(tmp.path().to_path_buf()).unwrap();
+        t!(tmp.close());
+        panic!("panic when unwinding past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    let path = rx.recv().unwrap();
+    assert!(!path.exists());
+
+    let tmp = t!(TempDir::new("test_rm_tempdir"));
+    let path = tmp.path().to_path_buf();
+    let f = move|| -> () {
+        let tmp = tmp;
+        t!(tmp.close());
+        panic!("panic when unwinding past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    assert!(!path.exists());
+
+    let path;
+    {
+        let f = move || {
+            t!(TempDir::new("test_rm_tempdir"))
+        };
+        // FIXME(#16640) `: TempDir` annotation shouldn't be necessary
+        let tmp: TempDir = thread::spawn(f).join().unwrap();
+        path = tmp.path().to_path_buf();
+        assert!(path.exists());
+        t!(tmp.close());
+    }
+    assert!(!path.exists());
+
+    let path;
+    {
+        let tmp = t!(TempDir::new("test_rm_tempdir"));
+        path = tmp.into_path();
+    }
+    assert!(path.exists());
+    t!(fs::remove_dir_all(&path));
+    assert!(!path.exists());
+}
+
+// Ideally these would be in std::os but then core would need
+// to depend on std
+fn recursive_mkdir_rel() {
+    let path = Path::new("frob");
+    let cwd = env::current_dir().unwrap();
+    println!("recursive_mkdir_rel: Making: {} in cwd {} [{}]", path.display(),
+           cwd.display(), path.exists());
+    t!(fs::create_dir(&path));
+    assert!(path.is_dir());
+    t!(fs::create_dir_all(&path));
+    assert!(path.is_dir());
+}
+
+fn recursive_mkdir_dot() {
+    let dot = Path::new(".");
+    t!(fs::create_dir_all(&dot));
+    let dotdot = Path::new("..");
+    t!(fs::create_dir_all(&dotdot));
+}
+
+fn recursive_mkdir_rel_2() {
+    let path = Path::new("./frob/baz");
+    let cwd = env::current_dir().unwrap();
+    println!("recursive_mkdir_rel_2: Making: {} in cwd {} [{}]", path.display(),
+             cwd.display(), path.exists());
+    t!(fs::create_dir_all(&path));
+    assert!(path.is_dir());
+    assert!(path.parent().unwrap().is_dir());
+    let path2 = Path::new("quux/blat");
+    println!("recursive_mkdir_rel_2: Making: {} in cwd {}", path2.display(),
+             cwd.display());
+    t!(fs::create_dir("quux"));
+    t!(fs::create_dir_all(&path2));
+    assert!(path2.is_dir());
+    assert!(path2.parent().unwrap().is_dir());
+}
+
+// Ideally this would be in core, but needs TempFile
+pub fn test_remove_dir_all_ok() {
+    let tmpdir = t!(TempDir::new("test"));
+    let tmpdir = tmpdir.path();
+    let root = tmpdir.join("foo");
+
+    println!("making {}", root.display());
+    t!(fs::create_dir(&root));
+    t!(fs::create_dir(&root.join("foo")));
+    t!(fs::create_dir(&root.join("foo").join("bar")));
+    t!(fs::create_dir(&root.join("foo").join("bar").join("blat")));
+    t!(fs::remove_dir_all(&root));
+    assert!(!root.exists());
+    assert!(!root.join("bar").exists());
+    assert!(!root.join("bar").join("blat").exists());
+}
+
+pub fn dont_double_panic() {
+    let r: Result<(), _> = thread::spawn(move|| {
+        let tmpdir = TempDir::new("test").unwrap();
+        // Remove the temporary directory so that TempDir sees
+        // an error on drop
+        t!(fs::remove_dir(tmpdir.path()));
+        // Panic. If TempDir panics *again* due to the rmdir
+        // error then the process will abort.
+        panic!();
+    }).join();
+    assert!(r.is_err());
+}
+
+fn in_tmpdir<F>(f: F) where F: FnOnce() {
+    let tmpdir = t!(TempDir::new("test"));
+    assert!(env::set_current_dir(tmpdir.path()).is_ok());
+
+    f();
+}
+
+pub fn pass_as_asref_path() {
+    let tempdir = t!(TempDir::new("test"));
+    takes_asref_path(&tempdir);
+
+    fn takes_asref_path<T: AsRef<Path>>(path: T) {
+        let path = path.as_ref();
+        assert!(path.exists());
+    }
+}
+
+#[test]
+fn main() {
+    in_tmpdir(test_tempdir);
+    in_tmpdir(test_rm_tempdir);
+    in_tmpdir(test_rm_tempdir_close);
+    in_tmpdir(recursive_mkdir_rel);
+    in_tmpdir(recursive_mkdir_dot);
+    in_tmpdir(recursive_mkdir_rel_2);
+    in_tmpdir(test_remove_dir_all_ok);
+    in_tmpdir(dont_double_panic);
+    in_tmpdir(pass_as_asref_path);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f58cbb29ee4ff8a030c1e32d3f4ac2b19753d7fdf8f72d050d4bda1353364fda",".travis.yml":"180cc837b1ea2ce0ed737c2e15208e83abf6f92291a77ed1ebcc564c628c2077","Cargo.toml":"2fc318d42aa26fc082740d312f6f712102988b388fbc556f1ebfe8c58c7e74de","README.md":"34b536550c8940eced0946c2c83c9984648346afad575c2ecfcd5cd64aca8678","src/impls.rs":"b8afa3cf40ff67e8a652ed6e07a15a69ec67d75c9b356094b209140a60d2d89b","src/lib.rs":"266104684b419fe6efd823976f5d4e728cc044b5169ea9e3d162709e02bcd1d5"},"package":"efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/.gitignore
@@ -0,0 +1,19 @@
+.DS_Store
+*~
+*#
+*.o
+*.so
+*.swp
+*.dylib
+*.dSYM
+*.dll
+*.rlib
+*.dummy
+*.exe
+*-test
+/doc/
+/target/
+/examples/*
+!/examples/*.rs
+Cargo.lock
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/.travis.yml
@@ -0,0 +1,19 @@
+language: rust
+sudo: false
+
+script:
+    - cargo build
+    - cargo test
+    - cargo bench --no-run
+    - cargo doc
+
+after_success:
+    - if [ "$TRAVIS_PULL_REQUEST" == false && test == "TRAVIS_BRANCH" == "master" ]; then
+    - curl https://raw.githubusercontent.com/reem/rust-gh-docs/master/make-docs.sh > docs.sh
+    - chmod u+x docs.sh
+    - ./docs.sh reem project-name
+
+env:
+  global:
+    secure: QPYL1XUr4CyK/2DXlsYC1eCpWRpyEiqQSd/FFVR+YdP/rOJ7AyAXQqPhfgjDBQwvc6E2fUiyYjoV/xe1a757DDeZKlgd8Lp20fSDwvNt/Ejx8ueh3h3kuOtgDpIGSKX/l+XC+ltDpzjhh7bowI2/fOEf+kE53jvu9i4PiLnKdlY=
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+
+name = "traitobject"
+version = "0.1.0"
+authors = ["Jonathan Reem <jonathan.reem@gmail.com>"]
+repository = "https://github.com/reem/rust-traitobject.git"
+description = "Unsafe helpers for working with raw trait objects."
+readme = "README.md"
+license = "MIT/Apache-2.0"
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/README.md
@@ -0,0 +1,23 @@
+# traitobject
+
+> Unsafe helpers for dealing with raw trait objects.
+
+## Usage
+
+Use the crates.io repository; add this to your `Cargo.toml` along
+with the rest of your dependencies:
+
+```toml
+[dependencies]
+traitobject = "*"
+```
+
+## Author
+
+[Jonathan Reem](https://medium.com/@jreem) is the primary author and maintainer
+of traitobject.
+
+## License
+
+MIT/Apache-2.0
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/src/impls.rs
@@ -0,0 +1,82 @@
+use Trait;
+
+unsafe impl Trait for ::std::any::Any + Send { }
+unsafe impl Trait for ::std::any::Any + Sync { }
+unsafe impl Trait for ::std::any::Any + Send + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::borrow::Borrow<T> + Send { }
+unsafe impl<T: ?Sized> Trait for ::std::borrow::Borrow<T> + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::borrow::Borrow<T> + Send + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::borrow::BorrowMut<T> + Send { }
+unsafe impl<T: ?Sized> Trait for ::std::borrow::BorrowMut<T> + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::borrow::BorrowMut<T> + Send + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::convert::AsMut<T> + Send { }
+unsafe impl<T: ?Sized> Trait for ::std::convert::AsMut<T> + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::convert::AsMut<T> + Send + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::convert::AsRef<T> + Send { }
+unsafe impl<T: ?Sized> Trait for ::std::convert::AsRef<T> + Sync { }
+unsafe impl<T: ?Sized> Trait for ::std::convert::AsRef<T> + Send + Sync { }
+unsafe impl Trait for ::std::error::Error + Send { }
+unsafe impl Trait for ::std::error::Error + Sync { }
+unsafe impl Trait for ::std::error::Error + Send + Sync { }
+unsafe impl Trait for ::std::fmt::Binary + Send { }
+unsafe impl Trait for ::std::fmt::Binary + Sync { }
+unsafe impl Trait for ::std::fmt::Binary + Send + Sync { }
+unsafe impl Trait for ::std::fmt::Debug + Send { }
+unsafe impl Trait for ::std::fmt::Debug + Sync { }
+unsafe impl Trait for ::std::fmt::Debug + Send + Sync { }
+unsafe impl Trait for ::std::fmt::Display + Send { }
+unsafe impl Trait for ::std::fmt::Display + Sync { }
+unsafe impl Trait for ::std::fmt::Display + Send + Sync { }
+unsafe impl Trait for ::std::fmt::LowerExp + Send { }
+unsafe impl Trait for ::std::fmt::LowerExp + Sync { }
+unsafe impl Trait for ::std::fmt::LowerExp + Send + Sync { }
+unsafe impl Trait for ::std::fmt::LowerHex + Send { }
+unsafe impl Trait for ::std::fmt::LowerHex + Sync { }
+unsafe impl Trait for ::std::fmt::LowerHex + Send + Sync { }
+unsafe impl Trait for ::std::fmt::Octal + Send { }
+unsafe impl Trait for ::std::fmt::Octal + Sync { }
+unsafe impl Trait for ::std::fmt::Octal + Send + Sync { }
+unsafe impl Trait for ::std::fmt::Pointer + Send { }
+unsafe impl Trait for ::std::fmt::Pointer + Sync { }
+unsafe impl Trait for ::std::fmt::Pointer + Send + Sync { }
+unsafe impl Trait for ::std::fmt::UpperExp + Send { }
+unsafe impl Trait for ::std::fmt::UpperExp + Sync { }
+unsafe impl Trait for ::std::fmt::UpperExp + Send + Sync { }
+unsafe impl Trait for ::std::fmt::UpperHex + Send { }
+unsafe impl Trait for ::std::fmt::UpperHex + Sync { }
+unsafe impl Trait for ::std::fmt::UpperHex + Send + Sync { }
+unsafe impl Trait for ::std::fmt::Write + Send { }
+unsafe impl Trait for ::std::fmt::Write + Sync { }
+unsafe impl Trait for ::std::fmt::Write + Send + Sync { }
+unsafe impl Trait for ::std::hash::Hasher + Send { }
+unsafe impl Trait for ::std::hash::Hasher + Sync { }
+unsafe impl Trait for ::std::hash::Hasher + Send + Sync { }
+unsafe impl Trait for ::std::io::BufRead + Send { }
+unsafe impl Trait for ::std::io::BufRead + Sync { }
+unsafe impl Trait for ::std::io::BufRead + Send + Sync { }
+unsafe impl Trait for ::std::io::Read + Send { }
+unsafe impl Trait for ::std::io::Read + Sync { }
+unsafe impl Trait for ::std::io::Read + Send + Sync { }
+unsafe impl Trait for ::std::io::Seek + Send { }
+unsafe impl Trait for ::std::io::Seek + Sync { }
+unsafe impl Trait for ::std::io::Seek + Send + Sync { }
+unsafe impl Trait for ::std::io::Write + Send { }
+unsafe impl Trait for ::std::io::Write + Sync { }
+unsafe impl Trait for ::std::io::Write + Send + Sync { }
+unsafe impl<T, I> Trait for ::std::iter::IntoIterator<IntoIter=I, Item=T> { }
+unsafe impl<T> Trait for ::std::iter::Iterator<Item=T> + Send { }
+unsafe impl<T> Trait for ::std::iter::Iterator<Item=T> + Sync { }
+unsafe impl<T> Trait for ::std::iter::Iterator<Item=T> + Send + Sync { }
+unsafe impl Trait for ::std::marker::Send + Send { }
+unsafe impl Trait for ::std::marker::Send + Sync { }
+unsafe impl Trait for ::std::marker::Send + Send + Sync { }
+unsafe impl Trait for ::std::marker::Sync + Send { }
+unsafe impl Trait for ::std::marker::Sync + Sync { }
+unsafe impl Trait for ::std::marker::Sync + Send + Sync { }
+unsafe impl Trait for ::std::ops::Drop + Send { }
+unsafe impl Trait for ::std::ops::Drop + Sync { }
+unsafe impl Trait for ::std::ops::Drop + Send + Sync { }
+unsafe impl Trait for ::std::string::ToString + Send { }
+unsafe impl Trait for ::std::string::ToString + Sync { }
+unsafe impl Trait for ::std::string::ToString + Send + Sync { }
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/traitobject/src/lib.rs
@@ -0,0 +1,36 @@
+#![cfg_attr(test, deny(warnings))]
+#![deny(missing_docs)]
+
+//! # traitobject
+//!
+//! Unsafe helpers for working with raw TraitObjects.
+
+use std::mem;
+
+/// Get the data pointer from this trait object.
+///
+/// Highly unsafe, as there is no information about the type of the data.
+pub unsafe fn data<T: ?Sized>(val: *const T) -> *const () {
+    *mem::transmute::<*const *const T, *const *const ()>(&val)
+}
+
+/// Get the data pointer from this trait object, mutably.
+///
+/// Highly unsafe, as there is no information about the type of the data.
+pub unsafe fn data_mut<T: ?Sized>(mut val: *mut T) -> *mut () {
+    *mem::transmute::<*mut *mut T, *mut *mut ()>(&mut val)
+}
+
+#[test]
+fn test_simple() {
+    let x = &7 as &Send;
+    unsafe { assert!(&7 == mem::transmute::<_, &i32>(data(x))) };
+}
+
+/// A trait implemented for all trait objects.
+///
+/// Implementations for all traits in std are provided.
+pub unsafe trait Trait {}
+
+mod impls;
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/typeable/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f58cbb29ee4ff8a030c1e32d3f4ac2b19753d7fdf8f72d050d4bda1353364fda",".travis.yml":"0d3e748c3b656d829a287f26360f7b860e0a579409828b4bdbe7ef843a79bb97","Cargo.toml":"76145a8c8efe636dc4b0a2939edf10798afe2529bbd1c95faab09330d2a3a6d9","src/lib.rs":"a3dc3caf75480c093cf4949b8287fef27a5e8f29ce20f7b7bea8f107b218c650"},"package":"1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/typeable/.gitignore
@@ -0,0 +1,19 @@
+.DS_Store
+*~
+*#
+*.o
+*.so
+*.swp
+*.dylib
+*.dSYM
+*.dll
+*.rlib
+*.dummy
+*.exe
+*-test
+/doc/
+/target/
+/examples/*
+!/examples/*.rs
+Cargo.lock
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/typeable/.travis.yml
@@ -0,0 +1,11 @@
+language: c
+env:
+  - LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/
+install:
+  - curl https://static.rust-lang.org/rustup.sh | sudo bash
+script:
+  - cargo build -v
+  - cargo test -v
+  - cargo doc -v
+os:
+  - linux
new file mode 100644
--- /dev/null
+++ b/third_party/rust/typeable/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+
+name = "typeable"
+version = "0.1.2"
+authors = ["Jonathan Reem <jonathan.reem@gmail.com>"]
+description = "Exposes Typeable, for getting TypeIds at runtime."
+keywords = ["type", "reflect", "typeid", "any", "downcast"]
+repository = "https://github.com/reem/rust-typeable"
+license = "MIT"
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/typeable/src/lib.rs
@@ -0,0 +1,18 @@
+#![deny(missing_docs)]
+#![deny(warnings)]
+
+//! Exposes `Typeable`, which exposes the `get_type` method, which gives
+//! the `TypeId` of any 'static type.
+
+use std::any::{Any, TypeId};
+
+/// Universal mixin trait for adding a `get_type` method.
+///
+pub trait Typeable: Any {
+    /// Get the `TypeId` of this object.
+    #[inline(always)]
+    fn get_type(&self) -> TypeId { TypeId::of::<Self>() }
+}
+
+impl<T: Any> Typeable for T {}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"659372b49358cc4b09cde98923122b608b9733a861ae51a7bb27ffe25808fad7","Cargo.toml":"b0a7941038e0cd9aa68c0bffdd2d872e71e1228f0d6fa33e090c09c843ee6a93","LICENSE":"a745ca7ae4a3c089cfbe4b0a6288fa95776244a65be2914b147878146f8c64da","README.md":"4c7e3e81e09029b9c8465241a6b673ba5f723ea279464fd0d44c3544ed0867c5","build.rs":"81a706e8a238587fdea06eb97c3756dd9eda8d92028c4ccd6339ffedbe0b78ff","src/lib.rs":"cca9109bf1124f46e9158e88b426bd74353917685226aeb442013ad30f84ab5d"},"package":"13a5906ca2b98c799f4b1ab4557b76367ebd6ae5ef14930ec841c74aed5f3764"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/.travis.yml
@@ -0,0 +1,21 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+matrix:
+  allow_failures:
+    - rust: nightly
+
+after_success: |
+    [ $TRAVIS_BRANCH = master ] &&
+    [ $TRAVIS_PULL_REQUEST = false ] &&
+    cargo doc &&
+    echo '<meta http-equiv=refresh content=0;url=case/index.html>' > target/doc/index.html &&
+    sudo pip install ghp-import &&
+    ghp-import -n target/doc &&
+    git push -fq https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
+
+env:
+    global:
+        - secure: rkPwcgjGQobsH3/LAV3Ecyt5Q6BiqWhAITLUUCX/lrBjXDaUma+RUjnh7bEzCQ5sG1hFLCJUlLZbWuNx+95t7yRgP14T3asp/a4PdtPkwL8okqq7RLAt7tjI6optUZ8Kr7HNp3jQDHda4tpSLDaZvM3zmrHOLwsDpYLRNAbhWM8=
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/Cargo.toml
@@ -0,0 +1,25 @@
+[package]
+
+name = "unicase"
+version = "1.4.0"
+authors = ["Sean McArthur <sean.monstar@gmail.com>"]
+description = "A case-insensitive wrapper around strings."
+repository = "https://github.com/seanmonstar/unicase"
+license = "MIT"
+keywords = ["lowercase", "case", "case-insensitive"]
+
+build = "build.rs"
+
+[build-dependencies]
+rustc_version = "0.1"
+
+[dependencies.heapsize]
+version = ">=0.2.0, <0.4"
+optional = true
+
+[dependencies.heapsize_plugin]
+version = "0.1.2"
+optional = true
+
+[features]
+heap_size = ["heapsize", "heapsize_plugin"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2014-2015 Sean McArthur
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/README.md
@@ -0,0 +1,15 @@
+# unicase
+
+[![Build Status](https://travis-ci.org/seanmonstar/unicase.svg?branch=master)](https://travis-ci.org/seanmonstar/unicase)
+
+Compare strings when case is not important.
+
+```rust
+if UniCase(method) == UniCase('GET') {
+    // GET request
+}
+```
+
+## License
+
+[MIT](./LICENSE)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/build.rs
@@ -0,0 +1,7 @@
+extern crate rustc_version as rustc;
+
+fn main() {
+    if rustc::version_matches(">= 1.5") {
+        println!("cargo:rustc-cfg=iter_cmp");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/unicase/src/lib.rs
@@ -0,0 +1,210 @@
+#![cfg_attr(test, deny(missing_docs))]
+#![cfg_attr(test, deny(warnings))]
+#![cfg_attr(feature = "heap_size", feature(custom_derive, plugin))]
+#![cfg_attr(feature = "heap_size", plugin(heapsize_plugin))]
+
+//! # Case
+//!
+//! Case provices a way of specifying strings that are case-insensitive.
+//!
+//! ## Example
+//!
+//! ```rust
+//! use unicase::UniCase;
+//!
+//! let a = UniCase("foobar");
+//! let b = UniCase("FoObAr");
+//!
+//! assert_eq!(a, b);
+//! ```
+
+#[cfg(feature = "heap_size")]
+extern crate heapsize;
+
+use std::ascii::AsciiExt;
+#[cfg(iter_cmp)]
+use std::cmp::Ordering;
+use std::fmt;
+use std::hash::{Hash, Hasher};
+use std::ops::{Deref, DerefMut};
+use std::str::FromStr;
+
+/// Case Insensitive wrapper of strings.
+#[derive(Copy, Clone, Debug)]
+#[cfg_attr(feature = "heap_size", derive(HeapSizeOf))]
+pub struct UniCase<S>(pub S);
+
+impl<S> Deref for UniCase<S> {
+    type Target = S;
+    #[inline]
+    fn deref<'a>(&'a self) -> &'a S {
+        &self.0
+    }
+}
+
+impl<S> DerefMut for UniCase<S> {
+    #[inline]
+    fn deref_mut<'a>(&'a mut self) -> &'a mut S {
+        &mut self.0
+    }
+}
+
+#[cfg(iter_cmp)]
+impl<T: AsRef<str>> PartialOrd for UniCase<T> {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+#[cfg(iter_cmp)]
+impl<T: AsRef<str>> Ord for UniCase<T> {
+    fn cmp(&self, other: &Self) -> Ordering {
+        let self_chars = self.as_ref().chars().map(|c| c.to_ascii_lowercase());
+        let other_chars = other.as_ref().chars().map(|c| c.to_ascii_lowercase());
+        self_chars.cmp(other_chars)
+    }
+}
+
+impl<S: AsRef<str>> AsRef<str> for UniCase<S> {
+    #[inline]
+    fn as_ref(&self) -> &str {
+        self.0.as_ref()
+    }
+
+}
+
+impl<S: fmt::Display> fmt::Display for UniCase<S> {
+    #[inline]
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self.0, fmt)
+    }
+}
+
+impl<S1: AsRef<str>, S2: AsRef<str>> PartialEq<S2> for UniCase<S1> {
+    #[inline]
+    fn eq(&self, other: &S2) -> bool {
+        self.as_ref().eq_ignore_ascii_case(other.as_ref())
+    }
+}
+
+
+impl<S: AsRef<str>> Eq for UniCase<S> {}
+
+impl<S: FromStr> FromStr for UniCase<S> {
+    type Err = <S as FromStr>::Err;
+    fn from_str(s: &str) -> Result<UniCase<S>, <S as FromStr>::Err> {
+        s.parse().map(UniCase)
+    }
+}
+
+impl<S: AsRef<str>> Hash for UniCase<S> {
+    #[inline]
+    fn hash<H: Hasher>(&self, hasher: &mut H) {
+        for byte in self.as_ref().bytes().map(|b| b.to_ascii_lowercase()) {
+            hasher.write(&[byte]);
+        }
+    }
+}
+
+macro_rules! from_impl {
+    ($from:ty => $to:ty; $by:ident) => (
+        impl<'a> From<$from> for UniCase<$to> {
+            fn from(s: $from) -> Self {
+                UniCase(s.$by())
+            }
+        }
+    );
+    ($from:ty => $to:ty) => ( from_impl!($from => $to; into); )
+}
+
+macro_rules! into_impl {
+    ($to:ty) => (
+        impl<'a> Into<$to> for UniCase<$to> {
+            fn into(self) -> $to {
+                self.0
+            }
+        }
+    );
+}
+
+from_impl!(&'a str => &'a str);
+from_impl!(&'a str => String);
+from_impl!(&'a String => &'a str; as_ref);
+from_impl!(String => String);
+
+into_impl!(&'a str);
+into_impl!(String);
+
+#[cfg(test)]
+mod test {
+    use super::UniCase;
+    use std::hash::{Hash, Hasher, SipHasher};
+
+    fn hash<T: Hash>(t: &T) -> u64 {
+        let mut s = SipHasher::new();
+        t.hash(&mut s);
+        s.finish()
+    }
+
+    #[test]
+    fn test_copy_for_refs() {
+        fn foo<T>(_: UniCase<T>) {}
+
+        let a = UniCase("foobar");
+        foo(a);
+        foo(a);
+    }
+
+    #[test]
+    fn test_case_insensitive() {
+        let a = UniCase("foobar");
+        let b = UniCase("FOOBAR");
+
+        assert_eq!(a, b);
+        assert_eq!(hash(&a), hash(&b));
+    }
+
+    #[test]
+    fn test_different_string_types() {
+        let a = UniCase("foobar");
+        let b = "FOOBAR".to_owned();
+        assert_eq!(a, b);
+        assert_eq!(UniCase(b), a);
+    }
+
+    #[cfg(iter_cmp)]
+    #[test]
+    fn test_case_cmp() {
+        assert!(UniCase("foobar") == UniCase("FOOBAR"));
+        assert!(UniCase("a") < UniCase("B"));
+
+        assert!(UniCase("A") < UniCase("b"));
+        assert!(UniCase("aa") > UniCase("a"));
+
+        assert!(UniCase("a") < UniCase("aa"));
+        assert!(UniCase("a") < UniCase("AA"));
+    }
+
+    #[test]
+    fn test_from_impls() {
+        let view: &'static str = "foobar";
+        let _: UniCase<&'static str> = view.into();
+        let _: UniCase<&str> = view.into();
+        let _: UniCase<String> = view.into();
+
+        let owned: String = view.to_owned();
+        let _: UniCase<&str> = (&owned).into();
+        let _: UniCase<String> = owned.into();
+    }
+
+    #[test]
+    fn test_into_impls() {
+        let view: UniCase<&'static str> = UniCase("foobar");
+        let _: &'static str = view.into();
+        let _: &str = view.into();
+
+        let owned: UniCase<String> = "foobar".into();
+        let _: String = owned.clone().into();
+        let _: &str = owned.as_ref();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"c8558d750b1a6bdd6dfbdce965bbdfbc5738629446e20d4d06179b918d928646","Cargo.toml":"b84f853328db3331df8e3a80ad0d4129d41042b129c0b5690f66175d7f47a3d4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"53871f0120ab8433977fbbfce7dcb8f552380acb31611ede12e9af7c47525d26","benches/parse_str.rs":"625a29dab53768392428a7ab69c81ce25965a73b7971f575999f9ad1f4ee12a2","src/lib.rs":"a22d2b257e4e4075e35fdc0aa01fb929e1d57a76206f643da3499bec0e762cd7"},"package":"78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/.travis.yml
@@ -0,0 +1,28 @@
+language: rust
+rust:
+  - 1.0.0
+  - beta
+  - nightly
+sudo: false
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - |
+    [ $TRAVIS_RUST_VERSION != nightly ] || (
+      cargo bench
+    )
+  - cargo doc
+after_success: |
+  [ $TRAVIS_BRANCH = master ] &&
+  [ $TRAVIS_PULL_REQUEST = false ] &&
+  [ $TRAVIS_RUST_VERSION = nightly ] &&
+  echo '<meta http-equiv=refresh content=0;url=uuid/index.html>' > target/doc/index.html &&
+  pip install ghp-import --user $USER &&
+  $HOME/.local/bin/ghp-import -n target/doc &&
+  git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
+env:
+  global:
+    secure: OiQj6NSyu634pS+qWCAeaibuBdiRsDMz5k0bi8hhdom3W24L8I9KkdWlBm2K8Ef97Uzgg6Xsr7LSWX0CONxX2eU3QaB1v3mXNxModa7ftW/w9y7B8MThxS5nRTUmHZC17OvoQ3EoNyrktnTAkyIr0E0YxBruJYAi4EH+54guRN8=
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+
+name = "uuid"
+version = "0.1.18"
+authors = ["The Rust Project Developers"]
+license = "MIT/Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/rust-lang/uuid"
+homepage = "https://github.com/rust-lang/uuid"
+documentation = "https://doc.rust-lang.org/uuid"
+description = """
+A library to generate and parse UUIDs.
+"""
+
+[dependencies]
+rustc-serialize = "0.3"
+serde = { version = "^0.6.0", optional = true }
+rand = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/README.md
@@ -0,0 +1,77 @@
+uuid
+====
+
+[![Build Status](https://travis-ci.org/rust-lang-nursery/uuid.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/uuid)
+[![](http://meritbadge.herokuapp.com/uuid)](https://crates.io/crates/uuid)
+
+A Rust library to generate and parse UUIDs.
+
+Provides support for Universally Unique Identifiers (UUIDs). A UUID is a unique
+128-bit number, stored as 16 octets. UUIDs are used to assign unique identifiers
+to entities without requiring a central allocating authority.
+
+They are particularly useful in distributed systems, though can be used in
+disparate areas, such as databases and network protocols. Typically a UUID is
+displayed in a readable string form as a sequence of hexadecimal digits,
+separated into groups by hyphens.
+
+The uniqueness property is not strictly guaranteed, however for all practical
+purposes, it can be assumed that an unintentional collision would be extremely
+unlikely.
+
+[Documentation](https://doc.rust-lang.org/uuid)
+
+## Usage
+
+Add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+
+uuid = "0.1"
+```
+
+and this to your crate root:
+
+```rust
+extern crate uuid;
+```
+
+## Examples
+
+To create a new random (V4) UUID and print it out in hexadecimal form:
+
+```rust
+use uuid::Uuid;
+
+fn main() {
+    let my_uuid = Uuid::new_v4();
+    println!("{}", my_uuid);
+}
+```
+
+The library supports 5 versions of UUID:
+
+Name     | Version
+---------|----------
+Mac      | Version 1: MAC address
+Dce      | Version 2: DCE Security
+Md5      | Version 3: MD5 hash
+Random   | Version 4: Random
+Sha1     | Version 5: SHA-1 hash
+
+To parse a simple UUID, then print the version and urn string format:
+
+```rust
+use uuid::Uuid;
+
+fn main() {
+    let my_uuid = Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap();
+    println!("Parsed a version {} UUID.", my_uuid.get_version_num());
+    println!("{}", my_uuid.to_urn_string());
+}
+```
+
+## References
+
+[Wikipedia: Universally Unique Identifier](https://en.wikipedia.org/wiki/Universally_unique_identifier)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/benches/parse_str.rs
@@ -0,0 +1,87 @@
+#![feature(test)]
+
+extern crate test;
+extern crate uuid;
+
+use test::Bencher;
+use uuid::Uuid;
+
+#[bench]
+fn bench_parse(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("");
+        let _ = Uuid::parse_str("!");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E45");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faaXB6BFF329BF39FA1E4");
+        let _ = Uuid::parse_str("F9168C5E-CEB-24fa-eB6BFF32-BF39FA1E4");
+        let _ = Uuid::parse_str("01020304-1112-2122-3132-41424344");
+        let _ = Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c88");
+        let _ = Uuid::parse_str("67e5504410b1426f9247bb680e5fe0cg8");
+        let _ = Uuid::parse_str("67e5504410b1426%9247bb680e5fe0c8");
+
+        // Valid
+        let _ = Uuid::parse_str("00000000000000000000000000000000");
+        let _ = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8");
+        let _ = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4");
+        let _ = Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c8");
+        let _ = Uuid::parse_str("01020304-1112-2122-3132-414243444546");
+        let _ = Uuid::parse_str("urn:uuid:67e55044-10b1-426f-9247-bb680e5fe0c8");
+
+        // Nil
+        let _ = Uuid::parse_str("00000000000000000000000000000000");
+        let _ = Uuid::parse_str("00000000-0000-0000-0000-000000000000");
+
+        // Test error reporting
+        let _ = Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c");
+        let _ = Uuid::parse_str("67e550X410b1426f9247bb680e5fe0cd");
+        let _ = Uuid::parse_str("67e550-4105b1426f9247bb680e5fe0c");
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF1-02BF39FA1E4");
+    });
+}
+
+#[bench]
+fn bench_parse_invalid_len(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4");
+    })
+}
+
+#[bench]
+fn bench_parse_invalid_character(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4");
+    })
+}
+
+#[bench]
+fn bench_parse_invalid_group_len(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("01020304-1112-2122-3132-41424344");
+    });
+}
+
+#[bench]
+fn bench_parse_invalid_groups(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4");
+    });
+}
+
+#[bench]
+fn bench_valid_hyphenated(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8");
+    });
+}
+
+#[bench]
+fn bench_valid_short(b: &mut Bencher) {
+    b.iter(|| {
+        let _ = Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c8");
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/uuid/src/lib.rs
@@ -0,0 +1,913 @@
+// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Generate and parse UUIDs
+//!
+//! Provides support for Universally Unique Identifiers (UUIDs). A UUID is a
+//! unique 128-bit number, stored as 16 octets.  UUIDs are used to  assign unique
+//! identifiers to entities without requiring a central allocating authority.
+//!
+//! They are particularly useful in distributed systems, though can be used in
+//! disparate areas, such as databases and network protocols.  Typically a UUID is
+//! displayed in a readable string form as a sequence of hexadecimal digits,
+//! separated into groups by hyphens.
+//!
+//! The uniqueness property is not strictly guaranteed, however for all practical
+//! purposes, it can be assumed that an unintentional collision would be extremely
+//! unlikely.
+//!
+//! # Examples
+//!
+//! To create a new random (V4) UUID and print it out in hexadecimal form:
+//!
+//! ```rust
+//! use uuid::Uuid;
+//!
+//! fn main() {
+//!     let my_uuid = Uuid::new_v4();
+//!     println!("{}", my_uuid);
+//! }
+//! ```
+//!
+//! To parse parse a UUID in the simple format and print it as a urn:
+//!
+//! ```rust
+//! use uuid::Uuid;
+//!
+//! fn main() {
+//!     let my_uuid = Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap();
+//!     println!("{}", my_uuid.to_urn_string());
+//! }
+//! ```
+//!
+//! # Strings
+//!
+//! Examples of string representations:
+//!
+//! * simple: `936DA01F9ABD4d9d80C702AF85C822A8`
+//! * hyphenated: `550e8400-e29b-41d4-a716-446655440000`
+//! * urn: `urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4`
+//!
+//! # References
+//!
+//! * [Wikipedia: Universally Unique Identifier](
+//!     http://en.wikipedia.org/wiki/Universally_unique_identifier)
+//! * [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](
+//!     http://tools.ietf.org/html/rfc4122)
+
+#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
+       html_favicon_url = "https://www.rust-lang.org/favicon.ico",
+       html_root_url = "https://doc.rust-lang.org/uuid/")]
+
+#![cfg_attr(test, deny(warnings))]
+
+extern crate rustc_serialize;
+#[cfg(feature = "serde")]
+extern crate serde;
+extern crate rand;
+
+use std::default::Default;
+use std::error::Error;
+use std::fmt;
+use std::hash;
+use std::iter::repeat;
+use std::mem::{transmute, transmute_copy};
+use std::str::FromStr;
+
+use rand::Rng;
+use rustc_serialize::{Encoder, Encodable, Decoder, Decodable};
+#[cfg(feature = "serde")]
+use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
+
+/// A 128-bit (16 byte) buffer containing the ID
+pub type UuidBytes = [u8; 16];
+
+/// The version of the UUID, denoting the generating algorithm
+#[derive(PartialEq, Copy, Clone)]
+pub enum UuidVersion {
+    /// Version 1: MAC address
+    Mac = 1,
+    /// Version 2: DCE Security
+    Dce = 2,
+    /// Version 3: MD5 hash
+    Md5 = 3,
+    /// Version 4: Random
+    Random = 4,
+    /// Version 5: SHA-1 hash
+    Sha1 = 5,
+}
+
+/// The reserved variants of UUIDs
+#[derive(PartialEq, Copy, Clone)]
+pub enum UuidVariant {
+    /// Reserved by the NCS for backward compatibility
+    NCS,
+    /// As described in the RFC4122 Specification (default)
+    RFC4122,
+    /// Reserved by Microsoft for backward compatibility
+    Microsoft,
+    /// Reserved for future expansion
+    Future,
+}
+
+/// A Universally Unique Identifier (UUID)
+#[derive(Copy, Clone)]
+pub struct Uuid {
+    /// The 128-bit number stored in 16 bytes
+    bytes: UuidBytes,
+}
+
+impl hash::Hash for Uuid {
+    fn hash<S: hash::Hasher>(&self, state: &mut S) {
+        self.bytes.hash(state)
+    }
+}
+
+/// A UUID stored as fields (identical to UUID, used only for conversions)
+#[derive(Copy, Clone)]
+struct UuidFields {
+    /// First field, 32-bit word
+    data1: u32,
+    /// Second field, 16-bit short
+    data2: u16,
+    /// Third field, 16-bit short
+    data3: u16,
+    /// Fourth field, 8 bytes
+    data4: [u8; 8],
+}
+
+/// Error details for string parsing failures
+#[allow(missing_docs)]
+#[derive(PartialEq, Eq, Copy, Clone, Debug)]
+pub enum ParseError {
+    InvalidLength(usize),
+    InvalidCharacter(char, usize),
+    InvalidGroups(usize),
+    InvalidGroupLength(usize, usize, u8),
+}
+
+/// Converts a ParseError to a string
+impl fmt::Display for ParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            ParseError::InvalidLength(found) =>
+                write!(f,
+                       "Invalid length; expecting 32 or 36 chars, found {}",
+                       found),
+            ParseError::InvalidCharacter(found, pos) =>
+                write!(f,
+                       "Invalid character; found `{}` (0x{:02x}) at offset {}",
+                       found,
+                       found as usize,
+                       pos),
+            ParseError::InvalidGroups(found) =>
+                write!(f,
+                       "Malformed; wrong number of groups: expected 1 or 5, found {}",
+                       found),
+            ParseError::InvalidGroupLength(group, found, expecting) =>
+                write!(f,
+                       "Malformed; length of group {} was {}, expecting {}",
+                       group,
+                       found,
+                       expecting),
+        }
+    }
+}
+
+impl Error for ParseError {
+    fn description(&self) -> &str {
+        "UUID parse error"
+    }
+}
+
+// Length of each hyphenated group in hex digits.
+const GROUP_LENS: [u8; 5] = [8, 4, 4, 4, 12];
+// Accumulated length of each hyphenated group in hex digits.
+const ACC_GROUP_LENS: [u8; 5] = [8, 12, 16, 20, 32];
+
+/// UUID support
+impl Uuid {
+    /// Returns a nil or empty UUID (containing all zeroes)
+    pub fn nil() -> Uuid {
+        Uuid { bytes: [0; 16] }
+    }
+
+    /// Create a new UUID of the specified version
+    pub fn new(v: UuidVersion) -> Option<Uuid> {
+        match v {
+            UuidVersion::Random => Some(Uuid::new_v4()),
+            _ => None,
+        }
+    }
+
+    /// Creates a new random UUID
+    ///
+    /// Uses the `rand` module's default RNG task as the source
+    /// of random numbers. Use the rand::Rand trait to supply
+    /// a custom generator if required.
+    pub fn new_v4() -> Uuid {
+        let ub = rand::thread_rng().gen_iter::<u8>().take(16).collect::<Vec<_>>();
+        let mut uuid = Uuid { bytes: [0; 16] };
+        copy_memory(&mut uuid.bytes, &ub);
+        uuid.set_variant(UuidVariant::RFC4122);
+        uuid.set_version(UuidVersion::Random);
+        uuid
+    }
+
+    /// Creates a UUID using the supplied field values
+    ///
+    /// # Arguments
+    /// * `d1` A 32-bit word
+    /// * `d2` A 16-bit word
+    /// * `d3` A 16-bit word
+    /// * `d4` Array of 8 octets
+    pub fn from_fields(d1: u32, d2: u16, d3: u16, d4: &[u8]) -> Uuid {
+        // First construct a temporary field-based struct
+        let mut fields = UuidFields {
+            data1: 0,
+            data2: 0,
+            data3: 0,
+            data4: [0; 8],
+        };
+
+        fields.data1 = d1.to_be();
+        fields.data2 = d2.to_be();
+        fields.data3 = d3.to_be();
+        copy_memory(&mut fields.data4, d4);
+
+        unsafe { transmute(fields) }
+    }
+
+    /// Creates a UUID using the supplied bytes
+    ///
+    /// # Arguments
+    /// * `b` An array or slice of 16 bytes
+    pub fn from_bytes(b: &[u8]) -> Option<Uuid> {
+        if b.len() != 16 {
+            return None
+        }
+
+        let mut uuid = Uuid { bytes: [0; 16] };
+        copy_memory(&mut uuid.bytes, b);
+        Some(uuid)
+    }
+
+    /// Specifies the variant of the UUID structure
+    fn set_variant(&mut self, v: UuidVariant) {
+        // Octet 8 contains the variant in the most significant 3 bits
+        self.bytes[8] = match v {
+            UuidVariant::NCS => self.bytes[8] & 0x7f,                // b0xx...
+            UuidVariant::RFC4122 => (self.bytes[8] & 0x3f) | 0x80,   // b10x...
+            UuidVariant::Microsoft => (self.bytes[8] & 0x1f) | 0xc0, // b110...
+            UuidVariant::Future => (self.bytes[8] & 0x1f) | 0xe0,    // b111...
+        }
+    }
+
+    /// Returns the variant of the UUID structure
+    ///
+    /// This determines the interpretation of the structure of the UUID.
+    /// Currently only the RFC4122 variant is generated by this module.
+    ///
+    /// * [Variant Reference](http://tools.ietf.org/html/rfc4122#section-4.1.1)
+    pub fn get_variant(&self) -> Option<UuidVariant> {
+        match self.bytes[8] {
+            x if x & 0x80 == 0x00 => Some(UuidVariant::NCS),
+            x if x & 0xc0 == 0x80 => Some(UuidVariant::RFC4122),
+            x if x & 0xe0 == 0xc0 => Some(UuidVariant::Microsoft),
+            x if x & 0xe0 == 0xe0 => Some(UuidVariant::Future),
+            _ => None,
+        }
+    }
+
+    /// Specifies the version number of the UUID
+    fn set_version(&mut self, v: UuidVersion) {
+        self.bytes[6] = (self.bytes[6] & 0xF) | ((v as u8) << 4);
+    }
+
+    /// Returns the version number of the UUID
+    ///
+    /// This represents the algorithm used to generate the contents.
+    ///
+    /// Currently only the Random (V4) algorithm is supported by this
+    /// module.  There are security and privacy implications for using
+    /// older versions - see [Wikipedia: Universally Unique Identifier](
+    /// http://en.wikipedia.org/wiki/Universally_unique_identifier) for
+    /// details.
+    ///
+    /// * [Version Reference](http://tools.ietf.org/html/rfc4122#section-4.1.3)
+    pub fn get_version_num(&self) -> usize {
+        (self.bytes[6] >> 4) as usize
+    }
+
+    /// Returns the version of the UUID
+    ///
+    /// This represents the algorithm used to generate the contents
+    pub fn get_version(&self) -> Option<UuidVersion> {
+        let v = self.bytes[6] >> 4;
+        match v {
+            1 => Some(UuidVersion::Mac),
+            2 => Some(UuidVersion::Dce),
+            3 => Some(UuidVersion::Md5),
+            4 => Some(UuidVersion::Random),
+            5 => Some(UuidVersion::Sha1),
+            _ => None,
+        }
+    }
+
+    /// Return an array of 16 octets containing the UUID data
+    pub fn as_bytes<'a>(&'a self) -> &'a [u8] {
+        &self.bytes
+    }
+
+    /// Returns the UUID as a string of 32 hexadecimal digits
+    ///
+    /// Example: `936DA01F9ABD4d9d80C702AF85C822A8`
+    pub fn to_simple_string(&self) -> String {
+        let mut s = repeat(0u8).take(32).collect::<Vec<_>>();
+        for i in 0..16 {
+            let digit = format!("{:02x}", self.bytes[i] as usize);
+            s[i * 2 + 0] = digit.as_bytes()[0];
+            s[i * 2 + 1] = digit.as_bytes()[1];
+        }
+        String::from_utf8(s).unwrap()
+    }
+
+    /// Returns a string of hexadecimal digits, separated into groups with a hyphen.
+    ///
+    /// Example: `550e8400-e29b-41d4-a716-446655440000`
+    pub fn to_hyphenated_string(&self) -> String {
+        // Convert to field-based struct as it matches groups in output.
+        // Ensure fields are in network byte order, as per RFC.
+        let mut uf: UuidFields;
+        unsafe {
+            uf = transmute_copy(&self.bytes);
+        }
+        uf.data1 = uf.data1.to_be();
+        uf.data2 = uf.data2.to_be();
+        uf.data3 = uf.data3.to_be();
+        let s = format!("{:08x}-{:04x}-{:04x}-{:02x}{:02x}-{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}",
+                        uf.data1,
+                        uf.data2,
+                        uf.data3,
+                        uf.data4[0],
+                        uf.data4[1],
+                        uf.data4[2],
+                        uf.data4[3],
+                        uf.data4[4],
+                        uf.data4[5],
+                        uf.data4[6],
+                        uf.data4[7]);
+        s
+    }
+
+    /// Returns the UUID formatted as a full URN string
+    ///
+    /// This is the same as the hyphenated format, but with the "urn:uuid:" prefix.
+    ///
+    /// Example: `urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4`
+    pub fn to_urn_string(&self) -> String {
+        format!("urn:uuid:{}", self.to_hyphenated_string())
+    }
+
+    /// Parses a UUID from a string of hexadecimal digits with optional hyphens
+    ///
+    /// Any of the formats generated by this module (simple, hyphenated, urn) are
+    /// supported by this parsing function.
+    pub fn parse_str(mut input: &str) -> Result<Uuid, ParseError> {
+        // Ensure length is valid for any of the supported formats
+        let len = input.len();
+        if len == 45 && input.starts_with("urn:uuid:") {
+            input = &input[9..];
+        } else if len != 32 && len != 36 {
+            return Err(ParseError::InvalidLength(len));
+        }
+
+        // `digit` counts only hexadecimal digits, `i_char` counts all chars.
+        let mut digit = 0;
+        let mut group = 0;
+        let mut acc = 0;
+        let mut buffer = [0u8; 16];
+
+        for (i_char, chr) in input.chars().enumerate() {
+            if digit % 2 == 0 {
+                // First digit of the byte.
+                match chr {
+                    // Calulate upper half.
+                    '0'...'9' => acc = chr as u8 - '0' as u8,
+                    'a'...'f' => acc = chr as u8 - 'a' as u8 + 10,
+                    'A'...'F' => acc = chr as u8 - 'A' as u8 + 10,
+                    // Found a group delimiter
+                    '-' => {
+                        if ACC_GROUP_LENS[group] != digit {
+                            // Calculate how many digits this group consists of in the input.
+                            let found = if group > 0 {
+                                digit - ACC_GROUP_LENS[group - 1]
+                            } else {
+                                digit
+                            };
+                            return Err(ParseError::InvalidGroupLength(group,
+                                                                      found as usize,
+                                                                      GROUP_LENS[group]));
+                        }
+                        // Next group, decrement digit, it is incremented again at the bottom.
+                        group += 1;
+                        digit -= 1;
+                    }
+                    _ => return Err(ParseError::InvalidCharacter(chr, i_char)),
+                }
+            } else {
+                // Second digit of the byte, shift the upper half.
+                acc *= 16;
+                match chr {
+                    '0'...'9' => acc += chr as u8 - '0' as u8,
+                    'a'...'f' => acc += chr as u8 - 'a' as u8 + 10,
+                    'A'...'F' => acc += chr as u8 - 'A' as u8 + 10,
+                    '-' => {
+                        // The byte isn't complete yet.
+                        let found = if group > 0 {
+                            digit - ACC_GROUP_LENS[group - 1]
+                        } else {
+                            digit
+                        };
+                        return Err(ParseError::InvalidGroupLength(group,
+                                                                  found as usize,
+                                                                  GROUP_LENS[group]));
+                    }
+                    _ => return Err(ParseError::InvalidCharacter(chr, i_char)),
+                }
+                buffer[(digit / 2) as usize] = acc;
+            }
+            digit += 1;
+        }
+
+        // Now check the last group.
+        if group != 0 && group != 4 {
+            return Err(ParseError::InvalidGroups(group + 1));
+        } else if ACC_GROUP_LENS[4] != digit {
+            return Err(ParseError::InvalidGroupLength(group,
+                                                      (digit - ACC_GROUP_LENS[3]) as usize,
+                                                      GROUP_LENS[4]));
+        }
+
+        Ok(Uuid::from_bytes(&mut buffer).unwrap())
+    }
+
+    /// Tests if the UUID is nil
+    pub fn is_nil(&self) -> bool {
+        self.bytes.iter().all(|&b| b == 0)
+    }
+}
+
+fn copy_memory(dst: &mut [u8], src: &[u8]) {
+    for (slot, val) in dst.iter_mut().zip(src.iter()) {
+        *slot = *val;
+    }
+}
+
+impl Default for Uuid {
+    /// Returns the nil UUID, which is all zeroes
+    fn default() -> Uuid {
+        Uuid::nil()
+    }
+}
+
+impl FromStr for Uuid {
+    type Err = ParseError;
+
+    /// Parse a hex string and interpret as a UUID
+    ///
+    /// Accepted formats are a sequence of 32 hexadecimal characters,
+    /// with or without hyphens (grouped as 8, 4, 4, 4, 12).
+    fn from_str(us: &str) -> Result<Uuid, ParseError> {
+        Uuid::parse_str(us)
+    }
+}
+
+/// Convert the UUID to a hexadecimal-based string representation wrapped in `Uuid()`
+impl fmt::Debug for Uuid {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Uuid(\"{}\")", self.to_hyphenated_string())
+    }
+}
+
+/// Convert the UUID to a hexadecimal-based string representation
+impl fmt::Display for Uuid {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.to_hyphenated_string())
+    }
+}
+
+/// Test two UUIDs for equality
+///
+/// UUIDs are equal only when they are byte-for-byte identical
+impl PartialEq for Uuid {
+    fn eq(&self, other: &Uuid) -> bool {
+        self.bytes == other.bytes
+    }
+}
+
+impl Eq for Uuid {}
+
+// FIXME #9845: Test these more thoroughly
+impl Encodable for Uuid {
+    /// Encode a UUID as a hyphenated string
+    fn encode<E: Encoder>(&self, e: &mut E) -> Result<(), E::Error> {
+        e.emit_str(&self.to_hyphenated_string())
+    }
+}
+
+impl Decodable for Uuid {
+    /// Decode a UUID from a string
+    fn decode<D: Decoder>(d: &mut D) -> Result<Uuid, D::Error> {
+        let string = try!(d.read_str());
+        string.parse().map_err(|err| d.error(&format!("{}", err)))
+    }
+}
+
+#[cfg(feature = "serde")]
+impl Serialize for Uuid {
+    fn serialize<S: Serializer>(&self, serializer: &mut S) -> Result<(), S::Error> {
+        serializer.visit_str(&self.to_hyphenated_string())
+    }
+}
+
+#[cfg(feature = "serde")]
+impl Deserialize for Uuid {
+    fn deserialize<D: Deserializer>(deserializer: &mut D) -> Result<Self, D::Error> {
+        struct UuidVisitor;
+
+        impl de::Visitor for UuidVisitor {
+            type Value = Uuid;
+
+            fn visit_str<E: de::Error>(&mut self, value: &str) -> Result<Uuid, E> {
+                value.parse().map_err(|err| E::syntax(&format!("{}", err)))
+            }
+
+            fn visit_bytes<E: de::Error>(&mut self, value: &[u8]) -> Result<Uuid, E> {
+                Uuid::from_bytes(value).ok_or(E::syntax("Expected 16 bytes."))
+            }
+        }
+
+        deserializer.visit(UuidVisitor)
+    }
+}
+
+/// Generates a random instance of UUID (V4 conformant)
+impl rand::Rand for Uuid {
+    #[inline]
+    fn rand<R: rand::Rng>(rng: &mut R) -> Uuid {
+        let ub = rng.gen_iter::<u8>().take(16).collect::<Vec<_>>();
+        let mut uuid = Uuid { bytes: [0; 16] };
+        copy_memory(&mut uuid.bytes, &ub);
+        uuid.set_variant(UuidVariant::RFC4122);
+        uuid.set_version(UuidVersion::Random);
+        uuid
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::{Uuid, UuidVariant, UuidVersion};
+    use rand;
+
+    #[test]
+    fn test_nil() {
+        let nil = Uuid::nil();
+        let not_nil = Uuid::new_v4();
+
+        assert!(nil.is_nil());
+        assert!(!not_nil.is_nil());
+    }
+
+    #[test]
+    fn test_new() {
+        // Supported
+        let uuid1 = Uuid::new(UuidVersion::Random).unwrap();
+        let s = uuid1.to_simple_string();
+
+        assert!(s.len() == 32);
+        assert!(uuid1.get_version().unwrap() == UuidVersion::Random);
+
+        // Test unsupported versions
+        assert!(Uuid::new(UuidVersion::Mac) == None);
+        assert!(Uuid::new(UuidVersion::Dce) == None);
+        assert!(Uuid::new(UuidVersion::Md5) == None);
+        assert!(Uuid::new(UuidVersion::Sha1) == None);
+    }
+
+    #[test]
+    fn test_new_v4() {
+        let uuid1 = Uuid::new_v4();
+
+        assert!(uuid1.get_version().unwrap() == UuidVersion::Random);
+        assert!(uuid1.get_variant().unwrap() == UuidVariant::RFC4122);
+    }
+
+    #[test]
+    fn test_get_version() {
+        let uuid1 = Uuid::new_v4();
+
+        assert!(uuid1.get_version().unwrap() == UuidVersion::Random);
+        assert!(uuid1.get_version_num() == 4);
+    }
+
+    #[test]
+    fn test_get_variant() {
+        let uuid1 = Uuid::new_v4();
+        let uuid2 = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap();
+        let uuid3 = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8").unwrap();
+        let uuid4 = Uuid::parse_str("936DA01F9ABD4d9dC0C702AF85C822A8").unwrap();
+        let uuid5 = Uuid::parse_str("F9168C5E-CEB2-4faa-D6BF-329BF39FA1E4").unwrap();
+        let uuid6 = Uuid::parse_str("f81d4fae-7dec-11d0-7765-00a0c91e6bf6").unwrap();
+
+        assert!(uuid1.get_variant().unwrap() == UuidVariant::RFC4122);
+        assert!(uuid2.get_variant().unwrap() == UuidVariant::RFC4122);
+        assert!(uuid3.get_variant().unwrap() == UuidVariant::RFC4122);
+        assert!(uuid4.get_variant().unwrap() == UuidVariant::Microsoft);
+        assert!(uuid5.get_variant().unwrap() == UuidVariant::Microsoft);
+        assert!(uuid6.get_variant().unwrap() == UuidVariant::NCS);
+    }
+
+    #[test]
+    fn test_parse_uuid_v4() {
+        use super::ParseError::*;
+
+        // Invalid
+        assert_eq!(Uuid::parse_str(""), Err(InvalidLength(0)));
+        assert_eq!(Uuid::parse_str("!"), Err(InvalidLength(1)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E45"),
+                   Err(InvalidLength(37)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4"),
+                   Err(InvalidLength(35)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"),
+                   Err(InvalidCharacter('G', 20)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4"),
+                   Err(InvalidGroups(4)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faa"),
+                   Err(InvalidLength(18)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faaXB6BFF329BF39FA1E4"),
+                   Err(InvalidCharacter('X', 18)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB-24fa-eB6BFF32-BF39FA1E4"),
+                   Err(InvalidGroupLength(1, 3, 4)));
+        assert_eq!(Uuid::parse_str("01020304-1112-2122-3132-41424344"),
+                   Err(InvalidGroupLength(4, 8, 12)));
+        assert_eq!(Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c"),
+                   Err(InvalidLength(31)));
+        assert_eq!(Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c88"),
+                   Err(InvalidLength(33)));
+        assert_eq!(Uuid::parse_str("67e5504410b1426f9247bb680e5fe0cg8"),
+                   Err(InvalidLength(33)));
+        assert_eq!(Uuid::parse_str("67e5504410b1426%9247bb680e5fe0c8"),
+                   Err(InvalidCharacter('%', 15)));
+
+        // Valid
+        assert!(Uuid::parse_str("00000000000000000000000000000000").is_ok());
+        assert!(Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8").is_ok());
+        assert!(Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4").is_ok());
+        assert!(Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c8").is_ok());
+        assert!(Uuid::parse_str("01020304-1112-2122-3132-414243444546").is_ok());
+        assert!(Uuid::parse_str("urn:uuid:67e55044-10b1-426f-9247-bb680e5fe0c8").is_ok());
+
+        // Nil
+        let nil = Uuid::nil();
+        assert!(Uuid::parse_str("00000000000000000000000000000000").unwrap() == nil);
+        assert!(Uuid::parse_str("00000000-0000-0000-0000-000000000000").unwrap() == nil);
+
+        // Round-trip
+        let uuid_orig = Uuid::new_v4();
+        let orig_str = uuid_orig.to_string();
+        let uuid_out = Uuid::parse_str(&orig_str).unwrap();
+        assert!(uuid_orig == uuid_out);
+
+        // Test error reporting
+        assert_eq!(Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c"),
+                   Err(InvalidLength(31)));
+        assert_eq!(Uuid::parse_str("67e550X410b1426f9247bb680e5fe0cd"),
+                   Err(InvalidCharacter('X', 6)));
+        assert_eq!(Uuid::parse_str("67e550-4105b1426f9247bb680e5fe0c"),
+                   Err(InvalidGroupLength(0, 6, 8)));
+        assert_eq!(Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF1-02BF39FA1E4"),
+                   Err(InvalidGroupLength(3, 5, 4)));
+    }
+
+    #[test]
+    fn test_to_simple_string() {
+        let uuid1 = Uuid::new_v4();
+        let s = uuid1.to_simple_string();
+
+        assert!(s.len() == 32);
+        assert!(s.chars().all(|c| c.is_digit(16)));
+    }
+
+    #[test]
+    fn test_to_string() {
+        let uuid1 = Uuid::new_v4();
+        let s = uuid1.to_string();
+
+        assert!(s.len() == 36);
+        assert!(s.chars().all(|c| c.is_digit(16) || c == '-'));
+    }
+
+    #[test]
+    fn test_to_hyphenated_string() {
+        let uuid1 = Uuid::new_v4();
+        let s = uuid1.to_hyphenated_string();
+
+        assert!(s.len() == 36);
+        assert!(s.chars().all(|c| c.is_digit(16) || c == '-'));
+    }
+
+    #[test]
+    fn test_to_urn_string() {
+        let uuid1 = Uuid::new_v4();
+        let ss = uuid1.to_urn_string();
+        let s = &ss[9..];
+
+        assert!(ss.starts_with("urn:uuid:"));
+        assert!(s.len() == 36);
+        assert!(s.chars().all(|c| c.is_digit(16) || c == '-'));
+    }
+
+    #[test]
+    fn test_to_simple_string_matching() {
+        let uuid1 = Uuid::new_v4();
+
+        let hs = uuid1.to_hyphenated_string();
+        let ss = uuid1.to_simple_string();
+
+        let hsn = hs.chars().filter(|&c| c != '-').collect::<String>();
+
+        assert!(hsn == ss);
+    }
+
+    #[test]
+    fn test_string_roundtrip() {
+        let uuid = Uuid::new_v4();
+
+        let hs = uuid.to_hyphenated_string();
+        let uuid_hs = Uuid::parse_str(&hs).unwrap();
+        assert!(uuid_hs == uuid);
+
+        let ss = uuid.to_string();
+        let uuid_ss = Uuid::parse_str(&ss).unwrap();
+        assert!(uuid_ss == uuid);
+    }
+
+    #[test]
+    fn test_compare() {
+        let uuid1 = Uuid::new_v4();
+        let uuid2 = Uuid::new_v4();
+
+        assert!(uuid1 == uuid1);
+        assert!(uuid2 == uuid2);
+        assert!(uuid1 != uuid2);
+        assert!(uuid2 != uuid1);
+    }
+
+    #[test]
+    fn test_from_fields() {
+        let d1: u32 = 0xa1a2a3a4;
+        let d2: u16 = 0xb1b2;
+        let d3: u16 = 0xc1c2;
+        let d4: Vec<u8> = vec!(0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8);
+
+        let u = Uuid::from_fields(d1, d2, d3, &d4);
+
+        let expected = "a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8".to_string();
+        let result = u.to_simple_string();
+        assert!(result == expected);
+    }
+
+    #[test]
+    fn test_from_bytes() {
+        let b = vec!(0xa1,
+                     0xa2,
+                     0xa3,
+                     0xa4,
+                     0xb1,
+                     0xb2,
+                     0xc1,
+                     0xc2,
+                     0xd1,
+                     0xd2,
+                     0xd3,
+                     0xd4,
+                     0xd5,
+                     0xd6,
+                     0xd7,
+                     0xd8);
+
+        let u = Uuid::from_bytes(&b).unwrap();
+        let expected = "a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8".to_string();
+
+        assert!(u.to_simple_string() == expected);
+    }
+
+    #[test]
+    fn test_as_bytes() {
+        let u = Uuid::new_v4();
+        let ub = u.as_bytes();
+
+        assert!(ub.len() == 16);
+        assert!(!ub.iter().all(|&b| b == 0));
+    }
+
+    #[test]
+    fn test_bytes_roundtrip() {
+        let b_in: [u8; 16] = [0xa1, 0xa2, 0xa3, 0xa4, 0xb1, 0xb2, 0xc1, 0xc2, 0xd1, 0xd2, 0xd3,
+                              0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
+
+        let u = Uuid::from_bytes(&b_in).unwrap();
+
+        let b_out = u.as_bytes();
+
+        assert_eq!(&b_in, b_out);
+    }
+
+    #[test]
+    fn test_operator_eq() {
+        let u1 = Uuid::new_v4();
+        let u2 = u1.clone();
+        let u3 = Uuid::new_v4();
+
+        assert!(u1 == u1);
+        assert!(u1 == u2);
+        assert!(u2 == u1);
+
+        assert!(u1 != u3);
+        assert!(u3 != u1);
+        assert!(u2 != u3);
+        assert!(u3 != u2);
+    }
+
+    #[test]
+    fn test_rand_rand() {
+        let mut rng = rand::thread_rng();
+        let u: Uuid = rand::Rand::rand(&mut rng);
+        let ub = u.as_bytes();
+
+        assert!(ub.len() == 16);
+        assert!(!ub.iter().all(|&b| b == 0));
+    }
+
+    #[test]
+    fn test_serialize_round_trip() {
+        use rustc_serialize::json;
+
+        let u = Uuid::new_v4();
+        let s = json::encode(&u).unwrap();
+        let u2 = json::decode(&s).unwrap();
+        assert_eq!(u, u2);
+    }
+
+    #[test]
+    fn test_iterbytes_impl_for_uuid() {
+        use std::collections::HashSet;
+        let mut set = HashSet::new();
+        let id1 = Uuid::new_v4();
+        let id2 = Uuid::new_v4();
+        set.insert(id1.clone());
+        assert!(set.contains(&id1));
+        assert!(!set.contains(&id2));
+    }
+}
+
+/*
+TODO: when benchmarking is stable, re-add these
+#[cfg(test)]
+mod bench {
+    extern crate test;
+    use self::test::Bencher;
+    use super::Uuid;
+
+    #[bench]
+    pub fn create_uuids(b: &mut Bencher) {
+        b.iter(|| {
+            Uuid::new_v4();
+        })
+    }
+
+    #[bench]
+    pub fn uuid_to_string(b: &mut Bencher) {
+        let u = Uuid::new_v4();
+        b.iter(|| {
+            u.to_string();
+        })
+    }
+
+    #[bench]
+    pub fn parse_str(b: &mut Bencher) {
+        let s = "urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4";
+        b.iter(|| {
+            Uuid::parse_str(s).unwrap();
+        })
+    }
+}
+*/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"6d7856aa51991bc6c15945046377a9992b8886cc8e4602d08f650f92803b71f6",".travis.yml":"78252ef89a407b1d76616b7afbf7afb8205530a7f7039f3a7ea140684e3aa8bc","Cargo.toml":"e5bfb146651b511a3e5c3493e11f7c3f845e948f95fe3796b32120decee6eac6","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"bd0e99ce271903a9f67cf5f8fca2f67f2583e4336fbaf583fcd78ec238d4176e","src/capabilities.rs":"6d65b5ca60a1c7140da33ab691bc877e335e4387edb09a7933605168db6e56b3","src/command.rs":"6d50f9ead11599c786d9d50708b633e6163764f3b8210cde0c557e42535c79c1","src/common.rs":"d696aabe88061f8315578c42115d976123a8fc4276384e478e14d241dfc9acc0","src/error.rs":"b0acf64e052edbc26e7dbcd1a54e8b9a786f01e9d48e0e5b2f410266bfdb9da2","src/httpapi.rs":"243cde695399975e5ff1ad765df26fe961f70ad9199f378c7544cf861c6bfe87","src/lib.rs":"336c146e934711dfe49f4b44bbcf278686b00be8d89abb9c7b7b045254994fbf","src/macros.rs":"93094c48e3880d925e684fba9678693eb8c0c39c7ed47b130b0751c4bca37ddc","src/response.rs":"c09d92fcf8177e3a0950db71f843123bab3dea78f136ba9c712afe1893f73961","src/server.rs":"dbbedec59c9a54629a4c59bd9aa3494d8621e59721f99c00b24c3b84a62a2e72"},"package":"0d161bc62ed766ddc0838af89f1b339ed3c8b5c3dbe8776b59731dfae7b1a6c7"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/.gitignore
@@ -0,0 +1,5 @@
+/target
+/Cargo.lock
+*~
+*.swp
+*.swo
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/.travis.yml
@@ -0,0 +1,9 @@
+language: rust
+
+rust:
+    - nightly
+    - stable
+
+script:
+    - cargo build --verbose
+    - cargo test --verbose
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "webdriver"
+version = "0.25.2"
+authors = ["Mozilla Tools and Automation <tools@lists.mozilla.com>"]
+description = "Library implementing the wire protocol for the W3C WebDriver specification"
+documentation = "https://docs.rs/webdriver"
+repository = "https://github.com/mozilla/webdriver-rust"
+readme = "README.md"
+keywords = ["webdriver", "browser", "automation", "protocol", "w3c"]
+license = "MPL-2.0"
+
+[dependencies]
+backtrace = "0.3"
+cookie = {version = "0.6", default-features = false}
+hyper = "0.10"
+log = "0.3"
+regex = "0.2"
+rustc-serialize = "0.3"
+time = "0.1"
+url = "1"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/README.md
@@ -0,0 +1,5 @@
+# webdriver Rust library [![Crate version](https://img.shields.io/crates/v/webdriver.svg)](https://crates.io/crates/webdriver) [![Documentation](https://docs.rs/webdriver/badge.svg)](https://docs.rs/webdriver/) [![Build status](https://travis-ci.org/mozilla/webdriver-rust.svg?branch=master)](https://travis-ci.org/mozilla/webdriver-rust) 
+
+As of right now this is an implementation
+for the server side of the WebDriver API in Rust,
+not the client side.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/capabilities.rs
@@ -0,0 +1,568 @@
+use command::Parameters;
+use error::{ErrorStatus, WebDriverError, WebDriverResult};
+use rustc_serialize::json::{Json, ToJson};
+use std::collections::BTreeMap;
+use std::net::Ipv6Addr;
+use url::Url;
+
+pub type Capabilities = BTreeMap<String, Json>;
+
+/// Trait for objects that can be used to inspect browser capabilities
+///
+/// The main methods in this trait are called with a Capabilites object
+/// resulting from a full set of potential capabilites for the session.
+/// Given those Capabilities they return a property of the browser instance
+/// that would be initiated. In many cases this will be independent of the
+/// input, but in the case of e.g. browser version, it might depend on a
+/// path to the binary provided as a capability.
+pub trait BrowserCapabilities {
+    /// Set up the Capabilites object
+    ///
+    /// Typically used to create any internal caches
+    fn init(&mut self, &Capabilities);
+
+    /// Name of the browser
+    fn browser_name(&mut self, &Capabilities) -> WebDriverResult<Option<String>>;
+    /// Version number of the browser
+    fn browser_version(&mut self, &Capabilities) -> WebDriverResult<Option<String>>;
+    /// Compare actual browser version to that provided in a version specifier
+    ///
+    /// Parameters are the actual browser version and the comparison string,
+    /// respectively. The format of the comparison string is implementation-defined.
+    fn compare_browser_version(&mut self, version: &str, comparison: &str) -> WebDriverResult<bool>;
+    /// Name of the platform/OS
+    fn platform_name(&mut self, &Capabilities) -> WebDriverResult<Option<String>>;
+    /// Whether insecure certificates are supported
+    fn accept_insecure_certs(&mut self, &Capabilities) -> WebDriverResult<bool>;
+
+    fn accept_proxy(&mut self, proxy_settings: &BTreeMap<String, Json>, &Capabilities) -> WebDriverResult<bool>;
+
+    /// Type check custom properties
+    ///
+    /// Check that custom properties containing ":" have the correct data types.
+    /// Properties that are unrecognised must be ignored i.e. return without
+    /// error.
+    fn validate_custom(&self, name: &str, value: &Json) -> WebDriverResult<()>;
+    /// Check if custom properties are accepted capabilites
+    ///
+    /// Check that custom properties containing ":" are compatible with
+    /// the implementation.
+    fn accept_custom(&mut self, name: &str, value: &Json, merged: &Capabilities) -> WebDriverResult<bool>;
+}
+
+/// Trait to abstract over various version of the new session parameters
+///
+/// This trait is expected to be implemented on objects holding the capabilities
+/// from a new session command.
+pub trait CapabilitiesMatching {
+    /// Match the BrowserCapabilities against some candidate capabilites
+    ///
+    /// Takes a BrowserCapabilites object and returns a set of capabilites that
+    /// are valid for that browser, if any, or None if there are no matching
+    /// capabilities.
+    fn match_browser<T: BrowserCapabilities>(&self, browser_capabilities: &mut T)
+                                             -> WebDriverResult<Option<Capabilities>>;
+}
+
+#[derive(Debug, PartialEq)]
+pub struct SpecNewSessionParameters {
+    pub alwaysMatch: Capabilities,
+    pub firstMatch: Vec<Capabilities>,
+}
+
+impl SpecNewSessionParameters {
+    fn validate<T: BrowserCapabilities>(&self,
+                                        mut capabilities: Capabilities,
+                                        browser_capabilities: &T) -> WebDriverResult<Capabilities> {
+        // Filter out entries with the value `null`
+        let null_entries = capabilities
+            .iter()
+            .filter(|&(_, ref value)| **value == Json::Null)
+            .map(|(k, _)| k.clone())
+            .collect::<Vec<String>>();
+        for key in null_entries {
+            capabilities.remove(&key);
+        }
+
+        for (key, value) in capabilities.iter() {
+            match &**key {
+                "acceptInsecureCerts" => if !value.is_boolean() {
+                        return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                       "acceptInsecureCerts was not a boolean"))
+                    },
+                x @ "browserName" |
+                x @ "browserVersion" |
+                x @ "platformName" => if !value.is_string() {
+                        return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                       format!("{} was not a boolean", x)))
+                    },
+                "pageLoadStrategy" => {
+                    try!(SpecNewSessionParameters::validate_page_load_strategy(value))
+                }
+                "proxy" => {
+                    try!(SpecNewSessionParameters::validate_proxy(value))
+                },
+                "timeouts" => {
+                    try!(SpecNewSessionParameters::validate_timeouts(value))
+                },
+                "unhandledPromptBehaviour" => {
+                    try!(SpecNewSessionParameters::validate_unhandled_prompt_behaviour(value))
+                }
+                x => {
+                    if !x.contains(":") {
+                        return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                       format!("{} was not a the name of a known capability or a valid extension capability", x)))
+                    } else {
+                        try!(browser_capabilities.validate_custom(x, value));
+                    }
+                }
+            }
+        }
+        Ok(capabilities)
+    }
+
+    fn validate_page_load_strategy(value: &Json) -> WebDriverResult<()> {
+        match value {
+            &Json::String(ref x) => {
+                match &**x {
+                    "normal" |
+                    "eager" |
+                    "none" => {},
+                    x => {
+                        return Err(WebDriverError::new(
+                            ErrorStatus::InvalidArgument,
+                            format!("\"{}\" not a valid page load strategy", x)))
+                    }
+                }
+            }
+            _ => return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                "pageLoadStrategy was not a string"))
+        }
+        Ok(())
+    }
+
+    fn validate_proxy(proxy_value: &Json) -> WebDriverResult<()> {
+        let obj = try_opt!(proxy_value.as_object(),
+                           ErrorStatus::InvalidArgument,
+                           "proxy was not an object");
+        for (key, value) in obj.iter() {
+            match &**key {
+                "proxyType" => match value.as_string() {
+                    Some("pac") |
+                    Some("noproxy") |
+                    Some("autodetect") |
+                    Some("system") |
+                    Some("manual") => {},
+                    Some(x) => return Err(WebDriverError::new(
+                        ErrorStatus::InvalidArgument,
+                        format!("{} was not a valid proxyType value", x))),
+                    None => return Err(WebDriverError::new(
+                        ErrorStatus::InvalidArgument,
+                        "proxyType value was not a string")),
+                },
+                "proxyAutoconfigUrl" => match value.as_string() {
+                    Some(x) => {
+                        try!(Url::parse(x).or(Err(WebDriverError::new(
+                            ErrorStatus::InvalidArgument,
+                            "proxyAutoconfigUrl was not a valid url"))));
+                    },
+                    None => return Err(WebDriverError::new(
+                        ErrorStatus::InvalidArgument,
+                        "proxyAutoconfigUrl was not a string"
+                    ))
+                },
+                "ftpProxy" => try!(SpecNewSessionParameters::validate_host_domain("ftpProxy", "ftp", obj, value)),
+                "ftpProxyPort" => try!(SpecNewSessionParameters::validate_port("ftpProxyPort", value)),
+                "httpProxy" => try!(SpecNewSessionParameters::validate_host_domain("httpProxy", "http", obj, value)),
+                "httpProxyPort" => try!(SpecNewSessionParameters::validate_port("httpProxyPort", value)),
+                "sslProxy" => try!(SpecNewSessionParameters::validate_host_domain("sslProxy", "http", obj, value)),
+                "sslProxyPort" => try!(SpecNewSessionParameters::validate_port("sslProxyPort", value)),
+                "socksProxy" => try!(SpecNewSessionParameters::validate_host_domain("socksProxy", "ssh", obj, value)),
+                "socksProxyPort" => try!(SpecNewSessionParameters::validate_port("socksProxyPort", value)),
+                "socksUsername" => if !value.is_string() {
+                    return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                   "socksUsername was not a string"))
+                },
+                "socksPassword" => if !value.is_string() {
+                    return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                   "socksPassword was not a string"))
+                },
+                x => return Err(WebDriverError::new(
+                    ErrorStatus::InvalidArgument,
+                    format!("{} was not a valid proxy configuration capability", x)))
+            }
+        }
+        Ok(())
+    }
+
+    /// Validate whether a named capability is JSON value is a string containing a host
+    /// and possible port
+    fn validate_host_domain(name: &str,
+                            scheme: &str,
+                            obj: &Capabilities,
+                            value: &Json) -> WebDriverResult<()> {
+        match value.as_string() {
+            Some(x) => {
+                if x.contains("::/") {
+                    return Err(WebDriverError::new(
+                        ErrorStatus::InvalidArgument,
+                        format!("{} contains a scheme", name)));
+                }
+
+                // IPv6 hosts must be enclosed with "[" and "]" in URLs
+                let host = match x.parse::<Ipv6Addr>() {
+                    Ok(ip) => format!("[{}]", ip),
+                    Err(_) => x.to_owned(),
+                };
+
+                let mut s = String::with_capacity(scheme.len() + host.len() + 3);
+                s.push_str(scheme);
+                s.push_str("://");
+                s.push_str(host.as_str());
+
+                let url = try!(Url::parse(&*s).or(Err(WebDriverError::new(
+                    ErrorStatus::InvalidArgument,
+                    format!("{} was not a valid url", name)))));
+                if url.username() != "" ||
+                    url.password() != None ||
+                    url.path() != "/" ||
+                    url.query() != None ||
+                    url.fragment() != None {
+                        return Err(WebDriverError::new(
+                            ErrorStatus::InvalidArgument,
+                            format!("{} was not of the form host[:port]", name)));
+                    }
+                let mut port_key = String::with_capacity(name.len() + 4);
+                port_key.push_str(name);
+                port_key.push_str("Port");
+                if url.port() != None &&
+                    obj.contains_key(&*port_key) {
+                        return Err(WebDriverError::new(
+                                    ErrorStatus::InvalidArgument,
+                                    format!("{} supplied with a port as well as {}",
+                                            name, port_key)));
+                    }
+            },
+            None => return Err(WebDriverError::new(
+                ErrorStatus::InvalidArgument,
+                format!("{} was not a string", name)
+            ))
+        }
+        Ok(())
+    }
+
+    fn validate_port(name: &str, value: &Json) -> WebDriverResult<()> {
+        match value.as_i64() {
+            Some(x) => {
+                if x < 0 || x > 2i64.pow(16) - 1 {
+                    return Err(WebDriverError::new(
+                        ErrorStatus::InvalidArgument,
+                        format!("{} is out of range", name)))
+                }
+            }
+            _ => return Err(WebDriverError::new(
+                ErrorStatus::InvalidArgument,
+                format!("{} was not an integer", name)))
+        }
+        Ok(())
+    }
+
+    fn validate_timeouts(value: &Json) -> WebDriverResult<()> {
+        let obj = try_opt!(value.as_object(),
+                           ErrorStatus::InvalidArgument,
+                           "timeouts capability was not an object");
+        for (key, value) in obj.iter() {
+            match &**key {
+                x @ "script" |
+                x @ "pageLoad" |
+                x @ "implicit" => {
+                    let timeout = try_opt!(value.as_i64(),
+                                           ErrorStatus::InvalidArgument,
+                                           format!("{} timeouts value was not an integer", x));
+                    if timeout < 0 {
+                        return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                       format!("{} timeouts value was negative", x)))
+                    }
+                },
+                x => return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                    format!("{} was not a valid timeouts capability", x)))
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_unhandled_prompt_behaviour(value: &Json) -> WebDriverResult<()> {
+        let behaviour = try_opt!(value.as_string(),
+                                 ErrorStatus::InvalidArgument,
+                                 "unhandledPromptBehaviour capability was not a string");
+        match behaviour {
+            "dismiss" |
+            "accept" => {},
+            x => return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                format!("{} was not a valid unhandledPromptBehaviour value", x)))        }
+        Ok(())
+    }
+}
+
+impl Parameters for SpecNewSessionParameters {
+    fn from_json(body: &Json) -> WebDriverResult<SpecNewSessionParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::UnknownError,
+                            "Message body was not an object");
+
+        let capabilities = try_opt!(
+            try_opt!(data.get("capabilities"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'capabilities' parameter").as_object(),
+            ErrorStatus::InvalidArgument,
+                     "'capabilities' parameter is not an object");
+
+        let default_always_match = Json::Object(Capabilities::new());
+        let always_match = try_opt!(capabilities.get("alwaysMatch")
+                                   .unwrap_or(&default_always_match)
+                                   .as_object(),
+                                   ErrorStatus::InvalidArgument,
+                                   "'alwaysMatch' parameter is not an object");
+        let default_first_matches = Json::Array(vec![]);
+        let first_matches = try!(
+            try_opt!(capabilities.get("firstMatch")
+                     .unwrap_or(&default_first_matches)
+                     .as_array(),
+                     ErrorStatus::InvalidArgument,
+                     "'firstMatch' parameter is not an array")
+                .iter()
+                .map(|x| x.as_object()
+                     .map(|x| x.clone())
+                     .ok_or(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                "'firstMatch' entry is not an object")))
+                .collect::<WebDriverResult<Vec<Capabilities>>>());
+
+        return Ok(SpecNewSessionParameters {
+            alwaysMatch: always_match.clone(),
+            firstMatch: first_matches
+        });
+    }
+}
+
+impl ToJson for SpecNewSessionParameters {
+    fn to_json(&self) -> Json {
+        let mut body = BTreeMap::new();
+        let mut capabilities = BTreeMap::new();
+        capabilities.insert("alwaysMatch".into(), self.alwaysMatch.to_json());
+        capabilities.insert("firstMatch".into(), self.firstMatch.to_json());
+        body.insert("capabilities".into(), capabilities.to_json());
+        Json::Object(body)
+    }
+}
+
+impl CapabilitiesMatching for SpecNewSessionParameters {
+    fn match_browser<T: BrowserCapabilities>(&self, browser_capabilities: &mut T)
+                                             -> WebDriverResult<Option<Capabilities>> {
+        let default = vec![BTreeMap::new()];
+        let capabilities_list = if self.firstMatch.len() > 0 {
+            &self.firstMatch
+        } else {
+            &default
+        };
+
+        let merged_capabilities = try!(capabilities_list
+            .iter()
+            .map(|first_match_entry| {
+                if first_match_entry.keys().any(|k| {
+                    self.alwaysMatch.contains_key(k)
+                }) {
+                    return Err(WebDriverError::new(
+                        ErrorStatus::InvalidArgument,
+                        "'firstMatch' key shadowed a value in 'alwaysMatch'"));
+                }
+                let mut merged = self.alwaysMatch.clone();
+                merged.append(&mut first_match_entry.clone());
+                Ok(merged)
+            })
+            .map(|merged| merged.and_then(|x| self.validate(x, browser_capabilities)))
+            .collect::<WebDriverResult<Vec<Capabilities>>>());
+
+        let selected = merged_capabilities
+            .iter()
+            .filter_map(|merged| {
+                browser_capabilities.init(merged);
+
+                for (key, value) in merged.iter() {
+                    match &**key {
+                        "browserName" => {
+                            let browserValue = browser_capabilities
+                                .browser_name(merged)
+                                .ok()
+                                .and_then(|x| x);
+
+                            if value.as_string() != browserValue.as_ref().map(|x| &**x) {
+                                    return None;
+                            }
+                        },
+                        "browserVersion" => {
+                            let browserValue = browser_capabilities
+                                .browser_version(merged)
+                                .ok()
+                                .and_then(|x| x);
+                            // We already validated this was a string
+                            let version_cond = value.as_string().unwrap_or("");
+                            if let Some(version) = browserValue {
+                                if !browser_capabilities
+                                    .compare_browser_version(&*version, version_cond)
+                                    .unwrap_or(false) {
+                                        return None;
+                                    }
+                            } else {
+                                return None
+                            }
+                        },
+                        "platformName" => {
+                            let browserValue = browser_capabilities
+                                .platform_name(merged)
+                                .ok()
+                                .and_then(|x| x);
+                            if value.as_string() != browserValue.as_ref().map(|x| &**x) {
+                                return None;
+                            }
+                        }
+                        "acceptInsecureCerts" => {
+                            if value.as_boolean().unwrap_or(false) &&
+                                !browser_capabilities
+                                .accept_insecure_certs(merged)
+                                .unwrap_or(false) {
+                                return None;
+                            }
+                        },
+                        "proxy" => {
+                            let default = BTreeMap::new();
+                            let proxy = value.as_object().unwrap_or(&default);
+                            if !browser_capabilities.accept_proxy(&proxy,
+                                                                  merged)
+                                .unwrap_or(false) {
+                                return None
+                            }
+                        },
+                        name => {
+                            if name.contains(":") {
+                                if !browser_capabilities
+                                    .accept_custom(name, value, merged)
+                                    .unwrap_or(false) {
+                                        return None
+                                    }
+                            } else {
+                                // Accept the capability
+                            }
+                        }
+                    }
+                }
+
+                return Some(merged)
+            })
+            .next()
+            .map(|x| x.clone());
+            Ok(selected)
+    }
+}
+
+#[derive(Debug, PartialEq)]
+pub struct LegacyNewSessionParameters {
+    pub desired: Capabilities,
+    pub required: Capabilities,
+}
+
+impl CapabilitiesMatching for LegacyNewSessionParameters {
+    fn match_browser<T: BrowserCapabilities>(&self, browser_capabilities: &mut T)
+                                             -> WebDriverResult<Option<Capabilities>> {
+        /* For now don't do anything much, just merge the
+        desired and required and return the merged list. */
+
+        let mut capabilities: Capabilities = BTreeMap::new();
+        self.required.iter()
+            .chain(self.desired.iter())
+            .fold(&mut capabilities,
+                  |mut caps, (key, value)| {
+                      if !caps.contains_key(key) {
+                          caps.insert(key.clone(), value.clone());
+                      }
+                      caps});
+        browser_capabilities.init(&capabilities);
+        Ok(Some(capabilities))
+    }
+}
+
+impl Parameters for LegacyNewSessionParameters {
+    fn from_json(body: &Json) -> WebDriverResult<LegacyNewSessionParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::UnknownError,
+                            "Message body was not an object");
+
+        let desired_capabilities =
+            if let Some(capabilities) = data.get("desiredCapabilities") {
+                try_opt!(capabilities.as_object(),
+                         ErrorStatus::InvalidArgument,
+                         "'desiredCapabilities' parameter is not an object").clone()
+            } else {
+                BTreeMap::new()
+            };
+
+        let required_capabilities =
+            if let Some(capabilities) = data.get("requiredCapabilities") {
+                try_opt!(capabilities.as_object(),
+                         ErrorStatus::InvalidArgument,
+                         "'requiredCapabilities' parameter is not an object").clone()
+            } else {
+                BTreeMap::new()
+            };
+
+        Ok(LegacyNewSessionParameters {
+            desired: desired_capabilities,
+            required: required_capabilities
+        })
+    }
+}
+
+impl ToJson for LegacyNewSessionParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("desiredCapabilities".to_owned(), self.desired.to_json());
+        data.insert("requiredCapabilities".to_owned(), self.required.to_json());
+        Json::Object(data)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use rustc_serialize::json::Json;
+    use std::collections::BTreeMap;
+    use super::{WebDriverResult, SpecNewSessionParameters};
+
+    fn parse(data: &str) -> BTreeMap<String, Json> {
+        Json::from_str(&*data).unwrap().as_object().unwrap().clone()
+    }
+
+    fn validate_host(name: &str, scheme: &str, caps: &str, value: &str) -> WebDriverResult<()> {
+        SpecNewSessionParameters::validate_host_domain(name,
+                                                       scheme,
+                                                       &parse(caps),
+                                                       &Json::String(value.into()))
+    }
+
+    #[test]
+    fn test_validate_host_domain() {
+        validate_host("ftpProxy", "ftp", "{}", "example.org").unwrap();
+        validate_host("ftpProxy", "ftp", "{}", "::1").unwrap();
+        assert!(validate_host("ftpProxy", "ftp", "{}", "ftp://example.org").is_err());
+        assert!(validate_host("ftpProxy", "ftp", "{}", "example.org/foo").is_err());
+        assert!(validate_host("ftpProxy", "ftp", "{}", "example.org#bar").is_err());
+        assert!(validate_host("ftpProxy", "ftp", "{}", "example.org?bar=baz").is_err());
+        assert!(validate_host("ftpProxy", "ftp", "{}", "foo:bar@example.org").is_err());
+        assert!(validate_host("ftpProxy", "ftp", "{}", "foo@example.org").is_err());
+        validate_host("httpProxy", "http", "{}", "example.org:8000").unwrap();
+        validate_host("httpProxy", "http", "{}", "::1:8000").unwrap();
+        validate_host("httpProxy", "http", "{\"ftpProxyPort\": \"1234\"}", "example.org:8000").unwrap();
+        assert!(validate_host("httpProxy", "http", "{\"httpProxyPort\": \"1234\"}", "example.org:8000").is_err());
+        validate_host("sslProxy", "http", "{}", "example.org:8000").unwrap();
+        validate_host("sslProxy", "http", "{\"ftpProxyPort\": \"1234\"}", "example.org:8000").unwrap();
+        assert!(validate_host("sslProxy", "http", "{\"sslProxyPort\": \"1234\"}", "example.org:8000").is_err());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/command.rs
@@ -0,0 +1,1738 @@
+use capabilities::{SpecNewSessionParameters, LegacyNewSessionParameters,
+                   CapabilitiesMatching, BrowserCapabilities, Capabilities};
+use common::{Date, Nullable, WebElement, FrameId, LocatorStrategy};
+use error::{WebDriverResult, WebDriverError, ErrorStatus};
+use httpapi::{Route, WebDriverExtensionRoute, VoidWebDriverExtensionRoute};
+use regex::Captures;
+use rustc_serialize::json;
+use rustc_serialize::json::{ToJson, Json};
+use std::collections::BTreeMap;
+use std::default::Default;
+
+#[derive(PartialEq)]
+pub enum WebDriverCommand<T: WebDriverExtensionCommand> {
+    NewSession(NewSessionParameters),
+    DeleteSession,
+    Get(GetParameters),
+    GetCurrentUrl,
+    GoBack,
+    GoForward,
+    Refresh,
+    GetTitle,
+    GetPageSource,
+    GetWindowHandle,
+    GetWindowHandles,
+    CloseWindow,
+    GetWindowRect,
+    SetWindowRect(WindowRectParameters),
+    MaximizeWindow,
+//    FullscreenWindow // Not supported in marionette
+    SwitchToWindow(SwitchToWindowParameters),
+    SwitchToFrame(SwitchToFrameParameters),
+    SwitchToParentFrame,
+    FindElement(LocatorParameters),
+    FindElements(LocatorParameters),
+    FindElementElement(WebElement, LocatorParameters),
+    FindElementElements(WebElement, LocatorParameters),
+    GetActiveElement,
+    IsDisplayed(WebElement),
+    IsSelected(WebElement),
+    GetElementAttribute(WebElement, String),
+    GetElementProperty(WebElement, String),
+    GetCSSValue(WebElement, String),
+    GetElementText(WebElement),
+    GetElementTagName(WebElement),
+    GetElementRect(WebElement),
+    IsEnabled(WebElement),
+    ExecuteScript(JavascriptCommandParameters),
+    ExecuteAsyncScript(JavascriptCommandParameters),
+    GetCookies,
+    GetNamedCookie(String),
+    AddCookie(AddCookieParameters),
+    DeleteCookies,
+    DeleteCookie(String),
+    GetTimeouts,
+    SetTimeouts(TimeoutsParameters),
+    ElementClick(WebElement),
+    ElementTap(WebElement),
+    ElementClear(WebElement),
+    ElementSendKeys(WebElement, SendKeysParameters),
+    PerformActions(ActionsParameters),
+    ReleaseActions,
+    DismissAlert,
+    AcceptAlert,
+    GetAlertText,
+    SendAlertText(SendKeysParameters),
+    TakeScreenshot,
+    TakeElementScreenshot(WebElement),
+    Status,
+    Extension(T)
+}
+
+pub trait WebDriverExtensionCommand : Clone + Send + PartialEq {
+    fn parameters_json(&self) -> Option<Json>;
+}
+
+#[derive(Clone, PartialEq)]
+pub struct VoidWebDriverExtensionCommand;
+
+impl WebDriverExtensionCommand for VoidWebDriverExtensionCommand {
+    fn parameters_json(&self) -> Option<Json> {
+        panic!("No extensions implemented");
+    }
+}
+
+#[derive(PartialEq)]
+pub struct WebDriverMessage <U: WebDriverExtensionRoute=VoidWebDriverExtensionRoute> {
+    pub session_id: Option<String>,
+    pub command: WebDriverCommand<U::Command>,
+}
+
+impl<U: WebDriverExtensionRoute> WebDriverMessage<U> {
+    pub fn new(session_id: Option<String>,
+               command: WebDriverCommand<U::Command>)
+               -> WebDriverMessage<U> {
+        WebDriverMessage {
+            session_id: session_id,
+            command: command,
+        }
+    }
+
+    pub fn from_http(match_type: Route<U>,
+                     params: &Captures,
+                     raw_body: &str,
+                     requires_body: bool)
+                     -> WebDriverResult<WebDriverMessage<U>> {
+        let session_id = WebDriverMessage::<U>::get_session_id(params);
+        let body_data = try!(WebDriverMessage::<U>::decode_body(raw_body, requires_body));
+
+        let command = match match_type {
+            Route::NewSession => {
+                let parameters: NewSessionParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::NewSession(parameters)
+            },
+            Route::DeleteSession => WebDriverCommand::DeleteSession,
+            Route::Get => {
+                let parameters: GetParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::Get(parameters)
+            },
+            Route::GetCurrentUrl => WebDriverCommand::GetCurrentUrl,
+            Route::GoBack => WebDriverCommand::GoBack,
+            Route::GoForward => WebDriverCommand::GoForward,
+            Route::Refresh => WebDriverCommand::Refresh,
+            Route::GetTitle => WebDriverCommand::GetTitle,
+            Route::GetPageSource => WebDriverCommand::GetPageSource,
+            Route::GetWindowHandle => WebDriverCommand::GetWindowHandle,
+            Route::GetWindowHandles => WebDriverCommand::GetWindowHandles,
+            Route::CloseWindow => WebDriverCommand::CloseWindow,
+            Route::GetTimeouts => WebDriverCommand::GetTimeouts,
+            Route::SetTimeouts => {
+                let parameters: TimeoutsParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::SetTimeouts(parameters)
+            },
+            Route::GetWindowRect | Route::GetWindowPosition | Route::GetWindowSize => WebDriverCommand::GetWindowRect,
+            Route::SetWindowRect | Route::SetWindowPosition | Route::SetWindowSize => {
+                let parameters: WindowRectParameters = Parameters::from_json(&body_data)?;
+                WebDriverCommand::SetWindowRect(parameters)
+            },
+            Route::MaximizeWindow => WebDriverCommand::MaximizeWindow,
+            Route::SwitchToWindow => {
+                let parameters: SwitchToWindowParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::SwitchToWindow(parameters)
+            }
+            Route::SwitchToFrame => {
+                let parameters: SwitchToFrameParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::SwitchToFrame(parameters)
+            },
+            Route::SwitchToParentFrame => WebDriverCommand::SwitchToParentFrame,
+            Route::FindElement => {
+                let parameters: LocatorParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::FindElement(parameters)
+            },
+            Route::FindElements => {
+                let parameters: LocatorParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::FindElements(parameters)
+            },
+            Route::FindElementElement => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                let parameters: LocatorParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::FindElementElement(element, parameters)
+            },
+            Route::FindElementElements => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                let parameters: LocatorParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::FindElementElements(element, parameters)
+            },
+            Route::GetActiveElement => WebDriverCommand::GetActiveElement,
+            Route::IsDisplayed => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::IsDisplayed(element)
+            },
+            Route::IsSelected => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::IsSelected(element)
+            },
+            Route::GetElementAttribute => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                let attr = try_opt!(params.name("name"),
+                                    ErrorStatus::InvalidArgument,
+                                    "Missing name parameter").as_str();
+                WebDriverCommand::GetElementAttribute(element, attr.into())
+            },
+            Route::GetElementProperty => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                let property = try_opt!(params.name("name"),
+                                        ErrorStatus::InvalidArgument,
+                                        "Missing name parameter").as_str();
+                WebDriverCommand::GetElementProperty(element, property.into())
+            },
+            Route::GetCSSValue => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                let property = try_opt!(params.name("propertyName"),
+                                        ErrorStatus::InvalidArgument,
+                                        "Missing propertyName parameter").as_str();
+                WebDriverCommand::GetCSSValue(element, property.into())
+            },
+            Route::GetElementText => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::GetElementText(element)
+            },
+            Route::GetElementTagName => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::GetElementTagName(element)
+            },
+            Route::GetElementRect => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::GetElementRect(element)
+            },
+            Route::IsEnabled => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::IsEnabled(element)
+            },
+            Route::ElementClick => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::ElementClick(element)
+            },
+            Route::ElementTap => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::ElementTap(element)
+            },
+            Route::ElementClear => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::ElementClear(element)
+            },
+            Route::ElementSendKeys => {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                let parameters: SendKeysParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::ElementSendKeys(element, parameters)
+            },
+            Route::ExecuteScript => {
+                let parameters: JavascriptCommandParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::ExecuteScript(parameters)
+            },
+            Route::ExecuteAsyncScript => {
+                let parameters: JavascriptCommandParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::ExecuteAsyncScript(parameters)
+            },
+            Route::GetCookies => {
+                WebDriverCommand::GetCookies
+            },
+            Route::GetNamedCookie => {
+                let name = try_opt!(params.name("name"),
+                                    ErrorStatus::InvalidArgument,
+                                    "Missing 'name' parameter").as_str().into();
+                WebDriverCommand::GetNamedCookie(name)
+            },
+            Route::AddCookie => {
+                let parameters: AddCookieParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::AddCookie(parameters)
+            },
+            Route::DeleteCookies => {
+                WebDriverCommand::DeleteCookies
+            },
+            Route::DeleteCookie => {
+                let name = try_opt!(params.name("name"),
+                                    ErrorStatus::InvalidArgument,
+                                    "Missing name parameter").as_str().into();
+                WebDriverCommand::DeleteCookie(name)
+            },
+            Route::PerformActions => {
+                let parameters: ActionsParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::PerformActions(parameters)
+            },
+            Route::ReleaseActions => {
+                WebDriverCommand::ReleaseActions
+            },
+            Route::DismissAlert => {
+                WebDriverCommand::DismissAlert
+            },
+            Route::AcceptAlert => {
+                WebDriverCommand::AcceptAlert
+            },
+            Route::GetAlertText => {
+                WebDriverCommand::GetAlertText
+            },
+            Route::SendAlertText => {
+                let parameters: SendKeysParameters = try!(Parameters::from_json(&body_data));
+                WebDriverCommand::SendAlertText(parameters)
+            },
+            Route::TakeScreenshot => WebDriverCommand::TakeScreenshot,
+            Route::TakeElementScreenshot =>  {
+                let element_id = try_opt!(params.name("elementId"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing elementId parameter");
+                let element = WebElement::new(element_id.as_str().into());
+                WebDriverCommand::TakeElementScreenshot(element)
+            },
+            Route::Status => WebDriverCommand::Status,
+            Route::Extension(ref extension) => {
+                try!(extension.command(params, &body_data))
+            }
+        };
+        Ok(WebDriverMessage::new(session_id, command))
+    }
+
+    fn get_session_id(params: &Captures) -> Option<String> {
+        params.name("sessionId").map(|x| x.as_str().into())
+    }
+
+    fn decode_body(body: &str, requires_body: bool) -> WebDriverResult<Json> {
+        if requires_body {
+            match Json::from_str(body) {
+                Ok(x @ Json::Object(_)) => Ok(x),
+                Ok(_) => {
+                    Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                            "Body was not a JSON Object"))
+                }
+                Err(json::ParserError::SyntaxError(_, line, col)) => {
+                    let msg = format!("Failed to decode request as JSON: {}", body);
+                    let stack = format!("Syntax error at :{}:{}", line, col);
+                    Err(WebDriverError::new_with_stack(ErrorStatus::InvalidArgument, msg, stack))
+                }
+                Err(json::ParserError::IoError(e)) => {
+                    Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                            format!("I/O error whilst decoding body: {}", e)))
+                }
+            }
+        } else {
+            Ok(Json::Null)
+        }
+    }
+}
+
+impl <U:WebDriverExtensionRoute> ToJson for WebDriverMessage<U> {
+    fn to_json(&self) -> Json {
+        let parameters = match self.command {
+            WebDriverCommand::AcceptAlert |
+            WebDriverCommand::CloseWindow |
+            WebDriverCommand::ReleaseActions |
+            WebDriverCommand::DeleteCookie(_) |
+            WebDriverCommand::DeleteCookies |
+            WebDriverCommand::DeleteSession |
+            WebDriverCommand::DismissAlert |
+            WebDriverCommand::ElementClear(_) |
+            WebDriverCommand::ElementClick(_) |
+            WebDriverCommand::ElementTap(_) |
+            WebDriverCommand::GetActiveElement |
+            WebDriverCommand::GetAlertText |
+            WebDriverCommand::GetNamedCookie(_) |
+            WebDriverCommand::GetCookies |
+            WebDriverCommand::GetCSSValue(_, _) |
+            WebDriverCommand::GetCurrentUrl |
+            WebDriverCommand::GetElementAttribute(_, _) |
+            WebDriverCommand::GetElementProperty(_, _) |
+            WebDriverCommand::GetElementRect(_) |
+            WebDriverCommand::GetElementTagName(_) |
+            WebDriverCommand::GetElementText(_) |
+            WebDriverCommand::GetPageSource |
+            WebDriverCommand::GetTimeouts |
+            WebDriverCommand::GetTitle |
+            WebDriverCommand::GetWindowHandle |
+            WebDriverCommand::GetWindowHandles |
+            WebDriverCommand::GetWindowRect |
+            WebDriverCommand::GoBack |
+            WebDriverCommand::GoForward |
+            WebDriverCommand::IsDisplayed(_) |
+            WebDriverCommand::IsEnabled(_) |
+            WebDriverCommand::IsSelected(_) |
+            WebDriverCommand::MaximizeWindow |
+            WebDriverCommand::NewSession(_) |
+            WebDriverCommand::Refresh |
+            WebDriverCommand::Status |
+            WebDriverCommand::SwitchToParentFrame |
+            WebDriverCommand::TakeElementScreenshot(_) |
+            WebDriverCommand::TakeScreenshot => {
+                None
+            },
+
+            WebDriverCommand::AddCookie(ref x) => Some(x.to_json()),
+            WebDriverCommand::ElementSendKeys(_, ref x) => Some(x.to_json()),
+            WebDriverCommand::ExecuteAsyncScript(ref x) |
+            WebDriverCommand::ExecuteScript(ref x) => Some(x.to_json()),
+            WebDriverCommand::FindElementElement(_, ref x) => Some(x.to_json()),
+            WebDriverCommand::FindElementElements(_, ref x) => Some(x.to_json()),
+            WebDriverCommand::FindElement(ref x) => Some(x.to_json()),
+            WebDriverCommand::FindElements(ref x) => Some(x.to_json()),
+            WebDriverCommand::Get(ref x) => Some(x.to_json()),
+            WebDriverCommand::PerformActions(ref x) => Some(x.to_json()),
+            WebDriverCommand::SendAlertText(ref x) => Some(x.to_json()),
+            WebDriverCommand::SetTimeouts(ref x) => Some(x.to_json()),
+            WebDriverCommand::SetWindowRect(ref x) => Some(x.to_json()),
+            WebDriverCommand::SwitchToFrame(ref x) => Some(x.to_json()),
+            WebDriverCommand::SwitchToWindow(ref x) => Some(x.to_json()),
+            WebDriverCommand::Extension(ref x) => x.parameters_json(),
+        };
+
+        let mut data = BTreeMap::new();
+        if let Some(parameters) = parameters {
+            data.insert("parameters".to_string(), parameters);
+        }
+        Json::Object(data)
+    }
+}
+
+pub trait Parameters: Sized {
+    fn from_json(body: &Json) -> WebDriverResult<Self>;
+}
+
+/// Wrapper around the two supported variants of new session paramters
+///
+/// The Spec variant is used for storing spec-compliant parameters whereas
+/// the legacy variant is used to store desiredCapabilities/requiredCapabilities
+/// parameters, and is intended to minimise breakage as we transition users to
+/// the spec design.
+#[derive(Debug, PartialEq)]
+pub enum NewSessionParameters {
+    Spec(SpecNewSessionParameters),
+    Legacy(LegacyNewSessionParameters),
+}
+
+impl Parameters for NewSessionParameters {
+    fn from_json(body: &Json) -> WebDriverResult<NewSessionParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::UnknownError,
+                            "Message body was not an object");
+        if data.get("capabilities").is_some() {
+            Ok(NewSessionParameters::Spec(try!(SpecNewSessionParameters::from_json(body))))
+        } else {
+            Ok(NewSessionParameters::Legacy(try!(LegacyNewSessionParameters::from_json(body))))
+        }
+    }
+}
+
+impl ToJson for NewSessionParameters {
+    fn to_json(&self) -> Json {
+        match self {
+            &NewSessionParameters::Spec(ref x) => x.to_json(),
+            &NewSessionParameters::Legacy(ref x) => x.to_json()
+        }
+    }
+}
+
+impl CapabilitiesMatching for NewSessionParameters {
+    fn match_browser<T: BrowserCapabilities>(&self, browser_capabilities: &mut T)
+                                             -> WebDriverResult<Option<Capabilities>> {
+        match self {
+            &NewSessionParameters::Spec(ref x) => x.match_browser(browser_capabilities),
+            &NewSessionParameters::Legacy(ref x) => x.match_browser(browser_capabilities)
+        }
+    }
+}
+
+
+#[derive(PartialEq)]
+pub struct GetParameters {
+    pub url: String
+}
+
+impl Parameters for GetParameters {
+    fn from_json(body: &Json) -> WebDriverResult<GetParameters> {
+        let data = try_opt!(body.as_object(), ErrorStatus::UnknownError,
+                            "Message body was not an object");
+        let url = try_opt!(
+            try_opt!(data.get("url"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'url' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "'url' not a string");
+        Ok(GetParameters {
+            url: url.to_string()
+        })
+    }
+}
+
+impl ToJson for GetParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("url".to_string(), self.url.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct TimeoutsParameters {
+    pub script: Option<u64>,
+    pub page_load: Option<u64>,
+    pub implicit: Option<u64>,
+}
+
+impl Parameters for TimeoutsParameters {
+    fn from_json(body: &Json) -> WebDriverResult<TimeoutsParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::UnknownError,
+                            "Message body was not an object");
+
+        let script = match data.get("script") {
+            Some(json) => {
+                Some(try_opt!(json.as_u64(),
+                              ErrorStatus::InvalidArgument,
+                              "Script timeout duration was not a signed integer"))
+            }
+            None => None,
+        };
+
+        let page_load = match data.get("pageLoad") {
+            Some(json) => {
+                Some(try_opt!(json.as_u64(),
+                              ErrorStatus::InvalidArgument,
+                              "Script timeout duration was not a signed integer"))
+            }
+            None => None,
+        };
+
+        let implicit = match data.get("implicit") {
+            Some(json) => {
+                Some(try_opt!(json.as_u64(),
+                              ErrorStatus::InvalidArgument,
+                              "Script timeout duration was not a signed integer"))
+            }
+            None => None,
+        };
+
+        Ok(TimeoutsParameters {
+            script: script,
+            page_load: page_load,
+            implicit: implicit,
+        })
+    }
+}
+
+impl ToJson for TimeoutsParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        if let Some(ms) = self.script {
+            data.insert("script".into(), ms.to_json());
+        }
+        if let Some(ms) = self.page_load {
+            data.insert("pageLoad".into(), ms.to_json());
+        }
+        if let Some(ms) = self.implicit {
+            data.insert("implicit".into(), ms.to_json());
+        }
+        Json::Object(data)
+    }
+}
+
+#[derive(Debug, PartialEq)]
+pub struct WindowRectParameters {
+    pub x: Nullable<i64>,
+    pub y: Nullable<i64>,
+    pub width: Nullable<u64>,
+    pub height: Nullable<u64>,
+}
+
+impl Parameters for WindowRectParameters {
+    fn from_json(body: &Json) -> WebDriverResult<WindowRectParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::UnknownError,
+                            "Message body was not an object");
+
+        let x = match data.get("x") {
+            Some(json) => {
+                try!(Nullable::from_json(json, |n| {
+                    Ok((try_opt!(n.as_i64(),
+                                 ErrorStatus::InvalidArgument,
+                                 "'x' is not an integer")))
+                }))
+            }
+            None => Nullable::Null,
+        };
+        let y = match data.get("y") {
+            Some(json) => {
+                try!(Nullable::from_json(json, |n| {
+                    Ok((try_opt!(n.as_i64(),
+                                 ErrorStatus::InvalidArgument,
+                                 "'y' is not an integer")))
+                }))
+            }
+            None => Nullable::Null,
+        };
+        let width = match data.get("width") {
+            Some(json) => {
+                try!(Nullable::from_json(json, |n| {
+                    Ok((try_opt!(n.as_u64(),
+                                 ErrorStatus::InvalidArgument,
+                                 "'width' is not a positive integer")))
+                }))
+            }
+            None => Nullable::Null,
+        };
+        let height = match data.get("height") {
+            Some(json) => {
+                try!(Nullable::from_json(json, |n| {
+                    Ok((try_opt!(n.as_u64(),
+                                 ErrorStatus::InvalidArgument,
+                                 "'height' is not a positive integer")))
+                }))
+            }
+            None => Nullable::Null,
+        };
+
+        Ok(WindowRectParameters {
+               x: x,
+               y: y,
+               width: width,
+               height: height,
+           })
+    }
+}
+
+impl ToJson for WindowRectParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("x".to_string(), self.x.to_json());
+        data.insert("y".to_string(), self.y.to_json());
+        data.insert("width".to_string(), self.width.to_json());
+        data.insert("height".to_string(), self.height.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct SwitchToWindowParameters {
+    pub handle: String
+}
+
+impl Parameters for SwitchToWindowParameters {
+    fn from_json(body: &Json) -> WebDriverResult<SwitchToWindowParameters> {
+        let data = try_opt!(body.as_object(), ErrorStatus::UnknownError,
+                            "Message body was not an object");
+        let handle = try_opt!(
+            try_opt!(data.get("handle"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'handle' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "'handle' not a string");
+        return Ok(SwitchToWindowParameters {
+            handle: handle.to_string()
+        })
+    }
+}
+
+impl ToJson for SwitchToWindowParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("handle".to_string(), self.handle.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct LocatorParameters {
+    pub using: LocatorStrategy,
+    pub value: String
+}
+
+impl Parameters for LocatorParameters {
+    fn from_json(body: &Json) -> WebDriverResult<LocatorParameters> {
+        let data = try_opt!(body.as_object(), ErrorStatus::UnknownError,
+                            "Message body was not an object");
+
+        let using = try!(LocatorStrategy::from_json(
+            try_opt!(data.get("using"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'using' parameter")));
+
+        let value = try_opt!(
+            try_opt!(data.get("value"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'value' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "Could not convert using to string").to_string();
+
+        return Ok(LocatorParameters {
+            using: using,
+            value: value
+        })
+    }
+}
+
+impl ToJson for LocatorParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("using".to_string(), self.using.to_json());
+        data.insert("value".to_string(), self.value.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct SwitchToFrameParameters {
+    pub id: FrameId
+}
+
+impl Parameters for SwitchToFrameParameters {
+    fn from_json(body: &Json) -> WebDriverResult<SwitchToFrameParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::UnknownError,
+                            "Message body was not an object");
+        let id = try!(FrameId::from_json(try_opt!(data.get("id"),
+                                                  ErrorStatus::UnknownError,
+                                                  "Missing 'id' parameter")));
+
+        Ok(SwitchToFrameParameters {
+            id: id
+        })
+    }
+}
+
+impl ToJson for SwitchToFrameParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("id".to_string(), self.id.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct SendKeysParameters {
+    pub text: String
+}
+
+impl Parameters for SendKeysParameters {
+    fn from_json(body: &Json) -> WebDriverResult<SendKeysParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Message body was not an object");
+        let text = try_opt!(try_opt!(data.get("text"),
+                                     ErrorStatus::InvalidArgument,
+                                     "Missing 'text' parameter").as_string(),
+                            ErrorStatus::InvalidArgument,
+                            "Could not convert 'text' to string");
+
+        Ok(SendKeysParameters {
+            text: text.into()
+        })
+    }
+}
+
+impl ToJson for SendKeysParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("value".to_string(), self.text.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct JavascriptCommandParameters {
+    pub script: String,
+    pub args: Nullable<Vec<Json>>
+}
+
+impl Parameters for JavascriptCommandParameters {
+    fn from_json(body: &Json) -> WebDriverResult<JavascriptCommandParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Message body was not an object");
+
+        let args_json = try_opt!(data.get("args"),
+                                 ErrorStatus::InvalidArgument,
+                                 "Missing args parameter");
+
+        let args = try!(Nullable::from_json(
+            args_json,
+            |x| {
+                Ok((try_opt!(x.as_array(),
+                             ErrorStatus::InvalidArgument,
+                             "Failed to convert args to Array")).clone())
+            }));
+
+         //TODO: Look for WebElements in args?
+        let script = try_opt!(
+            try_opt!(data.get("script"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing script parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "Failed to convert script to String");
+        Ok(JavascriptCommandParameters {
+            script: script.to_string(),
+            args: args.clone()
+        })
+    }
+}
+
+impl ToJson for JavascriptCommandParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        //TODO: Wrap script so that it becomes marionette-compatible
+        data.insert("script".to_string(), self.script.to_json());
+        data.insert("args".to_string(), self.args.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct GetNamedCookieParameters {
+    pub name: Nullable<String>,
+}
+
+impl Parameters for GetNamedCookieParameters {
+    fn from_json(body: &Json) -> WebDriverResult<GetNamedCookieParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Message body was not an object");
+        let name_json = try_opt!(data.get("name"),
+                                 ErrorStatus::InvalidArgument,
+                                 "Missing 'name' parameter");
+        let name = try!(Nullable::from_json(name_json, |x| {
+            Ok(try_opt!(x.as_string(),
+                        ErrorStatus::InvalidArgument,
+                        "Failed to convert name to string")
+                .to_string())
+        }));
+        return Ok(GetNamedCookieParameters { name: name });
+    }
+}
+
+impl ToJson for GetNamedCookieParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("name".to_string(), self.name.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct AddCookieParameters {
+    pub name: String,
+    pub value: String,
+    pub path: Nullable<String>,
+    pub domain: Nullable<String>,
+    pub expiry: Nullable<Date>,
+    pub secure: bool,
+    pub httpOnly: bool
+}
+
+impl Parameters for AddCookieParameters {
+    fn from_json(body: &Json) -> WebDriverResult<AddCookieParameters> {
+        if !body.is_object() {
+            return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                           "Message body was not an object"));
+        }
+
+        let data = try_opt!(body.find("cookie").and_then(|x| x.as_object()),
+                            ErrorStatus::UnableToSetCookie,
+                            "Cookie parameter not found or not an object");
+
+        let name = try_opt!(
+            try_opt!(data.get("name"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'name' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "'name' is not a string").to_string();
+
+        let value = try_opt!(
+            try_opt!(data.get("value"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'value' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "'value' is not a string").to_string();
+
+        let path = match data.get("path") {
+            Some(path_json) => {
+                try!(Nullable::from_json(
+                    path_json,
+                    |x| {
+                        Ok(try_opt!(x.as_string(),
+                                    ErrorStatus::InvalidArgument,
+                                    "Failed to convert path to String").to_string())
+                    }))
+            },
+            None => Nullable::Null
+        };
+
+        let domain = match data.get("domain") {
+            Some(domain_json) => {
+                try!(Nullable::from_json(
+                    domain_json,
+                    |x| {
+                        Ok(try_opt!(x.as_string(),
+                                    ErrorStatus::InvalidArgument,
+                                    "Failed to convert domain to String").to_string())
+                    }))
+            },
+            None => Nullable::Null
+        };
+
+        let expiry = match data.get("expiry") {
+            Some(expiry_json) => {
+                try!(Nullable::from_json(
+                    expiry_json,
+                    |x| {
+                        Ok(Date::new(try_opt!(x.as_u64(),
+                                              ErrorStatus::InvalidArgument,
+                                              "Failed to convert expiry to Date")))
+                    }))
+            },
+            None => Nullable::Null
+        };
+
+        let secure = match data.get("secure") {
+            Some(x) => try_opt!(x.as_boolean(),
+                                ErrorStatus::InvalidArgument,
+                                "Failed to convert secure to boolean"),
+            None => false
+        };
+
+        let http_only = match data.get("httpOnly") {
+            Some(x) => try_opt!(x.as_boolean(),
+                                ErrorStatus::InvalidArgument,
+                                "Failed to convert httpOnly to boolean"),
+            None => false
+        };
+
+        return Ok(AddCookieParameters {
+            name: name,
+            value: value,
+            path: path,
+            domain: domain,
+            expiry: expiry,
+            secure: secure,
+            httpOnly: http_only
+        })
+    }
+}
+
+impl ToJson for AddCookieParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("name".to_string(), self.name.to_json());
+        data.insert("value".to_string(), self.value.to_json());
+        data.insert("path".to_string(), self.path.to_json());
+        data.insert("domain".to_string(), self.domain.to_json());
+        data.insert("expiry".to_string(), self.expiry.to_json());
+        data.insert("secure".to_string(), self.secure.to_json());
+        data.insert("httpOnly".to_string(), self.httpOnly.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct TakeScreenshotParameters {
+    pub element: Nullable<WebElement>
+}
+
+impl Parameters for TakeScreenshotParameters {
+    fn from_json(body: &Json) -> WebDriverResult<TakeScreenshotParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Message body was not an object");
+        let element = match data.get("element") {
+            Some(element_json) => try!(Nullable::from_json(
+                element_json,
+                |x| {
+                    Ok(try!(WebElement::from_json(x)))
+                })),
+            None => Nullable::Null
+        };
+
+        return Ok(TakeScreenshotParameters {
+            element: element
+        })
+    }
+}
+
+impl ToJson for TakeScreenshotParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("element".to_string(), self.element.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct ActionsParameters {
+    pub actions: Vec<ActionSequence>
+}
+
+impl Parameters for ActionsParameters {
+    fn from_json(body: &Json) -> WebDriverResult<ActionsParameters> {
+        try_opt!(body.as_object(),
+                 ErrorStatus::InvalidArgument,
+                 "Message body was not an object");
+        let actions = try_opt!(
+            try_opt!(body.find("actions"),
+                     ErrorStatus::InvalidArgument,
+                     "No actions parameter found").as_array(),
+            ErrorStatus::InvalidArgument,
+            "Parameter 'actions' was not an array");
+
+        let mut result = Vec::with_capacity(actions.len());
+        for chain in actions.iter() {
+            result.push(try!(ActionSequence::from_json(chain)));
+        }
+        Ok(ActionsParameters {
+            actions: result
+        })
+    }
+}
+
+impl ToJson for ActionsParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("actions".to_owned(),
+                    self.actions.iter().map(|x| x.to_json()).collect::<Vec<Json>>().to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct ActionSequence {
+    pub id: Nullable<String>,
+    pub actions: ActionsType
+}
+
+impl Parameters for ActionSequence {
+    fn from_json(body: &Json) -> WebDriverResult<ActionSequence> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Actions chain was not an object");
+
+        let type_name = try_opt!(try_opt!(data.get("type"),
+                                          ErrorStatus::InvalidArgument,
+                                          "Missing type parameter").as_string(),
+                                 ErrorStatus::InvalidArgument,
+                                 "Parameter ;type' was not a string");
+
+        let id = match data.get("id") {
+            Some(x) => Some(try_opt!(x.as_string(),
+                                     ErrorStatus::InvalidArgument,
+                                     "Parameter 'id' was not a string").to_owned()),
+            None => None
+        };
+
+
+        // Note that unlike the spec we get the pointer parameters in ActionsType::from_json
+
+        let actions = match type_name {
+            "none" | "key" | "pointer" => try!(ActionsType::from_json(&body)),
+            _ => return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                "Invalid action type"))
+        };
+
+        Ok(ActionSequence {
+            id: id.into(),
+            actions: actions
+        })
+    }
+}
+
+impl ToJson for ActionSequence {
+    fn to_json(&self) -> Json {
+        let mut data: BTreeMap<String, Json> = BTreeMap::new();
+        data.insert("id".into(), self.id.to_json());
+        let (action_type, actions) = match self.actions {
+            ActionsType::Null(ref actions) => {
+                ("none",
+                 actions.iter().map(|x| x.to_json()).collect::<Vec<Json>>())
+            }
+            ActionsType::Key(ref actions) => {
+                ("key",
+                 actions.iter().map(|x| x.to_json()).collect::<Vec<Json>>())
+            }
+            ActionsType::Pointer(ref parameters, ref actions) => {
+                data.insert("parameters".into(), parameters.to_json());
+                ("pointer",
+                 actions.iter().map(|x| x.to_json()).collect::<Vec<Json>>())
+            }
+        };
+        data.insert("type".into(), action_type.to_json());
+        data.insert("actions".into(), actions.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub enum ActionsType {
+    Null(Vec<NullActionItem>),
+    Key(Vec<KeyActionItem>),
+    Pointer(PointerActionParameters, Vec<PointerActionItem>)
+}
+
+impl Parameters for ActionsType {
+    fn from_json(body: &Json) -> WebDriverResult<ActionsType> {
+        // These unwraps are OK as long as this is only called from ActionSequence::from_json
+        let data = body.as_object().expect("Body should be a JSON Object");
+        let actions_type = body.find("type").and_then(|x| x.as_string()).expect("Type should be a string");
+        let actions_chain = try_opt!(try_opt!(data.get("actions"),
+                                              ErrorStatus::InvalidArgument,
+                                              "Missing actions parameter").as_array(),
+                                     ErrorStatus::InvalidArgument,
+                                     "Parameter 'actions' was not an array");
+        match actions_type {
+            "none" => {
+                let mut actions = Vec::with_capacity(actions_chain.len());
+                for action_body in actions_chain.iter() {
+                    actions.push(try!(NullActionItem::from_json(action_body)));
+                };
+                Ok(ActionsType::Null(actions))
+            },
+            "key" => {
+                let mut actions = Vec::with_capacity(actions_chain.len());
+                for action_body in actions_chain.iter() {
+                    actions.push(try!(KeyActionItem::from_json(action_body)));
+                };
+                Ok(ActionsType::Key(actions))
+            },
+            "pointer" => {
+                let mut actions = Vec::with_capacity(actions_chain.len());
+                let parameters = match data.get("parameters") {
+                    Some(x) => try!(PointerActionParameters::from_json(x)),
+                    None => Default::default()
+                };
+
+                for action_body in actions_chain.iter() {
+                    actions.push(try!(PointerActionItem::from_json(action_body)));
+                }
+                Ok(ActionsType::Pointer(parameters, actions))
+            }
+            _ => panic!("Got unexpected action type after checking type")
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub enum PointerType {
+    Mouse,
+    Pen,
+    Touch,
+}
+
+impl Parameters for PointerType {
+    fn from_json(body: &Json) -> WebDriverResult<PointerType> {
+        match body.as_string() {
+            Some("mouse") => Ok(PointerType::Mouse),
+            Some("pen") => Ok(PointerType::Pen),
+            Some("touch") => Ok(PointerType::Touch),
+            Some(_) => Err(WebDriverError::new(
+                ErrorStatus::InvalidArgument,
+                "Unsupported pointer type"
+            )),
+            None => Err(WebDriverError::new(
+                ErrorStatus::InvalidArgument,
+                "Pointer type was not a string"
+            ))
+        }
+    }
+}
+
+impl ToJson for PointerType {
+    fn to_json(&self) -> Json {
+        match *self {
+            PointerType::Mouse => "mouse".to_json(),
+            PointerType::Pen => "pen".to_json(),
+            PointerType::Touch => "touch".to_json(),
+        }.to_json()
+    }
+}
+
+impl Default for PointerType {
+    fn default() -> PointerType {
+        PointerType::Mouse
+    }
+}
+
+#[derive(Default, PartialEq)]
+pub struct PointerActionParameters {
+    pub pointer_type: PointerType
+}
+
+impl Parameters for PointerActionParameters {
+    fn from_json(body: &Json) -> WebDriverResult<PointerActionParameters> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Parameter 'parameters' was not an object");
+        let pointer_type = match data.get("pointerType") {
+            Some(x) => try!(PointerType::from_json(x)),
+            None => PointerType::default()
+        };
+        Ok(PointerActionParameters {
+            pointer_type: pointer_type
+        })
+    }
+}
+
+impl ToJson for PointerActionParameters {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("pointerType".to_owned(),
+                    self.pointer_type.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub enum NullActionItem {
+    General(GeneralAction)
+}
+
+impl Parameters for NullActionItem {
+    fn from_json(body: &Json) -> WebDriverResult<NullActionItem> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Actions chain was not an object");
+        let type_name = try_opt!(
+            try_opt!(data.get("type"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'type' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "Parameter 'type' was not a string");
+        match type_name {
+            "pause" => Ok(NullActionItem::General(
+                try!(GeneralAction::from_json(body)))),
+            _ => return Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                "Invalid type attribute"))
+        }
+    }
+}
+
+impl ToJson for NullActionItem {
+    fn to_json(&self) -> Json {
+        match self {
+            &NullActionItem::General(ref x) => x.to_json(),
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub enum KeyActionItem {
+    General(GeneralAction),
+    Key(KeyAction)
+}
+
+impl Parameters for KeyActionItem {
+    fn from_json(body: &Json) -> WebDriverResult<KeyActionItem> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Key action item was not an object");
+        let type_name = try_opt!(
+            try_opt!(data.get("type"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'type' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "Parameter 'type' was not a string");
+        match type_name {
+            "pause" => Ok(KeyActionItem::General(
+                try!(GeneralAction::from_json(body)))),
+            _ => Ok(KeyActionItem::Key(
+                try!(KeyAction::from_json(body))))
+        }
+    }
+}
+
+impl ToJson for KeyActionItem {
+    fn to_json(&self) -> Json {
+        match *self {
+            KeyActionItem::General(ref x) => x.to_json(),
+            KeyActionItem::Key(ref x) => x.to_json()
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub enum PointerActionItem {
+    General(GeneralAction),
+    Pointer(PointerAction)
+}
+
+impl Parameters for PointerActionItem {
+    fn from_json(body: &Json) -> WebDriverResult<PointerActionItem> {
+        let data = try_opt!(body.as_object(),
+                            ErrorStatus::InvalidArgument,
+                            "Pointer action item was not an object");
+        let type_name = try_opt!(
+            try_opt!(data.get("type"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing 'type' parameter").as_string(),
+            ErrorStatus::InvalidArgument,
+            "Parameter 'type' was not a string");
+
+        match type_name {
+            "pause" => Ok(PointerActionItem::General(try!(GeneralAction::from_json(body)))),
+            _ => Ok(PointerActionItem::Pointer(try!(PointerAction::from_json(body))))
+        }
+    }
+}
+
+impl ToJson for PointerActionItem {
+    fn to_json(&self) -> Json {
+        match self {
+            &PointerActionItem::General(ref x) => x.to_json(),
+            &PointerActionItem::Pointer(ref x) => x.to_json()
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub enum GeneralAction {
+    Pause(PauseAction)
+}
+
+impl Parameters for GeneralAction {
+    fn from_json(body: &Json) -> WebDriverResult<GeneralAction> {
+        match body.find("type").and_then(|x| x.as_string()) {
+            Some("pause") => Ok(GeneralAction::Pause(try!(PauseAction::from_json(body)))),
+            _ => Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                         "Invalid or missing type attribute"))
+        }
+    }
+}
+
+impl ToJson for GeneralAction {
+    fn to_json(&self) -> Json {
+        match self {
+            &GeneralAction::Pause(ref x) => x.to_json()
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub struct PauseAction {
+    pub duration: u64
+}
+
+impl Parameters for PauseAction {
+    fn from_json(body: &Json) -> WebDriverResult<PauseAction> {
+        let default = Json::U64(0);
+        Ok(PauseAction {
+            duration: try_opt!(body.find("duration").unwrap_or(&default).as_u64(),
+                               ErrorStatus::InvalidArgument,
+                               "Parameter 'duration' was not a positive integer")
+        })
+    }
+}
+
+impl ToJson for PauseAction {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("type".to_owned(),
+                    "pause".to_json());
+        data.insert("duration".to_owned(),
+                    self.duration.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub enum KeyAction {
+    Up(KeyUpAction),
+    Down(KeyDownAction)
+}
+
+impl Parameters for KeyAction {
+    fn from_json(body: &Json) -> WebDriverResult<KeyAction> {
+        match body.find("type").and_then(|x| x.as_string()) {
+            Some("keyDown") => Ok(KeyAction::Down(try!(KeyDownAction::from_json(body)))),
+            Some("keyUp") => Ok(KeyAction::Up(try!(KeyUpAction::from_json(body)))),
+            Some(_) | None => Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                      "Invalid type attribute value for key action"))
+        }
+    }
+}
+
+impl ToJson for KeyAction {
+    fn to_json(&self) -> Json {
+        match self {
+            &KeyAction::Down(ref x) => x.to_json(),
+            &KeyAction::Up(ref x) => x.to_json(),
+        }
+    }
+}
+
+fn validate_key_value(value_str: &str) -> WebDriverResult<char> {
+    let mut chars = value_str.chars();
+    let value = if let Some(c) = chars.next() {
+        c
+    } else {
+        return Err(WebDriverError::new(
+            ErrorStatus::InvalidArgument,
+            "Parameter 'value' was an empty string"))
+    };
+    if chars.next().is_some() {
+        return Err(WebDriverError::new(
+            ErrorStatus::InvalidArgument,
+            "Parameter 'value' contained multiple characters"))
+    };
+    Ok(value)
+}
+
+#[derive(PartialEq)]
+pub struct KeyUpAction {
+    pub value: char
+}
+
+impl Parameters for KeyUpAction {
+    fn from_json(body: &Json) -> WebDriverResult<KeyUpAction> {
+        let value_str = try_opt!(
+                try_opt!(body.find("value"),
+                         ErrorStatus::InvalidArgument,
+                         "Missing value parameter").as_string(),
+                ErrorStatus::InvalidArgument,
+            "Parameter 'value' was not a string");
+
+        let value = try!(validate_key_value(value_str));
+        Ok(KeyUpAction {
+            value: value
+        })
+    }
+}
+
+impl ToJson for KeyUpAction {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("type".to_owned(),
+                    "keyUp".to_json());
+        data.insert("value".to_string(),
+                    self.value.to_string().to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct KeyDownAction {
+    pub value: char
+}
+
+impl Parameters for KeyDownAction {
+    fn from_json(body: &Json) -> WebDriverResult<KeyDownAction> {
+        let value_str = try_opt!(
+                try_opt!(body.find("value"),
+                         ErrorStatus::InvalidArgument,
+                         "Missing value parameter").as_string(),
+                ErrorStatus::InvalidArgument,
+            "Parameter 'value' was not a string");
+        let value = try!(validate_key_value(value_str));
+        Ok(KeyDownAction {
+            value: value
+        })
+    }
+}
+
+impl ToJson for KeyDownAction {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("type".to_owned(),
+                    "keyDown".to_json());
+        data.insert("value".to_owned(),
+                    self.value.to_string().to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub enum PointerOrigin {
+    Viewport,
+    Pointer,
+    Element(WebElement),
+}
+
+impl Parameters for PointerOrigin {
+    fn from_json(body: &Json) -> WebDriverResult<PointerOrigin> {
+        match *body {
+            Json::String(ref x) => {
+                match &**x {
+                    "viewport" => Ok(PointerOrigin::Viewport),
+                    "pointer" => Ok(PointerOrigin::Pointer),
+                    _ => Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                                 "Unknown pointer origin"))
+                }
+            },
+            Json::Object(_) => Ok(PointerOrigin::Element(try!(WebElement::from_json(body)))),
+            _ => Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                        "Pointer origin was not a string or an object"))
+        }
+    }
+}
+
+impl ToJson for PointerOrigin {
+    fn to_json(&self) -> Json {
+        match *self {
+            PointerOrigin::Viewport => "viewport".to_json(),
+            PointerOrigin::Pointer => "pointer".to_json(),
+            PointerOrigin::Element(ref x) => x.to_json(),
+        }
+    }
+}
+
+impl Default for PointerOrigin {
+    fn default() -> PointerOrigin {
+        PointerOrigin::Viewport
+    }
+}
+
+#[derive(PartialEq)]
+pub enum PointerAction {
+    Up(PointerUpAction),
+    Down(PointerDownAction),
+    Move(PointerMoveAction),
+    Cancel
+}
+
+impl Parameters for PointerAction {
+    fn from_json(body: &Json) -> WebDriverResult<PointerAction> {
+        match body.find("type").and_then(|x| x.as_string()) {
+            Some("pointerUp") => Ok(PointerAction::Up(try!(PointerUpAction::from_json(body)))),
+            Some("pointerDown") => Ok(PointerAction::Down(try!(PointerDownAction::from_json(body)))),
+            Some("pointerMove") => Ok(PointerAction::Move(try!(PointerMoveAction::from_json(body)))),
+            Some("pointerCancel") => Ok(PointerAction::Cancel),
+            Some(_) | None => Err(WebDriverError::new(
+                ErrorStatus::InvalidArgument,
+                "Missing or invalid type argument for pointer action"))
+        }
+    }
+}
+
+impl ToJson for PointerAction {
+    fn to_json(&self) -> Json {
+        match self {
+            &PointerAction::Down(ref x) => x.to_json(),
+            &PointerAction::Up(ref x) => x.to_json(),
+            &PointerAction::Move(ref x) => x.to_json(),
+            &PointerAction::Cancel => {
+                let mut data = BTreeMap::new();
+                data.insert("type".to_owned(),
+                            "pointerCancel".to_json());
+                Json::Object(data)
+            }
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub struct PointerUpAction {
+    pub button: u64,
+}
+
+impl Parameters for PointerUpAction {
+    fn from_json(body: &Json) -> WebDriverResult<PointerUpAction> {
+        let button = try_opt!(
+            try_opt!(body.find("button"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing button parameter").as_u64(),
+            ErrorStatus::InvalidArgument,
+            "Parameter 'button' was not a positive integer");
+
+        Ok(PointerUpAction {
+            button: button
+        })
+    }
+}
+
+impl ToJson for PointerUpAction {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("type".to_owned(),
+                    "pointerUp".to_json());
+        data.insert("button".to_owned(), self.button.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct PointerDownAction {
+    pub button: u64,
+}
+
+impl Parameters for PointerDownAction {
+    fn from_json(body: &Json) -> WebDriverResult<PointerDownAction> {
+        let button = try_opt!(
+            try_opt!(body.find("button"),
+                     ErrorStatus::InvalidArgument,
+                     "Missing button parameter").as_u64(),
+            ErrorStatus::InvalidArgument,
+            "Parameter 'button' was not a positive integer");
+
+        Ok(PointerDownAction {
+            button: button
+        })
+    }
+}
+
+impl ToJson for PointerDownAction {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("type".to_owned(),
+                    "pointerDown".to_json());
+        data.insert("button".to_owned(), self.button.to_json());
+        Json::Object(data)
+    }
+}
+
+#[derive(PartialEq)]
+pub struct PointerMoveAction {
+    pub duration: Nullable<u64>,
+    pub origin: PointerOrigin,
+    pub x: Nullable<i64>,
+    pub y: Nullable<i64>
+}
+
+impl Parameters for PointerMoveAction {
+    fn from_json(body: &Json) -> WebDriverResult<PointerMoveAction> {
+        let duration = match body.find("duration") {
+            Some(duration) => Some(try_opt!(duration.as_u64(),
+                                            ErrorStatus::InvalidArgument,
+                                            "Parameter 'duration' was not a positive integer")),
+            None => None
+
+        };
+
+        let origin = match body.find("origin") {
+            Some(o) => try!(PointerOrigin::from_json(o)),
+            None => PointerOrigin::default()
+        };
+
+        let x = match body.find("x") {
+            Some(x) => {
+                Some(try_opt!(x.as_i64(),
+                              ErrorStatus::InvalidArgument,
+                              "Parameter 'x' was not an integer"))
+            },
+            None => None
+        };
+
+        let y = match body.find("y") {
+            Some(y) => {
+                Some(try_opt!(y.as_i64(),
+                              ErrorStatus::InvalidArgument,
+                              "Parameter 'y' was not an integer"))
+            },
+            None => None
+        };
+
+        Ok(PointerMoveAction {
+            duration: duration.into(),
+            origin: origin.into(),
+            x: x.into(),
+            y: y.into(),
+        })
+    }
+}
+
+impl ToJson for PointerMoveAction {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("type".to_owned(), "pointerMove".to_json());
+        if self.duration.is_value() {
+            data.insert("duration".to_owned(),
+                        self.duration.to_json());
+        }
+
+        data.insert("origin".to_owned(), self.origin.to_json());
+
+        if self.x.is_value() {
+            data.insert("x".to_owned(), self.x.to_json());
+        }
+        if self.y.is_value() {
+            data.insert("y".to_owned(), self.y.to_json());
+        }
+        Json::Object(data)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use rustc_serialize::json::Json;
+    use super::{Nullable, Parameters, WindowRectParameters};
+
+    #[test]
+    fn test_window_rect() {
+        let expected = WindowRectParameters {
+            x: Nullable::Value(0i64),
+            y: Nullable::Value(1i64),
+            width: Nullable::Value(2u64),
+            height: Nullable::Value(3u64),
+        };
+        let actual = Json::from_str(r#"{"x": 0, "y": 1, "width": 2, "height": 3}"#).unwrap();
+        assert_eq!(expected, Parameters::from_json(&actual).unwrap());
+    }
+
+    #[test]
+    fn test_window_rect_nullable() {
+        let expected = WindowRectParameters {
+            x: Nullable::Value(0i64),
+            y: Nullable::Null,
+            width: Nullable::Value(2u64),
+            height: Nullable::Null,
+        };
+        let actual = Json::from_str(r#"{"x": 0, "y": null, "width": 2, "height": null}"#).unwrap();
+        assert_eq!(expected, Parameters::from_json(&actual).unwrap());
+    }
+
+    #[test]
+    fn test_window_rect_missing_fields() {
+        let expected = WindowRectParameters {
+            x: Nullable::Value(0i64),
+            y: Nullable::Null,
+            width: Nullable::Value(2u64),
+            height: Nullable::Null,
+        };
+        let actual = Json::from_str(r#"{"x": 0, "width": 2}"#).unwrap();
+        assert_eq!(expected, Parameters::from_json(&actual).unwrap());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/common.rs
@@ -0,0 +1,219 @@
+use rustc_serialize::{Encodable, Encoder};
+use rustc_serialize::json::{Json, ToJson};
+use std::collections::BTreeMap;
+
+use error::{WebDriverResult, WebDriverError, ErrorStatus};
+
+pub static ELEMENT_KEY: &'static str = "element-6066-11e4-a52e-4f735466cecf";
+
+#[derive(RustcEncodable, PartialEq, Clone, Debug)]
+pub struct Date(pub u64);
+
+impl Date {
+    pub fn new(timestamp: u64) -> Date {
+        Date(timestamp)
+    }
+}
+
+impl ToJson for Date {
+    fn to_json(&self) -> Json {
+        let &Date(x) = self;
+        x.to_json()
+    }
+}
+
+#[derive(PartialEq, Clone, Debug)]
+pub enum Nullable<T: ToJson> {
+    Value(T),
+    Null
+}
+
+impl<T: ToJson> Nullable<T> {
+     pub fn is_null(&self) -> bool {
+        match *self {
+            Nullable::Value(_) => false,
+            Nullable::Null => true
+        }
+    }
+
+     pub fn is_value(&self) -> bool {
+        match *self {
+            Nullable::Value(_) => true,
+            Nullable::Null => false
+        }
+    }
+
+    pub fn map<F, U: ToJson>(self, f: F) -> Nullable<U>
+        where F: FnOnce(T) -> U {
+        match self {
+            Nullable::Value(val) => Nullable::Value(f(val)),
+            Nullable::Null => Nullable::Null
+        }
+    }
+}
+
+impl<T: ToJson> Nullable<T> {
+    //This is not very pretty
+    pub fn from_json<F: FnOnce(&Json) -> WebDriverResult<T>>(value: &Json, f: F) -> WebDriverResult<Nullable<T>> {
+        if value.is_null() {
+            Ok(Nullable::Null)
+        } else {
+            Ok(Nullable::Value(try!(f(value))))
+        }
+    }
+}
+
+impl<T: ToJson> ToJson for Nullable<T> {
+    fn to_json(&self) -> Json {
+        match *self {
+            Nullable::Value(ref x) => x.to_json(),
+            Nullable::Null => Json::Null
+        }
+    }
+}
+
+impl<T: ToJson> Encodable for Nullable<T> {
+    fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+        match *self {
+            Nullable::Value(ref x) => x.to_json().encode(s),
+            Nullable::Null => s.emit_option_none()
+        }
+    }
+}
+
+impl<T: ToJson> Into<Option<T>> for Nullable<T> {
+    fn into(self) -> Option<T> {
+        match self {
+            Nullable::Value(val) => Some(val),
+            Nullable::Null => None
+        }
+    }
+}
+
+impl<T: ToJson> From<Option<T>> for Nullable<T> {
+    fn from(option: Option<T>) -> Nullable<T> {
+        match option {
+            Some(val) => Nullable::Value(val),
+            None => Nullable::Null,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct WebElement {
+    pub id: String
+}
+
+impl WebElement {
+    pub fn new(id: String) -> WebElement {
+        WebElement {
+            id: id
+        }
+    }
+
+    pub fn from_json(data: &Json) -> WebDriverResult<WebElement> {
+        let object = try_opt!(data.as_object(),
+                              ErrorStatus::InvalidArgument,
+                              "Could not convert webelement to object");
+        let id_value = try_opt!(object.get(ELEMENT_KEY),
+                                ErrorStatus::InvalidArgument,
+                                "Could not find webelement key");
+
+        let id = try_opt!(id_value.as_string(),
+                          ErrorStatus::InvalidArgument,
+                          "Could not convert web element to string").to_string();
+
+        Ok(WebElement::new(id))
+    }
+}
+
+impl ToJson for WebElement {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert(ELEMENT_KEY.to_string(), self.id.to_json());
+        Json::Object(data)
+    }
+}
+
+impl <T> From<T> for WebElement
+    where T: Into<String> {
+    fn from(data: T) -> WebElement {
+        WebElement::new(data.into())
+    }
+}
+
+#[derive(PartialEq, Debug)]
+pub enum FrameId {
+    Short(u16),
+    Element(WebElement),
+    Null
+}
+
+impl FrameId {
+    pub fn from_json(data: &Json) -> WebDriverResult<FrameId> {
+        match data {
+            &Json::U64(x) => {
+                if x > u16::max_value() as u64 || x < u16::min_value() as u64 {
+                    return Err(WebDriverError::new(ErrorStatus::NoSuchFrame,
+                                                   "frame id out of range"))
+                };
+                Ok(FrameId::Short(x as u16))
+            },
+            &Json::Null => Ok(FrameId::Null),
+            &Json::Object(_) => Ok(FrameId::Element(
+                try!(WebElement::from_json(data)))),
+            _ => Err(WebDriverError::new(ErrorStatus::NoSuchFrame,
+                                         "frame id has unexpected type"))
+        }
+    }
+}
+
+impl ToJson for FrameId {
+    fn to_json(&self) -> Json {
+        match *self {
+            FrameId::Short(x) => {
+                Json::U64(x as u64)
+            },
+            FrameId::Element(ref x) => {
+                Json::String(x.id.clone())
+            },
+            FrameId::Null => {
+                Json::Null
+            }
+        }
+    }
+}
+
+#[derive(PartialEq)]
+pub enum LocatorStrategy {
+    CSSSelector,
+    LinkText,
+    PartialLinkText,
+    XPath
+}
+
+impl LocatorStrategy {
+    pub fn from_json(body: &Json) -> WebDriverResult<LocatorStrategy> {
+        match try_opt!(body.as_string(),
+                       ErrorStatus::InvalidArgument,
+                       "Cound not convert strategy to string") {
+            "css selector" => Ok(LocatorStrategy::CSSSelector),
+            "link text" => Ok(LocatorStrategy::LinkText),
+            "partial link text" => Ok(LocatorStrategy::PartialLinkText),
+            "xpath" => Ok(LocatorStrategy::XPath),
+            x => Err(WebDriverError::new(ErrorStatus::InvalidArgument,
+                                         format!("Unknown locator strategy {}", x)))
+        }
+    }
+}
+
+impl ToJson for LocatorStrategy {
+    fn to_json(&self) -> Json {
+        Json::String(match *self {
+            LocatorStrategy::CSSSelector => "css selector",
+            LocatorStrategy::LinkText => "link text",
+            LocatorStrategy::PartialLinkText => "partial link text",
+            LocatorStrategy::XPath => "xpath"
+        }.to_string())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/error.rs
@@ -0,0 +1,318 @@
+use backtrace::Backtrace;
+use hyper::status::StatusCode;
+use rustc_serialize::base64::FromBase64Error;
+use rustc_serialize::json::{DecoderError, Json, ParserError, ToJson};
+use std::borrow::Cow;
+use std::collections::BTreeMap;
+use std::convert::From;
+use std::error::Error;
+use std::fmt;
+use std::io;
+
+#[derive(PartialEq, Debug)]
+pub enum ErrorStatus {
+    /// The [`ElementClick`] command could not be completed because the
+    /// [element] receiving the events is obscuring the element that was
+    /// requested clicked.
+    ///
+    /// [`ElementClick`]:
+    /// ../command/enum.WebDriverCommand.html#variant.ElementClick
+    /// [element]: ../common/struct.WebElement.html
+    ElementClickIntercepted,
+
+    /// A [command] could not be completed because the element is not pointer-
+    /// or keyboard interactable.
+    ///
+    /// [command]: ../command/index.html
+    ElementNotInteractable,
+
+    /// An attempt was made to select an [element] that cannot be selected.
+    ///
+    /// [element]: ../common/struct.WebElement.html
+    ElementNotSelectable,
+
+    /// Navigation caused the user agent to hit a certificate warning, which is
+    /// usually the result of an expired or invalid TLS certificate.
+    InsecureCertificate,
+
+    /// The arguments passed to a [command] are either invalid or malformed.
+    ///
+    /// [command]: ../command/index.html
+    InvalidArgument,
+
+    /// An illegal attempt was made to set a cookie under a different domain
+    /// than the current page.
+    InvalidCookieDomain,
+
+    /// The coordinates provided to an interactions operation are invalid.
+    InvalidCoordinates,
+
+    /// A [command] could not be completed because the element is an invalid
+    /// state, e.g. attempting to click an element that is no longer attached
+    /// to the document.
+    ///
+    /// [command]: ../command/index.html
+    InvalidElementState,
+
+    /// Argument was an invalid selector.
+    InvalidSelector,
+
+    /// Occurs if the given session ID is not in the list of active sessions,
+    /// meaning the session either does not exist or that it’s not active.
+    InvalidSessionId,
+
+    /// An error occurred while executing JavaScript supplied by the user.
+    JavascriptError,
+
+    /// The target for mouse interaction is not in the browser’s viewport and
+    /// cannot be brought into that viewport.
+    MoveTargetOutOfBounds,
+
+    /// An attempt was made to operate on a modal dialogue when one was not
+    /// open.
+    NoSuchAlert,
+
+    /// No cookie matching the given path name was found amongst the associated
+    /// cookies of the current browsing context’s active document.
+    NoSuchCookie,
+
+    /// An [element] could not be located on the page using the given search
+    /// parameters.
+    ///
+    /// [element]: ../common/struct.WebElement.html
+    NoSuchElement,
+
+    /// A [command] to switch to a frame could not be satisfied because the
+    /// frame could not be found.
+    ///
+    /// [command]: ../command/index.html
+    NoSuchFrame,
+
+    /// A [command] to switch to a window could not be satisfied because the
+    /// window could not be found.
+    ///
+    /// [command]: ../command/index.html
+    NoSuchWindow,
+
+    /// A script did not complete before its timeout expired.
+    ScriptTimeout,
+
+    /// A new session could not be created.
+    SessionNotCreated,
+
+    /// A [command] failed because the referenced [element] is no longer
+    /// attached to the DOM.
+    ///
+    /// [command]: ../command/index.html
+    /// [element]: ../common/struct.WebElement.html
+    StaleElementReference,
+
+    /// An operation did not complete before its timeout expired.
+    Timeout,
+
+    /// A screen capture was made impossible.
+    UnableToCaptureScreen,
+
+    /// Setting the cookie’s value could not be done.
+    UnableToSetCookie,
+
+    /// A modal dialogue was open, blocking this operation.
+    UnexpectedAlertOpen,
+
+    /// The requested command could not be executed because it does not exist.
+    UnknownCommand,
+
+    /// An unknown error occurred in the remote end whilst processing the
+    /// [command].
+    ///
+    /// [command]: ../command/index.html
+    UnknownError,
+
+    /// The requested [command] matched a known endpoint, but did not match a
+    /// method for that endpoint.
+    ///
+    /// [command]: ../command/index.html
+    UnknownMethod,
+
+    UnknownPath,
+
+    /// Indicates that a [command] that should have executed properly is not
+    /// currently supported.
+    UnsupportedOperation,
+}
+
+
+impl ErrorStatus {
+    pub fn error_code(&self) -> &'static str {
+        match *self {
+            ErrorStatus::ElementClickIntercepted => "element click intercepted",
+            ErrorStatus::ElementNotInteractable => "element not interactable",
+            ErrorStatus::ElementNotSelectable => "element not selectable",
+            ErrorStatus::InsecureCertificate => "insecure certificate",
+            ErrorStatus::InvalidArgument => "invalid argument",
+            ErrorStatus::InvalidCookieDomain => "invalid cookie domain",
+            ErrorStatus::InvalidCoordinates => "invalid coordinates",
+            ErrorStatus::InvalidElementState => "invalid element state",
+            ErrorStatus::InvalidSelector => "invalid selector",
+            ErrorStatus::InvalidSessionId => "invalid session id",
+            ErrorStatus::JavascriptError => "javascript error",
+            ErrorStatus::MoveTargetOutOfBounds => "move target out of bounds",
+            ErrorStatus::NoSuchAlert => "no such alert",
+            ErrorStatus::NoSuchCookie => "no such cookie",
+            ErrorStatus::NoSuchElement => "no such element",
+            ErrorStatus::NoSuchFrame => "no such frame",
+            ErrorStatus::NoSuchWindow => "no such window",
+            ErrorStatus::ScriptTimeout => "script timeout",
+            ErrorStatus::SessionNotCreated => "session not created",
+            ErrorStatus::StaleElementReference => "stale element reference",
+            ErrorStatus::Timeout => "timeout",
+            ErrorStatus::UnableToCaptureScreen => "unable to capture screen",
+            ErrorStatus::UnableToSetCookie => "unable to set cookie",
+            ErrorStatus::UnexpectedAlertOpen => "unexpected alert open",
+            ErrorStatus::UnknownCommand |
+            ErrorStatus::UnknownError => "unknown error",
+            ErrorStatus::UnknownMethod => "unknown method",
+            ErrorStatus::UnknownPath => "unknown command",
+            ErrorStatus::UnsupportedOperation => "unsupported operation",
+        }
+    }
+
+    pub fn http_status(&self) -> StatusCode {
+        match *self {
+            ErrorStatus::ElementClickIntercepted => StatusCode::BadRequest,
+            ErrorStatus::ElementNotInteractable => StatusCode::BadRequest,
+            ErrorStatus::ElementNotSelectable => StatusCode::BadRequest,
+            ErrorStatus::InsecureCertificate => StatusCode::BadRequest,
+            ErrorStatus::InvalidArgument => StatusCode::BadRequest,
+            ErrorStatus::InvalidCookieDomain => StatusCode::BadRequest,
+            ErrorStatus::InvalidCoordinates => StatusCode::BadRequest,
+            ErrorStatus::InvalidElementState => StatusCode::BadRequest,
+            ErrorStatus::InvalidSelector => StatusCode::BadRequest,
+            ErrorStatus::InvalidSessionId => StatusCode::NotFound,
+            ErrorStatus::JavascriptError => StatusCode::InternalServerError,
+            ErrorStatus::MoveTargetOutOfBounds => StatusCode::InternalServerError,
+            ErrorStatus::NoSuchAlert => StatusCode::BadRequest,
+            ErrorStatus::NoSuchCookie => StatusCode::NotFound,
+            ErrorStatus::NoSuchElement => StatusCode::NotFound,
+            ErrorStatus::NoSuchFrame => StatusCode::BadRequest,
+            ErrorStatus::NoSuchWindow => StatusCode::BadRequest,
+            ErrorStatus::ScriptTimeout => StatusCode::RequestTimeout,
+            ErrorStatus::SessionNotCreated => StatusCode::InternalServerError,
+            ErrorStatus::StaleElementReference => StatusCode::BadRequest,
+            ErrorStatus::Timeout => StatusCode::RequestTimeout,
+            ErrorStatus::UnableToCaptureScreen => StatusCode::BadRequest,
+            ErrorStatus::UnableToSetCookie => StatusCode::InternalServerError,
+            ErrorStatus::UnexpectedAlertOpen => StatusCode::InternalServerError,
+            ErrorStatus::UnknownCommand => StatusCode::NotFound,
+            ErrorStatus::UnknownError => StatusCode::InternalServerError,
+            ErrorStatus::UnknownMethod => StatusCode::MethodNotAllowed,
+            ErrorStatus::UnknownPath => StatusCode::NotFound,
+            ErrorStatus::UnsupportedOperation => StatusCode::InternalServerError,
+        }
+    }
+}
+
+pub type WebDriverResult<T> = Result<T, WebDriverError>;
+
+#[derive(Debug)]
+pub struct WebDriverError {
+    pub error: ErrorStatus,
+    pub message: Cow<'static, str>,
+    pub stack: Cow<'static, str>,
+    pub delete_session: bool,
+}
+
+impl WebDriverError {
+    pub fn new<S>(error: ErrorStatus, message: S) -> WebDriverError
+        where S: Into<Cow<'static, str>>
+    {
+        WebDriverError {
+            error: error,
+            message: message.into(),
+            stack: format!("{:?}", Backtrace::new()).into(),
+            delete_session: false,
+        }
+    }
+
+    pub fn new_with_stack<S>(error: ErrorStatus, message: S, stack: S) -> WebDriverError
+        where S: Into<Cow<'static, str>>
+    {
+        WebDriverError {
+            error: error,
+            message: message.into(),
+            stack: stack.into(),
+            delete_session: false,
+        }
+    }
+
+    pub fn error_code(&self) -> &'static str {
+        self.error.error_code()
+    }
+
+    pub fn http_status(&self) -> StatusCode {
+        self.error.http_status()
+    }
+
+    pub fn to_json_string(&self) -> String {
+        self.to_json().to_string()
+    }
+}
+
+impl ToJson for WebDriverError {
+    fn to_json(&self) -> Json {
+        let mut data = BTreeMap::new();
+        data.insert("error".into(), self.error_code().to_json());
+        data.insert("message".into(), self.message.to_json());
+        data.insert("stacktrace".into(), self.stack.to_json());
+
+        let mut wrapper = BTreeMap::new();
+        wrapper.insert("value".into(), Json::Object(data));
+        Json::Object(wrapper)
+    }
+}
+
+impl Error for WebDriverError {
+    fn description(&self) -> &str {
+        self.error_code()
+    }
+
+    fn cause(&self) -> Option<&Error> {
+        None
+    }
+}
+
+impl fmt::Display for WebDriverError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.message.fmt(f)
+    }
+}
+
+impl From<ParserError> for WebDriverError {
+    fn from(err: ParserError) -> WebDriverError {
+        WebDriverError::new(ErrorStatus::UnknownError, err.description().to_string())
+    }
+}
+
+impl From<io::Error> for WebDriverError {
+    fn from(err: io::Error) -> WebDriverError {
+        WebDriverError::new(ErrorStatus::UnknownError, err.description().to_string())
+    }
+}
+
+impl From<DecoderError> for WebDriverError {
+    fn from(err: DecoderError) -> WebDriverError {
+        WebDriverError::new(ErrorStatus::UnknownError, err.description().to_string())
+    }
+}
+
+impl From<FromBase64Error> for WebDriverError {
+    fn from(err: FromBase64Error) -> WebDriverError {
+        WebDriverError::new(ErrorStatus::UnknownError, err.description().to_string())
+    }
+}
+
+impl From<Box<Error>> for WebDriverError {
+    fn from(err: Box<Error>) -> WebDriverError {
+        WebDriverError::new(ErrorStatus::UnknownError, err.description().to_string())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/httpapi.rs
@@ -0,0 +1,240 @@
+use regex::{Regex, Captures};
+use rustc_serialize::json::Json;
+
+use hyper::method::Method;
+use hyper::method::Method::{Get, Post, Delete};
+
+use command::{WebDriverCommand, WebDriverMessage, WebDriverExtensionCommand,
+              VoidWebDriverExtensionCommand};
+use error::{WebDriverResult, WebDriverError, ErrorStatus};
+
+fn standard_routes<U:WebDriverExtensionRoute>() -> Vec<(Method, &'static str, Route<U>)> {
+    return vec![(Post, "/session", Route::NewSession),
+                (Delete, "/session/{sessionId}", Route::DeleteSession),
+                (Post, "/session/{sessionId}/url", Route::Get),
+                (Get, "/session/{sessionId}/url", Route::GetCurrentUrl),
+                (Post, "/session/{sessionId}/back", Route::GoBack),
+                (Post, "/session/{sessionId}/forward", Route::GoForward),
+                (Post, "/session/{sessionId}/refresh", Route::Refresh),
+                (Get, "/session/{sessionId}/title", Route::GetTitle),
+                (Get, "/session/{sessionId}/source", Route::GetPageSource),
+                (Get, "/session/{sessionId}/window", Route::GetWindowHandle),
+                (Get, "/session/{sessionId}/window/handles", Route::GetWindowHandles),
+                (Delete, "/session/{sessionId}/window", Route::CloseWindow),
+                (Get, "/session/{sessionId}/window/size", Route::GetWindowSize),
+                (Post, "/session/{sessionId}/window/size", Route::SetWindowSize),
+                (Get, "/session/{sessionId}/window/position", Route::GetWindowPosition),
+                (Post, "/session/{sessionId}/window/position", Route::SetWindowPosition),
+                (Get, "/session/{sessionId}/window/rect", Route::GetWindowRect),
+                (Post, "/session/{sessionId}/window/rect", Route::SetWindowRect),
+                (Post, "/session/{sessionId}/window/maximize", Route::MaximizeWindow),
+                (Post, "/session/{sessionId}/window", Route::SwitchToWindow),
+                (Post, "/session/{sessionId}/frame", Route::SwitchToFrame),
+                (Post, "/session/{sessionId}/frame/parent", Route::SwitchToParentFrame),
+                (Post, "/session/{sessionId}/element", Route::FindElement),
+                (Post, "/session/{sessionId}/elements", Route::FindElements),
+                (Post, "/session/{sessionId}/element/{elementId}/element", Route::FindElementElement),
+                (Post, "/session/{sessionId}/element/{elementId}/elements", Route::FindElementElements),
+                (Get, "/session/{sessionId}/element/active", Route::GetActiveElement),
+                (Get, "/session/{sessionId}/element/{elementId}/displayed", Route::IsDisplayed),
+                (Get, "/session/{sessionId}/element/{elementId}/selected", Route::IsSelected),
+                (Get, "/session/{sessionId}/element/{elementId}/attribute/{name}", Route::GetElementAttribute),
+                (Get, "/session/{sessionId}/element/{elementId}/property/{name}", Route::GetElementProperty),
+                (Get, "/session/{sessionId}/element/{elementId}/css/{propertyName}", Route::GetCSSValue),
+                (Get, "/session/{sessionId}/element/{elementId}/text", Route::GetElementText),
+                (Get, "/session/{sessionId}/element/{elementId}/name", Route::GetElementTagName),
+                (Get, "/session/{sessionId}/element/{elementId}/rect", Route::GetElementRect),
+                (Get, "/session/{sessionId}/element/{elementId}/enabled", Route::IsEnabled),
+                (Post, "/session/{sessionId}/execute/sync", Route::ExecuteScript),
+                (Post, "/session/{sessionId}/execute/async", Route::ExecuteAsyncScript),
+                (Get, "/session/{sessionId}/cookie", Route::GetCookies),
+                (Get, "/session/{sessionId}/cookie/{name}", Route::GetNamedCookie),
+                (Post, "/session/{sessionId}/cookie", Route::AddCookie),
+                (Delete, "/session/{sessionId}/cookie", Route::DeleteCookies),
+                (Delete, "/session/{sessionId}/cookie/{name}", Route::DeleteCookie),
+                (Get, "/session/{sessionId}/timeouts", Route::GetTimeouts),
+                (Post, "/session/{sessionId}/timeouts", Route::SetTimeouts),
+                (Post, "/session/{sessionId}/element/{elementId}/click", Route::ElementClick),
+                (Post, "/session/{sessionId}/element/{elementId}/tap", Route::ElementTap),
+                (Post, "/session/{sessionId}/element/{elementId}/clear", Route::ElementClear),
+                (Post, "/session/{sessionId}/element/{elementId}/value", Route::ElementSendKeys),
+                (Post, "/session/{sessionId}/alert/dismiss", Route::DismissAlert),
+                (Post, "/session/{sessionId}/alert/accept", Route::AcceptAlert),
+                (Get, "/session/{sessionId}/alert/text", Route::GetAlertText),
+                (Post, "/session/{sessionId}/alert/text", Route::SendAlertText),
+                (Get, "/session/{sessionId}/screenshot", Route::TakeScreenshot),
+                (Get, "/session/{sessionId}/element/{elementId}/screenshot", Route::TakeElementScreenshot),
+                (Post, "/session/{sessionId}/actions", Route::PerformActions),
+                (Delete, "/session/{sessionId}/actions", Route::ReleaseActions),
+                (Get, "/status", Route::Status),]
+}
+
+#[derive(Clone, Copy)]
+pub enum Route<U:WebDriverExtensionRoute> {
+    NewSession,
+    DeleteSession,
+    Get,
+    GetCurrentUrl,
+    GoBack,
+    GoForward,
+    Refresh,
+    GetTitle,
+    GetPageSource,
+    GetWindowHandle,
+    GetWindowHandles,
+    CloseWindow,
+    GetWindowSize,  // deprecated
+    SetWindowSize,  // deprecated
+    GetWindowPosition,  // deprecated
+    SetWindowPosition,  // deprecated
+    GetWindowRect,
+    SetWindowRect,
+    MaximizeWindow,
+    SwitchToWindow,
+    SwitchToFrame,
+    SwitchToParentFrame,
+    FindElement,
+    FindElements,
+    FindElementElement,
+    FindElementElements,
+    GetActiveElement,
+    IsDisplayed,
+    IsSelected,
+    GetElementAttribute,
+    GetElementProperty,
+    GetCSSValue,
+    GetElementText,
+    GetElementTagName,
+    GetElementRect,
+    IsEnabled,
+    ExecuteScript,
+    ExecuteAsyncScript,
+    GetCookies,
+    GetNamedCookie,
+    AddCookie,
+    DeleteCookies,
+    DeleteCookie,
+    GetTimeouts,
+    SetTimeouts,
+    ElementClick,
+    ElementTap,
+    ElementClear,
+    ElementSendKeys,
+    PerformActions,
+    ReleaseActions,
+    DismissAlert,
+    AcceptAlert,
+    GetAlertText,
+    SendAlertText,
+    TakeScreenshot,
+    TakeElementScreenshot,
+    Status,
+    Extension(U),
+}
+
+pub trait WebDriverExtensionRoute : Clone + Send + PartialEq {
+    type Command: WebDriverExtensionCommand + 'static;
+
+    fn command(&self, &Captures, &Json) -> WebDriverResult<WebDriverCommand<Self::Command>>;
+}
+
+#[derive(Clone, PartialEq)]
+pub struct VoidWebDriverExtensionRoute;
+
+impl WebDriverExtensionRoute for VoidWebDriverExtensionRoute {
+    type Command = VoidWebDriverExtensionCommand;
+
+    fn command(&self, _:&Captures, _:&Json) -> WebDriverResult<WebDriverCommand<VoidWebDriverExtensionCommand>> {
+        panic!("No extensions implemented");
+    }
+}
+
+#[derive(Clone)]
+struct RequestMatcher<U: WebDriverExtensionRoute> {
+    method: Method,
+    path_regexp: Regex,
+    match_type: Route<U>
+}
+
+impl <U: WebDriverExtensionRoute> RequestMatcher<U> {
+    pub fn new(method: Method, path: &str, match_type: Route<U>) -> RequestMatcher<U> {
+        let path_regexp = RequestMatcher::<U>::compile_path(path);
+        RequestMatcher {
+            method: method,
+            path_regexp: path_regexp,
+            match_type: match_type
+        }
+    }
+
+    pub fn get_match<'t>(&'t self, method: Method, path: &'t str) -> (bool, Option<Captures>) {
+        let captures = self.path_regexp.captures(path);
+        (method == self.method, captures)
+    }
+
+    fn compile_path(path: &str) -> Regex {
+        let mut rv = String::new();
+        rv.push_str("^");
+        let components = path.split('/');
+        for component in components {
+            if component.starts_with("{") {
+                if !component.ends_with("}") {
+                    panic!("Invalid url pattern")
+                }
+                rv.push_str(&format!("(?P<{}>[^/]+)/", &component[1..component.len()-1])[..]);
+            } else {
+                rv.push_str(&format!("{}/", component)[..]);
+            }
+        }
+        //Remove the trailing /
+        rv.pop();
+        rv.push_str("$");
+        //This will fail at runtime if the regexp is invalid
+        Regex::new(&rv[..]).unwrap()
+    }
+}
+
+pub struct WebDriverHttpApi<U: WebDriverExtensionRoute> {
+    routes: Vec<(Method, RequestMatcher<U>)>,
+}
+
+impl <U: WebDriverExtensionRoute> WebDriverHttpApi<U> {
+    pub fn new(extension_routes: &[(Method, &str, U)]) -> WebDriverHttpApi<U> {
+        let mut rv = WebDriverHttpApi::<U> {
+            routes: vec![],
+        };
+        debug!("Creating routes");
+        for &(ref method, ref url, ref match_type) in standard_routes::<U>().iter() {
+            rv.add(method.clone(), *url, (*match_type).clone());
+        };
+        for &(ref method, ref url, ref extension_route) in extension_routes.iter() {
+            rv.add(method.clone(), *url, Route::Extension(extension_route.clone()));
+        };
+        rv
+    }
+
+    fn add(&mut self, method: Method, path: &str, match_type: Route<U>) {
+        let http_matcher = RequestMatcher::new(method.clone(), path, match_type);
+        self.routes.push((method, http_matcher));
+    }
+
+    pub fn decode_request(&self, method: Method, path: &str, body: &str) -> WebDriverResult<WebDriverMessage<U>> {
+        let mut error = ErrorStatus::UnknownPath;
+        for &(ref match_method, ref matcher) in self.routes.iter() {
+            if method == *match_method {
+                let (method_match, captures) = matcher.get_match(method.clone(), path);
+                if captures.is_some() {
+                    if method_match {
+                        return WebDriverMessage::from_http(matcher.match_type.clone(),
+                                                           &captures.unwrap(),
+                                                           body,
+                                                           method == Post)
+                    } else {
+                        error = ErrorStatus::UnknownMethod;
+                    }
+                }
+            }
+        }
+        Err(WebDriverError::new(error,
+                                format!("{} {} did not match a known command", method, path)))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/lib.rs
@@ -0,0 +1,43 @@
+#![allow(non_snake_case)]
+
+extern crate backtrace;
+#[macro_use]
+extern crate log;
+extern crate rustc_serialize;
+extern crate hyper;
+extern crate regex;
+extern crate cookie;
+extern crate time;
+extern crate url;
+
+#[macro_use] pub mod macros;
+pub mod httpapi;
+pub mod capabilities;
+pub mod command;
+pub mod common;
+pub mod error;
+pub mod server;
+pub mod response;
+
+#[cfg(test)]
+mod nullable_tests {
+    use super::common::Nullable;
+
+    #[test]
+    fn test_nullable_map() {
+        let mut test = Nullable::Value(21);
+
+        assert_eq!(test.map(|x| x << 1), Nullable::Value(42));
+
+        test = Nullable::Null;
+
+        assert_eq!(test.map(|x| x << 1), Nullable::Null);
+    }
+
+    #[test]
+    fn test_nullable_into() {
+        let test: Option<i32> = Nullable::Value(42).into();
+
+        assert_eq!(test, Some(42));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/macros.rs
@@ -0,0 +1,8 @@
+macro_rules! try_opt {
+    ($expr:expr, $err_type:expr, $err_msg:expr) => ({
+        match $expr {
+            Some(x) => x,
+            None => return Err(WebDriverError::new($err_type, $err_msg))
+        }
+    })
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/response.rs
@@ -0,0 +1,297 @@
+use rustc_serialize::json::{self, Json, ToJson};
+
+use common::{Nullable, Date};
+use cookie;
+use time;
+
+#[derive(Debug)]
+pub enum WebDriverResponse {
+    CloseWindow(CloseWindowResponse),
+    Cookie(CookieResponse),
+    DeleteSession,
+    ElementRect(ElementRectResponse),
+    Generic(ValueResponse),
+    NewSession(NewSessionResponse),
+    Timeouts(TimeoutsResponse),
+    Void,
+    WindowRect(WindowRectResponse),
+}
+
+impl WebDriverResponse {
+    pub fn to_json_string(self) -> String {
+        let obj = match self {
+            WebDriverResponse::CloseWindow(ref x) => json::encode(&x.to_json()),
+            WebDriverResponse::Cookie(ref x) => json::encode(x),
+            WebDriverResponse::DeleteSession => Ok("{}".to_string()),
+            WebDriverResponse::ElementRect(ref x) => json::encode(x),
+            WebDriverResponse::Generic(ref x) => json::encode(x),
+            WebDriverResponse::NewSession(ref x) => json::encode(x),
+            WebDriverResponse::Timeouts(ref x) => json::encode(x),
+            WebDriverResponse::Void => Ok("{}".to_string()),
+            WebDriverResponse::WindowRect(ref x) => json::encode(x),
+        }.unwrap();
+
+        match self {
+            WebDriverResponse::Generic(_) |
+            WebDriverResponse::Cookie(_) => obj,
+            _ => {
+                let mut data = String::with_capacity(11 + obj.len());
+                data.push_str("{\"value\": ");
+                data.push_str(&*obj);
+                data.push_str("}");
+                data
+            }
+        }
+    }
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct CloseWindowResponse {
+    pub window_handles: Vec<String>,
+}
+
+impl CloseWindowResponse {
+    pub fn new(handles: Vec<String>) -> CloseWindowResponse {
+        CloseWindowResponse { window_handles: handles }
+    }
+}
+
+impl ToJson for CloseWindowResponse {
+    fn to_json(&self) -> Json {
+        Json::Array(self.window_handles
+                    .iter()
+                    .map(|x| Json::String(x.clone()))
+                    .collect::<Vec<Json>>())
+    }
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct NewSessionResponse {
+    pub sessionId: String,
+    pub capabilities: json::Json
+}
+
+impl NewSessionResponse {
+    pub fn new(session_id: String, capabilities: json::Json) -> NewSessionResponse {
+        NewSessionResponse {
+            capabilities: capabilities,
+            sessionId: session_id
+        }
+    }
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct TimeoutsResponse {
+    pub script: u64,
+    pub pageLoad: u64,
+    pub implicit: u64,
+}
+
+impl TimeoutsResponse {
+    pub fn new(script: u64, page_load: u64, implicit: u64) -> TimeoutsResponse {
+        TimeoutsResponse {
+            script: script,
+            pageLoad: page_load,
+            implicit: implicit,
+        }
+    }
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct ValueResponse {
+    pub value: json::Json
+}
+
+impl ValueResponse {
+    pub fn new(value: json::Json) -> ValueResponse {
+        ValueResponse {
+            value: value
+        }
+    }
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct WindowRectResponse {
+    pub x: i64,
+    pub y: i64,
+    pub width: u64,
+    pub height: u64,
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct ElementRectResponse {
+    pub x: f64,
+    pub y: f64,
+    pub width: f64,
+    pub height: f64
+}
+
+impl ElementRectResponse {
+    pub fn new(x: f64, y: f64, width: f64, height: f64) -> ElementRectResponse {
+        ElementRectResponse {
+            x: x,
+            y: y,
+            width: width,
+            height: height
+        }
+    }
+}
+
+//TODO: some of these fields are probably supposed to be optional
+#[derive(RustcEncodable, PartialEq, Debug, Clone)]
+pub struct Cookie {
+    pub name: String,
+    pub value: String,
+    pub path: Nullable<String>,
+    pub domain: Nullable<String>,
+    pub expiry: Nullable<Date>,
+    pub secure: bool,
+    pub httpOnly: bool
+}
+
+impl Cookie {
+    pub fn new(name: String, value: String, path: Nullable<String>, domain: Nullable<String>,
+               expiry: Nullable<Date>, secure: bool, http_only: bool) -> Cookie {
+        Cookie {
+            name: name,
+            value: value,
+            path: path,
+            domain: domain,
+            expiry: expiry,
+            secure: secure,
+            httpOnly: http_only
+        }
+    }
+}
+
+impl Into<cookie::Cookie<'static>> for Cookie {
+    fn into(self) -> cookie::Cookie<'static> {
+        let cookie = cookie::Cookie::build(self.name, self.value)
+            .secure(self.secure)
+            .http_only(self.httpOnly);
+        let cookie = match self.domain {
+            Nullable::Value(domain) => cookie.domain(domain),
+            Nullable::Null => cookie,
+        };
+        let cookie = match self.path {
+            Nullable::Value(path) => cookie.path(path),
+            Nullable::Null => cookie,
+        };
+        let cookie = match self.expiry {
+            Nullable::Value(Date(expiry)) => {
+                cookie.expires(time::at(time::Timespec::new(expiry as i64, 0)))
+            },
+            Nullable::Null => cookie,
+        };
+        cookie.finish()
+    }
+}
+
+#[derive(RustcEncodable, Debug)]
+pub struct CookieResponse {
+    pub value: Vec<Cookie>
+}
+
+impl CookieResponse {
+    pub fn new(value: Vec<Cookie>) -> CookieResponse {
+        CookieResponse {
+            value: value
+        }
+    }
+}
+
+
+#[cfg(test)]
+mod tests {
+    use std::collections::BTreeMap;
+    use rustc_serialize::json::Json;
+    use super::{WebDriverResponse,
+                CloseWindowResponse,
+                CookieResponse,
+                ElementRectResponse,
+                NewSessionResponse,
+                ValueResponse,
+                TimeoutsResponse,
+                WindowRectResponse,
+                Cookie,
+                Nullable};
+
+    fn test(resp: WebDriverResponse, expected_str: &str) {
+        let data = resp.to_json_string();
+        let actual = Json::from_str(&*data).unwrap();
+        let expected = Json::from_str(expected_str).unwrap();
+        assert_eq!(actual, expected);
+    }
+
+    #[test]
+    fn test_close_window() {
+        let resp = WebDriverResponse::CloseWindow(
+            CloseWindowResponse::new(vec!["test".into()]));
+        let expected = r#"{"value": ["test"]}"#;
+        test(resp, expected);
+    }
+
+    #[test]
+    fn test_cookie() {
+        let resp = WebDriverResponse::Cookie(CookieResponse::new(
+            vec![
+                Cookie::new("test".into(),
+                            "test_value".into(),
+                            Nullable::Value("/".into()),
+                            Nullable::Null,
+                            Nullable::Null,
+                            true,
+                            false)
+            ]));
+        let expected = r#"{"value": [{"name": "test", "value": "test_value", "path": "/",
+"domain": null, "expiry": null, "secure": true, "httpOnly": false}]}"#;
+        test(resp, expected);
+    }
+
+    #[test]
+    fn test_element_rect() {
+        let resp = WebDriverResponse::ElementRect(ElementRectResponse::new(
+            0f64, 1f64, 2f64, 3f64));
+        let expected = r#"{"value": {"x": 0.0, "y": 1.0, "width": 2.0, "height": 3.0}}"#;
+        test(resp, expected);
+    }
+
+    #[test]
+    fn test_window_rect() {
+        let resp = WebDriverResponse::WindowRect(WindowRectResponse {
+            x: 0i64,
+            y: 1i64,
+            width: 2u64,
+            height: 3u64,
+        });
+        let expected = r#"{"value": {"x": 0, "y": 1, "width": 2, "height": 3}}"#;
+        test(resp, expected);
+    }
+
+    #[test]
+    fn test_new_session() {
+        let resp = WebDriverResponse::NewSession(
+            NewSessionResponse::new("test".into(),
+                                    Json::Object(BTreeMap::new())));
+        let expected = r#"{"value": {"sessionId": "test", "capabilities": {}}}"#;
+        test(resp, expected);
+    }
+
+    #[test]
+    fn test_timeouts() {
+         let resp = WebDriverResponse::Timeouts(TimeoutsResponse::new(
+            1, 2, 3));
+        let expected = r#"{"value": {"script": 1, "pageLoad": 2, "implicit": 3}}"#;
+        test(resp, expected);
+    }
+
+    #[test]
+    fn test_value() {
+        let mut value = BTreeMap::new();
+        value.insert("example".into(), Json::Array(vec![Json::String("test".into())]));
+        let resp = WebDriverResponse::Generic(ValueResponse::new(
+            Json::Object(value)));
+        let expected = r#"{"value": {"example": ["test"]}}"#;
+        test(resp, expected);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webdriver/src/server.rs
@@ -0,0 +1,262 @@
+use std::io::Read;
+use std::marker::PhantomData;
+use std::net::SocketAddr;
+use std::sync::mpsc::{channel, Receiver, Sender};
+use std::sync::Mutex;
+use std::thread;
+
+use hyper::header::{ContentType, CacheControl, CacheDirective};
+use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value};
+use hyper::method::Method;
+use hyper::Result;
+use hyper::server::{Handler, Listening, Request, Response, Server};
+use hyper::status::StatusCode;
+use hyper::uri::RequestUri::AbsolutePath;
+
+use command::{WebDriverMessage, WebDriverCommand};
+use error::{WebDriverResult, WebDriverError, ErrorStatus};
+use httpapi::{WebDriverHttpApi, WebDriverExtensionRoute, VoidWebDriverExtensionRoute};
+use response::{CloseWindowResponse, WebDriverResponse};
+
+enum DispatchMessage<U: WebDriverExtensionRoute> {
+    HandleWebDriver(WebDriverMessage<U>, Sender<WebDriverResult<WebDriverResponse>>),
+    Quit
+}
+
+#[derive(PartialEq, Clone)]
+pub struct Session {
+    id: String
+}
+
+impl Session {
+    fn new(id: String) -> Session {
+        Session {
+            id: id
+        }
+    }
+}
+
+pub trait WebDriverHandler<U: WebDriverExtensionRoute=VoidWebDriverExtensionRoute> : Send {
+    fn handle_command(&mut self, session: &Option<Session>, msg: WebDriverMessage<U>) -> WebDriverResult<WebDriverResponse>;
+    fn delete_session(&mut self, session: &Option<Session>);
+}
+
+struct Dispatcher<T: WebDriverHandler<U>,
+                  U: WebDriverExtensionRoute> {
+    handler: T,
+    session: Option<Session>,
+    extension_type: PhantomData<U>,
+}
+
+impl<T: WebDriverHandler<U>, U: WebDriverExtensionRoute> Dispatcher<T, U> {
+    fn new(handler: T) -> Dispatcher<T, U> {
+        Dispatcher {
+            handler: handler,
+            session: None,
+            extension_type: PhantomData,
+        }
+    }
+
+    fn run(&mut self, msg_chan: Receiver<DispatchMessage<U>>) {
+        loop {
+            match msg_chan.recv() {
+                Ok(DispatchMessage::HandleWebDriver(msg, resp_chan)) => {
+                    let resp = match self.check_session(&msg) {
+                        Ok(_) => self.handler.handle_command(&self.session, msg),
+                        Err(e) => Err(e),
+                    };
+
+                    match resp {
+                        Ok(WebDriverResponse::NewSession(ref new_session)) => {
+                            self.session = Some(Session::new(new_session.sessionId.clone()));
+                        }
+                        Ok(WebDriverResponse::CloseWindow(CloseWindowResponse { ref window_handles })) => {
+                            if window_handles.len() == 0 {
+                                debug!("Last window was closed, deleting session");
+                                self.delete_session();
+                            }
+                        }
+                        Ok(WebDriverResponse::DeleteSession) => self.delete_session(),
+                        Err(ref x) if x.delete_session => self.delete_session(),
+                        _ => {}
+                    }
+
+                    if resp_chan.send(resp).is_err() {
+                        error!("Sending response to the main thread failed");
+                    };
+                }
+                Ok(DispatchMessage::Quit) => break,
+                Err(_) => panic!("Error receiving message in handler"),
+            }
+        }
+    }
+
+    fn delete_session(&mut self) {
+        debug!("Deleting session");
+        self.handler.delete_session(&self.session);
+        self.session = None;
+    }
+
+    fn check_session(&self, msg: &WebDriverMessage<U>) -> WebDriverResult<()> {
+        match msg.session_id {
+            Some(ref msg_session_id) => {
+                match self.session {
+                    Some(ref existing_session) => {
+                        if existing_session.id != *msg_session_id {
+                            Err(WebDriverError::new(
+                                ErrorStatus::InvalidSessionId,
+                                format!("Got unexpected session id {} expected {}",
+                                        msg_session_id,
+                                        existing_session.id)))
+                        } else {
+                            Ok(())
+                        }
+                    },
+                    None => Ok(())
+                }
+            },
+            None => {
+                match self.session {
+                    Some(_) => {
+                        match msg.command {
+                            WebDriverCommand::Status => Ok(()),
+                            WebDriverCommand::NewSession(_) => {
+                                Err(WebDriverError::new(
+                                    ErrorStatus::SessionNotCreated,
+                                    "Session is already started"))
+                            },
+                            _ => {
+                                //This should be impossible
+                                error!("Got a message with no session id");
+                                Err(WebDriverError::new(
+                                    ErrorStatus::UnknownError,
+                                    "Got a command with no session?!"))
+                            }
+                        }
+                    },
+                    None => {
+                        match msg.command {
+                            WebDriverCommand::NewSession(_) => Ok(()),
+                            WebDriverCommand::Status => Ok(()),
+                            _ => Err(WebDriverError::new(
+                                ErrorStatus::InvalidSessionId,
+                                "Tried to run a command before creating a session"))
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+struct HttpHandler<U: WebDriverExtensionRoute> {
+    chan: Mutex<Sender<DispatchMessage<U>>>,
+    api: Mutex<WebDriverHttpApi<U>>
+}
+
+impl <U: WebDriverExtensionRoute> HttpHandler<U> {
+    fn new(api: WebDriverHttpApi<U>, chan: Sender<DispatchMessage<U>>) -> HttpHandler<U> {
+        HttpHandler {
+            chan: Mutex::new(chan),
+            api: Mutex::new(api)
+        }
+    }
+}
+
+impl<U: WebDriverExtensionRoute> Handler for HttpHandler<U> {
+    fn handle(&self, req: Request, res: Response) {
+        let mut req = req;
+        let mut res = res;
+
+        let mut body = String::new();
+        if let Method::Post = req.method {
+            req.read_to_string(&mut body).unwrap();
+        }
+
+        debug!("→ {} {} {}", req.method, req.uri, body);
+
+        match req.uri {
+            AbsolutePath(path) => {
+                let msg_result = {
+                    // The fact that this locks for basically the whole request doesn't
+                    // matter as long as we are only handling one request at a time.
+                    match self.api.lock() {
+                        Ok(ref api) => api.decode_request(req.method, &path[..], &body[..]),
+                        Err(_) => return,
+                    }
+                };
+                let (status, resp_body) = match msg_result {
+                    Ok(message) => {
+                        let (send_res, recv_res) = channel();
+                        match self.chan.lock() {
+                            Ok(ref c) => {
+                                let res =
+                                    c.send(DispatchMessage::HandleWebDriver(message, send_res));
+                                match res {
+                                    Ok(x) => x,
+                                    Err(_) => {
+                                        error!("Something terrible happened");
+                                        return;
+                                    }
+                                }
+                            }
+                            Err(_) => {
+                                error!("Something terrible happened");
+                                return;
+                            }
+                        }
+                        match recv_res.recv() {
+                            Ok(data) => {
+                                match data {
+                                    Ok(response) => (StatusCode::Ok, response.to_json_string()),
+                                    Err(err) => (err.http_status(), err.to_json_string()),
+                                }
+                            }
+                            Err(e) => panic!("Error reading response: {:?}", e),
+                        }
+                    }
+                    Err(err) => (err.http_status(), err.to_json_string()),
+                };
+
+                debug!("↠{} {}", status, resp_body);
+
+                {
+                    let resp_status = res.status_mut();
+                    *resp_status = status;
+                }
+                res.headers_mut()
+                    .set(ContentType(Mime(TopLevel::Application,
+                                          SubLevel::Json,
+                                          vec![(Attr::Charset, Value::Utf8)])));
+                res.headers_mut()
+                    .set(CacheControl(vec![CacheDirective::NoCache]));
+
+                res.send(&resp_body.as_bytes()).unwrap();
+            }
+            _ => {}
+        }
+    }
+}
+
+pub fn start<T, U>(address: SocketAddr,
+                   handler: T,
+                   extension_routes: &[(Method, &str, U)])
+                   -> Result<Listening>
+    where T: 'static + WebDriverHandler<U>,
+          U: 'static + WebDriverExtensionRoute
+{
+    let (msg_send, msg_recv) = channel();
+
+    let api = WebDriverHttpApi::new(extension_routes);
+    let http_handler = HttpHandler::new(api, msg_send);
+    let mut server = try!(Server::http(address));
+    server.keep_alive(None);
+
+    let builder = thread::Builder::new().name("webdriver dispatcher".to_string());
+    try!(builder.spawn(move || {
+        let mut dispatcher = Dispatcher::new(handler);
+        dispatcher.run(msg_recv);
+    }));
+
+    server.handle(http_handler)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805","Cargo.toml":"c364e8b72ff5f5ff18e84791bde05db78543373caa50e328b4ee0138e91e724d","LICENSE":"ea021d8c6383c84d19c15ce90d3b1602cf448fdcc0bf3772c98e43c7bf1bf1d1","README.md":"bb66d37fe37c48c93e22bc50b63f976c075eefe0a8c2a109b5f0f4e4f17cae5d","examples/basic_usage.rs":"bbc18b3df70f45a5bd00327e3a5bb7a09247b261ecc8d06e23327b28352813aa","examples/enum.rs":"dea1b952e820c3c11dc44aad57acc009d19d8446473305033bd5c6caea259fa3","examples/serialization.rs":"0bc04464b6e1ba8e8717bef9d8886c9a832c90150c89cccc0494d90f7f7f9281","examples/transaction.rs":"6fb7d7c7811aadab840b5ba36dfef9e8c19c0f874e02f54f90b73b16f455be70","src/enums.rs":"ebc300f86a0f3a36095c53c28cce81549b39150c87695eeba0d71353c4b1ac3c","src/lib.rs":"234404a5bd1ccf8c9f2fe1b30eeaacfdf8aa1cc106feba563aca2a8fc49b7eaa","src/serialization.rs":"fe79314e04a07108465a320a090cd3a237a05cfe52c5b0219eb765ea0868174a","src/transaction.rs":"3727976dc26b0daa7fde7739a5fb9823cab2c54f3cf7255ee17d73b7c60120fb","src/types.rs":"11d926bdbdfac7efe3cf662dacb10821c3add4611e29cd05fb344143ff7e96f6"},"package":"e63857fb213f619b4c4fff86b158285c76766aac7e7474967e92fb6dbbfeefe9"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "winreg"
+version = "0.3.5"
+authors = ["Igor Shaula <gentoo90@gmail.com>"]
+license = "MIT"
+description = "Rust bindings to MS Windows Registry API"
+repository = "https://github.com/gentoo90/winreg-rs"
+documentation = "https://gentoo90.github.io/winreg-rs/v0.3.5/winreg/"
+readme = "README.md"
+keywords = ["Windows", "WinSDK", "Registry"]
+
+[dependencies]
+winapi = "0.2.0"
+kernel32-sys = "0.1.2"
+advapi32-sys = "0.1.1"
+ktmw32-sys = "0.1.0"
+rustc-serialize = "0.3.14"
+clippy = { version = "^0", optional = true }
+
+[dev-dependencies]
+rand = "0.3"
+
+[features]
+default=[]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015 Igor Shaula
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/README.md
@@ -0,0 +1,237 @@
+winreg [![Crates.io](https://img.shields.io/crates/v/winreg.svg)](https://crates.io/crates/winreg)
+======
+
+Rust bindings to MS Windows Registry API. Work in progress.
+
+Current features:
+* Basic registry operations:
+    * open/create/delete keys
+    * read and write values
+    * seamless conversion between `REG_*` types and rust primitives
+        * `String` and `OsString` <= `REG_SZ`, `REG_EXPAND_SZ` or `REG_MULTI_SZ`
+        * `String`, `&str` and `OsStr` => `REG_SZ`
+        * `u32` <=> `REG_DWORD`
+        * `u64` <=> `REG_QWORD`
+* Iteration through key names and through values
+* Transactions
+* Transacted serialization of rust types into/from registry (only primitives and structures for now)
+
+## Usage
+
+### Basic usage
+
+```toml
+# Cargo.toml
+[dependencies]
+winreg = "0.3"
+```
+
+```rust
+extern crate winreg;
+use std::path::Path;
+use std::io;
+use winreg::RegKey;
+use winreg::enums::*;
+
+fn main() {
+    println!("Reading some system info...");
+    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+    let cur_ver = hklm.open_subkey_with_flags("SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
+        KEY_READ).unwrap();
+    let pf: String = cur_ver.get_value("ProgramFilesDir").unwrap();
+    let dp: String = cur_ver.get_value("DevicePath").unwrap();
+    println!("ProgramFiles = {}\nDevicePath = {}", pf, dp);
+    let info = cur_ver.query_info().unwrap();
+    println!("info = {:?}", info);
+
+    println!("And now lets write something...");
+    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    let path = Path::new("Software").join("WinregRsExample1");
+    let key = hkcu.create_subkey(&path).unwrap();
+
+    key.set_value("TestSZ", &"written by Rust").unwrap();
+    let sz_val: String = key.get_value("TestSZ").unwrap();
+    key.delete_value("TestSZ").unwrap();
+    println!("TestSZ = {}", sz_val);
+
+    key.set_value("TestDWORD", &1234567890u32).unwrap();
+    let dword_val: u32 = key.get_value("TestDWORD").unwrap();
+    println!("TestDWORD = {}", dword_val);
+
+    key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
+    let qword_val: u64 = key.get_value("TestQWORD").unwrap();
+    println!("TestQWORD = {}", qword_val);
+
+    key.create_subkey("sub\\key").unwrap();
+    hkcu.delete_subkey_all(&path).unwrap();
+
+    println!("Trying to open nonexistent key...");
+    let key2 = hkcu.open_subkey(&path)
+    .unwrap_or_else(|e| match e.kind() {
+        io::ErrorKind::NotFound => panic!("Key doesn't exist"),
+        io::ErrorKind::PermissionDenied => panic!("Access denied"),
+        _ => panic!("{:?}", e)
+    });
+}
+```
+
+### Iterators
+
+```rust
+extern crate winreg;
+use winreg::RegKey;
+use winreg::enums::*;
+
+fn main() {
+    println!("File extensions, registered in system:");
+    for i in RegKey::predef(HKEY_CLASSES_ROOT)
+        .enum_keys().map(|x| x.unwrap())
+        .filter(|x| x.starts_with("."))
+    {
+        println!("{}", i);
+    }
+
+    let system = RegKey::predef(HKEY_LOCAL_MACHINE)
+        .open_subkey_with_flags("HARDWARE\\DESCRIPTION\\System", KEY_READ)
+        .unwrap();
+    for (name, value) in system.enum_values().map(|x| x.unwrap()) {
+        println!("{} = {:?}", name, value);
+    }
+}
+```
+
+### Transactions
+
+```rust
+extern crate winreg;
+use std::io;
+use winreg::RegKey;
+use winreg::enums::*;
+use winreg::transaction::Transaction;
+
+fn main() {
+    let t = Transaction::new().unwrap();
+    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    let key = hkcu.create_subkey_transacted("Software\\RustTransaction", &t).unwrap();
+    key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
+    key.set_value("TestDWORD", &1234567890u32).unwrap();
+
+    println!("Commit transaction? [y/N]:");
+    let mut input = String::new();
+    io::stdin().read_line(&mut input).unwrap();
+    input = input.trim_right().to_owned();
+    if input == "y" || input == "Y" {
+        t.commit().unwrap();
+        println!("Transaction committed.");
+    }
+    else {
+        // this is optional, if transaction wasn't committed,
+        // it will be rolled back on disposal
+        t.rollback().unwrap();
+
+        println!("Transaction wasn't committed, it will be rolled back.");
+    }
+}
+```
+
+### Serialization
+
+```rust
+extern crate rustc_serialize;
+extern crate winreg;
+use winreg::enums::*;
+
+#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+struct Rectangle{
+    x: u32,
+    y: u32,
+    w: u32,
+    h: u32,
+}
+
+#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+struct Test {
+    t_bool: bool,
+    t_u8: u8,
+    t_u16: u16,
+    t_u32: u32,
+    t_u64: u64,
+    t_usize: usize,
+    t_struct: Rectangle,
+    t_string: String,
+    t_i8: i8,
+    t_i16: i16,
+    t_i32: i32,
+    t_i64: i64,
+    t_isize: isize,
+    t_f64: f64,
+    t_f32: f32,
+}
+
+fn main() {
+    let hkcu = winreg::RegKey::predef(HKEY_CURRENT_USER);
+    let key = hkcu.create_subkey("Software\\RustEncode").unwrap();
+    let v1 = Test{
+        t_bool: false,
+        t_u8: 127,
+        t_u16: 32768,
+        t_u32: 123456789,
+        t_u64: 123456789101112,
+        t_usize: 123456789101112,
+        t_struct: Rectangle{
+            x: 55,
+            y: 77,
+            w: 500,
+            h: 300,
+        },
+        t_string: "test 123!".to_owned(),
+        t_i8: -123,
+        t_i16: -2049,
+        t_i32: 20100,
+        t_i64: -12345678910,
+        t_isize: -1234567890,
+        t_f64: -0.01,
+        t_f32: 3.14,
+    };
+
+    key.encode(&v1).unwrap();
+
+    let v2: Test = key.decode().unwrap();
+    println!("Decoded {:?}", v2);
+
+    // This shows `false` because f32 and f64 encoding/decoding is NOT precise
+    println!("Equal to encoded: {:?}", v1 == v2);
+}
+```
+
+## Changelog
+
+### 0.3.5
+
+* Implement `FromRegValue` for `OsString` and `ToRegValue` for `OsStr` (#8)
+* Minor fixes
+
+### 0.3.4
+
+* Add `copy_tree` method to `RegKey`
+* Now checked with [rust-clippy](https://github.com/Manishearth/rust-clippy)
+    * no more `unwrap`s
+    * replaced `to_string` with `to_owned`
+* Fix: reading strings longer than 2048 characters (#6)
+
+### 0.3.3
+
+* Fix: now able to read values longer than 2048 bytes (#3)
+
+### 0.3.2
+
+* Fix: `FromRegValue` trait now requires `Sized` (fixes build with rust 1.4)
+
+### 0.3.1
+
+* Fix: bump `winapi` version to fix build
+
+### 0.3.0
+
+* Add transactions support and make serialization transacted
+* Breaking change: use `std::io::{Error,Result}` instead of own `RegError` and `RegResult`
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/examples/basic_usage.rs
@@ -0,0 +1,51 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+extern crate winreg;
+use std::path::Path;
+use std::io;
+use winreg::RegKey;
+use winreg::enums::*;
+
+fn main() {
+    println!("Reading some system info...");
+    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+    let cur_ver = hklm.open_subkey_with_flags("SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
+        KEY_READ).unwrap();
+    let pf: String = cur_ver.get_value("ProgramFilesDir").unwrap();
+    let dp: String = cur_ver.get_value("DevicePath").unwrap();
+    println!("ProgramFiles = {}\nDevicePath = {}", pf, dp);
+    let info = cur_ver.query_info().unwrap();
+    println!("info = {:?}", info);
+
+    println!("And now lets write something...");
+    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    let path = Path::new("Software").join("WinregRsExample1");
+    let key = hkcu.create_subkey(&path).unwrap();
+
+    key.set_value("TestSZ", &"written by Rust").unwrap();
+    let sz_val: String = key.get_value("TestSZ").unwrap();
+    key.delete_value("TestSZ").unwrap();
+    println!("TestSZ = {}", sz_val);
+
+    key.set_value("TestDWORD", &1234567890u32).unwrap();
+    let dword_val: u32 = key.get_value("TestDWORD").unwrap();
+    println!("TestDWORD = {}", dword_val);
+
+    key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
+    let qword_val: u64 = key.get_value("TestQWORD").unwrap();
+    println!("TestQWORD = {}", qword_val);
+
+    key.create_subkey("sub\\key").unwrap();
+    hkcu.delete_subkey_all(&path).unwrap();
+
+    println!("Trying to open nonexistent key...");
+    let key2 = hkcu.open_subkey(&path)
+    .unwrap_or_else(|e| match e.kind() {
+        io::ErrorKind::NotFound => panic!("Key doesn't exist"),
+        io::ErrorKind::PermissionDenied => panic!("Access denied"),
+        _ => panic!("{:?}", e)
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/examples/enum.rs
@@ -0,0 +1,25 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+extern crate winreg;
+use winreg::RegKey;
+use winreg::enums::*;
+
+fn main() {
+    println!("File extensions, registered in system:");
+    for i in RegKey::predef(HKEY_CLASSES_ROOT)
+        .enum_keys().map(|x| x.unwrap())
+        .filter(|x| x.starts_with("."))
+    {
+        println!("{}", i);
+    }
+
+    let system = RegKey::predef(HKEY_LOCAL_MACHINE)
+        .open_subkey_with_flags("HARDWARE\\DESCRIPTION\\System", KEY_READ)
+        .unwrap();
+    for (name, value) in system.enum_values().map(|x| x.unwrap()) {
+        println!("{} = {:?}", name, value);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/examples/serialization.rs
@@ -0,0 +1,80 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+extern crate rustc_serialize;
+extern crate winreg;
+use winreg::enums::*;
+
+#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+struct Coords {
+    x: u32,
+    y: u32,
+}
+
+#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+struct Size {
+    w: u32,
+    h: u32,
+}
+
+#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+struct Rectangle {
+    coords: Coords,
+    size: Size,
+}
+
+#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+struct Test {
+    t_bool: bool,
+    t_u8: u8,
+    t_u16: u16,
+    t_u32: u32,
+    t_u64: u64,
+    t_usize: usize,
+    t_struct: Rectangle,
+    t_string: String,
+    t_i8: i8,
+    t_i16: i16,
+    t_i32: i32,
+    t_i64: i64,
+    t_isize: isize,
+    t_f64: f64,
+    t_f32: f32,
+    // t_char: char,
+}
+
+fn main() {
+    let hkcu = winreg::RegKey::predef(HKEY_CURRENT_USER);
+    let key = hkcu.create_subkey("Software\\RustEncode").unwrap();
+    let v1 = Test{
+        t_bool: false,
+        t_u8: 127,
+        t_u16: 32768,
+        t_u32: 123456789,
+        t_u64: 123456789101112,
+        t_usize: 123456789101112,
+        t_struct: Rectangle{
+            coords: Coords{ x: 55, y: 77 },
+            size: Size{ w: 500, h: 300 },
+        },
+        t_string: "test 123!".to_owned(),
+        t_i8: -123,
+        t_i16: -2049,
+        t_i32: 20100,
+        t_i64: -12345678910,
+        t_isize: -1234567890,
+        t_f64: -0.01,
+        t_f32: 3.14,
+        // t_char: 'a',
+    };
+
+    key.encode(&v1).unwrap();
+
+    let v2: Test = key.decode().unwrap();
+    println!("Decoded {:?}", v2);
+
+    // This shows `false` because f32 and f64 encoding/decoding is NOT precise
+    println!("Equal to encoded: {:?}", v1 == v2);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/examples/transaction.rs
@@ -0,0 +1,34 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+extern crate winreg;
+use std::io;
+use winreg::RegKey;
+use winreg::enums::*;
+use winreg::transaction::Transaction;
+
+fn main() {
+    let t = Transaction::new().unwrap();
+    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    let key = hkcu.create_subkey_transacted("Software\\RustTransaction", &t).unwrap();
+    key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
+    key.set_value("TestDWORD", &1234567890u32).unwrap();
+
+    println!("Commit transaction? [y/N]:");
+    let mut input = String::new();
+    io::stdin().read_line(&mut input).unwrap();
+    input = input.trim_right().to_owned();
+    if input == "y" || input == "Y" {
+        t.commit().unwrap();
+        println!("Transaction commited.");
+    }
+    else {
+        // this is optional, if transaction wasn't commited,
+        // it will be rolled back on disposal
+        t.rollback().unwrap();
+
+        println!("Transaction wasn't commited, it will be rolled back.");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/src/enums.rs
@@ -0,0 +1,58 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+
+//! `use winreg::enums::*;` to import all needed enumerations and constants
+use super::winapi;
+pub use winapi::{HKEY_CLASSES_ROOT,
+                 HKEY_CURRENT_USER,
+                 HKEY_LOCAL_MACHINE,
+                 HKEY_USERS,
+                 HKEY_PERFORMANCE_DATA,
+                 HKEY_PERFORMANCE_TEXT,
+                 HKEY_PERFORMANCE_NLSTEXT,
+                 HKEY_CURRENT_CONFIG,
+                 HKEY_DYN_DATA,
+                 HKEY_CURRENT_USER_LOCAL_SETTINGS};
+pub use winapi::{KEY_QUERY_VALUE,
+                 KEY_SET_VALUE,
+                 KEY_CREATE_SUB_KEY,
+                 KEY_ENUMERATE_SUB_KEYS,
+                 KEY_NOTIFY,
+                 KEY_CREATE_LINK,
+                 KEY_WOW64_32KEY,
+                 KEY_WOW64_64KEY,
+                 KEY_WOW64_RES,
+                 KEY_READ,
+                 KEY_WRITE,
+                 KEY_EXECUTE,
+                 KEY_ALL_ACCESS};
+
+macro_rules! winapi_enum{
+    ($t:ident, $doc:expr => [$($v:ident),*]) => (
+        #[doc=$doc]
+        #[allow(non_camel_case_types)]
+        #[derive(Debug,Clone,PartialEq)]
+        pub enum $t {
+            $( $v = winapi::$v as isize ),*
+        }
+    )
+}
+
+winapi_enum!(RegType, "Enumeration of possible registry value types" => [
+REG_NONE,
+REG_SZ,
+REG_EXPAND_SZ,
+REG_BINARY,
+REG_DWORD,
+REG_DWORD_BIG_ENDIAN,
+REG_LINK,
+REG_MULTI_SZ,
+REG_RESOURCE_LIST,
+REG_FULL_RESOURCE_DESCRIPTOR,
+REG_RESOURCE_REQUIREMENTS_LIST,
+REG_QWORD
+]);
+pub use self::RegType::*;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/src/lib.rs
@@ -0,0 +1,1204 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Crate for accessing MS Windows registry
+//!
+//!## Usage
+//!
+//!### Basic usage
+//!
+//!```toml,ignore
+//!# Cargo.toml
+//![dependencies]
+//!winreg = "0.3"
+//!```
+//!
+//!```no_run
+//!extern crate winreg;
+//!use std::path::Path;
+//!use std::io;
+//!use winreg::RegKey;
+//!use winreg::enums::*;
+//!
+//!fn main() {
+//!    println!("Reading some system info...");
+//!    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+//!    let cur_ver = hklm.open_subkey_with_flags("SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
+//!        KEY_READ).unwrap();
+//!    let pf: String = cur_ver.get_value("ProgramFilesDir").unwrap();
+//!    let dp: String = cur_ver.get_value("DevicePath").unwrap();
+//!    println!("ProgramFiles = {}\nDevicePath = {}", pf, dp);
+//!    let info = cur_ver.query_info().unwrap();
+//!    println!("info = {:?}", info);
+//!
+//!    println!("And now lets write something...");
+//!    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+//!    let path = Path::new("Software").join("WinregRsExample1");
+//!    let key = hkcu.create_subkey(&path).unwrap();
+//!
+//!    key.set_value("TestSZ", &"written by Rust").unwrap();
+//!    let sz_val: String = key.get_value("TestSZ").unwrap();
+//!    key.delete_value("TestSZ").unwrap();
+//!    println!("TestSZ = {}", sz_val);
+//!
+//!    key.set_value("TestDWORD", &1234567890u32).unwrap();
+//!    let dword_val: u32 = key.get_value("TestDWORD").unwrap();
+//!    println!("TestDWORD = {}", dword_val);
+//!
+//!    key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
+//!    let qword_val: u64 = key.get_value("TestQWORD").unwrap();
+//!    println!("TestQWORD = {}", qword_val);
+//!
+//!    key.create_subkey("sub\\key").unwrap();
+//!    hkcu.delete_subkey_all(&path).unwrap();
+//!
+//!    println!("Trying to open nonexistent key...");
+//!    let key2 = hkcu.open_subkey(&path)
+//!    .unwrap_or_else(|e| match e.kind() {
+//!        io::ErrorKind::NotFound => panic!("Key doesn't exist"),
+//!        io::ErrorKind::PermissionDenied => panic!("Access denied"),
+//!        _ => panic!("{:?}", e)
+//!    });
+//!}
+//!```
+//!
+//!### Iterators
+//!
+//!```no_run
+//!extern crate winreg;
+//!use winreg::RegKey;
+//!use winreg::enums::*;
+//!
+//!fn main() {
+//!    println!("File extensions, registered in system:");
+//!    for i in RegKey::predef(HKEY_CLASSES_ROOT)
+//!        .enum_keys().map(|x| x.unwrap())
+//!        .filter(|x| x.starts_with("."))
+//!    {
+//!        println!("{}", i);
+//!    }
+//!
+//!    let system = RegKey::predef(HKEY_LOCAL_MACHINE)
+//!        .open_subkey_with_flags("HARDWARE\\DESCRIPTION\\System", KEY_READ)
+//!        .unwrap();
+//!    for (name, value) in system.enum_values().map(|x| x.unwrap()) {
+//!        println!("{} = {:?}", name, value);
+//!    }
+//!}
+//!```
+//!
+//!### Transactions
+//!
+//!```no_run
+//!extern crate winreg;
+//!use std::io;
+//!use winreg::RegKey;
+//!use winreg::enums::*;
+//!use winreg::transaction::Transaction;
+//!
+//!fn main() {
+//!    let t = Transaction::new().unwrap();
+//!    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+//!    let key = hkcu.create_subkey_transacted("Software\\RustTransaction", &t).unwrap();
+//!    key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
+//!    key.set_value("TestDWORD", &1234567890u32).unwrap();
+//!
+//!    println!("Commit transaction? [y/N]:");
+//!    let mut input = String::new();
+//!    io::stdin().read_line(&mut input).unwrap();
+//!    input = input.trim_right().to_owned();
+//!    if input == "y" || input == "Y" {
+//!        t.commit().unwrap();
+//!        println!("Transaction committed.");
+//!    }
+//!    else {
+//!        // this is optional, if transaction wasn't committed,
+//!        // it will be rolled back on disposal
+//!        t.rollback().unwrap();
+//!
+//!        println!("Transaction wasn't committed, it will be rolled back.");
+//!    }
+//!}
+//!```
+//!
+//!### Serialization
+//!
+//!```no_run
+//!extern crate rustc_serialize;
+//!extern crate winreg;
+//!use winreg::enums::*;
+//!
+//!#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+//!struct Rectangle{
+//!    x: u32,
+//!    y: u32,
+//!    w: u32,
+//!    h: u32,
+//!}
+//!
+//!#[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+//!struct Test {
+//!    t_bool: bool,
+//!    t_u8: u8,
+//!    t_u16: u16,
+//!    t_u32: u32,
+//!    t_u64: u64,
+//!    t_usize: usize,
+//!    t_struct: Rectangle,
+//!    t_string: String,
+//!    t_i8: i8,
+//!    t_i16: i16,
+//!    t_i32: i32,
+//!    t_i64: i64,
+//!    t_isize: isize,
+//!    t_f64: f64,
+//!    t_f32: f32,
+//!}
+//!
+//!fn main() {
+//!    let hkcu = winreg::RegKey::predef(HKEY_CURRENT_USER);
+//!    let key = hkcu.create_subkey("Software\\RustEncode").unwrap();
+//!    let v1 = Test{
+//!        t_bool: false,
+//!        t_u8: 127,
+//!        t_u16: 32768,
+//!        t_u32: 123456789,
+//!        t_u64: 123456789101112,
+//!        t_usize: 123456789101112,
+//!        t_struct: Rectangle{
+//!            x: 55,
+//!            y: 77,
+//!            w: 500,
+//!            h: 300,
+//!        },
+//!        t_string: "test 123!".to_owned(),
+//!        t_i8: -123,
+//!        t_i16: -2049,
+//!        t_i32: 20100,
+//!        t_i64: -12345678910,
+//!        t_isize: -1234567890,
+//!        t_f64: -0.01,
+//!        t_f32: 3.14,
+//!    };
+//!
+//!    key.encode(&v1).unwrap();
+//!
+//!    let v2: Test = key.decode().unwrap();
+//!    println!("Decoded {:?}", v2);
+//!
+//!    // This shows `false` because f32 and f64 encoding/decoding is NOT precise
+//!    println!("Equal to encoded: {:?}", v1 == v2);
+//!}
+//!```
+#![cfg_attr(feature="clippy", feature(plugin))]
+#![cfg_attr(feature="clippy", plugin(clippy))]
+#![cfg_attr(feature="clippy", warn(option_unwrap_used))]
+#![cfg_attr(feature="clippy", warn(result_unwrap_used))]
+extern crate winapi;
+extern crate kernel32;
+extern crate advapi32;
+extern crate ktmw32;
+extern crate rustc_serialize;
+use std::ptr;
+use std::slice;
+use std::fmt;
+use std::default::Default;
+use std::ffi::OsStr;
+use std::os::windows::ffi::OsStrExt;
+use std::mem::transmute;
+use std::io;
+use winapi::winerror;
+use winapi::{HKEY, DWORD, WCHAR};
+use enums::*;
+use types::{FromRegValue, ToRegValue};
+use transaction::Transaction;
+
+macro_rules! werr {
+    ($e:expr) => (
+        Err(io::Error::from_raw_os_error($e as i32))
+    )
+}
+
+pub mod enums;
+pub mod types;
+pub mod serialization;
+pub mod transaction;
+
+/// Metadata returned by `RegKey::query_info`
+#[derive(Debug,Default)]
+pub struct RegKeyMetadata {
+    // pub Class: winapi::LPWSTR,
+    // pub ClassLen: DWORD,
+    pub sub_keys: DWORD,
+    pub max_sub_key_len: DWORD,
+    pub max_class_len: DWORD,
+    pub values: DWORD,
+    pub max_value_name_len: DWORD,
+    pub max_value_len: DWORD,
+    // pub SecurityDescriptor: DWORD,
+    // pub LastWriteTime: winapi::PFILETIME,
+}
+
+/// Raw registry value
+#[derive(PartialEq)]
+pub struct RegValue {
+    pub bytes: Vec<u8>,
+    pub vtype: RegType,
+}
+
+macro_rules! format_reg_value {
+    ($e:expr => $t:ident) => (
+        match $t::from_reg_value($e) {
+            Ok(val) => format!("{:?}", val),
+            Err(_) => return Err(fmt::Error),
+        }
+    )
+}
+
+impl fmt::Debug for RegValue {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let f_val = match self.vtype {
+            REG_SZ | REG_EXPAND_SZ | REG_MULTI_SZ => {
+                format_reg_value!(self => String)
+            },
+            REG_DWORD => {
+                format_reg_value!(self => u32)
+            },
+            REG_QWORD => {
+                format_reg_value!(self => u64)
+            },
+            _ => format!("{:?}", self.bytes) //TODO: implement more types
+        };
+        write!(f, "RegValue({:?}: {})", self.vtype, f_val)
+    }
+}
+
+/// Handle of opened registry key
+#[derive(Debug)]
+pub struct RegKey {
+    hkey: HKEY,
+}
+
+impl RegKey {
+    /// Open one of predefined keys:
+    ///
+    /// * `HKEY_CLASSES_ROOT`
+    /// * `HKEY_CURRENT_USER`
+    /// * `HKEY_LOCAL_MACHINE`
+    /// * `HKEY_USERS`
+    /// * `HKEY_PERFORMANCE_DATA`
+    /// * `HKEY_PERFORMANCE_TEXT`
+    /// * `HKEY_PERFORMANCE_NLSTEXT`
+    /// * `HKEY_CURRENT_CONFIG`
+    /// * `HKEY_DYN_DATA`
+    /// * `HKEY_CURRENT_USER_LOCAL_SETTINGS`
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+    /// ```
+    pub fn predef(hkey: HKEY) -> RegKey {
+        RegKey{ hkey: hkey }
+    }
+
+    /// Open subkey with `KEY_ALL_ACCESS` permissions.
+    /// Will open another handle to itself if `path` is an empty string.
+    /// To open with different permissions use `open_subkey_with_flags`.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// let soft = RegKey::predef(HKEY_CURRENT_USER)
+    ///     .open_subkey("Software").unwrap();
+    /// ```
+    pub fn open_subkey<P: AsRef<OsStr>>(&self, path: P) -> io::Result<RegKey> {
+        self.open_subkey_with_flags(path, winapi::KEY_ALL_ACCESS)
+    }
+
+    /// Open subkey with desired permissions.
+    /// Will open another handle to itself if `path` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+    /// hklm.open_subkey_with_flags("SOFTWARE\\Microsoft", KEY_READ).unwrap();
+    /// ```
+    pub fn open_subkey_with_flags<P: AsRef<OsStr>>(&self, path: P, perms: winapi::REGSAM) -> io::Result<RegKey> {
+        let c_path = to_utf16(path);
+        let mut new_hkey: HKEY = ptr::null_mut();
+        match unsafe {
+            advapi32::RegOpenKeyExW(
+                self.hkey,
+                c_path.as_ptr(),
+                0,
+                perms,
+                &mut new_hkey,
+            ) as DWORD
+        } {
+            0 => Ok(RegKey{ hkey: new_hkey }),
+            err => werr!(err)
+        }
+    }
+
+    pub fn open_subkey_transacted<P: AsRef<OsStr>>(&self, path: P, t: &Transaction) -> io::Result<RegKey> {
+        self.open_subkey_transacted_with_flags(path, t, winapi::KEY_ALL_ACCESS)
+    }
+
+    pub fn open_subkey_transacted_with_flags<P: AsRef<OsStr>>(&self, path: P, t: &Transaction, perms: winapi::REGSAM)
+        -> io::Result<RegKey>
+    {
+        let c_path = to_utf16(path);
+        let mut new_hkey: HKEY = ptr::null_mut();
+        match unsafe {
+            advapi32::RegOpenKeyTransactedW(
+                self.hkey,
+                c_path.as_ptr(),
+                0,
+                perms,
+                &mut new_hkey,
+                t.handle,
+                ptr::null_mut(),
+            ) as DWORD
+        } {
+            0 => Ok(RegKey{ hkey: new_hkey }),
+            err => werr!(err)
+        }
+    }
+
+    /// Create subkey (and all missing parent keys)
+    /// and open it with `KEY_ALL_ACCESS` permissions.
+    /// Will just open key if it already exists.
+    /// Will open another handle to itself if `path` is an empty string.
+    /// To create with different permissions use `create_subkey_with_flags`.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let settings = hkcu.create_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// ```
+    pub fn create_subkey<P: AsRef<OsStr>>(&self, path: P) -> io::Result<RegKey> {
+        self.create_subkey_with_flags(path, winapi::KEY_ALL_ACCESS)
+    }
+
+    pub fn create_subkey_with_flags<P: AsRef<OsStr>>(&self, path: P, perms: winapi::REGSAM) -> io::Result<RegKey> {
+        let c_path = to_utf16(path);
+        let mut new_hkey: HKEY = ptr::null_mut();
+        let mut disp: DWORD = 0;
+        match unsafe {
+            advapi32::RegCreateKeyExW(
+                self.hkey,
+                c_path.as_ptr(),
+                0,
+                ptr::null_mut(),
+                winapi::REG_OPTION_NON_VOLATILE,
+                perms,
+                ptr::null_mut(),
+                &mut new_hkey,
+                &mut disp // TODO: return this somehow
+            )
+        } {
+            0 => Ok(RegKey{ hkey: new_hkey }),
+            err => werr!(err)
+        }
+    }
+
+    pub fn create_subkey_transacted<P: AsRef<OsStr>>(&self, path: P, t: &Transaction) -> io::Result<RegKey> {
+        self.create_subkey_transacted_with_flags(path, t, winapi::KEY_ALL_ACCESS)
+    }
+
+    pub fn create_subkey_transacted_with_flags<P: AsRef<OsStr>>(&self, path: P, t: &Transaction, perms: winapi::REGSAM)
+        -> io::Result<RegKey>
+    {
+        let c_path = to_utf16(path);
+        let mut new_hkey: HKEY = ptr::null_mut();
+        let mut disp: DWORD = 0;
+        match unsafe {
+            advapi32::RegCreateKeyTransactedW(
+                self.hkey,
+                c_path.as_ptr(),
+                0,
+                ptr::null_mut(),
+                winapi::REG_OPTION_NON_VOLATILE,
+                perms,
+                ptr::null_mut(),
+                &mut new_hkey,
+                &mut disp, // TODO: return this somehow
+                t.handle,
+                ptr::null_mut(),
+            ) as DWORD
+        } {
+            0 => Ok(RegKey{ hkey: new_hkey }),
+            err => werr!(err)
+        }
+    }
+
+    /// Copy all the values and subkeys from `path` to `dest` key.
+    /// WIll copy the content of `self` if `path` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let src = hkcu.open_subkey_with_flags("Software\\MyProduct", KEY_READ).unwrap();
+    /// let dst = hkcu.create_subkey("Software\\MyProduct\\Section2").unwrap();
+    /// src.copy_tree("Section1", &dst).unwrap();
+    /// ```
+    pub fn copy_tree<P: AsRef<OsStr>>(&self, path: P, dest: &RegKey) -> io::Result<()> {
+        let c_path = to_utf16(path);
+        match unsafe {
+            advapi32::RegCopyTreeW(
+                self.hkey,
+                c_path.as_ptr(),
+                dest.hkey,
+            )
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+
+    pub fn query_info(&self) -> io::Result<RegKeyMetadata> {
+        let mut info: RegKeyMetadata = Default::default();
+        match unsafe {
+            advapi32::RegQueryInfoKeyW(
+                self.hkey,
+                ptr::null_mut(), // Class: winapi::LPWSTR,
+                ptr::null_mut(), // ClassLen: DWORD,
+                ptr::null_mut(), // Reserved
+                &mut info.sub_keys,
+                &mut info.max_sub_key_len,
+                &mut info.max_class_len,
+                &mut info.values,
+                &mut info.max_value_name_len,
+                &mut info.max_value_len,
+                ptr::null_mut(), // lpcbSecurityDescriptor: winapi::LPDWORD,
+                ptr::null_mut(), // lpftLastWriteTime: winapi::PFILETIME,
+            ) as DWORD
+        } {
+            0 => Ok(info),
+            err => werr!(err)
+        }
+    }
+
+    /// Return an iterator over subkeys names.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// println!("File extensions, registered in this system:");
+    /// for i in RegKey::predef(HKEY_CLASSES_ROOT)
+    ///     .enum_keys().map(|x| x.unwrap())
+    ///     .filter(|x| x.starts_with("."))
+    /// {
+    ///     println!("{}", i);
+    /// }
+    /// ```
+    pub fn enum_keys(&self) -> EnumKeys {
+        EnumKeys{key: self, index: 0}
+    }
+
+    /// Return an iterator over values.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// let system = RegKey::predef(HKEY_LOCAL_MACHINE)
+    ///     .open_subkey_with_flags("HARDWARE\\DESCRIPTION\\System", KEY_READ)
+    ///     .unwrap();
+    /// for (name, value) in system.enum_values().map(|x| x.unwrap()) {
+    ///     println!("{} = {:?}", name, value);
+    /// }
+    /// ```
+    pub fn enum_values(&self) -> EnumValues {
+        EnumValues{key: self, index: 0}
+    }
+
+    /// Delete key. Cannot delete if it has subkeys.
+    /// Will delete itself if `path` is an empty string.
+    /// Use `delete_subkey_all` for that.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// RegKey::predef(HKEY_CURRENT_USER)
+    ///     .delete_subkey(r"Software\MyProduct\History").unwrap();
+    /// ```
+    pub fn delete_subkey<P: AsRef<OsStr>>(&self, path: P) -> io::Result<()> {
+        let c_path = to_utf16(path);
+        match unsafe {
+            advapi32::RegDeleteKeyW(
+                self.hkey,
+                c_path.as_ptr(),
+            ) as DWORD
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+
+    pub fn delete_subkey_transacted<P: AsRef<OsStr>>(&self, path: P, t: &Transaction) -> io::Result<()> {
+        let c_path = to_utf16(path);
+        match unsafe {
+            advapi32::RegDeleteKeyTransactedW(
+                self.hkey,
+                c_path.as_ptr(),
+                0,
+                0,
+                t.handle,
+                ptr::null_mut(),
+            ) as DWORD
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+
+    /// Recursively delete subkey with all its subkeys and values.
+    /// Will delete itself if `path` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// RegKey::predef(HKEY_CURRENT_USER)
+    ///     .delete_subkey_all("Software\\MyProduct").unwrap();
+    /// ```
+    pub fn delete_subkey_all<P: AsRef<OsStr>>(&self, path: P) -> io::Result<()> {
+        let c_path = to_utf16(path);
+        match unsafe{
+            advapi32::RegDeleteTreeW(
+                self.hkey,
+                c_path.as_ptr(),
+            ) as DWORD
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+
+    /// Get a value from registry and seamlessly convert it to the specified rust type
+    /// with `FromRegValue` implemented (currently `String`, `u32` and `u64`).
+    /// Will get the `Default` value if `name` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// # let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let settings = hkcu.open_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// let server: String = settings.get_value("server").unwrap();
+    /// let port: u32 = settings.get_value("port").unwrap();
+    /// ```
+    pub fn get_value<T: FromRegValue, N: AsRef<OsStr>>(&self, name: N) -> io::Result<T> {
+        match self.get_raw_value(name) {
+            Ok(ref val) => FromRegValue::from_reg_value(val),
+            Err(err) => Err(err)
+        }
+    }
+
+    /// Get raw bytes from registry value.
+    /// Will get the `Default` value if `name` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// # let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let settings = hkcu.open_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// let data = settings.get_raw_value("data").unwrap();
+    /// println!("Bytes: {:?}", data.bytes);
+    /// ```
+    pub fn get_raw_value<N: AsRef<OsStr>>(&self, name: N) -> io::Result<RegValue> {
+        let c_name = to_utf16(name);
+        let mut buf_len: DWORD = 2048;
+        let mut buf_type: DWORD = 0;
+        let mut buf: Vec<u8> = Vec::with_capacity(buf_len as usize);
+        loop {
+            match unsafe {
+                advapi32::RegQueryValueExW(
+                    self.hkey,
+                    c_name.as_ptr() as *const u16,
+                    ptr::null_mut(),
+                    &mut buf_type,
+                    buf.as_mut_ptr() as winapi::LPBYTE,
+                    &mut buf_len
+                ) as DWORD
+            } {
+                0 => {
+                    unsafe{ buf.set_len(buf_len as usize); }
+                    // minimal check before transmute to RegType
+                    if buf_type > winapi::REG_QWORD {
+                        return werr!(winerror::ERROR_BAD_FILE_TYPE);
+                    }
+                    let t: RegType = unsafe{ transmute(buf_type as u8) };
+                    return Ok(RegValue{ bytes: buf, vtype: t })
+                },
+                winerror::ERROR_MORE_DATA => {
+                    buf.reserve(buf_len as usize);
+                },
+                err => return werr!(err),
+            }
+        }
+    }
+
+    /// Seamlessly convert a value from a rust type and write it to the registry value
+    /// with `ToRegValue` trait implemented (currently `String`, `&str`, `u32` and `u64`).
+    /// Will set the `Default` value if `name` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// # let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let settings = hkcu.create_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// settings.set_value("server", &"www.example.com").unwrap();
+    /// settings.set_value("port", &8080u32).unwrap();
+    /// ```
+    pub fn set_value<T: ToRegValue, N: AsRef<OsStr>>(&self, name: N, value: &T) -> io::Result<()> {
+        self.set_raw_value(name, &value.to_reg_value())
+    }
+
+    /// Write raw bytes from `RegValue` struct to a registry value.
+    /// Will set the `Default` value if `name` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// use winreg::{RegKey, RegValue};
+    /// use winreg::enums::*;
+    /// let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let settings = hkcu.open_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// let bytes: Vec<u8> = vec![1, 2, 3, 5, 8, 13, 21, 34, 55, 89];
+    /// let data = RegValue{ vtype: REG_BINARY, bytes: bytes};
+    /// settings.set_raw_value("data", &data).unwrap();
+    /// println!("Bytes: {:?}", data.bytes)
+    /// ```
+    pub fn set_raw_value<N: AsRef<OsStr>>(&self, name: N, value: &RegValue) -> io::Result<()> {
+        let c_name = to_utf16(name);
+        let t = value.vtype.clone() as DWORD;
+        match unsafe{
+            advapi32::RegSetValueExW(
+                self.hkey,
+                c_name.as_ptr(),
+                0,
+                t,
+                value.bytes.as_ptr() as *const winapi::BYTE,
+                value.bytes.len() as u32
+            ) as DWORD
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+
+    /// Delete specified value from registry.
+    /// Will delete the `Default` value if `name` is an empty string.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use winreg::RegKey;
+    /// # use winreg::enums::*;
+    /// # let hkcu = RegKey::predef(HKEY_CURRENT_USER);
+    /// let settings = hkcu.open_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// settings.delete_value("data").unwrap();
+    /// ```
+    pub fn delete_value<N: AsRef<OsStr>>(&self, name: N) -> io::Result<()> {
+        let c_name = to_utf16(name);
+        match unsafe {
+            advapi32::RegDeleteValueW(
+                self.hkey,
+                c_name.as_ptr(),
+            ) as DWORD
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+
+    /// Save `Encodable` type to a registry key.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// extern crate rustc_serialize;
+    /// extern crate winreg;
+    /// # fn main() {
+    /// use winreg::RegKey;
+    /// use winreg::enums::*;
+    /// use rustc_serialize::Encodable;
+    ///
+    /// #[derive(RustcEncodable)]
+    /// struct Rectangle{
+    ///     x: u32,
+    ///     y: u32,
+    ///     w: u32,
+    ///     h: u32,
+    /// }
+    ///
+    /// #[derive(RustcEncodable)]
+    /// struct Settings{
+    ///     current_dir: String,
+    ///     window_pos: Rectangle,
+    ///     show_in_tray: bool,
+    /// }
+    ///
+    /// let s: Settings = Settings{
+    ///     current_dir: "C:\\".to_owned(),
+    ///     window_pos: Rectangle{ x:200, y: 100, w: 800, h: 500 },
+    ///     show_in_tray: false,
+    /// };
+    /// let s_key = RegKey::predef(HKEY_CURRENT_USER)
+    ///     .open_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// s_key.encode(&s).unwrap();
+    /// # }
+    /// ```
+    pub fn encode<T: rustc_serialize::Encodable>(&self, value: &T)
+        -> serialization::EncodeResult<()>
+    {
+        let mut encoder = try!(
+            serialization::Encoder::from_key(&self)
+        );
+        try!(value.encode(&mut encoder));
+        encoder.commit()
+    }
+
+    /// Load `Decodable` type from a registry key.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// extern crate rustc_serialize;
+    /// extern crate winreg;
+    /// # fn main() {
+    /// use winreg::RegKey;
+    /// use winreg::enums::*;
+    /// use rustc_serialize::Decodable;
+    ///
+    /// #[derive(RustcDecodable)]
+    /// struct Rectangle{
+    ///     x: u32,
+    ///     y: u32,
+    ///     w: u32,
+    ///     h: u32,
+    /// }
+    ///
+    /// #[derive(RustcDecodable)]
+    /// struct Settings{
+    ///     current_dir: String,
+    ///     window_pos: Rectangle,
+    ///     show_in_tray: bool,
+    /// }
+    ///
+    /// let s_key = RegKey::predef(HKEY_CURRENT_USER)
+    ///     .open_subkey("Software\\MyProduct\\Settings").unwrap();
+    /// let s: Settings = s_key.decode().unwrap();
+    /// # }
+    /// ```
+    pub fn decode<T: rustc_serialize::Decodable>(&self)
+        -> serialization::DecodeResult<T>
+    {
+        let mut decoder = try!(
+            serialization::Decoder::from_key(&self)
+        );
+        T::decode(&mut decoder)
+    }
+
+    fn close_(&mut self) -> io::Result<()> {
+        // don't try to close predefined keys
+        if self.hkey >= winapi::HKEY_CLASSES_ROOT { return Ok(()) };
+        match unsafe {
+            advapi32::RegCloseKey(self.hkey) as DWORD
+        } {
+            0 => Ok(()),
+            err => werr!(err)
+        }
+    }
+}
+
+impl Drop for RegKey {
+    fn drop(&mut self) {
+        self.close_().unwrap_or(());
+    }
+}
+
+/// Iterator over subkeys names
+pub struct EnumKeys<'key> {
+    key: &'key RegKey,
+    index: DWORD,
+}
+
+impl<'key> Iterator for EnumKeys<'key> {
+    type Item = io::Result<String>;
+
+    fn next(&mut self) -> Option<io::Result<String>> {
+        let mut name_len = 2048;
+        let mut name = [0 as WCHAR; 2048];
+        match unsafe {
+            advapi32::RegEnumKeyExW(
+                self.key.hkey,
+                self.index,
+                name.as_mut_ptr(),
+                &mut name_len,
+                ptr::null_mut(), // reserved
+                ptr::null_mut(), // lpClass: LPWSTR,
+                ptr::null_mut(), // lpcClass: LPDWORD,
+                ptr::null_mut(), // lpftLastWriteTime: PFILETIME,
+            ) as DWORD
+        } {
+            0 => {
+                self.index += 1;
+                Some(match String::from_utf16(&name[..name_len as usize]) {
+                    Ok(s) => Ok(s),
+                    Err(_) => werr!(winerror::ERROR_INVALID_BLOCK)
+                })
+            },
+            winerror::ERROR_NO_MORE_ITEMS => None,
+            err => {
+                Some(werr!(err))
+            }
+        }
+    }
+}
+
+/// Iterator over values
+pub struct EnumValues<'key> {
+    key: &'key RegKey,
+    index: DWORD,
+}
+
+impl<'key> Iterator for EnumValues<'key> {
+    type Item = io::Result<(String, RegValue)>;
+
+    fn next(&mut self) -> Option<io::Result<(String, RegValue)>> {
+        let mut name_len = 2048;
+        let mut name = [0 as WCHAR; 2048];
+
+        let mut buf_len: DWORD = 2048;
+        let mut buf_type: DWORD = 0;
+        let mut buf: Vec<u8> = Vec::with_capacity(buf_len as usize);
+        loop {
+            match unsafe {
+                advapi32::RegEnumValueW(
+                    self.key.hkey,
+                    self.index,
+                    name.as_mut_ptr(),
+                    &mut name_len,
+                    ptr::null_mut(), // reserved
+                    &mut buf_type,
+                    buf.as_mut_ptr() as winapi::LPBYTE,
+                    &mut buf_len,
+                ) as DWORD
+            } {
+                0 => {
+                    self.index += 1;
+                    let name = match String::from_utf16(&name[..name_len as usize]) {
+                        Ok(s) => s,
+                        Err(_) => return Some(werr!(winerror::ERROR_INVALID_DATA))
+                    };
+                    unsafe{ buf.set_len(buf_len as usize); }
+                    // minimal check before transmute to RegType
+                    if buf_type > winapi::REG_QWORD {
+                        return Some(werr!(winerror::ERROR_BAD_FILE_TYPE));
+                    }
+                    let t: RegType = unsafe{ transmute(buf_type as u8) };
+                    let value = RegValue{ bytes: buf, vtype: t };
+                    return Some(Ok((name, value)))
+                },
+                winerror::ERROR_MORE_DATA => {
+                    name_len += 1; //for NULL char
+                    buf.reserve(buf_len as usize);
+                },
+                winerror::ERROR_NO_MORE_ITEMS => return None,
+                err => return Some(werr!(err))
+            }
+        }
+    }
+}
+
+fn to_utf16<P: AsRef<OsStr>>(s: P) -> Vec<u16> {
+    s.as_ref().encode_wide().chain(Some(0).into_iter()).collect()
+}
+
+fn v16_to_v8(v: &[u16]) -> Vec<u8> {
+    unsafe {
+        slice::from_raw_parts(v.as_ptr() as *const u8, v.len()*2).to_vec()
+    }
+}
+
+
+#[cfg(test)]
+#[cfg_attr(feature="clippy", allow(option_unwrap_used))]
+#[cfg_attr(feature="clippy", allow(result_unwrap_used))]
+mod test {
+    extern crate rand;
+    use super::*;
+    use super::enums::*;
+    use super::types::*;
+    use std::collections::HashMap;
+    use rustc_serialize::{Encodable,Decodable};
+    use self::rand::Rng;
+    use std::ffi::{OsStr,OsString};
+    //use std::os::windows::ffi::{OsStrExt,OsStringExt};
+
+    #[test]
+    fn test_open_subkey_with_flags_query_info() {
+        let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
+        let win = hklm.open_subkey_with_flags("Software\\Microsoft\\Windows", KEY_READ).unwrap();
+        assert!(win.query_info().is_ok());
+        assert!(win.open_subkey_with_flags("CurrentVersion\\", KEY_READ).is_ok());
+        assert!(hklm.open_subkey_with_flags("i\\just\\hope\\nobody\\created\\that\\key", KEY_READ).is_err());
+    }
+
+    macro_rules! with_key {
+        ($k:ident, $path:expr => $b:block) => {{
+            let mut path = "Software\\WinRegRsTest".to_owned();
+            path.push_str($path);
+            let $k = RegKey::predef(HKEY_CURRENT_USER)
+                .create_subkey(&path).unwrap();
+            $b
+            RegKey::predef(HKEY_CURRENT_USER)
+            .delete_subkey_all(path).unwrap();
+        }}
+    }
+
+    #[test]
+    fn test_delete_subkey() {
+        let path = "Software\\WinRegRsTestDeleteSubkey";
+        RegKey::predef(HKEY_CURRENT_USER).create_subkey(path).unwrap();
+        assert!(RegKey::predef(HKEY_CURRENT_USER)
+            .delete_subkey(path).is_ok());
+    }
+
+    #[test]
+    fn test_copy_tree() {
+        with_key!(key, "CopyTree" => {
+            let sub_tree = key.create_subkey("Src\\Sub\\Tree").unwrap();
+            for v in &["one", "two", "three"] {
+                sub_tree.set_value(v, v).unwrap();
+            }
+            let dst = key.create_subkey("Dst").unwrap();
+            assert!(key.copy_tree("Src", &dst).is_ok());
+        });
+    }
+
+    #[test]
+    fn test_long_value() {
+        with_key!(key, "LongValue" => {
+            let name = "RustLongVal";
+            let val1 = RegValue { vtype: REG_BINARY, bytes: (0..6000).map(|_| rand::random::<u8>()).collect() };
+            key.set_raw_value(name, &val1).unwrap();
+            let val2 = key.get_raw_value(name).unwrap();
+            assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_string_value() {
+        with_key!(key, "StringValue" => {
+            let name = "RustStringVal";
+            let val1 = "Test123 \n$%^&|+-*/\\()".to_owned();
+            key.set_value(name, &val1).unwrap();
+            let val2: String = key.get_value(name).unwrap();
+            assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_long_string_value() {
+        with_key!(key, "LongStringValue" => {
+            let name = "RustLongStringVal";
+            let val1 : String = rand::thread_rng().gen_ascii_chars().take(7000).collect();
+            key.set_value(name, &val1).unwrap();
+            let val2: String = key.get_value(name).unwrap();
+            assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_os_string_value() {
+        with_key!(key, "OsStringValue" => {
+            let name = "RustOsStringVal";
+            let val1 = OsStr::new("Test123 \n$%^&|+-*/\\()");
+            key.set_value(name, &val1).unwrap();
+            let val2: OsString = key.get_value(name).unwrap();
+            assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_long_os_string_value() {
+        with_key!(key, "LongStringValue" => {
+        let name = "RustLongStringVal";
+        let val1 = rand::thread_rng().gen_ascii_chars().take(7000).collect::<String>();
+        let val1 = OsStr::new(&val1);
+        key.set_value(name, &val1).unwrap();
+        let val2: OsString = key.get_value(name).unwrap();
+        assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_u32_value() {
+        with_key!(key, "U32Value" => {
+            let name = "RustU32Val";
+            let val1 = 1234567890u32;
+            key.set_value(name, &val1).unwrap();
+            let val2: u32 = key.get_value(name).unwrap();
+            assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_u64_value() {
+        with_key!(key, "U64Value" => {
+            let name = "RustU64Val";
+            let val1 = 1234567891011121314u64;
+            key.set_value(name, &val1).unwrap();
+            let val2: u64 = key.get_value(name).unwrap();
+            assert_eq!(val1, val2);
+        });
+    }
+
+    #[test]
+    fn test_delete_value() {
+        with_key!(key, "DeleteValue" => {
+            let name = "WinregRsTestVal";
+            key.set_value(name, &"Qwerty123").unwrap();
+            assert!(key.delete_value(name).is_ok());
+        });
+    }
+
+    #[test]
+    fn test_enum_keys() {
+        with_key!(key, "EnumKeys" => {
+            let mut keys1 = vec!("qwerty", "asdf", "1", "2", "3", "5", "8", "йцукен");
+            keys1.sort();
+            for i in &keys1 {
+                key.create_subkey(i).unwrap();
+            }
+            let keys2: Vec<_> = key.enum_keys().map(|x| x.unwrap()).collect();
+            assert_eq!(keys1, keys2);
+        });
+    }
+
+    #[test]
+    fn test_enum_values() {
+        with_key!(key, "EnumValues" => {
+            let mut vals1 = vec!("qwerty", "asdf", "1", "2", "3", "5", "8", "йцукен");
+            vals1.sort();
+            for i in &vals1 {
+                key.set_value(i,i).unwrap();
+            }
+            let mut vals2: Vec<String> = Vec::with_capacity(vals1.len());
+            let mut vals3: Vec<String> = Vec::with_capacity(vals1.len());
+            for (name, val) in key.enum_values()
+                .map(|x| x.unwrap())
+            {
+                vals2.push(name);
+                vals3.push(String::from_reg_value(&val).unwrap());
+            }
+            assert_eq!(vals1, vals2);
+            assert_eq!(vals1, vals3);
+        });
+    }
+
+    #[test]
+    fn test_enum_long_values() {
+        with_key!(key, "EnumLongValues" => {
+            let mut vals = HashMap::with_capacity(3);
+
+            for i in &[5500, 9500, 15000] {
+                let name: String = format!("val{}", i);
+                let val = RegValue { vtype: REG_BINARY, bytes: (0..*i).map(|_| rand::random::<u8>()).collect() };
+                vals.insert(name, val);
+            }
+
+            for (name, val) in key.enum_values()
+                                  .map(|x| x.unwrap())
+            {
+                assert_eq!(val.bytes, vals.get(&name).unwrap().bytes);
+            }
+        });
+    }
+
+    #[test]
+    fn test_serialization() {
+        #[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+        struct Rectangle{
+            x: u32,
+            y: u32,
+            w: u32,
+            h: u32,
+        }
+
+        #[derive(Debug,RustcEncodable,RustcDecodable,PartialEq)]
+        struct Test {
+            t_bool: bool,
+            t_u8: u8,
+            t_u16: u16,
+            t_u32: u32,
+            t_u64: u64,
+            t_usize: usize,
+            t_struct: Rectangle,
+            t_string: String,
+            t_i8: i8,
+            t_i16: i16,
+            t_i32: i32,
+            t_i64: i64,
+            t_isize: isize,
+            // t_f64: f64,
+            // t_f32: f32,
+        }
+
+        let v1 = Test{
+            t_bool: false,
+            t_u8: 127,
+            t_u16: 32768,
+            t_u32: 123456789,
+            t_u64: 123456789101112,
+            t_usize: 123456789101112,
+            t_struct: Rectangle{ x: 55, y: 77, w: 500, h: 300 },
+            t_string: "Test123 \n$%^&|+-*/\\()".to_owned(),
+            t_i8: -123,
+            t_i16: -2049,
+            t_i32: 20100,
+            t_i64: -12345678910,
+            t_isize: -1234567890,
+            // t_f64: -0.01,
+            // t_f32: 3.14,
+        };
+
+        with_key!(key, "Serialization" => {
+            key.encode(&v1).unwrap();
+            let v2: Test = key.decode().unwrap();
+            assert_eq!(v1, v2);
+        });
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/src/serialization.rs
@@ -0,0 +1,566 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Registry keys parsing and serialization
+use std::mem;
+use std::io;
+use super::{RegKey};
+use super::enums::*;
+use super::transaction::Transaction;
+use super::rustc_serialize;
+use super::winapi;
+use self::EncoderState::{Start, NextKey/*, NextMapKey */};
+
+
+#[derive(Debug)]
+pub enum EncoderError{
+    EncodeNotImplemented(String),
+    IoError(io::Error),
+    NoFieldName,
+}
+
+pub type EncodeResult<T> = Result<T, EncoderError>;
+
+impl From<io::Error> for EncoderError {
+    fn from(err: io::Error) -> EncoderError {
+        EncoderError::IoError(err)
+    }
+}
+
+#[derive(Debug)]
+enum EncoderState {
+    Start,
+    NextKey(String),
+    // NextMapKey,
+}
+
+#[derive(Debug)]
+pub struct Encoder {
+    keys: Vec<RegKey>,
+    tr: Transaction,
+    state: EncoderState,
+}
+
+const ENCODER_SAM: winapi::DWORD = KEY_CREATE_SUB_KEY|KEY_SET_VALUE;
+
+impl Encoder {
+    pub fn from_key(key: &RegKey) -> EncodeResult<Encoder> {
+        let tr = try!(Transaction::new());
+        key.open_subkey_transacted_with_flags("", &tr, ENCODER_SAM)
+            .map(|k| Encoder::new(k, tr))
+            .map_err(EncoderError::IoError)
+    }
+
+    fn new(key: RegKey, tr: Transaction) -> Encoder {
+        let mut keys = Vec::with_capacity(5);
+        keys.push(key);
+        Encoder{
+            keys: keys,
+            tr: tr,
+            state: Start,
+        }
+    }
+
+    pub fn commit(&mut self) -> EncodeResult<()> {
+        self.tr.commit().map_err(EncoderError::IoError)
+    }
+}
+
+macro_rules! emit_value{
+    ($s:ident, $v:ident) => (
+        match mem::replace(&mut $s.state, Start) {
+            NextKey(ref s) => {
+                $s.keys[$s.keys.len()-1].set_value(s, &$v)
+                    .map_err(EncoderError::IoError)
+            },
+            Start => Err(EncoderError::NoFieldName)
+        }
+    )
+}
+
+macro_rules! no_impl {
+    ($e:expr) => (
+        Err(EncoderError::EncodeNotImplemented($e.to_owned()))
+    )
+}
+
+impl rustc_serialize::Encoder for Encoder {
+    type Error = EncoderError;
+
+    fn emit_nil(&mut self) -> EncodeResult<()> {
+        no_impl!("nil")
+    }
+
+    fn emit_usize(&mut self, v: usize) -> EncodeResult<()> {
+        self.emit_u64(v as u64)
+    }
+
+    fn emit_u64(&mut self, v: u64) -> EncodeResult<()> {
+        emit_value!(self, v)
+    }
+
+    fn emit_u32(&mut self, v: u32) -> EncodeResult<()> {
+        emit_value!(self, v)
+    }
+
+    fn emit_u16(&mut self, v: u16) -> EncodeResult<()> {
+        self.emit_u32(v as u32)
+    }
+
+    fn emit_u8(&mut self, v: u8) -> EncodeResult<()> {
+        self.emit_u32(v as u32)
+    }
+
+    fn emit_isize(&mut self, v: isize) -> EncodeResult<()> {
+        self.emit_i64(v as i64)
+    }
+
+    fn emit_i64(&mut self, v: i64) -> EncodeResult<()> {
+        let s = v.to_string();
+        emit_value!(self, s)
+    }
+
+    fn emit_i32(&mut self, v: i32) -> EncodeResult<()> {
+        self.emit_i64(v as i64)
+    }
+
+    fn emit_i16(&mut self, v: i16) -> EncodeResult<()> {
+        self.emit_i64(v as i64)
+    }
+
+    fn emit_i8(&mut self, v: i8) -> EncodeResult<()> {
+        self.emit_i64(v as i64)
+    }
+
+    fn emit_bool(&mut self, v: bool) -> EncodeResult<()> {
+        self.emit_u32(v as u32)
+    }
+
+    fn emit_f64(&mut self, v: f64) -> EncodeResult<()> {
+        let s = v.to_string();
+        emit_value!(self, s)
+    }
+
+    fn emit_f32(&mut self, v: f32) -> EncodeResult<()> {
+        let s = v.to_string();
+        emit_value!(self, s)
+    }
+
+    fn emit_char(&mut self, _v: char) -> EncodeResult<()> {
+        no_impl!("char")
+    }
+
+    fn emit_str(&mut self, v: &str) -> EncodeResult<()> {
+        emit_value!(self, v)
+    }
+
+    fn emit_enum<F>(&mut self, _name: &str, _f: F) -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("enum")
+    }
+
+    fn emit_enum_variant<F>(&mut self, _name: &str, _id: usize, _cnt: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("enum_variant")
+    }
+
+    fn emit_enum_variant_arg<F>(&mut self, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("enum_variant_arg")
+    }
+
+    fn emit_enum_struct_variant<F>(&mut self, _name: &str, _id: usize, _cnt: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("enum_struct_variant")
+    }
+
+    fn emit_enum_struct_variant_field<F>(&mut self, _name: &str, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("enum_struct_variant_field")
+    }
+
+    fn emit_struct<F>(&mut self, _name: &str, _len: usize, f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        match mem::replace(&mut self.state, Start) {
+            Start => { // root structure
+                f(self)
+            },
+            NextKey(ref s) => { // nested structure
+                match self.keys[self.keys.len()-1].create_subkey_transacted_with_flags(&s, &self.tr, ENCODER_SAM) {
+                    Ok(subkey) => {
+                        self.keys.push(subkey);
+                        let res = f(self);
+                        self.keys.pop();
+                        res
+                    },
+                    Err(err) => Err(EncoderError::IoError(err))
+                }
+            }
+        }
+    }
+
+    fn emit_struct_field<F>(&mut self, f_name: &str, _f_idx: usize, f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>
+    {
+        self.state = NextKey(f_name.to_owned());
+        f(self)
+    }
+
+    fn emit_tuple<F>(&mut self, _: usize, _f: F) -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>
+    {
+        no_impl!("tuple")
+    }
+
+    fn emit_tuple_arg<F>(&mut self, _: usize, _f: F) -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>
+    {
+        no_impl!("tuple_arg")
+    }
+
+    fn emit_tuple_struct<F>(&mut self, _: &str, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>
+    {
+        no_impl!("tuple_struct")
+    }
+
+    fn emit_tuple_struct_arg<F>(&mut self, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>
+    {
+        no_impl!("tuple_struct_arg")
+    }
+
+    fn emit_option<F>(&mut self, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>
+    {
+        no_impl!("Option")
+    }
+
+    fn emit_option_none(&mut self) -> EncodeResult<()> {
+        no_impl!("Option::None")
+    }
+
+    fn emit_option_some<F>(&mut self, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("Option::Some")
+    }
+
+    fn emit_seq<F>(&mut self, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("seq")
+    }
+
+    fn emit_seq_elt<F>(&mut self, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("seq_elt")
+    }
+
+    fn emit_map<F>(&mut self, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("map")
+    }
+
+    fn emit_map_elt_key<F>(&mut self, _: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("map_elt_key")
+    }
+
+    fn emit_map_elt_val<F>(&mut self, _idx: usize, _f: F)
+        -> EncodeResult<()> where
+        F: FnOnce(&mut Self) -> EncodeResult<()>,
+    {
+        no_impl!("map_elt_val")
+    }
+}
+
+//=====================================================================
+
+#[derive(Debug)]
+pub enum DecoderError{
+    DecodeNotImplemented(String),
+    IoError(io::Error),
+    ParseError(String),
+    NoFieldName,
+}
+
+pub type DecodeResult<T> = Result<T, DecoderError>;
+
+#[derive(Debug)]
+pub struct Decoder {
+    key: RegKey,
+    f_name: Option<String>,
+}
+
+const DECODER_SAM: winapi::DWORD = KEY_QUERY_VALUE;
+
+impl Decoder {
+    pub fn from_key(key: &RegKey) -> DecodeResult<Decoder> {
+        key.open_subkey_with_flags("", DECODER_SAM)
+            .map(Decoder::new)
+            .map_err(DecoderError::IoError)
+    }
+
+    fn new(key: RegKey) -> Decoder {
+        Decoder{
+            key: key,
+            f_name: None,
+        }
+    }
+}
+
+macro_rules! read_value{
+    ($s:ident) => (
+        match mem::replace(&mut $s.f_name, None) {
+            Some(ref s) => {
+                $s.key.get_value(s)
+                    .map_err(DecoderError::IoError)
+            },
+            None => Err(DecoderError::NoFieldName)
+        }
+    )
+}
+
+macro_rules! parse_string{
+    ($s:ident) => ({
+        let s: String = try!(read_value!($s));
+        s.parse().map_err(|e| DecoderError::ParseError(format!("{:?}", e)))
+    })
+}
+
+macro_rules! no_impl {
+    ($e:expr) => (
+        Err(DecoderError::DecodeNotImplemented($e.to_owned()))
+    )
+}
+
+impl rustc_serialize::Decoder for Decoder {
+    type Error = DecoderError;
+    fn read_nil(&mut self) -> DecodeResult<()> {
+        no_impl!("nil")
+    }
+
+    fn read_usize(&mut self) -> DecodeResult<usize> {
+        self.read_u64().map(|v| v as usize)
+    }
+
+    fn read_u64(&mut self) -> DecodeResult<u64> {
+        read_value!(self)
+    }
+
+    fn read_u32(&mut self) -> DecodeResult<u32> {
+        read_value!(self)
+    }
+
+    fn read_u16(&mut self) -> DecodeResult<u16> {
+        self.read_u32().map(|v| v as u16)
+    }
+
+    fn read_u8(&mut self) -> DecodeResult<u8> {
+        self.read_u32().map(|v| v as u8)
+    }
+
+    fn read_isize(&mut self) -> DecodeResult<isize> {
+        self.read_i64().map(|v| v as isize)
+    }
+
+    fn read_i64(&mut self) -> DecodeResult<i64> {
+        parse_string!(self)
+    }
+
+    fn read_i32(&mut self) -> DecodeResult<i32> {
+        parse_string!(self)
+    }
+
+    fn read_i16(&mut self) -> DecodeResult<i16> {
+        parse_string!(self)
+    }
+
+    fn read_i8(&mut self) -> DecodeResult<i8> {
+        parse_string!(self)
+    }
+
+    fn read_bool(&mut self) -> DecodeResult<bool> {
+        self.read_u32().map(|v| v > 0)
+    }
+
+    fn read_f64(&mut self) -> DecodeResult<f64> {
+        parse_string!(self)
+    }
+
+    fn read_f32(&mut self) -> DecodeResult<f32> {
+        parse_string!(self)
+    }
+
+    fn read_char(&mut self) -> DecodeResult<char> {
+        no_impl!("char")
+    }
+
+    fn read_str(&mut self) -> DecodeResult<String> {
+        read_value!(self)
+    }
+
+    fn read_enum<T, F>(&mut self, _name: &str, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("enum")
+    }
+
+    fn read_enum_variant<T, F>(&mut self, _names: &[&str], _f: F)
+        -> DecodeResult<T> where
+        F: FnMut(&mut Self, usize) -> DecodeResult<T>
+    {
+        no_impl!("enum_variant")
+    }
+
+    fn read_enum_variant_arg<T, F>(&mut self, _a_idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("enum_variant_arg")
+    }
+
+    fn read_enum_struct_variant<T, F>(&mut self, _names: &[&str], _f: F)
+        -> DecodeResult<T> where
+        F: FnMut(&mut Self, usize) -> DecodeResult<T>
+    {
+        no_impl!("enum_struct_variant")
+    }
+
+    fn read_enum_struct_variant_field<T, F>(&mut self, _f_name: &str, _f_idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("enum_struct_variant_field")
+    }
+
+    fn read_struct<T, F>(&mut self, _s_name: &str, _len: usize, f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        match mem::replace(&mut self.f_name, None) {
+            None => { // root structure
+                f(self)
+            },
+            Some(ref s) => { // nested structure
+                match self.key.open_subkey_with_flags(&s, DECODER_SAM) {
+                    Ok(subkey) => {
+                        let mut nested = Decoder::new(subkey);
+                        f(&mut nested)
+                    },
+                    Err(err) => Err(DecoderError::IoError(err))
+                }
+            }
+        }
+    }
+
+    fn read_struct_field<T, F>(&mut self, f_name: &str, _f_idx: usize, f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        self.f_name = Some(f_name.to_owned());
+        f(self)
+    }
+
+    fn read_tuple<T, F>(&mut self, _len: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("tuple")
+    }
+
+    fn read_tuple_arg<T, F>(&mut self, _a_idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("tuple_arg")
+    }
+
+    fn read_tuple_struct<T, F>(&mut self, _s_name: &str, _len: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("tuple_struct")
+    }
+
+    fn read_tuple_struct_arg<T, F>(&mut self, _a_idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("tuple_struct_arg")
+    }
+
+    fn read_option<T, F>(&mut self, _f: F)
+        -> DecodeResult<T> where
+        F: FnMut(&mut Self, bool) -> DecodeResult<T>
+    {
+        no_impl!("option")
+    }
+
+    fn read_seq<T, F>(&mut self, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self, usize) -> DecodeResult<T>
+    {
+        no_impl!("seq")
+    }
+
+    fn read_seq_elt<T, F>(&mut self, _idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("seq_elt")
+    }
+
+    fn read_map<T, F>(&mut self, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self, usize) -> DecodeResult<T>
+    {
+        no_impl!("map")
+    }
+
+    fn read_map_elt_key<T, F>(&mut self, _idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("map_elt_key")
+    }
+
+    fn read_map_elt_val<T, F>(&mut self, _idx: usize, _f: F)
+        -> DecodeResult<T> where
+        F: FnOnce(&mut Self) -> DecodeResult<T>
+    {
+        no_impl!("map_elt_val")
+    }
+
+    fn error(&mut self, err: &str) -> Self::Error {
+        DecoderError::ParseError(err.to_owned())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/src/transaction.rs
@@ -0,0 +1,69 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+use std::ptr;
+use std::io;
+use super::winapi;
+use super::kernel32;
+use super::ktmw32;
+
+#[derive(Debug)]
+pub struct Transaction {
+    pub handle: winapi::HANDLE,
+}
+
+impl Transaction {
+    //TODO: add arguments
+    pub fn new() -> io::Result<Transaction> {
+        unsafe {
+            let handle = ktmw32::CreateTransaction(
+                ptr::null_mut(),
+                ptr::null_mut(),
+                0,
+                0,
+                0,
+                0,
+                ptr::null_mut(),
+            );
+            if handle == winapi::INVALID_HANDLE_VALUE {
+                return Err(io::Error::last_os_error())
+            };
+            Ok(Transaction{ handle: handle })
+        }
+    }
+
+    pub fn commit(&self) -> io::Result<()> {
+        unsafe {
+            match ktmw32::CommitTransaction(self.handle) {
+                0 => Err(io::Error::last_os_error()),
+                _ => Ok(())
+            }
+        }
+    }
+
+    pub fn rollback(&self) -> io::Result<()> {
+        unsafe {
+            match ktmw32::RollbackTransaction(self.handle) {
+                0 => Err(io::Error::last_os_error()),
+                _ => Ok(())
+            }
+        }
+    }
+
+    fn close_(&mut self) -> io::Result<()> {
+        unsafe {
+            match kernel32::CloseHandle(self.handle) {
+                0 => Err(io::Error::last_os_error()),
+                _ => Ok(())
+            }
+        }
+    }
+}
+
+impl Drop for Transaction {
+    fn drop(&mut self) {
+        self.close_().unwrap_or(());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/winreg/src/types.rs
@@ -0,0 +1,141 @@
+// Copyright 2015, Igor Shaula
+// Licensed under the MIT License <LICENSE or
+// http://opensource.org/licenses/MIT>. This file
+// may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Traits for loading/saving Registry values
+use std::slice;
+use std::io;
+use std::ffi::{OsStr,OsString};
+use std::os::windows::ffi::{OsStrExt,OsStringExt};
+use super::winapi::winerror;
+use super::{RegValue};
+use super::enums::*;
+use super::{to_utf16,v16_to_v8};
+
+/// A trait for types that can be loaded from registry values.
+///
+/// **NOTE:** Uses `from_utf16_lossy` when converting to `String`.
+///
+/// **NOTE:** When converting to `String`, trailing `NULL` characters are trimmed
+/// and line separating `NULL` characters in `REG_MULTI_SZ` are replaced by `\n`.
+/// When converting to `OsString`, all `NULL` characters are left as is.
+pub trait FromRegValue : Sized {
+    fn from_reg_value(val: &RegValue) -> io::Result<Self>;
+}
+
+impl FromRegValue for String {
+    fn from_reg_value(val: &RegValue) -> io::Result<String> {
+        match val.vtype {
+            REG_SZ | REG_EXPAND_SZ | REG_MULTI_SZ => {
+                let words = unsafe {
+                    slice::from_raw_parts(val.bytes.as_ptr() as *const u16, val.bytes.len() / 2)
+                };
+                let mut s = String::from_utf16_lossy(words);
+                while s.ends_with('\u{0}') {s.pop();}
+                if val.vtype == REG_MULTI_SZ {
+                    return Ok(s.replace("\u{0}", "\n"))
+                }
+                Ok(s)
+            },
+            _ => werr!(winerror::ERROR_BAD_FILE_TYPE)
+        }
+    }
+}
+
+impl FromRegValue for OsString {
+    fn from_reg_value(val: &RegValue) -> io::Result<OsString> {
+        match val.vtype {
+            REG_SZ | REG_EXPAND_SZ | REG_MULTI_SZ => {
+                let words = unsafe {
+                    slice::from_raw_parts(val.bytes.as_ptr() as *const u16, val.bytes.len() / 2)
+                };
+                let s = OsString::from_wide(words);
+                Ok(s)
+            },
+            _ => werr!(winerror::ERROR_BAD_FILE_TYPE)
+        }
+    }
+}
+
+impl FromRegValue for u32 {
+    fn from_reg_value(val: &RegValue) -> io::Result<u32> {
+        match val.vtype {
+            REG_DWORD => {
+                Ok(unsafe{ *(val.bytes.as_ptr() as *const u32) })
+            },
+            _ => werr!(winerror::ERROR_BAD_FILE_TYPE)
+        }
+    }
+}
+
+impl FromRegValue for u64 {
+    fn from_reg_value(val: &RegValue) -> io::Result<u64> {
+        match val.vtype {
+            REG_QWORD => {
+                Ok(unsafe{ *(val.bytes.as_ptr() as *const u64) })
+            },
+            _ => werr!(winerror::ERROR_BAD_FILE_TYPE)
+        }
+    }
+}
+
+/// A trait for types that can be written into registry values.
+///
+/// **NOTE:** Adds trailing `NULL` character to `str` and `String` values
+/// but **not** to `OsStr` values.
+pub trait ToRegValue {
+    fn to_reg_value(&self) -> RegValue;
+}
+
+impl ToRegValue for String {
+    fn to_reg_value(&self) -> RegValue {
+        RegValue{
+            bytes: v16_to_v8(&to_utf16(self)),
+            vtype: REG_SZ
+        }
+    }
+}
+
+impl<'a> ToRegValue for &'a str {
+    fn to_reg_value(&self) -> RegValue {
+        RegValue{
+            bytes: v16_to_v8(&to_utf16(self)),
+            vtype: REG_SZ
+        }
+    }
+}
+
+impl<'a> ToRegValue for &'a OsStr {
+    fn to_reg_value(&self) -> RegValue {
+        RegValue{
+            bytes: v16_to_v8(&(self.encode_wide().collect::<Vec<_>>())),
+            vtype: REG_SZ
+        }
+    }
+}
+
+impl ToRegValue for u32 {
+    fn to_reg_value(&self) -> RegValue {
+        let bytes: Vec<u8> = unsafe {
+            slice::from_raw_parts((self as *const u32) as *const u8, 4).to_vec()
+        };
+        RegValue{
+            bytes: bytes,
+            vtype: REG_DWORD
+        }
+    }
+}
+
+impl ToRegValue for u64 {
+    fn to_reg_value(&self) -> RegValue {
+        let bytes: Vec<u8> = unsafe {
+            slice::from_raw_parts((self as *const u64) as *const u8, 8).to_vec()
+        };
+        RegValue{
+            bytes: bytes,
+            vtype: REG_QWORD
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"51e52038dc72d5cc37e35cea86d7d6963b59f9b9a6e8c0a5a02a5ff6e4de4b64",".travis.yml":"0fdc25599955e736ecacc1cebd797f881211ac6c884ab2d30354577c43ffcd90","Cargo.toml":"cc7a9135f41fd8da033fcc015efe686f28f11908bfe8b351f483e24a527aaa6b","LICENSE":"5e7ac0ad7a72f8cb5772354d32b09ada8d9894212fda6ee13e1dd0eadc2e37e0","README.md":"83a651701a98d695873abb0d317b30258a6c353edae37af31564924d0620c67d","appveyor.yml":"d16570d4d11a2ce39d9684fe2e4ea9349b57ece4f2352de17c286461c78cc02e","examples/extract.rs":"bb5c54f37d7cc6388a1f7bc463b92584267a0150e2ceb8a63278160445dff0f3","examples/extract_lorem.rs":"627754013da474f16bf51f81e7898d0c059176e9724f09654202e326242f5c93","examples/write_sample.rs":"42d273e35e5a975ceb94277fb310b03177ea528e492df3ca9c66b7a59113bdca","script/doc-upload.cfg":"07b75180ece25f83941233e0e90295db54eef8e51d4fe171cba009f67d62d3f0","src/compression.rs":"ba15dac70de2d44c5de2bf7dc286a11ded48d9df80b7465d1f05c2ee943ca399","src/cp437.rs":"10744ad7893f1ac712e5f87268de073f12753bd58074e8fcb70516657ef3f48c","src/crc32.rs":"faef1a9b513a901c2763e806c4833fee8c7fc174bf2caaf29e22813a8dd85cd3","src/lib.rs":"1ed01e0ab9be5f9cc484d5d2898011a9af23080ce560c856bc1500ce559a68e7","src/read.rs":"bb97ea6ded215a86667ecd8eea6a8b1889782f46ee487981fd66e13fb3800164","src/result.rs":"c55a1eaebbfb9529d17b20dc38e1f140b7a282f7067885c3da65c6746c16774e","src/spec.rs":"959a5158c2f436c37a5b1a9f49cafdb62c3198a67ea09d15d8cdf7b24334891c","src/types.rs":"daf733db787c487893c268676cf2b4a09c576e1ce68eea924f8562f8a3f21273","src/write.rs":"186dcc7a6dc2fac78fad5818226bb03e177e3b5b912c0703b125576383d4dde7"},"package":"c0deac03fc7d43abcf19f2c2db6bd9289f9ea3d31f350e26eb0ed8b4117983c1"}
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/.gitignore
@@ -0,0 +1,2 @@
+Cargo.lock
+target
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/.travis.yml
@@ -0,0 +1,20 @@
+language: rust
+
+rust:
+    - stable
+
+sudo: false
+
+notifications:
+    email:
+        on_success: never
+        on_failure: always
+
+script:
+    - cargo test
+    - cargo test --no-default-features
+    - cargo doc --no-deps
+    - rustdoc --test README.md -L target/debug
+
+after_success:
+    - curl https://mvdnes.github.io/rust-docs/travis-doc-upload.sh | bash
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+
+name = "zip"
+version = "0.1.19"
+authors = ["Mathijs van de Nes <git@mathijs.vd-nes.nl>"]
+license = "MIT"
+repository = "https://github.com/mvdnes/zip-rs.git"
+documentation = "http://mvdnes.github.io/rust-docs/zip-rs/zip/index.html"
+keywords = ["zip", "archive"]
+description = """
+Library to support the reading and writing of zip files.
+"""
+
+[dependencies]
+flate2 = "0.2"
+time = "0.1"
+podio = "0.1"
+msdos_time = "0.1"
+bzip2 = { version = "0.3", optional = true }
+
+[features]
+default = ["bzip2"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathijs van de Nes
+
+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
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/README.md
@@ -0,0 +1,42 @@
+zip-rs
+======
+
+[![Build Status](https://travis-ci.org/mvdnes/zip-rs.svg?branch=master)](https://travis-ci.org/mvdnes/zip-rs)
+[![Build status](https://ci.appveyor.com/api/projects/status/gsnpqcodg19iu253/branch/master?svg=true)](https://ci.appveyor.com/project/mvdnes/zip-rs/branch/master)
+[![Crates.io version](https://img.shields.io/crates/v/zip.svg)](https://crates.io/crates/zip)
+
+[Documentation](http://mvdnes.github.io/rust-docs/zip-rs/zip/index.html)
+
+Info
+----
+
+A zip library for rust which supports reading and writing of simple ZIP files.
+
+Supported compression formats:
+
+* stored (i.e. none)
+* deflate
+* bzip2 (optional, enabled by default)
+
+Currently unsupported zip extensions:
+
+* ZIP64
+* Encryption
+* Multi-disk
+
+Usage
+-----
+
+With all default features:
+
+```toml
+[dependencies]
+zip = "0.1"
+```
+
+Without the default features:
+
+```toml
+[dependencies]
+zip = { version = "0.1", default-features = false }
+```
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/appveyor.yml
@@ -0,0 +1,49 @@
+environment:
+    matrix:
+        - RUST_INSTALL_TOOLCHAIN: gnu
+          RUST_CHANNEL: stable
+        - RUST_INSTALL_TOOLCHAIN: msvc
+          RUST_CHANNEL: nightly
+
+matrix:
+    allow_failures:
+        - RUST_CHANNEL: nightly
+
+platform:
+    - x86
+    - x64
+
+install:
+    - ps: Start-FileDownload "http://static.rust-lang.org/dist/channel-rust-${env:RUST_CHANNEL}"
+    - ps: |
+          if ($env:PLATFORM -eq "x86") {
+            $env:RUST_INSTALLER = Select-String "i686-pc-windows-${env:RUST_INSTALL_TOOLCHAIN}.*exe" "channel-rust-${env:RUST_CHANNEL}" | select -exp line
+          } else {
+            $env:RUST_INSTALLER = Select-String "x86_64-pc-windows-${env:RUST_INSTALL_TOOLCHAIN}.*exe" "channel-rust-${env:RUST_CHANNEL}" | select -exp line
+          }
+    - ps: Start-FileDownload "http://static.rust-lang.org/dist/${env:RUST_INSTALLER}"
+    - '%RUST_INSTALLER% /VERYSILENT /NORESTART /DIR="C:\Rust"'
+    - ps: $env:path = "C:\Rust\bin;" + $env:path
+    - ps: |
+        if ($env:RUST_INSTALL_TOOLCHAIN -eq "gnu" -And $env:PLATFORM -eq "x64") {
+            Start-FileDownload "http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/5.1.0/threads-win32/seh/x86_64-5.1.0-release-win32-seh-rt_v4-rev0.7z/download" -FileName mingw64.7z
+            7z x -oC:\ mingw64.7z > $null
+            $env:path = "C:\mingw64\bin;" + $env:path
+            gcc --version
+        }
+        elseif ($env:RUST_INSTALL_TOOLCHAIN -eq "gnu") {
+            $env:path = "C:\mingw\bin;" + $env:path
+            gcc --version
+        }
+    - ps: |
+        if ($env:PLATFORM -eq "x64") { $env:vcargs = "amd64" }
+        else { $env:vcargs = "x86" }
+    - call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" %vcargs%
+    - rustc --version --verbose
+    - cargo --version
+
+build: false
+
+test_script:
+    - cargo test
+    - cargo test --no-default-features
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/examples/extract.rs
@@ -0,0 +1,97 @@
+extern crate zip;
+
+use std::io;
+use std::fs;
+
+#[cfg(unix)]
+use std::os::unix::fs::PermissionsExt;
+
+fn main() {
+    std::process::exit(real_main());
+}
+
+fn real_main() -> i32
+{
+    let args: Vec<_> = std::env::args().collect();
+    if args.len() < 2 {
+        println!("Usage: {} <filename>", args[0]);
+        return 1;
+    }
+    let fname = std::path::Path::new(&*args[1]);
+    let file = fs::File::open(&fname).unwrap();
+
+    let mut archive = zip::ZipArchive::new(file).unwrap();
+
+    for i in 0..archive.len()
+    {
+        let mut file = archive.by_index(i).unwrap();
+        let outpath = sanitize_filename(file.name());
+        println!("{}", outpath.display());
+
+        {
+            let comment = file.comment();
+            if comment.len() > 0 { println!("  File comment: {}", comment); }
+        }
+
+        create_directory(outpath.parent().unwrap_or(std::path::Path::new("")), None);
+
+        let perms = convert_permissions(file.unix_mode());
+
+        if (&*file.name()).ends_with("/") {
+            create_directory(&outpath, perms);
+            
+        }
+        else {
+            write_file(&mut file, &outpath, perms);
+        }
+    }
+
+    return 0;
+}
+
+#[cfg(unix)]
+fn convert_permissions(mode: Option<u32>) -> Option<fs::Permissions>
+{
+    match mode {
+        Some(mode) => Some(fs::Permissions::from_mode(mode)),
+        None => None,
+    }
+}
+#[cfg(not(unix))]
+fn convert_permissions(_mode: Option<u32>) -> Option<fs::Permissions>
+{
+    None
+}
+
+fn write_file(file: &mut zip::read::ZipFile, outpath: &std::path::Path, perms: Option<fs::Permissions>)
+{
+    let mut outfile = fs::File::create(&outpath).unwrap();
+    io::copy(file, &mut outfile).unwrap();
+    if let Some(perms) = perms {
+        fs::set_permissions(outpath, perms).unwrap();
+    }
+}
+
+fn create_directory(outpath: &std::path::Path, perms: Option<fs::Permissions>)
+{
+    fs::create_dir_all(&outpath).unwrap();
+    if let Some(perms) = perms {
+        fs::set_permissions(outpath, perms).unwrap();
+    }
+}
+
+fn sanitize_filename(filename: &str) -> std::path::PathBuf
+{
+    let no_null_filename = match filename.find('\0') {
+        Some(index) => &filename[0..index],
+        None => filename,
+    };
+
+    std::path::Path::new(no_null_filename)
+        .components()
+        .filter(|component| *component != std::path::Component::ParentDir)
+        .fold(std::path::PathBuf::new(), |mut path, ref cur| {
+            path.push(cur.as_os_str());
+            path
+        })
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/examples/extract_lorem.rs
@@ -0,0 +1,33 @@
+use std::io::prelude::*;
+
+extern crate zip;
+
+fn main()
+{
+    std::process::exit(real_main());
+}
+
+fn real_main() -> i32
+{
+    let args: Vec<_> = std::env::args().collect();
+    if args.len() < 2 {
+        println!("Usage: {} <filename>", args[0]);
+        return 1;
+    }
+    let fname = std::path::Path::new(&*args[1]);
+    let zipfile = std::fs::File::open(&fname).unwrap();
+
+    let mut archive = zip::ZipArchive::new(zipfile).unwrap();
+    
+    let mut file = match archive.by_name("test/lorem_ipsum.txt")
+    {
+        Ok(file) => file,
+        Err(..) => { println!("File test/lorem_ipsum.txt not found"); return 2;}
+    };
+
+    let mut contents = String::new();
+    file.read_to_string(&mut contents).unwrap();
+    println!("{}", contents);
+
+    return 0;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/examples/write_sample.rs
@@ -0,0 +1,73 @@
+use std::io::prelude::*;
+
+extern crate zip;
+
+fn main()
+{
+    std::process::exit(real_main());
+}
+
+fn real_main() -> i32
+{
+    let args: Vec<_> = std::env::args().collect();
+    if args.len() < 2 {
+        println!("Usage: {} <filename>", args[0]);
+        return 1;
+    }
+
+    let filename = &*args[1];
+    match doit(filename)
+    {
+        Ok(_) => println!("File written to {}", filename),
+        Err(e) => println!("Error: {:?}", e),
+    }
+
+    return 0;
+}
+
+fn doit(filename: &str) -> zip::result::ZipResult<()>
+{
+    let path = std::path::Path::new(filename);
+    let file = std::fs::File::create(&path).unwrap();
+
+    let mut zip = zip::ZipWriter::new(file);
+
+    try!(zip.start_file("test/", zip::CompressionMethod::Stored));
+
+    try!(zip.start_file("test/☃.txt", zip::CompressionMethod::Stored));
+    try!(zip.write_all(b"Hello, World!\n"));
+
+    try!(zip.start_file("test/lorem_ipsum.txt", zip::CompressionMethod::Deflated));
+    try!(zip.write_all(LOREM_IPSUM));
+
+    try!(zip.finish());
+    Ok(())
+}
+
+const LOREM_IPSUM : &'static [u8] = b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. In tellus elit, tristique vitae mattis egestas, ultricies vitae risus. Quisque sit amet quam ut urna aliquet
+molestie. Proin blandit ornare dui, a tempor nisl accumsan in. Praesent a consequat felis. Morbi metus diam, auctor in auctor vel, feugiat id odio. Curabitur ex ex,
+dictum quis auctor quis, suscipit id lorem. Aliquam vestibulum dolor nec enim vehicula, porta tristique augue tincidunt. Vivamus ut gravida est. Sed pellentesque, dolor
+vitae tristique consectetur, neque lectus pulvinar dui, sed feugiat purus diam id lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+inceptos himenaeos. Maecenas feugiat velit in ex ultrices scelerisque id id neque.
+
+Phasellus sed nisi in augue sodales pulvinar ut et leo. Pellentesque eget leo vitae massa bibendum sollicitudin. Curabitur erat lectus, congue quis auctor sed, aliquet
+bibendum est. Ut porta ultricies turpis at maximus. Cras non lobortis justo. Duis rutrum magna sed velit facilisis, et sagittis metus laoreet. Pellentesque quam ligula,
+dapibus vitae mauris quis, dapibus cursus leo. Sed sit amet condimentum eros. Nulla vestibulum enim sit amet lorem pharetra, eu fringilla nisl posuere. Sed tristique non
+nibh at viverra. Vivamus sed accumsan lacus, nec pretium eros. Mauris elementum arcu eu risus fermentum, tempor ullamcorper neque aliquam. Sed tempor in erat eu
+suscipit. In euismod in libero in facilisis. Donec sagittis, odio et fermentum dignissim, risus justo pretium nibh, eget vestibulum lectus metus vel lacus.
+
+Quisque feugiat, magna ac feugiat ullamcorper, augue justo consequat felis, ut fermentum arcu lorem vitae ligula. Quisque iaculis tempor maximus. In quis eros ac tellus
+aliquam placerat quis id tellus. Donec non gravida nulla. Morbi faucibus neque sed faucibus aliquam. Sed accumsan mattis nunc, non interdum justo. Cras vitae facilisis
+leo. Fusce sollicitudin ultrices sagittis. Maecenas eget massa id lorem dignissim ultrices non et ligula. Pellentesque aliquam mi ac neque tempus ornare. Morbi non enim
+vulputate quam ullamcorper finibus id non neque. Quisque malesuada commodo lorem, ut ornare velit iaculis rhoncus. Mauris vel maximus ex.
+
+Morbi eleifend blandit diam, non vulputate ante iaculis in. Donec pellentesque augue id enim suscipit, eget suscipit lacus commodo. Ut vel ex vitae elit imperdiet
+vulputate. Nunc eu mattis orci, ut pretium sem. Nam vitae purus mollis ante tempus malesuada a at magna. Integer mattis lectus non luctus lobortis. In a cursus quam,
+eget faucibus sem.
+
+Donec vitae condimentum nisi, non efficitur massa. Praesent sed mi in massa sollicitudin iaculis. Pellentesque a libero ultrices, sodales lacus eu, ornare dui. In
+laoreet est nec dolor aliquam consectetur. Integer iaculis felis venenatis libero pulvinar, ut pretium odio interdum. Donec in nisi eu dolor varius vestibulum eget vel
+nunc. Morbi a venenatis quam, in vehicula justo. Nam risus dui, auctor eu accumsan at, sagittis ac lectus. Mauris iaculis dignissim interdum. Cras cursus dapibus auctor.
+Donec sagittis massa vitae tortor viverra vehicula. Mauris fringilla nunc eu lorem ultrices placerat. Maecenas posuere porta quam at semper. Praesent eu bibendum eros.
+Nunc congue sollicitudin ante, sollicitudin lacinia magna cursus vitae.
+";
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/script/doc-upload.cfg
@@ -0,0 +1,3 @@
+PROJECT_NAME=zip-rs
+DOCS_REPO=mvdnes/rust-docs.git
+DOC_RUST_VERSION=stable
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/compression.rs
@@ -0,0 +1,101 @@
+//! Possible ZIP compression methods.
+
+use std::fmt;
+
+/// Compression methods for the contents of a ZIP file.
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub enum CompressionMethod
+{
+    /// The file is stored (no compression)
+    Stored,
+    /// The file is Deflated
+    Deflated,
+    /// File is compressed using BZIP2 algorithm
+    #[cfg(feature = "bzip2")]
+    Bzip2,
+    /// Unsupported compression method
+    Unsupported(u16),
+}
+
+impl CompressionMethod {
+    /// Converts an u16 to its corresponding CompressionMethod
+    pub fn from_u16(val: u16) -> CompressionMethod {
+        match val {
+            0 => CompressionMethod::Stored,
+            8 => CompressionMethod::Deflated,
+            #[cfg(feature = "bzip2")]
+            12 => CompressionMethod::Bzip2,
+            v => CompressionMethod::Unsupported(v),
+        }
+    }
+
+    /// Converts a CompressionMethod to a u16
+    pub fn to_u16(self) -> u16 {
+        match self {
+            CompressionMethod::Stored => 0,
+            CompressionMethod::Deflated => 8,
+            #[cfg(feature = "bzip2")]
+            CompressionMethod::Bzip2 => 12,
+            CompressionMethod::Unsupported(v) => v,
+        }
+    }
+}
+
+impl fmt::Display for CompressionMethod {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        // Just duplicate what the Debug format looks like, i.e, the enum key:
+        write!(f, "{:?}", self)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::CompressionMethod;
+
+    #[test]
+    fn from_eq_to() {
+        for v in 0..(::std::u16::MAX as u32 + 1)
+        {
+            let from = CompressionMethod::from_u16(v as u16);
+            let to = from.to_u16() as u32;
+            assert_eq!(v, to);
+        }
+    }
+
+    #[cfg(not(feature = "bzip2"))]
+    fn methods() -> Vec<CompressionMethod> {
+        vec![CompressionMethod::Stored, CompressionMethod::Deflated]
+    }
+
+    #[cfg(feature = "bzip2")]
+    fn methods() -> Vec<CompressionMethod> {
+        vec![CompressionMethod::Stored, CompressionMethod::Deflated, CompressionMethod::Bzip2]
+    }
+
+    #[test]
+    fn to_eq_from() {
+        fn check_match(method: CompressionMethod) {
+            let to = method.to_u16();
+            let from = CompressionMethod::from_u16(to);
+            let back = from.to_u16();
+            assert_eq!(to, back);
+        }
+
+        for method in methods() {
+            check_match(method);
+        }
+    }
+
+    #[test]
+    fn to_display_fmt() {
+        fn check_match(method: CompressionMethod) {
+            let debug_str = format!("{:?}", method);
+            let display_str = format!("{}", method);
+            assert_eq!(debug_str, display_str);
+        }
+
+        for method in methods() {
+            check_match(method);
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/cp437.rs
@@ -0,0 +1,212 @@
+//! Convert a string in IBM codepage 437 to UTF-8
+
+/// Trait to convert IBM codepage 437 to the target type
+pub trait FromCp437 {
+    /// Target type
+    type Target;
+
+    /// Function that does the conversion from cp437.
+    /// Gennerally allocations will be avoided if all data falls into the ASCII range.
+    fn from_cp437(self) -> Self::Target;
+}
+
+impl<'a> FromCp437 for &'a [u8] {
+    type Target = ::std::borrow::Cow<'a, str>;
+
+    fn from_cp437(self) -> Self::Target
+    {
+        if self.iter().all(|c| *c < 0x80) {
+            ::std::str::from_utf8(self).unwrap().into()
+        }
+        else {
+            self.iter().map(|c| to_char(*c)).collect::<String>().into()
+        }
+    }
+}
+
+impl FromCp437 for Vec<u8> {
+    type Target = String;
+
+    fn from_cp437(self) -> Self::Target {
+        if self.iter().all(|c| *c < 0x80) {
+            String::from_utf8(self).unwrap()
+        }
+        else {
+            self.into_iter().map(|c| to_char(c)).collect()
+        }
+    }
+}
+
+fn to_char(input: u8) -> char
+{
+    let output = match input
+    {
+        0x00 ... 0x7f => input as u32,
+        0x80 => 0x00c7,
+        0x81 => 0x00fc,
+        0x82 => 0x00e9,
+        0x83 => 0x00e2,
+        0x84 => 0x00e4,
+        0x85 => 0x00e0,
+        0x86 => 0x00e5,
+        0x87 => 0x00e7,
+        0x88 => 0x00ea,
+        0x89 => 0x00eb,
+        0x8a => 0x00e8,
+        0x8b => 0x00ef,
+        0x8c => 0x00ee,
+        0x8d => 0x00ec,
+        0x8e => 0x00c4,
+        0x8f => 0x00c5,
+        0x90 => 0x00c9,
+        0x91 => 0x00e6,
+        0x92 => 0x00c6,
+        0x93 => 0x00f4,
+        0x94 => 0x00f6,
+        0x95 => 0x00f2,
+        0x96 => 0x00fb,
+        0x97 => 0x00f9,
+        0x98 => 0x00ff,
+        0x99 => 0x00d6,
+        0x9a => 0x00dc,
+        0x9b => 0x00a2,
+        0x9c => 0x00a3,
+        0x9d => 0x00a5,
+        0x9e => 0x20a7,
+        0x9f => 0x0192,
+        0xa0 => 0x00e1,
+        0xa1 => 0x00ed,
+        0xa2 => 0x00f3,
+        0xa3 => 0x00fa,
+        0xa4 => 0x00f1,
+        0xa5 => 0x00d1,
+        0xa6 => 0x00aa,
+        0xa7 => 0x00ba,
+        0xa8 => 0x00bf,
+        0xa9 => 0x2310,
+        0xaa => 0x00ac,
+        0xab => 0x00bd,
+        0xac => 0x00bc,
+        0xad => 0x00a1,
+        0xae => 0x00ab,
+        0xaf => 0x00bb,
+        0xb0 => 0x2591,
+        0xb1 => 0x2592,
+        0xb2 => 0x2593,
+        0xb3 => 0x2502,
+        0xb4 => 0x2524,
+        0xb5 => 0x2561,
+        0xb6 => 0x2562,
+        0xb7 => 0x2556,
+        0xb8 => 0x2555,
+        0xb9 => 0x2563,
+        0xba => 0x2551,
+        0xbb => 0x2557,
+        0xbc => 0x255d,
+        0xbd => 0x255c,
+        0xbe => 0x255b,
+        0xbf => 0x2510,
+        0xc0 => 0x2514,
+        0xc1 => 0x2534,
+        0xc2 => 0x252c,
+        0xc3 => 0x251c,
+        0xc4 => 0x2500,
+        0xc5 => 0x253c,
+        0xc6 => 0x255e,
+        0xc7 => 0x255f,
+        0xc8 => 0x255a,
+        0xc9 => 0x2554,
+        0xca => 0x2569,
+        0xcb => 0x2566,
+        0xcc => 0x2560,
+        0xcd => 0x2550,
+        0xce => 0x256c,
+        0xcf => 0x2567,
+        0xd0 => 0x2568,
+        0xd1 => 0x2564,
+        0xd2 => 0x2565,
+        0xd3 => 0x2559,
+        0xd4 => 0x2558,
+        0xd5 => 0x2552,
+        0xd6 => 0x2553,
+        0xd7 => 0x256b,
+        0xd8 => 0x256a,
+        0xd9 => 0x2518,
+        0xda => 0x250c,
+        0xdb => 0x2588,
+        0xdc => 0x2584,
+        0xdd => 0x258c,
+        0xde => 0x2590,
+        0xdf => 0x2580,
+        0xe0 => 0x03b1,
+        0xe1 => 0x00df,
+        0xe2 => 0x0393,
+        0xe3 => 0x03c0,
+        0xe4 => 0x03a3,
+        0xe5 => 0x03c3,
+        0xe6 => 0x00b5,
+        0xe7 => 0x03c4,
+        0xe8 => 0x03a6,
+        0xe9 => 0x0398,
+        0xea => 0x03a9,
+        0xeb => 0x03b4,
+        0xec => 0x221e,
+        0xed => 0x03c6,
+        0xee => 0x03b5,
+        0xef => 0x2229,
+        0xf0 => 0x2261,
+        0xf1 => 0x00b1,
+        0xf2 => 0x2265,
+        0xf3 => 0x2264,
+        0xf4 => 0x2320,
+        0xf5 => 0x2321,
+        0xf6 => 0x00f7,
+        0xf7 => 0x2248,
+        0xf8 => 0x00b0,
+        0xf9 => 0x2219,
+        0xfa => 0x00b7,
+        0xfb => 0x221a,
+        0xfc => 0x207f,
+        0xfd => 0x00b2,
+        0xfe => 0x25a0,
+        0xff => 0x00a0,
+        _ => unreachable!(),
+    };
+    ::std::char::from_u32(output).unwrap()
+}
+
+#[cfg(test)]
+mod test
+{
+    #[test]
+    fn to_char_valid()
+    {
+        for i in 0x00_u32 .. 0x100
+        {
+            super::to_char(i as u8);
+        }
+    }
+
+    #[test]
+    fn ascii() {
+        for i in 0x00 .. 0x80 {
+            assert_eq!(super::to_char(i), i as char);
+        }
+    }
+
+    #[test]
+    fn example_slice() {
+        use super::FromCp437;
+        let data = b"Cura\x87ao";
+        assert!(::std::str::from_utf8(data).is_err());
+        assert_eq!(data.from_cp437(), "Curaçao");
+    }
+
+    #[test]
+    fn example_vec() {
+        use super::FromCp437;
+        let data = vec![0xCC, 0xCD, 0xCD, 0xB9];
+        assert!(String::from_utf8(data.clone()).is_err());
+        assert_eq!(&data.from_cp437(), "â• â•â•â•£");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/crc32.rs
@@ -0,0 +1,124 @@
+//! Helper module to compute a CRC32 checksum
+
+use std::io;
+use std::io::prelude::*;
+
+static CRC32_TABLE : [u32; 256] = [
+	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+	0xe963a535, 0x9e6495a3,	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+	0xf3b97148, 0x84be41de,	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,	0x14015c4f, 0x63066cd9,
+	0xfa0f3d63, 0x8d080df5,	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,	0x35b5a8fa, 0x42b2986c,
+	0xdbbbc9d6, 0xacbcf940,	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,	0x76dc4190, 0x01db7106,
+	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+	0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+	0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+];
+
+/// Update the checksum prev based upon the contents of buf.
+pub fn update(prev: u32, buf: &[u8]) -> u32
+{
+    let mut crc = !prev;
+
+    for &byte in buf.iter()
+    {
+        crc = CRC32_TABLE[((crc as u8) ^ byte) as usize] ^ (crc >> 8);
+    }
+
+    !crc
+}
+
+/// Reader that validates the CRC32 when it reaches the EOF.
+pub struct Crc32Reader<R>
+{
+    inner: R,
+    crc: u32,
+    check: u32,
+}
+
+impl<R> Crc32Reader<R>
+{
+    /// Get a new Crc32Reader which check the inner reader against checksum.
+    pub fn new(inner: R, checksum: u32) -> Crc32Reader<R>
+    {
+        Crc32Reader
+        {
+            inner: inner,
+            crc: 0,
+            check: checksum,
+        }
+    }
+
+    fn check_matches(&self) -> bool
+    {
+        self.check == self.crc
+    }
+}
+
+impl<R: Read> Read for Crc32Reader<R>
+{
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>
+    {
+        let count = match self.inner.read(buf)
+        {
+            Ok(0) if !self.check_matches() => { return Err(io::Error::new(io::ErrorKind::Other, "Invalid checksum")) },
+            Ok(n) => n,
+            Err(e) => return Err(e),
+        };
+        self.crc = update(self.crc, &buf[0..count]);
+        Ok(count)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    #[test]
+    fn samples() {
+        assert_eq!(super::update(0, b""), 0);
+
+        // test vectors from the iPXE project (input and output are bitwise negated)
+        assert_eq!(super::update(!0x12345678, b""), !0x12345678);
+        assert_eq!(super::update(!0xffffffff, b"hello world"), !0xf2b5ee7a);
+        assert_eq!(super::update(!0xffffffff, b"hello"), !0xc9ef5979);
+        assert_eq!(super::update(!0xc9ef5979, b" world"), !0xf2b5ee7a);
+
+        // Some vectors found on Rosetta code
+        assert_eq!(super::update(0, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), 0x190A55AD);
+        assert_eq!(super::update(0, b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"), 0xFF6CAB0B);
+        assert_eq!(super::update(0, b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"), 0x91267E8A);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/lib.rs
@@ -0,0 +1,23 @@
+//! A basic ZipReader/Writer crate
+
+#![warn(missing_docs)]
+
+#[cfg(feature = "bzip2")]
+extern crate bzip2;
+extern crate flate2;
+extern crate msdos_time;
+extern crate podio;
+extern crate time;
+
+pub use read::ZipArchive;
+pub use write::ZipWriter;
+pub use compression::CompressionMethod;
+
+mod spec;
+mod crc32;
+mod types;
+pub mod read;
+mod compression;
+pub mod write;
+mod cp437;
+pub mod result;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/read.rs
@@ -0,0 +1,352 @@
+//! Structs for reading a ZIP archive
+
+use crc32::Crc32Reader;
+use compression::CompressionMethod;
+use spec;
+use result::{ZipResult, ZipError};
+use std::io;
+use std::io::prelude::*;
+use std::collections::HashMap;
+use flate2;
+use flate2::FlateReadExt;
+use podio::{ReadPodExt, LittleEndian};
+use types::{ZipFileData, System};
+use cp437::FromCp437;
+use msdos_time::{TmMsDosExt, MsDosDateTime};
+
+#[cfg(feature = "bzip2")]
+use bzip2::read::BzDecoder;
+
+mod ffi {
+    pub const S_IFDIR: u32 = 0o0040000;
+    pub const S_IFREG: u32 = 0o0100000;
+}
+
+/// Wrapper for reading the contents of a ZIP file.
+///
+/// ```
+/// fn doit() -> zip::result::ZipResult<()>
+/// {
+///     use std::io::prelude::*;
+///
+///     // For demonstration purposes we read from an empty buffer.
+///     // Normally a File object would be used.
+///     let buf: &[u8] = &[0u8; 128];
+///     let mut reader = std::io::Cursor::new(buf);
+///
+///     let mut zip = try!(zip::ZipArchive::new(reader));
+///
+///     for i in 0..zip.len()
+///     {
+///         let mut file = zip.by_index(i).unwrap();
+///         println!("Filename: {}", file.name());
+///         let first_byte = try!(file.bytes().next().unwrap());
+///         println!("{}", first_byte);
+///     }
+///     Ok(())
+/// }
+///
+/// println!("Result: {:?}", doit());
+/// ```
+#[derive(Debug)]
+pub struct ZipArchive<R: Read + io::Seek>
+{
+    reader: R,
+    files: Vec<ZipFileData>,
+    names_map: HashMap<String, usize>,
+}
+
+enum ZipFileReader<'a> {
+    Stored(Crc32Reader<io::Take<&'a mut Read>>),
+    Deflated(Crc32Reader<flate2::read::DeflateDecoder<io::Take<&'a mut Read>>>),
+    #[cfg(feature = "bzip2")]
+    Bzip2(Crc32Reader<BzDecoder<io::Take<&'a mut Read>>>),
+}
+
+/// A struct for reading a zip file
+pub struct ZipFile<'a> {
+    data: &'a ZipFileData,
+    reader: ZipFileReader<'a>,
+}
+
+fn unsupported_zip_error<T>(detail: &'static str) -> ZipResult<T>
+{
+    Err(ZipError::UnsupportedArchive(detail))
+}
+
+impl<R: Read+io::Seek> ZipArchive<R>
+{
+    /// Opens a Zip archive and parses the central directory
+    pub fn new(mut reader: R) -> ZipResult<ZipArchive<R>> {
+        let footer = try!(spec::CentralDirectoryEnd::find_and_parse(&mut reader));
+
+        if footer.disk_number != footer.disk_with_central_directory { return unsupported_zip_error("Support for multi-disk files is not implemented") }
+
+        let directory_start = footer.central_directory_offset as u64;
+        let number_of_files = footer.number_of_files_on_this_disk as usize;
+
+        let mut files = Vec::with_capacity(number_of_files);
+        let mut names_map = HashMap::new();
+
+        try!(reader.seek(io::SeekFrom::Start(directory_start)));
+        for _ in 0 .. number_of_files
+        {
+            let file = try!(central_header_to_zip_file(&mut reader));
+            names_map.insert(file.file_name.clone(), files.len());
+            files.push(file);
+        }
+
+        Ok(ZipArchive { reader: reader, files: files, names_map: names_map })
+    }
+
+    /// Number of files contained in this zip.
+    ///
+    /// ```
+    /// fn iter() {
+    ///     let mut zip = zip::ZipArchive::new(std::io::Cursor::new(vec![])).unwrap();
+    ///
+    ///     for i in 0..zip.len() {
+    ///         let mut file = zip.by_index(i).unwrap();
+    ///         // Do something with file i
+    ///     }
+    /// }
+    /// ```
+    pub fn len(&self) -> usize
+    {
+        self.files.len()
+    }
+
+    /// Search for a file entry by name
+    pub fn by_name<'a>(&'a mut self, name: &str) -> ZipResult<ZipFile<'a>>
+    {
+        let index = match self.names_map.get(name) {
+            Some(index) => *index,
+            None => { return Err(ZipError::FileNotFound); },
+        };
+        self.by_index(index)
+    }
+
+    /// Get a contained file by index
+    pub fn by_index<'a>(&'a mut self, file_number: usize) -> ZipResult<ZipFile<'a>>
+    {
+        if file_number >= self.files.len() { return Err(ZipError::FileNotFound); }
+        let ref data = self.files[file_number];
+        let pos = data.data_start;
+
+        if data.encrypted
+        {
+            return unsupported_zip_error("Encrypted files are not supported")
+        }
+
+        try!(self.reader.seek(io::SeekFrom::Start(pos)));
+        let limit_reader = (self.reader.by_ref() as &mut Read).take(data.compressed_size);
+
+        let reader = match data.compression_method
+        {
+            CompressionMethod::Stored =>
+            {
+                ZipFileReader::Stored(Crc32Reader::new(
+                    limit_reader,
+                    data.crc32))
+            },
+            CompressionMethod::Deflated =>
+            {
+                let deflate_reader = limit_reader.deflate_decode();
+                ZipFileReader::Deflated(Crc32Reader::new(
+                    deflate_reader,
+                    data.crc32))
+            },
+            #[cfg(feature = "bzip2")]
+            CompressionMethod::Bzip2 =>
+            {
+                let bzip2_reader = BzDecoder::new(limit_reader);
+                ZipFileReader::Bzip2(Crc32Reader::new(
+                    bzip2_reader,
+                    data.crc32))
+            },
+            _ => return unsupported_zip_error("Compression method not supported"),
+        };
+        Ok(ZipFile { reader: reader, data: data })
+    }
+
+    /// Unwrap and return the inner reader object
+    ///
+    /// The position of the reader is undefined.
+    pub fn into_inner(self) -> R
+    {
+        self.reader
+    }
+}
+
+fn central_header_to_zip_file<R: Read+io::Seek>(reader: &mut R) -> ZipResult<ZipFileData>
+{
+    // Parse central header
+    let signature = try!(reader.read_u32::<LittleEndian>());
+    if signature != spec::CENTRAL_DIRECTORY_HEADER_SIGNATURE
+    {
+        return Err(ZipError::InvalidArchive("Invalid Central Directory header"))
+    }
+
+    let version_made_by = try!(reader.read_u16::<LittleEndian>());
+    let _version_to_extract = try!(reader.read_u16::<LittleEndian>());
+    let flags = try!(reader.read_u16::<LittleEndian>());
+    let encrypted = flags & 1 == 1;
+    let is_utf8 = flags & (1 << 11) != 0;
+    let compression_method = try!(reader.read_u16::<LittleEndian>());
+    let last_mod_time = try!(reader.read_u16::<LittleEndian>());
+    let last_mod_date = try!(reader.read_u16::<LittleEndian>());
+    let crc32 = try!(reader.read_u32::<LittleEndian>());
+    let compressed_size = try!(reader.read_u32::<LittleEndian>());
+    let uncompressed_size = try!(reader.read_u32::<LittleEndian>());
+    let file_name_length = try!(reader.read_u16::<LittleEndian>()) as usize;
+    let extra_field_length = try!(reader.read_u16::<LittleEndian>()) as usize;
+    let file_comment_length = try!(reader.read_u16::<LittleEndian>()) as usize;
+    let _disk_number = try!(reader.read_u16::<LittleEndian>());
+    let _internal_file_attributes = try!(reader.read_u16::<LittleEndian>());
+    let external_file_attributes = try!(reader.read_u32::<LittleEndian>());
+    let offset = try!(reader.read_u32::<LittleEndian>()) as u64;
+    let file_name_raw = try!(ReadPodExt::read_exact(reader, file_name_length));
+    let extra_field = try!(ReadPodExt::read_exact(reader, extra_field_length));
+    let file_comment_raw  = try!(ReadPodExt::read_exact(reader, file_comment_length));
+
+    let file_name = match is_utf8
+    {
+        true => String::from_utf8_lossy(&*file_name_raw).into_owned(),
+        false => file_name_raw.from_cp437(),
+    };
+    let file_comment = match is_utf8
+    {
+        true => String::from_utf8_lossy(&*file_comment_raw).into_owned(),
+        false => file_comment_raw.from_cp437(),
+    };
+
+    // Remember end of central header
+    let return_position = try!(reader.seek(io::SeekFrom::Current(0)));
+
+    // Parse local header
+    try!(reader.seek(io::SeekFrom::Start(offset)));
+    let signature = try!(reader.read_u32::<LittleEndian>());
+    if signature != spec::LOCAL_FILE_HEADER_SIGNATURE
+    {
+        return Err(ZipError::InvalidArchive("Invalid local file header"))
+    }
+
+    try!(reader.seek(io::SeekFrom::Current(22)));
+    let file_name_length = try!(reader.read_u16::<LittleEndian>()) as u64;
+    let extra_field_length = try!(reader.read_u16::<LittleEndian>()) as u64;
+    let magic_and_header = 4 + 22 + 2 + 2;
+    let data_start = offset + magic_and_header + file_name_length + extra_field_length;
+
+    // Construct the result
+    let mut result = ZipFileData
+    {
+        system: System::from_u8((version_made_by >> 8) as u8),
+        version_made_by: version_made_by as u8,
+        encrypted: encrypted,
+        compression_method: CompressionMethod::from_u16(compression_method),
+        last_modified_time: try!(::time::Tm::from_msdos(MsDosDateTime::new(last_mod_time, last_mod_date))),
+        crc32: crc32,
+        compressed_size: compressed_size as u64,
+        uncompressed_size: uncompressed_size as u64,
+        file_name: file_name,
+        file_comment: file_comment,
+        header_start: offset,
+        data_start: data_start,
+        external_attributes: external_file_attributes,
+    };
+
+    try!(parse_extra_field(&mut result, &*extra_field));
+
+    // Go back after the central header
+    try!(reader.seek(io::SeekFrom::Start(return_position)));
+
+    Ok(result)
+}
+
+fn parse_extra_field(_file: &mut ZipFileData, data: &[u8]) -> ZipResult<()>
+{
+    let mut reader = io::Cursor::new(data);
+
+    while (reader.position() as usize) < data.len()
+    {
+        let kind = try!(reader.read_u16::<LittleEndian>());
+        let len = try!(reader.read_u16::<LittleEndian>());
+        match kind
+        {
+            _ => try!(reader.seek(io::SeekFrom::Current(len as i64))),
+        };
+    }
+    Ok(())
+}
+
+/// Methods for retreiving information on zip files
+impl<'a> ZipFile<'a> {
+    fn get_reader(&mut self) -> &mut Read {
+        match self.reader {
+           ZipFileReader::Stored(ref mut r) => r as &mut Read,
+           ZipFileReader::Deflated(ref mut r) => r as &mut Read,
+           #[cfg(feature = "bzip2")]
+           ZipFileReader::Bzip2(ref mut r) => r as &mut Read,
+        }
+    }
+    /// Get the version of the file
+    pub fn version_made_by(&self) -> (u8, u8) {
+        (self.data.version_made_by / 10, self.data.version_made_by % 10)
+    }
+    /// Get the name of the file
+    pub fn name(&self) -> &str {
+        &*self.data.file_name
+    }
+    /// Get the comment of the file
+    pub fn comment(&self) -> &str {
+        &*self.data.file_comment
+    }
+    /// Get the compression method used to store the file
+    pub fn compression(&self) -> CompressionMethod {
+        self.data.compression_method
+    }
+    /// Get the size of the file in the archive
+    pub fn compressed_size(&self) -> u64 {
+        self.data.compressed_size
+    }
+    /// Get the size of the file when uncompressed
+    pub fn size(&self) -> u64 {
+        self.data.uncompressed_size
+    }
+    /// Get the time the file was last modified
+    pub fn last_modified(&self) -> ::time::Tm {
+        self.data.last_modified_time
+    }
+    /// Get unix mode for the file
+    pub fn unix_mode(&self) -> Option<u32> {
+        match self.data.system {
+            System::Unix => {
+                Some(self.data.external_attributes >> 16)
+            },
+            System::Dos => {
+                // Interpret MSDOS directory bit
+                let mut mode = if 0x10 == (self.data.external_attributes & 0x10) {
+                    ffi::S_IFDIR | 0o0775
+                } else {
+                    ffi::S_IFREG | 0o0664
+                };
+                if 0x01 == (self.data.external_attributes & 0x01) {
+                    // Read-only bit; strip write permissions
+                    mode &= 0o0555;
+                }
+                Some(mode)
+            },
+            _ => None,
+        }
+    }
+    /// Get the CRC32 hash of the original file
+    pub fn crc32(&self) -> u32 {
+        self.data.crc32
+    }
+}
+
+impl<'a> Read for ZipFile<'a> {
+     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+         self.get_reader().read(buf)
+     }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/result.rs
@@ -0,0 +1,94 @@
+//! Error types that can be emitted from this library
+
+use std::convert;
+use std::error;
+use std::fmt;
+use std::io;
+
+/// Generic result type with ZipError as its error variant
+pub type ZipResult<T> = Result<T, ZipError>;
+
+/// Error type for Zip
+#[derive(Debug)]
+pub enum ZipError
+{
+    /// An Error caused by I/O
+    Io(io::Error),
+
+    /// This file is probably not a zip archive
+    InvalidArchive(&'static str),
+
+    /// This archive is not supported
+    UnsupportedArchive(&'static str),
+
+    /// The requested file could not be found in the archive
+    FileNotFound,
+}
+
+impl ZipError
+{
+    fn detail(&self) -> ::std::borrow::Cow<str>
+    {
+        use std::error::Error;
+
+        match *self
+        {
+            ZipError::Io(ref io_err) => {
+                ("Io Error: ".to_string() + (io_err as &error::Error).description()).into()
+            },
+            ZipError::InvalidArchive(msg) | ZipError::UnsupportedArchive(msg) => {
+                (self.description().to_string() + ": " + msg).into()
+            },
+            ZipError::FileNotFound => {
+                self.description().into()
+            },
+        }
+    }
+}
+
+impl convert::From<io::Error> for ZipError
+{
+    fn from(err: io::Error) -> ZipError
+    {
+        ZipError::Io(err)
+    }
+}
+
+impl convert::From<ZipError> for io::Error
+{
+    fn from(err: ZipError) -> io::Error
+    {
+        io::Error::new(io::ErrorKind::Other, err)
+    }
+}
+
+impl fmt::Display for ZipError
+{
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error>
+    {
+        fmt.write_str(&*self.detail())
+    }
+}
+
+impl error::Error for ZipError
+{
+    fn description(&self) -> &str
+    {
+        match *self
+        {
+            ZipError::Io(ref io_err) => (io_err as &error::Error).description(),
+            ZipError::InvalidArchive(..) => "Invalid Zip archive",
+            ZipError::UnsupportedArchive(..) => "Unsupported Zip archive",
+            ZipError::FileNotFound => "Specified file not found in archive",
+        }
+    }
+
+    fn cause(&self) -> Option<&error::Error>
+    {
+        match *self
+        {
+            ZipError::Io(ref io_err) => Some(io_err as &error::Error),
+            _ => None,
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/spec.rs
@@ -0,0 +1,91 @@
+use std::io;
+use std::io::prelude::*;
+use result::{ZipResult, ZipError};
+use podio::{ReadPodExt, WritePodExt, LittleEndian};
+
+pub static LOCAL_FILE_HEADER_SIGNATURE : u32 = 0x04034b50;
+pub static CENTRAL_DIRECTORY_HEADER_SIGNATURE : u32 = 0x02014b50;
+static CENTRAL_DIRECTORY_END_SIGNATURE : u32 = 0x06054b50;
+
+pub struct CentralDirectoryEnd
+{
+    pub disk_number: u16,
+    pub disk_with_central_directory: u16,
+    pub number_of_files_on_this_disk: u16,
+    pub number_of_files: u16,
+    pub central_directory_size: u32,
+    pub central_directory_offset: u32,
+    pub zip_file_comment: Vec<u8>,
+}
+
+impl CentralDirectoryEnd
+{
+    pub fn parse<T: Read>(reader: &mut T) -> ZipResult<CentralDirectoryEnd>
+    {
+        let magic = try!(reader.read_u32::<LittleEndian>());
+        if magic != CENTRAL_DIRECTORY_END_SIGNATURE
+        {
+            return Err(ZipError::InvalidArchive("Invalid digital signature header"))
+        }
+        let disk_number = try!(reader.read_u16::<LittleEndian>());
+        let disk_with_central_directory = try!(reader.read_u16::<LittleEndian>());
+        let number_of_files_on_this_disk = try!(reader.read_u16::<LittleEndian>());
+        let number_of_files = try!(reader.read_u16::<LittleEndian>());
+        let central_directory_size = try!(reader.read_u32::<LittleEndian>());
+        let central_directory_offset = try!(reader.read_u32::<LittleEndian>());
+        let zip_file_comment_length = try!(reader.read_u16::<LittleEndian>()) as usize;
+        let zip_file_comment = try!(ReadPodExt::read_exact(reader, zip_file_comment_length));
+
+        Ok(CentralDirectoryEnd
+           {
+               disk_number: disk_number,
+               disk_with_central_directory: disk_with_central_directory,
+               number_of_files_on_this_disk: number_of_files_on_this_disk,
+               number_of_files: number_of_files,
+               central_directory_size: central_directory_size,
+               central_directory_offset: central_directory_offset,
+               zip_file_comment: zip_file_comment,
+           })
+    }
+
+    pub fn find_and_parse<T: Read+io::Seek>(reader: &mut T) -> ZipResult<CentralDirectoryEnd>
+    {
+        let header_size = 22;
+        let bytes_between_magic_and_comment_size = header_size - 6;
+        let file_length = try!(reader.seek(io::SeekFrom::End(0))) as i64;
+
+        let search_upper_bound = ::std::cmp::max(0, file_length - header_size - ::std::u16::MAX as i64);
+
+        let mut pos = file_length - header_size;
+        while pos >= search_upper_bound
+        {
+            try!(reader.seek(io::SeekFrom::Start(pos as u64)));
+            if try!(reader.read_u32::<LittleEndian>()) == CENTRAL_DIRECTORY_END_SIGNATURE
+            {
+                try!(reader.seek(io::SeekFrom::Current(bytes_between_magic_and_comment_size)));
+                let comment_length = try!(reader.read_u16::<LittleEndian>()) as i64;
+                if file_length - pos - header_size == comment_length
+                {
+                    try!(reader.seek(io::SeekFrom::Start(pos as u64)));
+                    return CentralDirectoryEnd::parse(reader);
+                }
+            }
+            pos -= 1;
+        }
+        Err(ZipError::InvalidArchive("Could not find central directory end"))
+    }
+
+    pub fn write<T: Write>(&self, writer: &mut T) -> ZipResult<()>
+    {
+        try!(writer.write_u32::<LittleEndian>(CENTRAL_DIRECTORY_END_SIGNATURE));
+        try!(writer.write_u16::<LittleEndian>(self.disk_number));
+        try!(writer.write_u16::<LittleEndian>(self.disk_with_central_directory));
+        try!(writer.write_u16::<LittleEndian>(self.number_of_files_on_this_disk));
+        try!(writer.write_u16::<LittleEndian>(self.number_of_files));
+        try!(writer.write_u32::<LittleEndian>(self.central_directory_size));
+        try!(writer.write_u32::<LittleEndian>(self.central_directory_offset));
+        try!(writer.write_u16::<LittleEndian>(self.zip_file_comment.len() as u16));
+        try!(writer.write_all(&self.zip_file_comment));
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/types.rs
@@ -0,0 +1,61 @@
+//! Types that specify what is contained in a ZIP.
+
+use time;
+
+
+#[derive(Clone, Copy, Debug)]
+pub enum System
+{
+    Dos,
+    Unix,
+    Unknown,
+    #[doc(hidden)]
+    __Nonexhaustive,
+}
+
+impl System {
+    pub fn from_u8(system: u8) -> System
+    {
+        use self::System::*;
+
+        match system {
+            0 => Dos,
+            3 => Unix,
+            _ => Unknown,
+        }
+    }
+}
+
+pub const DEFAULT_VERSION: u8 = 20;
+
+/// Structure representing a ZIP file.
+#[derive(Debug)]
+pub struct ZipFileData
+{
+    /// Compatibility of the file attribute information
+    pub system: System,
+    /// Specification version
+    pub version_made_by: u8,
+    /// True if the file is encrypted.
+    pub encrypted: bool,
+    /// Compression method used to store the file
+    pub compression_method: ::compression::CompressionMethod,
+    /// Last modified time. This will only have a 2 second precision.
+    pub last_modified_time: time::Tm,
+    /// CRC32 checksum
+    pub crc32: u32,
+    /// Size of the file in the ZIP
+    pub compressed_size: u64,
+    /// Size of the file when extracted
+    pub uncompressed_size: u64,
+    /// Name of the file
+    pub file_name: String,
+    /// File comment
+    pub file_comment: String,
+    /// Specifies where the local header of the file starts
+    pub header_start: u64,
+    /// Specifies where the compressed data of the file starts
+    pub data_start: u64,
+    /// External file attributes
+    pub external_attributes: u32,
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/zip/src/write.rs
@@ -0,0 +1,388 @@
+//! Structs for creating a new zip archive
+
+use compression::CompressionMethod;
+use types::{ZipFileData, System, DEFAULT_VERSION};
+use spec;
+use crc32;
+use result::{ZipResult, ZipError};
+use std::default::Default;
+use std::io;
+use std::io::prelude::*;
+use std::mem;
+use std::ascii::AsciiExt;
+use time;
+use flate2;
+use flate2::FlateWriteExt;
+use flate2::write::DeflateEncoder;
+use podio::{WritePodExt, LittleEndian};
+use msdos_time::TmMsDosExt;
+
+#[cfg(feature = "bzip2")]
+use bzip2;
+#[cfg(feature = "bzip2")]
+use bzip2::write::BzEncoder;
+
+enum GenericZipWriter<W: Write + io::Seek>
+{
+    Closed,
+    Storer(W),
+    Deflater(DeflateEncoder<W>),
+    #[cfg(feature = "bzip2")]
+    Bzip2(BzEncoder<W>),
+}
+
+/// Generator for ZIP files.
+///
+/// ```
+/// fn doit() -> zip::result::ZipResult<()>
+/// {
+///     use std::io::Write;
+///
+///     // For this example we write to a buffer, but normally you should use a File
+///     let mut buf: &mut [u8] = &mut [0u8; 65536];
+///     let mut w = std::io::Cursor::new(buf);
+///     let mut zip = zip::ZipWriter::new(w);
+///
+///     try!(zip.start_file("hello_world.txt", zip::CompressionMethod::Stored));
+///     try!(zip.write(b"Hello, World!"));
+///
+///     // Optionally finish the zip. (this is also done on drop)
+///     try!(zip.finish());
+///
+///     Ok(())
+/// }
+///
+/// println!("Result: {:?}", doit());
+/// ```
+pub struct ZipWriter<W: Write + io::Seek>
+{
+    inner: GenericZipWriter<W>,
+    files: Vec<ZipFileData>,
+    stats: ZipWriterStats,
+}
+
+#[derive(Default)]
+struct ZipWriterStats
+{
+    crc32: u32,
+    start: u64,
+    bytes_written: u64,
+}
+
+impl<W: Write+io::Seek> Write for ZipWriter<W>
+{
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize>
+    {
+        if self.files.len() == 0 { return Err(io::Error::new(io::ErrorKind::Other, "No file has been started")) }
+        match self.inner.ref_mut()
+        {
+            Some(ref mut w) => {
+                let write_result = w.write(buf);
+                if let Ok(count) = write_result {
+                    self.stats.update(&buf[0..count]);
+                }
+                write_result
+
+            }
+            None => Err(io::Error::new(io::ErrorKind::BrokenPipe, "ZipWriter was already closed")),
+        }
+    }
+
+    fn flush(&mut self) -> io::Result<()>
+    {
+        match self.inner.ref_mut()
+        {
+            Some(ref mut w) => w.flush(),
+            None => Err(io::Error::new(io::ErrorKind::BrokenPipe, "ZipWriter was already closed")),
+        }
+    }
+}
+
+impl ZipWriterStats
+{
+    fn update(&mut self, buf: &[u8])
+    {
+        self.crc32 = crc32::update(self.crc32, buf);
+        self.bytes_written += buf.len() as u64;
+    }
+}
+
+impl<W: Write+io::Seek> ZipWriter<W>
+{
+    /// Initializes the ZipWriter.
+    ///
+    /// Before writing to this object, the start_file command should be called.
+    pub fn new(inner: W) -> ZipWriter<W>
+    {
+        ZipWriter
+        {
+            inner: GenericZipWriter::Storer(inner),
+            files: Vec::new(),
+            stats: Default::default(),
+        }
+    }
+
+    /// Start a new file for with the requested compression method.
+    pub fn start_file<S>(&mut self, name: S, compression: CompressionMethod) -> ZipResult<()>
+        where S: Into<String>
+    {
+        try!(self.finish_file());
+
+        {
+            let writer = self.inner.get_plain();
+            let header_start = try!(writer.seek(io::SeekFrom::Current(0)));
+
+            let mut file = ZipFileData
+            {
+                system: System::Dos,
+                version_made_by: DEFAULT_VERSION,
+                encrypted: false,
+                compression_method: compression,
+                last_modified_time: time::now(),
+                crc32: 0,
+                compressed_size: 0,
+                uncompressed_size: 0,
+                file_name: name.into(),
+                file_comment: String::new(),
+                header_start: header_start,
+                data_start: 0,
+                external_attributes: 0,
+            };
+            try!(write_local_file_header(writer, &file));
+
+            let header_end = try!(writer.seek(io::SeekFrom::Current(0)));
+            self.stats.start = header_end;
+            file.data_start = header_end;
+
+            self.stats.bytes_written = 0;
+            self.stats.crc32 = 0;
+
+            self.files.push(file);
+        }
+
+        try!(self.inner.switch_to(compression));
+
+        Ok(())
+    }
+
+    fn finish_file(&mut self) -> ZipResult<()>
+    {
+        try!(self.inner.switch_to(CompressionMethod::Stored));
+        let writer = self.inner.get_plain();
+
+        let file = match self.files.last_mut()
+        {
+            None => return Ok(()),
+            Some(f) => f,
+        };
+        file.crc32 = self.stats.crc32;
+        file.uncompressed_size = self.stats.bytes_written;
+        file.compressed_size = try!(writer.seek(io::SeekFrom::Current(0))) - self.stats.start;
+
+        try!(update_local_file_header(writer, file));
+        try!(writer.seek(io::SeekFrom::End(0)));
+        Ok(())
+    }
+
+    /// Finish the last file and write all other zip-structures
+    ///
+    /// This will return the writer, but one should normally not append any data to the end of the file.  
+    /// Note that the zipfile will also be finished on drop.
+    pub fn finish(&mut self) -> ZipResult<W>
+    {
+        try!(self.finalize());
+        let inner = mem::replace(&mut self.inner, GenericZipWriter::Closed);
+        Ok(inner.unwrap())
+    }
+
+    fn finalize(&mut self) -> ZipResult<()>
+    {
+        try!(self.finish_file());
+
+        {
+            let writer = self.inner.get_plain();
+
+            let central_start = try!(writer.seek(io::SeekFrom::Current(0)));
+            for file in self.files.iter()
+            {
+                try!(write_central_directory_header(writer, file));
+            }
+            let central_size = try!(writer.seek(io::SeekFrom::Current(0))) - central_start;
+
+            let footer = spec::CentralDirectoryEnd
+            {
+                disk_number: 0,
+                disk_with_central_directory: 0,
+                number_of_files_on_this_disk: self.files.len() as u16,
+                number_of_files: self.files.len() as u16,
+                central_directory_size: central_size as u32,
+                central_directory_offset: central_start as u32,
+                zip_file_comment: b"zip-rs".to_vec(),
+            };
+
+            try!(footer.write(writer));
+        }
+
+        Ok(())
+    }
+}
+
+impl<W: Write+io::Seek> Drop for ZipWriter<W>
+{
+    fn drop(&mut self)
+    {
+        if !self.inner.is_closed()
+        {
+            if let Err(e) = self.finalize() {
+                let _ = write!(&mut io::stderr(), "ZipWriter drop failed: {:?}", e);
+            }
+        }
+    }
+}
+
+impl<W: Write+io::Seek> GenericZipWriter<W>
+{
+    fn switch_to(&mut self, compression: CompressionMethod) -> ZipResult<()>
+    {
+        match self.current_compression() {
+            Some(method) if method == compression => return Ok(()),
+            None => try!(Err(io::Error::new(io::ErrorKind::BrokenPipe, "ZipWriter was already closed"))),
+            _ => {},
+        }
+
+        let bare = match mem::replace(self, GenericZipWriter::Closed)
+        {
+            GenericZipWriter::Storer(w) => w,
+            GenericZipWriter::Deflater(w) => try!(w.finish()),
+            #[cfg(feature = "bzip2")]
+            GenericZipWriter::Bzip2(w) => try!(w.finish()),
+            GenericZipWriter::Closed => try!(Err(io::Error::new(io::ErrorKind::BrokenPipe, "ZipWriter was already closed"))),
+        };
+
+        *self = match compression
+        {
+            CompressionMethod::Stored => GenericZipWriter::Storer(bare),
+            CompressionMethod::Deflated => GenericZipWriter::Deflater(bare.deflate_encode(flate2::Compression::Default)),
+            #[cfg(feature = "bzip2")]
+            CompressionMethod::Bzip2 => GenericZipWriter::Bzip2(BzEncoder::new(bare, bzip2::Compression::Default)),
+            CompressionMethod::Unsupported(..) => return Err(ZipError::UnsupportedArchive("Unsupported compression")),
+        };
+
+        Ok(())
+    }
+
+    fn ref_mut(&mut self) -> Option<&mut Write> {
+        match *self {
+            GenericZipWriter::Storer(ref mut w) => Some(w as &mut Write),
+            GenericZipWriter::Deflater(ref mut w) => Some(w as &mut Write),
+            #[cfg(feature = "bzip2")]
+            GenericZipWriter::Bzip2(ref mut w) => Some(w as &mut Write),
+            GenericZipWriter::Closed => None,
+        }
+    }
+
+    fn is_closed(&self) -> bool
+    {
+        match *self
+        {
+            GenericZipWriter::Closed => true,
+            _ => false,
+        }
+    }
+
+    fn get_plain(&mut self) -> &mut W
+    {
+        match *self
+        {
+            GenericZipWriter::Storer(ref mut w) => w,
+            _ => panic!("Should have switched to stored beforehand"),
+        }
+    }
+
+    fn current_compression(&self) -> Option<CompressionMethod> {
+        match *self {
+            GenericZipWriter::Storer(..) => Some(CompressionMethod::Stored),
+            GenericZipWriter::Deflater(..) => Some(CompressionMethod::Deflated),
+            #[cfg(feature = "bzip2")]
+            GenericZipWriter::Bzip2(..) => Some(CompressionMethod::Bzip2),
+            GenericZipWriter::Closed => None,
+        }
+    }
+
+    fn unwrap(self) -> W
+    {
+        match self
+        {
+            GenericZipWriter::Storer(w) => w,
+            _ => panic!("Should have switched to stored beforehand"),
+        }
+    }
+}
+
+fn write_local_file_header<T: Write>(writer: &mut T, file: &ZipFileData) -> ZipResult<()>
+{
+    try!(writer.write_u32::<LittleEndian>(spec::LOCAL_FILE_HEADER_SIGNATURE));
+    let version_made_by = (file.system as u16) << 8 | (file.version_made_by as u16);
+    try!(writer.write_u16::<LittleEndian>(version_made_by));
+    let flag = if !file.file_name.is_ascii() { 1u16 << 11 } else { 0 };
+    try!(writer.write_u16::<LittleEndian>(flag));
+    try!(writer.write_u16::<LittleEndian>(file.compression_method.to_u16()));
+    let msdos_datetime = try!(file.last_modified_time.to_msdos());
+    try!(writer.write_u16::<LittleEndian>(msdos_datetime.timepart));
+    try!(writer.write_u16::<LittleEndian>(msdos_datetime.datepart));
+    try!(writer.write_u32::<LittleEndian>(file.crc32));
+    try!(writer.write_u32::<LittleEndian>(file.compressed_size as u32));
+    try!(writer.write_u32::<LittleEndian>(file.uncompressed_size as u32));
+    try!(writer.write_u16::<LittleEndian>(file.file_name.as_bytes().len() as u16));
+    let extra_field = try!(build_extra_field(file));
+    try!(writer.write_u16::<LittleEndian>(extra_field.len() as u16));
+    try!(writer.write_all(file.file_name.as_bytes()));
+    try!(writer.write_all(&extra_field));
+
+    Ok(())
+}
+
+fn update_local_file_header<T: Write+io::Seek>(writer: &mut T, file: &ZipFileData) -> ZipResult<()>
+{
+    static CRC32_OFFSET : u64 = 14;
+    try!(writer.seek(io::SeekFrom::Start(file.header_start + CRC32_OFFSET)));
+    try!(writer.write_u32::<LittleEndian>(file.crc32));
+    try!(writer.write_u32::<LittleEndian>(file.compressed_size as u32));
+    try!(writer.write_u32::<LittleEndian>(file.uncompressed_size as u32));
+    Ok(())
+}
+
+fn write_central_directory_header<T: Write>(writer: &mut T, file: &ZipFileData) -> ZipResult<()>
+{
+    try!(writer.write_u32::<LittleEndian>(spec::CENTRAL_DIRECTORY_HEADER_SIGNATURE));
+    try!(writer.write_u16::<LittleEndian>(0x14FF));
+    try!(writer.write_u16::<LittleEndian>(20));
+    let flag = if !file.file_name.is_ascii() { 1u16 << 11 } else { 0 };
+    try!(writer.write_u16::<LittleEndian>(flag));
+    try!(writer.write_u16::<LittleEndian>(file.compression_method.to_u16()));
+    let msdos_datetime = try!(file.last_modified_time.to_msdos());
+    try!(writer.write_u16::<LittleEndian>(msdos_datetime.timepart));
+    try!(writer.write_u16::<LittleEndian>(msdos_datetime.datepart));
+    try!(writer.write_u32::<LittleEndian>(file.crc32));
+    try!(writer.write_u32::<LittleEndian>(file.compressed_size as u32));
+    try!(writer.write_u32::<LittleEndian>(file.uncompressed_size as u32));
+    try!(writer.write_u16::<LittleEndian>(file.file_name.as_bytes().len() as u16));
+    let extra_field = try!(build_extra_field(file));
+    try!(writer.write_u16::<LittleEndian>(extra_field.len() as u16));
+    try!(writer.write_u16::<LittleEndian>(0));
+    try!(writer.write_u16::<LittleEndian>(0));
+    try!(writer.write_u16::<LittleEndian>(0));
+    try!(writer.write_u32::<LittleEndian>(0));
+    try!(writer.write_u32::<LittleEndian>(file.header_start as u32));
+    try!(writer.write_all(file.file_name.as_bytes()));
+    try!(writer.write_all(&extra_field));
+
+    Ok(())
+}
+
+fn build_extra_field(_file: &ZipFileData) -> ZipResult<Vec<u8>>
+{
+    let writer = Vec::new();
+    // Future work
+    Ok(writer)
+}