diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for portage-hs
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,661 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/portage-hs.cabal b/portage-hs.cabal
new file mode 100644
--- /dev/null
+++ b/portage-hs.cabal
@@ -0,0 +1,164 @@
+cabal-version:      3.0
+name:               portage-hs
+version:            0.1.0.0
+synopsis:           Data structures and functions for interacting with the Portage package manager
+
+tested-with:        GHC == { 9.0.2, 9.2.8, 9.4.8, 9.6.6, 9.8.4, 9.10.1, 9.12.1 }
+
+description:
+    Currently, this includes:
+
+    * data structures for package atoms
+    * parsers for atoms, emerge output, and CONTENTS files
+    * functions for running emerge
+    * lots of tests
+
+homepage:           https://github.com/gentoo-haskell/cabal-portage/tree/main/portage-hs
+bug-reports:        https://github.com/gentoo-haskell/cabal-portage/issues
+
+license:            AGPL-3.0-only
+license-file:       LICENSE
+author:             Gentoo Authors
+maintainer:         hololeap@protonmail.com
+
+copyright:          Copyright (C) 2022-2025 Gentoo Authors
+category:           System
+extra-doc-files: CHANGELOG.md
+
+extra-source-files:
+    test/data/**/*.stdout
+
+source-repository head
+    type:           git
+    location:       https://github.com/hololeap/cabal-portage.git
+    branch:         main
+    subdir:         portage-hs
+
+flag gentoo-tests
+    description: Enable tests that depend on a working Gentoo environment
+    default:     False
+    manual:      True
+
+flag pedantic
+    description: Enable -Werror
+    default:     False
+    manual:      True
+
+common all
+    ghc-options:        -Wall
+                        -foptimal-applicative-do
+    if flag(pedantic)
+        ghc-options:    -Werror
+
+    default-extensions:
+        , StrictData
+
+common fast
+    ghc-options:        -threaded
+                        -with-rtsopts=-N
+
+library
+    import: all
+    exposed-modules:
+        , Distribution.Portage.Types
+        , Distribution.Portage.PkgDb
+        , Distribution.Portage.PkgDb.Contents
+        , Distribution.Portage.Emerge
+        , Distribution.Portage.Emerge.Parser
+
+    hs-source-dirs:   src
+    default-language: Haskell2010
+
+    build-depends:
+        , base >=4.13 && <4.22
+        , containers <0.8
+        , directory <1.4
+        , filepath <1.6
+        , mtl <2.4
+        , process <1.7
+        , text <2.2
+        , transformers <0.7
+        , parsable <0.2
+        , portage-hs-internal <0.2
+
+    other-extensions:
+        , ApplicativeDo
+        , FlexibleContexts
+        , LambdaCase
+        , NoImplicitPrelude
+        , OverloadedStrings
+        , ScopedTypeVariables
+        , TypeFamilies
+
+library portage-hs-internal
+    import: all
+    exposed-modules:
+        , Internal.Distribution.Portage.Types
+
+    build-depends:
+        , base >=4.13 && <4.22
+        , hashable <1.6
+        , parsable <0.2
+    hs-source-dirs:   src-internal
+    default-language: Haskell2010
+    other-extensions:
+        , DeriveDataTypeable
+        , DeriveGeneric
+        , DerivingVia
+        , FlexibleContexts
+        , FlexibleInstances
+        , GeneralizedNewtypeDeriving
+        , LambdaCase
+        , MultiParamTypeClasses
+        , OverloadedStrings
+        , ScopedTypeVariables
+        , TypeApplications
+        , TypeFamilies
+        , UndecidableInstances
+
+test-suite portage-hs-test
+    import: all, fast
+    default-language: Haskell2010
+    type:             exitcode-stdio-1.0
+    hs-source-dirs:   test
+    main-is:          Main.hs
+    other-modules:
+        , Emerge.ParserTests
+        , Types.ValidityTests
+        , Types.UnitTests
+        , Paths_portage_hs
+    autogen-modules:
+        , Paths_portage_hs
+    build-depends:
+        , parsable <0.2
+        , parsable-test <0.2
+        , portage-hs <0.2
+        , portage-hs-internal <0.2
+        , base >=4.13 && <4.22
+        , conduit <1.4
+        , containers <0.8
+        , directory <1.4
+        , filepath <1.6
+        , QuickCheck <2.16
+        , tasty <1.6
+        , tasty-hunit <0.11
+        , text <2.2
+        , transformers <0.7
+
+    other-extensions:
+        , CPP
+        , FlexibleContexts
+        , LambdaCase
+        , ScopedTypeVariables
+        , TypeApplications
+        , ViewPatterns
+
+    if flag(gentoo-tests)
+        build-depends:
+            , pretty-simple
+        CPP-Options:
+            -DGENTOO_TESTS
+        other-modules:
+            , Emerge.GentooTests
+            , PkgDb.GentooTests
+            , Types.GentooTests
diff --git a/src-internal/Internal/Distribution/Portage/Types.hs b/src-internal/Internal/Distribution/Portage/Types.hs
new file mode 100644
--- /dev/null
+++ b/src-internal/Internal/Distribution/Portage/Types.hs
@@ -0,0 +1,590 @@
+{-|
+Module      : Distribution.Portage.Internal.Types
+
+Types for internal use
+-}
+
+{-# Language DeriveAnyClass #-}
+{-# Language DeriveDataTypeable #-}
+{-# Language DeriveGeneric #-}
+{-# Language DerivingVia #-}
+{-# Language FlexibleContexts #-}
+{-# Language FlexibleInstances #-}
+{-# Language GeneralizedNewtypeDeriving #-}
+{-# Language LambdaCase #-}
+{-# Language MultiParamTypeClasses #-}
+{-# Language OverloadedStrings #-}
+{-# Language ScopedTypeVariables #-}
+{-# Language TypeApplications #-}
+{-# Language TypeFamilies #-}
+{-# Language UndecidableInstances #-}
+
+module Internal.Distribution.Portage.Types
+    (
+    -- * Types
+      Package(..)
+    , Category(..)
+    , PkgName(..)
+    , Slot(..)
+    , SubSlot(..)
+    , Repository(..)
+--     , EBuildFileName (..)
+    -- ** Versions
+    , Version(..)
+    , VersionNum(..)
+    , VersionLetter(..)
+    , VersionSuffix(..)
+    , VersionSuffixNum(..)
+    , VersionRevision(..)
+    -- ** Constraints
+    , ConstrainedDep(..)
+    , toConstrainedDep
+    , fromConstrainedDep
+    , doesConstraintMatch
+    , Operator(..)
+    -- * Internal
+    , FauxVersion(..)
+    , FauxVersionNum(..)
+    ) where
+
+import Control.Applicative (Alternative, some)
+import Data.Data (Data)
+import Data.Function (on)
+import Data.Hashable
+import qualified Data.List as L
+import Data.List.NonEmpty (NonEmpty(..))
+import qualified Data.List.NonEmpty as NE
+import GHC.Exts (IsList(..))
+import GHC.Generics (Generic)
+import GHC.Natural (Natural)
+
+import Data.Parsable
+
+newtype Category = Category
+    { unwrapCategory :: String }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving newtype (IsString, Printable)
+    deriving anyclass Hashable
+
+instance Stream s m Char => Parsable Category m u s where
+    parserName = "portage category"
+    parser = Category <$> wordAllowed wordStart wordRest
+      where
+        wordStart =
+            [ isAsciiUpper
+            , isAsciiLower
+            , isDigit
+            , (== '_')
+            ]
+        wordRest = wordStart ++
+            [ (== '+')
+            , (== '-')
+            , (== '.')
+            ]
+
+newtype PkgName = PkgName
+    { unwrapPkgName :: String }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving newtype (IsString, Printable)
+    deriving anyclass Hashable
+
+instance forall m u s. Stream s m Char => Parsable PkgName m u s where
+    parserName = "portage package name"
+    parser = PkgName <$> pkgParser wordStart wordRest
+      where
+        wordStart =
+            [ isAsciiUpper
+            , isAsciiLower
+            , isDigit
+            , (== '_')
+            ]
+        wordRest = (== '+') : (== '-') : wordStart
+
+newtype VersionNum = VersionNum
+    { unwrapVersionNum :: NonEmpty (NonEmpty Char) }
+    deriving stock (Show, Eq, Data, Generic)
+    deriving anyclass Hashable
+
+-- See section 3.3 "Version Comparison" of the Package Manager Specification
+instance Ord VersionNum where
+    VersionNum (s1 :| ss1) `compare` VersionNum (s2 :| ss2)
+        = toNat s1 `compare` toNat s2 -- Algorithm 3.2
+            <> mconcat ((zipWith compRest `on` fmap trim) ss1 ss2) -- Algorithm 3.3
+            <> length ss1 `compare` length ss2
+      where
+        compRest :: (Bool, NonEmpty Char) -> (Bool, NonEmpty Char) -> Ordering
+        -- Neither side had a leading zero so we use numeric comparison
+        compRest (False, c1) (False, c2) = toNat c1 `compare` toNat c2
+        -- At least one side a had leading zero so we use string comparison
+        compRest (_    , c1) (_    , c2) =       c1 `compare`       c2
+
+        -- If a component starts with a '0', mark it True and remove any
+        -- trailing 0s
+        trim :: NonEmpty Char -> (Bool, NonEmpty Char)
+        trim = \case
+            ('0' :| xs) -> (True, '0' :| foldr skipTrailing0s [] xs)
+            xs -> (False, xs)
+          where
+            skipTrailing0s '0' [] = []
+            skipTrailing0s c cs = c:cs
+
+        toNat :: NonEmpty Char -> Natural
+        toNat = read . toList
+
+instance IsList VersionNum where
+    type instance Item VersionNum = NonEmpty Char
+    fromList = VersionNum . fromList
+    toList = toList . unwrapVersionNum
+
+instance Printable VersionNum where
+    toString = L.intercalate "." . NE.toList . fmap NE.toList . unwrapVersionNum
+
+instance Stream s m Char => Parsable VersionNum m u s where
+    parserName = "portage version number"
+    parser = versionNumParser (`sepBy1` char '.') (NE.fromList <$>)
+
+newtype VersionLetter = VersionLetter
+    { unwrapVersionLetter :: Char }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving anyclass Hashable
+
+instance Printable VersionLetter where
+    toString (VersionLetter l) = [l]
+
+instance Stream s m Char => Parsable VersionLetter m u s where
+    parserName = "portage version letter"
+    parser = VersionLetter <$> satisfy isAsciiLower
+
+data VersionSuffix
+    = SuffixAlpha
+    | SuffixBeta
+    | SuffixPre
+    | SuffixRC
+    | SuffixP
+    deriving stock (Show, Eq, Ord, Data, Generic, Bounded, Enum)
+    deriving anyclass Hashable
+
+instance Printable VersionSuffix where
+    toString = \case
+        SuffixAlpha -> "alpha"
+        SuffixBeta  -> "beta"
+        SuffixPre   -> "pre"
+        SuffixRC    -> "rc"
+        SuffixP     -> "p"
+
+instance Stream s m Char => Parsable VersionSuffix m u s where
+    parserName = "portage version suffix"
+    parser = choice
+        [ SuffixAlpha <$ try (string "alpha")
+        , SuffixBeta  <$ try (string "beta")
+        , SuffixPre   <$ try (string "pre")
+        , SuffixRC    <$ try (string "rc")
+        , SuffixP     <$ string "p"
+        ]
+
+newtype VersionSuffixNum = VersionSuffixNum
+    { unwrapVersionSuffixNum :: NonEmpty Char }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving anyclass Hashable
+
+instance Printable VersionSuffixNum where
+    toString = NE.toList . unwrapVersionSuffixNum
+
+instance Stream s m Char => Parsable VersionSuffixNum m u s where
+    parserName = "portage version suffix number"
+    parser = VersionSuffixNum . NE.fromList <$> some (satisfy isDigit)
+
+newtype VersionRevision = VersionRevision
+    { unwrapVersionRevision :: NonEmpty Char }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving anyclass Hashable
+
+instance Printable VersionRevision where
+    toString (VersionRevision r) = "r" ++ NE.toList r
+
+instance Stream s m Char => Parsable VersionRevision m u s where
+    parserName = "portage version revision"
+    parser = do
+        _ <- char 'r'
+        VersionRevision . NE.fromList <$> some (satisfy isDigit)
+
+data Version = Version
+    { getVersionNum :: VersionNum
+    , getVersionLetter :: Maybe VersionLetter
+    , getVersionSuffixes :: [(VersionSuffix, Maybe VersionSuffixNum)]
+    , getVersionRevision :: Maybe VersionRevision
+    } deriving stock (Show, Eq, Data, Generic)
+    deriving anyclass Hashable
+
+-- See section 3.3 "Version Comparison" of the Package Manager Specification
+instance Ord Version where
+    Version n1 l1 s1 r1 `compare` Version n2 l2 s2 r2
+        =  n1 `compare` n2
+        <> l1 `compare` l2
+        <> s1 `compareSuffixes` s2
+        <> r1 `compareRevisions` r2
+      where
+        -- Algorithm 3.5
+        compareSuffixes [] [] = EQ
+        compareSuffixes ((SuffixP,_):_) [] = GT
+        compareSuffixes ((_,_):_) [] = LT
+        compareSuffixes [] ((SuffixP,_):_) = LT
+        compareSuffixes [] ((_,_):_) = GT
+        compareSuffixes (u1:us1) (u2:us2) =
+            (compare `on` fmap toNat) u1 u2
+                <> us1 `compareSuffixes` us2
+          where
+            toNat :: Maybe VersionSuffixNum -> Natural
+            toNat = maybe (0 :: Natural) (read . toList . unwrapVersionSuffixNum)
+
+        compareRevisions = compare `on`
+            maybe (0 :: Natural) (read . NE.toList . unwrapVersionRevision)
+
+instance Printable Version where
+    toString (Version n l s r)
+        = toString n
+        ++ foldMap toString l
+        ++ (s >>= suffixString)
+        ++ foldMap (\x -> "-" ++ toString x) r
+      where
+        suffixString (ss,sn) = "_" ++ toString ss ++ foldMap toString sn
+
+instance Stream s m Char => Parsable Version m u s where
+    parserName = "portage version"
+    parser = versionParser parser
+
+data Operator
+    = Lesser
+    | LesserOrEqual
+    | Equal
+    | EqualAsterisk
+    | EqualIgnoreRevision
+    | GreaterOrEqual
+    | Greater
+    deriving stock (Show, Eq, Ord, Bounded, Enum, Data, Generic)
+    deriving anyclass Hashable
+
+data ConstrainedDep = ConstrainedDep
+    { constrainedOperator   :: Operator
+    , constrainedCategory   :: Category
+    , constrainedPkgName    :: PkgName
+    , constrainedVersion    :: Version
+    , constrainedSlot       :: Maybe Slot
+    , constrainedRepository :: Maybe Repository
+    } deriving stock (Show, Eq, Ord, Data, Generic)
+      deriving anyclass Hashable
+
+instance Printable ConstrainedDep where
+    toString (ConstrainedDep o c n v ms mr)
+        =  operStr
+        ++ toString c
+        ++ "/"
+        ++ toString n
+        ++ "-"
+        ++ toString v
+        ++ asterisk
+        ++ foldMap (\s -> ":"  ++ toString s) ms
+        ++ foldMap (\r -> "::" ++ toString r) mr
+      where
+        asterisk = case o of
+            EqualAsterisk -> "*"
+            _ -> ""
+
+        operStr :: String
+        operStr = case o of
+            Lesser -> "<"
+            LesserOrEqual -> "<="
+            Greater -> ">"
+            GreaterOrEqual -> ">="
+            Equal -> "="
+            EqualAsterisk -> "="
+            EqualIgnoreRevision -> "~"
+
+instance Stream s m Char => Parsable ConstrainedDep m u s where
+    parserName = "portage package with version constraint"
+    parser = do
+        o <- operParser
+        c <- parser
+        _ <- char '/'
+        n <- parser
+        _ <- char '-'
+        v <- parser
+        o' <- option o $ try $ case o of
+            Equal -> EqualAsterisk <$ char '*'
+            _ -> char '*' *> fail "Unexpected asterisk (not Equal operator)"
+        s <- optionMaybe $ try $ string ":"  *> parser
+        r <- optionMaybe $ try $ string "::" *> parser
+        pure $ ConstrainedDep o' c n v s r
+      where
+        operParser = choice
+            [ char '>' *> option Greater (try (GreaterOrEqual <$ char '='))
+            , char '<' *> option Lesser (try (LesserOrEqual <$ char '='))
+            , Equal <$ char '='
+            , EqualIgnoreRevision <$ char '~'
+            ]
+
+toConstrainedDep :: Operator -> Package -> Maybe ConstrainedDep
+toConstrainedDep o (Package c n mv ms mr) =
+    (\v -> ConstrainedDep o c n v ms mr) <$> mv
+
+fromConstrainedDep :: ConstrainedDep -> Package
+fromConstrainedDep (ConstrainedDep _ c p v ms mr) =
+    Package c p (Just v) ms mr
+
+-- | Uses "optimistic" matching, meaning: if a package does not provide
+--   information that the constraint requires, it is assumed to be a match.
+--
+--   For example, the constraint @<dev-haskell/text-2.2:0::haskell@ matches
+--   @dev-haskell/text@ but not @dev-haskell/text-2.3@.
+doesConstraintMatch :: ConstrainedDep -> Package -> Bool
+doesConstraintMatch (ConstrainedDep co cc cn cv cs cr) (Package pc pn pv ps pr)
+    | cc /= pc = False
+    | cn /= pn = False
+    | otherwise
+        =  checkConstrained cs ps
+        && checkConstrained cr pr
+        && case pv of
+            Nothing -> True -- No version info on the package means it matches
+            Just v -> case co of
+                Lesser -> v < cv
+                LesserOrEqual -> v <= cv
+                Equal -> v == cv
+                GreaterOrEqual -> v >= cv
+                Greater -> v > cv
+                EqualIgnoreRevision ->
+                    v { getVersionRevision = Nothing }
+                        == cv { getVersionRevision = Nothing }
+                EqualAsterisk ->
+                    checkEqAst
+                        (toList (getVersionNum cv))
+                        (toList (getVersionNum v))
+  where
+    checkEqAst [] [] = True
+    checkEqAst (_cv:_cvs) [] = False
+    checkEqAst [] (_v:_vs) = True
+    checkEqAst (cv':cvs) (v:vs) = cv' == v && checkEqAst cvs vs
+
+    checkConstrained :: Eq a => Maybe a -> Maybe a -> Bool
+    checkConstrained m1 m2 = case (m1, m2) of
+        -- Constraint specifies, package provides
+        (Just x1, Just x2) -> x1 == x2
+        -- Package does not specifiy
+        _ -> True
+
+data Slot = Slot
+    { unwrapSlot :: String
+    , getSubSlot :: Maybe SubSlot
+    }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving anyclass Hashable
+
+instance Printable Slot where
+    toString (Slot s mss)
+        =  s
+        ++ foldMap (\ss -> "/" ++ toString ss) mss
+
+instance Stream s m Char => Parsable Slot m u s where
+    parserName = "portage slot"
+    parser = do
+        s <- slotParser
+        mss <- optionMaybe $ try $ char '/' *> parser
+        pure $ Slot s mss
+
+newtype SubSlot = SubSlot { unwrapSubSlot :: String }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving newtype (IsString, Printable)
+    deriving anyclass Hashable
+
+instance Stream s m Char => Parsable SubSlot m u s where
+    parserName = "portage sub-slot"
+    parser = SubSlot <$> slotParser
+
+slotParser :: Stream s m Char => ParsecT s u m String
+slotParser = wordAllowed wordStart wordRest
+  where
+    wordStart =
+        [ isAsciiUpper
+        , isAsciiLower
+        , isDigit
+        , (== '_')
+        ]
+    wordRest = wordStart ++
+        [ (== '+')
+        , (== '.')
+        , (== '-')
+        ]
+
+
+newtype Repository = Repository { unwrapRepository :: String }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving newtype (IsString, Printable)
+    deriving anyclass Hashable
+
+instance Stream s m Char => Parsable Repository m u s where
+    parserName = "portage repository"
+    parser = Repository <$> pkgParser wordStart wordRest
+      where
+        wordStart =
+            [ isAsciiUpper
+            , isAsciiLower
+            , isDigit
+            , (== '_')
+            ]
+
+        wordRest = (== '-') : wordStart
+
+data Package = Package
+    { getCategory   :: Category
+    , getPkgName    :: PkgName
+    , getVersion    :: Maybe Version
+    , getSlot       :: Maybe Slot
+    , getRepository :: Maybe Repository
+    }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving anyclass Hashable
+
+instance Printable Package where
+    toString (Package c n mv ms mr)
+        =  toString c
+        ++ "/"
+        ++ toString n
+        ++ foldMap (\v -> "-"  ++ toString v) mv
+        ++ foldMap (\s -> ":"  ++ toString s) ms
+        ++ foldMap (\r -> "::" ++ toString r) mr
+
+instance Stream s m Char => Parsable Package m u s where
+    parserName = "portage package"
+    parser = do
+        c <- parser
+        _ <- char '/'
+        n <- parser
+        v <- optionMaybe $ try $ string "-"  *> parser
+        s <- optionMaybe $ try $ string ":"  *> parser
+        r <- optionMaybe $ try $ string "::" *> parser
+        pure $ Package c n v s r
+
+-- data EBuildFileName = EBuildFileName
+--     { ebuildName :: PkgName
+--     , ebuildVersion :: Version
+--     }
+--     deriving stock (Show, Eq, Ord, Data, Generic)
+--     deriving anyclass Hashable
+--
+-- instance Printable EBuildFileName where
+--     toString (EBuildFileName n v)
+--         =  toString n
+--         ++ "-"
+--         ++ toString v
+--         ++ ".ebuild"
+--
+-- instance Stream s m Char => Parsable EBuildFileName m u s  where
+--     parserName = "portage ebuild file name"
+--     parser = do
+--         n <- parser
+--         _ <- char '-'
+--         v <- parser
+--         _ <- string ".ebuild"
+--         pure $ EBuildFileName n v
+
+-- | A type of Version that also forms valid PkgName and Repository strings:
+--
+--   "[A PkgName] must not end in a hyphen followed by anything matching the [Version]
+--   syntax"
+--   <https://projects.gentoo.org/pms/8/pms.html#x1-180003.1.2>
+newtype FauxVersion = FauxVersion
+    { unwrapFauxVersion :: Version }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving newtype Printable
+    deriving anyclass Hashable
+
+instance Stream s m Char => Parsable FauxVersion m u s where
+    parserName = "faux portage version"
+    parser = FauxVersion <$> versionParser (unwrapFauxVersionNum <$> parser)
+
+-- | A type of VersionNum which always has one digit. This avoids having '.' in
+--   the resulting string, as this is an invalid character for both PkgName and
+--   Category.
+newtype FauxVersionNum = FauxVersionNum
+    { unwrapFauxVersionNum :: VersionNum }
+    deriving stock (Show, Eq, Ord, Data, Generic)
+    deriving newtype Printable
+    deriving anyclass Hashable
+
+instance Stream s m Char => Parsable FauxVersionNum m u s where
+    parserName = "faux portage version number"
+    parser = FauxVersionNum <$> versionNumParser id pure
+
+versionParser :: Stream s m Char
+    => ParsecT s u m VersionNum -> ParsecT s u m Version
+versionParser pn = do
+        n <- pn
+        l <- optionMaybe $ try parser
+        s <- many $ do
+            _ <- char '_'
+            ss <- parser
+            sn <- optionMaybe $ try parser
+            pure (ss, sn)
+        r <- optionMaybe $ try $ string "-" *> parser
+        pure $ Version n l s r
+
+versionNumParser :: Stream s m Char
+    => (ParsecT s u m [Char] -> ParsecT s u m [a])
+    -> (NonEmpty a -> NonEmpty (NonEmpty Char))
+    -> ParsecT s u m VersionNum
+versionNumParser f g = do
+    ns <- f $ some $ satisfy isDigit
+    pure $ VersionNum $ g $ NE.fromList ns
+
+-- | Both 'PkgName' and 'Repository' have similar parsers
+pkgParser :: forall s u m. Stream s m Char
+    => [Char -> Bool]
+    -> [Char -> Bool]
+    -> ParsecT s u m String
+pkgParser wordStart wordRest = (:) <$> satisfyAny wordStart <*> goOrEnd
+  where
+    goOrEnd :: ParsecT s u m String
+    goOrEnd = try go <|> end
+
+    -- If 'fauxV' gives back a 'Nothing', it means the wole parse ended with
+    -- a Version string and we need to throw the error 'e'.
+    go :: ParsecT s u m String
+    go = do
+        m <- choice
+            [ try fauxV
+            , Just <$> nextChar -- 'fauxV' did not match at all :)
+            ]
+        maybe e pure m
+
+    -- Check for a hyphen followed by something that parses as a 'FauxVersion'.
+    -- If this is matched, but there isn't a successful 'go' parser after it,
+    -- the parser aborts.
+    fauxV :: ParsecT s u m (Maybe String)
+    fauxV = do
+        h <- char '-'
+        v <- parser @FauxVersion
+        choice
+            [ try $ do
+                rest <- go -- Don't accept 'end' as a choice at this point
+                pure $ Just $ h : toString v ++ rest
+            , abort
+            ]
+
+    nextChar :: ParsecT s u m String
+    nextChar = do
+        c <- satisfyAny wordRest
+        rest <- goOrEnd
+        pure $ c : rest
+
+    end :: ParsecT s u m String
+    end = pure ""
+
+    -- 'show' is used here to wrap the string in quotes
+    e :: ParsecT s u m String
+    e = fail $
+            "ends in a hyphen followed by anything "
+            ++ "matching the version syntax"
+
+    -- This is a trick to abort without jumping to the next 'Alternative'
+    -- choice.
+    abort :: Alternative f => f (Maybe a)
+    abort = pure Nothing
diff --git a/src/Distribution/Portage/Emerge.hs b/src/Distribution/Portage/Emerge.hs
new file mode 100644
--- /dev/null
+++ b/src/Distribution/Portage/Emerge.hs
@@ -0,0 +1,73 @@
+
+
+module Distribution.Portage.Emerge
+    ( EmergeArgs
+    , StdOut
+    , StdErr
+    , emergeExe
+    , upgradeWorldArgs
+    , singleArgs
+    , pretendArgs
+    , stripPackageVersion
+    , emergeProcess
+    ) where
+
+import Data.Text (Text)
+import qualified Data.Text as T
+import System.Exit
+import System.Process
+
+import Data.Parsable
+import Distribution.Portage.Types
+
+type EmergeArgs = [String]
+type StdOut = Text
+type StdErr = Text
+
+
+emergeExe :: FilePath
+emergeExe = "/usr/bin/emerge"
+
+upgradeWorldArgs :: EmergeArgs
+upgradeWorldArgs = commonEmergeArgs ++
+    [ "--deep"
+    , "--changed-use"
+    , "--update"
+    , "--complete-graph"
+    , "@world"
+    ]
+
+singleArgs :: [Package] -> EmergeArgs
+singleArgs ps = commonEmergeArgs ++
+    [ "--oneshot"
+    , "--complete-graph"
+    ] ++
+    (packageString <$> ps)
+
+pretendArgs :: EmergeArgs
+pretendArgs = [ "--pretend" ]
+
+-- | Add a @'='@ character to the front of the string if the version is
+--   specified.
+packageString :: Package -> String
+packageString p@(Package _ _ v _ _) =
+    let pre = case v of
+                Just _  -> "="
+                Nothing -> ""
+    in pre ++ toString p
+
+stripPackageVersion :: Package -> Package
+stripPackageVersion (Package c n _ s r) = Package c n Nothing s r
+
+commonEmergeArgs :: EmergeArgs
+commonEmergeArgs =
+    [ "--ignore-default-opts"
+    , "--color=n"
+    , "--nospinner"
+    , "--verbose"
+    ]
+
+emergeProcess :: FilePath -> EmergeArgs -> IO (ExitCode, StdOut, StdErr)
+emergeProcess p a = do
+    (c, o, e) <- readProcessWithExitCode p a ""
+    pure (c, T.pack o, T.pack e)
diff --git a/src/Distribution/Portage/Emerge/Parser.hs b/src/Distribution/Portage/Emerge/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Distribution/Portage/Emerge/Parser.hs
@@ -0,0 +1,87 @@
+{-# Language ApplicativeDo #-}
+{-# Language FlexibleContexts #-}
+{-# Language LambdaCase #-}
+{-# Language OverloadedStrings #-}
+{-# Language ScopedTypeVariables #-}
+{-# Language TypeFamilies #-}
+
+module Distribution.Portage.Emerge.Parser
+    ( emergeParser
+    ) where
+
+import Control.Applicative (some)
+-- import Control.Monad.Combinators
+import Data.Coerce
+import Data.Monoid (Last(..))
+-- import qualified Data.List.NonEmpty as NE
+import qualified Data.Set as S
+import Data.Set (Set)
+-- import Text.Parsec.Language (haskell)
+-- import Text.Parsec.Token (GenTokenParser(decimal))
+import Text.Read (readMaybe)
+
+import Data.Parsable hiding (space)
+import Distribution.Portage.Types
+
+-- | Returns a set of packages and the count as reported by the emerge output
+emergeParser :: (Stream s m Char, Parsable Package m u s)
+    => ParsecT s u m (Integer, Set Package)
+emergeParser = do
+    r <- sepEndBy lineParser newline
+    case coerce $ foldMap go r of
+        (Nothing, _) -> fail e
+        (Just i , s) -> pure (i, s)
+  where
+    go :: EmergeLine -> (Last Integer, Set Package)
+    go = coerce . \case
+        PackageLine p -> (Nothing, S.singleton p)
+        TotalLine   i -> (Just i , S.empty      )
+        OtherLine     -> (Nothing, S.empty      )
+
+    e :: String
+    e = "emerge output contains a package total"
+
+data EmergeLine
+    = PackageLine Package
+    | TotalLine Integer
+    | OtherLine
+    deriving (Show, Eq, Ord)
+
+
+lineParser :: (Stream s m Char, Parsable Package m u s)
+    => ParsecT s u m EmergeLine
+lineParser = choice
+    [ PackageLine <$> try packageLine
+    , TotalLine   <$> try totalLine
+    , OtherLine   <$  skipRest
+    ]
+
+packageLine :: (Stream s m Char, Parsable Package m u s) => ParsecT s u m Package
+packageLine = do
+    _ <- space
+    _ <- char '['
+    _ <- many $ satisfy (\c -> c /= ']' && c /= '\n')
+    _ <- char ']'
+    _ <- space
+    pkg <- parser
+    _ <- space
+    _ <- skipRest
+    pure pkg
+
+totalLine :: Stream s m Char => ParsecT s u m Integer
+totalLine = do
+    _ <- string "Total:"
+    _ <- space
+    ds <- some digit
+    _ <- space
+    _ <- string "packages"
+    _ <- skipRest
+    case readMaybe ds of
+        Just n  -> pure n
+        Nothing -> fail $ "Could not parse as Integer: " ++ show ds
+
+skipRest :: Stream s m Char => ParsecT s u m ()
+skipRest = void $ many $ satisfy (/= '\n')
+
+space :: Stream s m Char => ParsecT s u m ()
+space = void $ many $ satisfy (\c -> c == ' ' || c == '\t')
diff --git a/src/Distribution/Portage/PkgDb.hs b/src/Distribution/Portage/PkgDb.hs
new file mode 100644
--- /dev/null
+++ b/src/Distribution/Portage/PkgDb.hs
@@ -0,0 +1,20 @@
+{-# Language FlexibleContexts #-}
+{-# Language ScopedTypeVariables #-}
+
+module Distribution.Portage.PkgDb
+    ( PkgDbEntry(..)
+    , pkgDbDirectory
+    ) where
+
+import System.FilePath.Posix
+
+import Distribution.Portage.Types
+
+data PkgDbEntry = PkgDbEntry
+    { pkgDbEntryPackage :: Package
+    , pkgDbEntryPath :: FilePath
+    }
+    deriving (Show, Eq, Ord)
+
+pkgDbDirectory :: FilePath
+pkgDbDirectory = "/var" </> "db" </> "pkg"
diff --git a/src/Distribution/Portage/PkgDb/Contents.hs b/src/Distribution/Portage/PkgDb/Contents.hs
new file mode 100644
--- /dev/null
+++ b/src/Distribution/Portage/PkgDb/Contents.hs
@@ -0,0 +1,2 @@
+module Distribution.Portage.PkgDb.Contents where
+
diff --git a/src/Distribution/Portage/Types.hs b/src/Distribution/Portage/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Distribution/Portage/Types.hs
@@ -0,0 +1,38 @@
+{-|
+Module      : Distribution.Portage.Types
+
+Types for Portage atoms, etc.
+-}
+
+{-# Language NoImplicitPrelude #-}
+
+module Distribution.Portage.Types
+    (
+    -- * Types
+      Package(..)
+    , Category(..)
+    , PkgName(..)
+    , Slot(..)
+    , SubSlot(..)
+    , Repository(..)
+    -- ** Versions
+    , Version(..)
+    , VersionNum(..)
+    , VersionLetter(..)
+    , VersionSuffix(..)
+    , VersionSuffixNum(..)
+    , VersionRevision(..)
+    -- ** Constraints
+    , ConstrainedDep(..)
+    , toConstrainedDep
+    , fromConstrainedDep
+    , doesConstraintMatch
+    , Operator(..)
+    -- * Internal
+    , FauxVersion(..)
+    , FauxVersionNum(..)
+    ) where
+
+import Internal.Distribution.Portage.Types
+
+
diff --git a/test/Emerge/GentooTests.hs b/test/Emerge/GentooTests.hs
new file mode 100644
--- /dev/null
+++ b/test/Emerge/GentooTests.hs
@@ -0,0 +1,25 @@
+{-# Language ScopedTypeVariables #-}
+
+module Emerge.GentooTests (gentooTests) where
+
+import qualified Data.Text.IO as T
+import Test.Tasty
+import Test.Tasty.HUnit
+
+import Distribution.Portage.Emerge
+
+gentooTests :: TestTree
+gentooTests = testGroup "gentoo system tests"
+    [ emergeWorldTest
+    ]
+
+-- | Emerge world "test". Currently just writes to
+--   @/tmp/emerge-world-test.stdout@,
+--   @/tmp/emerge-world-test.stderr@,
+--   @/tmp/emerge-world-test.exitcode@
+emergeWorldTest :: TestTree
+emergeWorldTest = testCase "emerge world \"test\"" $ do
+    (c, o, e) <- emergeProcess emergeExe $ upgradeWorldArgs ++ pretendArgs
+    T.writeFile "/tmp/emerge-world-test.stdout" o
+    T.writeFile "/tmp/emerge-world-test.stderr" e
+    writeFile "/tmp/emerge-world-test.exitcode" $ show c
diff --git a/test/Emerge/ParserTests.hs b/test/Emerge/ParserTests.hs
new file mode 100644
--- /dev/null
+++ b/test/Emerge/ParserTests.hs
@@ -0,0 +1,75 @@
+{-# Language LambdaCase #-}
+{-# Language TupleSections #-}
+
+module Emerge.ParserTests
+    ( parserTests
+    ) where
+
+import Conduit
+import Data.Set (Set)
+import qualified Data.Set as S
+import qualified Data.Text.IO as T
+import System.Directory
+import System.FilePath
+import Test.Tasty
+import Test.Tasty.HUnit
+
+import Data.Parsable
+import Distribution.Portage.Types
+import Distribution.Portage.Emerge
+import Distribution.Portage.Emerge.Parser
+import Test.Parsable
+
+import Paths_portage_hs (getDataFileName)
+
+parserTests :: IO TestTree
+parserTests = do
+    stdouts <- emergeStdOuts
+    pure $ testGroup "test against recorded emerge output" $
+        map (uncurry stdoutTest) stdouts
+
+stdoutTest :: FilePath -> StdOut -> TestTree
+stdoutTest d o =
+    case ecis of
+        Left e ->
+            testCase d $ assertFailure $
+                "Could not parse recorded emerge ouptut:\n"
+                ++ "Error:\n" ++ show e
+        Right (c, (i,ps)) -> testGroup d
+            [ testCase "complete coverage" (checkPC c)
+            , testCase "package count" (checkCount i ps)
+            , testGroup "round-trip on extracted packages" $
+                printableHUnit <$> S.toList ps
+            ]
+  where
+    checkPC :: ParseCoverage -> Assertion
+    checkPC = \case
+        c@(PartialParse _) ->
+            assertFailure $
+                "Got a PartialParse when it should be a CompleteParse:\n"
+                ++ show c ++ "\n"
+        _ -> pure ()
+
+    checkCount :: Integer -> Set Package -> Assertion
+    checkCount i ps = assertEqual "reported package count should equal set size" (fromInteger i) (S.size ps)
+
+    ecis :: Either ParseError (ParseCoverage, (Integer, Set Package))
+    ecis = runParser (checkCoverage emergeParser) () f o
+
+    f = "test" </> "data" </> d </> "emerge-world-test.stdout"
+
+emergeStdOuts :: IO [(FilePath, StdOut)]
+emergeStdOuts = do
+    dataDir <- getDataFileName ("test" </> "data") >>= canonicalizePath
+    runConduitRes
+        $  sourceDirectoryDeep False dataDir
+        .| filterC (\f -> takeFileName f == validFile)
+        .| (await >>= mapM_ readFileC)
+        .| sinkList
+  where
+    validFile = "emerge-world-test" <.> "stdout"
+
+    readFileC :: FilePath -> ConduitT i (FilePath, StdOut) (ResourceT IO) ()
+    readFileC f = do
+        o <- liftIO $ T.readFile f
+        yield (f, o)
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,45 @@
+{-# Language CPP #-}
+
+module Main (main) where
+
+import Test.Tasty
+
+import Test.Parsable
+
+import qualified Emerge.ParserTests as Emerge
+import qualified Types.ValidityTests as Types
+import qualified Types.UnitTests as Types
+#if defined(GENTOO_TESTS)
+import qualified Emerge.GentooTests as Emerge
+import qualified PkgDb.GentooTests as PkgDb
+import qualified Types.GentooTests as Types
+#endif
+
+main :: IO ()
+main = do
+    typesTests <- sequenceA
+        [ atomically Types.validityTests
+        , pure Types.unitTests
+#if defined(GENTOO_TESTS)
+        , Types.gentooTests
+#endif
+        ]
+
+    emergeTests <- sequenceA
+        [ Emerge.parserTests
+#if defined(GENTOO_TESTS)
+--        , pure Emerge.gentooTests
+#endif
+        ]
+
+    let pkgDBTests = [
+#if defined(GENTOO_TESTS)
+--             PkgDb.gentooTests
+#endif
+            ]
+
+    defaultMain $ testGroup "portage-hs tests"
+        [ testGroup "portage types" typesTests
+        , testGroup "emerge" emergeTests
+        , testGroup "pkgdb" pkgDBTests
+        ]
diff --git a/test/PkgDb/GentooTests.hs b/test/PkgDb/GentooTests.hs
new file mode 100644
--- /dev/null
+++ b/test/PkgDb/GentooTests.hs
@@ -0,0 +1,15 @@
+
+module PkgDb.GentooTests
+    where
+--     ( gentooTests
+--     ) where
+
+import Distribution.Portage.PkgDb
+
+import Test.Tasty
+import Test.Tasty.HUnit
+import Text.Pretty.Simple
+
+-- gentooTests :: TestTree
+-- gentooTests = testCase "walk /var/db/pkg" $
+--     pkgDbEntries >>= pPrintForceColor
diff --git a/test/Types/GentooTests.hs b/test/Types/GentooTests.hs
new file mode 100644
--- /dev/null
+++ b/test/Types/GentooTests.hs
@@ -0,0 +1,79 @@
+{-# Language ScopedTypeVariables #-}
+{-# Language TypeApplications #-}
+
+{-# Options_GHC -Wno-deprecations #-} -- Don't nag me about ListT
+
+module Types.GentooTests (gentooTests) where
+
+import Control.Applicative
+import Control.Monad.Trans.Class
+import Control.Monad.Trans.List
+import Data.Proxy
+import System.Directory
+import System.FilePath.Posix
+import Test.Tasty
+import Test.Tasty.HUnit
+
+import Internal.Distribution.Portage.Types
+import Data.Parsable
+import Test.Parsable
+
+gentooTests :: IO TestTree
+gentooTests = testGroup "strings from live Gentoo system" <$> sequenceA
+    [ gentooParseTests "/var/db/repos parse tests" <$> repoTree
+    , gentooParseTests "/var/db/pkg parse tests" <$> pkgTree
+    ]
+
+-- | Check all package atoms and make sure they are parsed successfully and
+--   pass the "roundtrip" test.
+gentooParseTests :: TestName -> [String] -> TestTree
+gentooParseTests n pkgStrings = testGroup n $
+    parsableHUnit (Proxy @Package) <$> pkgStrings
+
+-- | Scan the entire @/var/db/repos@ tree for ebuilds and form these into
+--  pacakge atoms.
+repoTree :: IO [String]
+repoTree = runListT $ do
+    let reposDir = "/var/db/repos"
+    checkDir reposDir $ do
+
+        repo <- listDir reposDir
+        cat  <- listDir $ reposDir </> repo
+        n    <- listDir $ reposDir </> repo </> cat
+        eb   <- listDir $ reposDir </> repo </> cat </> n
+
+        let (nv,ext) = splitExtension eb
+
+        guard $ ext == ".ebuild"
+
+        pure $ cat ++ "/" ++ nv ++ "::" ++ repo
+
+-- | Scan the entire @/var/db/pkg@ tree for package atoms in the form
+--   @<category>/<pkg-name>-<version>@. This is inherently part of the directory
+--   structure inside @/var/db/pkg@.
+pkgTree :: IO [String]
+pkgTree = runListT $ do
+    let portagePkgDir = "/var/db/pkg"
+    checkDir portagePkgDir $ do
+
+        cat <- listDir portagePkgDir           -- Scan for categories
+        nv  <- listDir $ portagePkgDir </> cat -- Scan for names/versions
+
+        case nv of
+            '.' : _ -> empty
+            '-' : _ -> empty
+            []      -> empty
+            _       -> pure $ cat ++ "/" ++ nv
+
+listDir :: FilePath -> ListT IO FilePath
+listDir d = do
+    lift (doesDirectoryExist d) >>= guard
+    ListT $ listDirectory d
+
+checkDir :: FilePath -> ListT IO a -> ListT IO a
+checkDir d rest = do
+    b <- lift $ doesDirectoryExist d
+    if b
+        then rest
+        else lift $ assertFailure $
+                show d ++ " is not a directory. Is this really a Gentoo system?"
diff --git a/test/Types/UnitTests.hs b/test/Types/UnitTests.hs
new file mode 100644
--- /dev/null
+++ b/test/Types/UnitTests.hs
@@ -0,0 +1,214 @@
+{-# Language FlexibleContexts #-}
+{-# Language ScopedTypeVariables #-}
+{-# Language TypeApplications #-}
+
+module Types.UnitTests (unitTests) where
+
+import Data.List.NonEmpty (NonEmpty(..))
+import Test.Tasty
+import Test.Tasty.HUnit
+
+import Internal.Distribution.Portage.Types
+import Data.Parsable
+import Test.Parsable
+
+unitTests :: TestTree
+unitTests = testGroup "unit tests"
+    [ testGroup "basic tests"
+        [ "dev-python/nose" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                Nothing
+                Nothing
+                Nothing
+        , "dev-python/nose-1" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                (Just (Version
+                    (VersionNum (('1':|[]):|[]))
+                    Nothing
+                    []
+                    Nothing
+                ))
+                Nothing
+                Nothing
+        , "dev-python/nose-1.23a-r123" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                (Just (Version
+                    (VersionNum (('1':|[]):|['2':|"3"]))
+                    (Just (VersionLetter 'a'))
+                    []
+                    (Just (VersionRevision ('1':|"23")))
+                ))
+                Nothing
+                Nothing
+        , "dev-python/nose:1337" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                Nothing
+                (Just (Slot "1337" Nothing))
+                Nothing
+        , "dev-python/nose::uberRepo" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                Nothing
+                Nothing
+                (Just (Repository "uberRepo"))
+        ,  "dev-python/nose-1.23a-r123:1337::uberRepo" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                (Just (Version
+                    (VersionNum (('1':|[]):|['2':|"3"]))
+                    (Just (VersionLetter 'a'))
+                    []
+                    (Just (VersionRevision ('1':|"23")))
+                ))
+                (Just (Slot "1337" Nothing))
+                (Just (Repository "uberRepo"))
+        , "=dev-python/nose-1.23*:1337::uberRepo" `parserTest`
+            ConstrainedDep
+                EqualAsterisk
+                (Category "dev-python")
+                (PkgName "nose")
+                (Version
+                    (VersionNum (('1':|[]):|['2':|"3"]))
+                    Nothing
+                    []
+                    Nothing
+                )
+                (Just (Slot "1337" Nothing))
+                (Just (Repository "uberRepo"))
+        ]
+    , testGroup "tricky tests"
+        [ "dev-python/nose-1.3.7_p20211111_p1" `parserTest`
+            Package
+                (Category "dev-python")
+                (PkgName "nose")
+                (Just (Version
+                    (VersionNum
+                        (('1':|[]) :| ['3':|[],'7':|[]])
+                    )
+                    Nothing
+                    [ (SuffixP, Just (VersionSuffixNum ('2' :| "0211111")))
+                    , (SuffixP, Just (VersionSuffixNum ('1' :| [])))
+                    ]
+                    Nothing
+                ))
+                Nothing
+                Nothing
+        , "app-text/xdvik-22.87.03-r3" `parserTest`
+            Package
+                (Category "app-text")
+                (PkgName "xdvik")
+                (Just (Version
+                    (VersionNum
+                        (('2':|"2") :|
+                            ['8':|"7"
+                            ,'0':|"3"
+                            ]
+                        )
+                    )
+                    Nothing
+                    []
+                    (Just (VersionRevision ('3':|[])))
+                ))
+                Nothing
+                Nothing
+        , "dev-java/log4j-12-api-2.17.2" `parserTest`
+            Package
+                (Category "dev-java")
+                (PkgName "log4j-12-api")
+                (Just (Version
+                    (VersionNum
+                        (('2':|[]) :|
+                            ['1':|"7"
+                            ,'2':|[]
+                            ]
+                        )
+                    )
+                    Nothing
+                    []
+                    Nothing
+                ))
+                Nothing
+                Nothing
+        , "sec-keys/openpgp-keys-gawk-20220407" `parserTest`
+            Package
+                (Category "sec-keys")
+                (PkgName "openpgp-keys-gawk")
+                (Just (Version
+                    (VersionNum (('2':|"0220407"):|[]))
+                    Nothing
+                    []
+                    Nothing
+                ))
+                Nothing
+                Nothing
+        , "app-derp/f--98---54.321x_pre1:gawk--::goo" `parserTest`
+            Package
+                (Category "app-derp")
+                (PkgName "f--98--")
+                (Just (Version
+                    (VersionNum (('5':|"4") :| ['3':|"21"]))
+                    (Just (VersionLetter 'x'))
+                    [ (SuffixPre, Just (VersionSuffixNum ('1' :| []))) ]
+                    Nothing
+                ))
+                (Just (Slot "gawk--" Nothing))
+                (Just (Repository "goo"))
+        , "app-office/hledger-web-1.26.1:0/1.26.1::haskell" `parserTest`
+            Package
+                (Category "app-office")
+                (PkgName "hledger-web")
+                (Just (Version
+                    (VersionNum (('1':|[]) :| ['2':|"6", '1':|[]]))
+                    Nothing
+                    []
+                    Nothing
+                ))
+                (Just (Slot "0" (Just (SubSlot "1.26.1"))))
+                (Just (Repository "haskell"))
+        ]
+    , testGroup "failed QuickCheck tests"
+        [ "7-r2b" `parserTest` Repository "7-r2b"
+        , "7-r2b" `parserTest` PkgName "7-r2b"
+        , "1.3.7_p20211111_p1" `parserTest` Version
+                    (VersionNum
+                        (('1':|[]) :| ['3':|[],'7':|[]])
+                    )
+                    Nothing
+                    [ (SuffixP, Just (VersionSuffixNum ('2' :| "0211111")))
+                    , (SuffixP, Just (VersionSuffixNum ('1' :| [])))
+                    ]
+                    Nothing
+        , "p" `parserTest` SuffixP
+--         , "7-r4-8y-r3-o-7-r0-a-4.ebuild" `parserTest` EBuildFileName
+--                     (PkgName "7-r4-8y-r3-o-7-r0-a")
+--                     (Version
+--                         (VersionNum
+--                             (('4' :| "") :| [])
+--                         )
+--                         Nothing
+--                         []
+--                         Nothing
+--                     )
+        ]
+    ]
+
+-- Takes a string and an expected result, and creates a TestTree from them
+parserTest :: forall a.
+    ( Parsable a Identity () String
+    , Eq a
+    , Show a
+    ) => String
+    -> a
+    -> TestTree
+parserTest s x = testCase (show s) $
+    Right (CompleteParse, x) @=? runParser (checkParsable @a) () "" s
diff --git a/test/Types/ValidityTests.hs b/test/Types/ValidityTests.hs
new file mode 100644
--- /dev/null
+++ b/test/Types/ValidityTests.hs
@@ -0,0 +1,277 @@
+{-# Language LambdaCase #-}
+{-# Language TypeApplications #-}
+{-# Language ViewPatterns #-}
+
+{-# Options_GHC -Wno-orphans #-}
+
+module Types.ValidityTests (validityTests) where
+
+import Data.Either (isLeft)
+import qualified Data.List as L
+import qualified Data.List.NonEmpty as NE
+import Data.Proxy
+import GHC.Natural
+import Test.QuickCheck
+import Test.Tasty
+
+import Data.Parsable
+import Test.Parsable
+import Internal.Distribution.Portage.Types
+
+
+validityTests :: STM TestTree
+validityTests =
+    testGroup "parsable validity tests" <$> sequenceA
+        [ parsableQuickCheck (Proxy @Category)
+        , parsableQuickCheck (Proxy @PkgName)
+        , parsableQuickCheck (Proxy @VersionNum)
+        , parsableQuickCheck (Proxy @VersionLetter)
+        , parsableQuickCheck (Proxy @VersionSuffix)
+        , parsableQuickCheck (Proxy @VersionSuffixNum)
+        , parsableQuickCheck (Proxy @VersionRevision)
+        , parsableQuickCheck (Proxy @Version)
+--         , parsableQuickCheck (Proxy @Operator) -- lossy round-trip
+        , parsableQuickCheck (Proxy @ConstrainedDep)
+        , parsableQuickCheck (Proxy @Slot)
+        , parsableQuickCheck (Proxy @SubSlot)
+        , parsableQuickCheck (Proxy @Repository)
+        , parsableQuickCheck (Proxy @Package)
+--         , parsableQuickCheck (Proxy @EBuildFileName) -- removed
+        , parsableQuickCheck (Proxy @FauxVersion)
+        , parsableQuickCheck (Proxy @FauxVersionNum)
+        ]
+
+-- Arbitrary instances    --
+-- Based off Gentoo PMS 8 --
+
+instance Arbitrary Natural where
+    arbitrary = arbitrarySizedNatural
+
+-- > 3.1.1 Category names
+-- > A category name may contain any of the characters [A-Za-z0-9+_.-].
+-- > It must not begin with a hyphen, a dot or a plus sign.
+instance Arbitrary Category where
+    arbitrary = Category <$> wordGen wordStart wordRest
+      where
+        wordStart =
+            [ isAsciiUpper
+            , isAsciiLower
+            , isDigit
+            , (== '_')
+            ]
+        wordRest = (== '+') : (== '-') : (== '.') : wordStart
+
+-- > 3.1.2 Package names
+-- > A package name may contain any of the characters [A-Za-z0-9+_-]. It must
+-- > not begin with a hyphen or a plus sign, and must not end in a hyphen
+-- > followed by anything matching the version syntax described in section 3.2.
+-- >
+-- > Note: A package name does not include the category. The term qualified
+-- > package name is used where a category/package pair is meant.
+instance Arbitrary PkgName where
+    arbitrary = PkgName <$> pkgGen wordStart wordRest
+      where
+        wordStart = [isAsciiUpper, isAsciiLower, isDigit, (== '_')]
+        wordRest  = (== '+') : (== '-') : wordStart
+
+-- > 3.1.3 Slot names
+-- > A slot name may contain any of the characters [A-Za-z0-9+_.-].
+-- > It must not begin with a hyphen, a dot or a plus sign.
+instance Arbitrary Slot where
+    arbitrary = Slot
+        <$> slotGen
+        <*> liftArbitrary arbitrary
+
+instance Arbitrary SubSlot where
+    arbitrary = SubSlot <$> slotGen
+
+slotGen :: Gen String
+slotGen = wordGen wordStart wordRest
+  where
+    wordStart =
+        [ isAsciiUpper
+        , isAsciiLower
+        , isDigit
+        , (== '_')
+        ]
+    wordRest = wordStart ++
+        [ (== '+')
+        , (== '.')
+        , (== '-')
+        ]
+
+
+-- TODO
+-- > 3.1.4 USE flag names
+-- > A USE flag name may contain any of the characters [A-Za-z0-9+_@-].
+-- > It must begin with an alphanumeric character. Underscores should be
+-- > considered reserved for USE_EXPAND, as described in section 11.1.1.
+-- >
+-- > Note: Usage of the at-sign is deprecated. It was previously required for
+-- > LINGUAS.
+
+
+-- > 3.1.5 Repository names
+-- > A repository name may contain any of the characters [A-Za-z0-9_-].
+-- > It must not begin with a hyphen. In addition, every repository
+-- > name must also be a valid package name.
+instance Arbitrary Repository where
+    arbitrary = Repository <$> pkgGen wordStart wordRest
+      where
+        wordStart =
+            [ isAsciiUpper
+            , isAsciiLower
+            , isDigit
+            , (== '_')
+            ]
+        wordRest = (== '-') : wordStart
+
+
+-- TODO
+-- > 3.1.6 License names
+-- > A license name may contain any of the characters [A-Za-z0-9+_.-].
+-- > It must not begin with a hyphen, a dot or a plus sign.
+
+
+-- TODO
+-- > 3.1.7 Keyword names
+-- > A keyword name may contain any of the characters [A-Za-z0-9_-].
+-- > It must not begin with a hyphen. In contexts where it makes sense to do so,
+-- > a keyword name may be prefixed by a tilde or a hyphen.
+-- > In KEYWORDS, -* is also acceptable as a keyword.
+
+
+-- TODO
+-- > 3.1.8 EAPI names
+-- > An EAPI name may contain any of the characters [A-Za-z0-9+_.-].
+-- > It must not begin with a hyphen, a dot or a plus sign.
+
+
+-- > 3.2 Version Specifications
+-- > The package manager must neither impose fixed limits upon the number of
+-- > version components, nor upon the length of any component. Package managers
+-- > should indicate or reject any version that is invalid according to the
+-- > rules below.
+
+-- > A version starts with the number part, which is in the form
+-- > [0-9]+(\.[0-9]+)* (an unsigned integer, followed by zero or more
+-- > dot-prefixed unsigned integers).
+instance Arbitrary VersionNum where
+    arbitrary = VersionNum <$> nonEmptyGen nonEmptyDigitGen
+
+-- > This may optionally be followed by one of [a-z] (a lowercase letter).
+instance Arbitrary VersionLetter where
+    arbitrary = VersionLetter <$> arbitrary `suchThat` isAsciiLower
+
+-- > This may be followed by zero or more of the suffixes
+-- > _alpha, _beta, _pre, _rc or _p [...]
+instance Arbitrary VersionSuffix where
+    arbitrary = arbitraryBoundedEnum
+
+-- > [...] each of which may optionally be followed by an unsigned integer.
+-- > Suffix and integer count as separate version components.
+instance Arbitrary VersionSuffixNum where
+    arbitrary = VersionSuffixNum <$> nonEmptyDigitGen
+
+-- > This may optionally be followed by the suffix -r followed immediately by an
+-- > unsigned integer (the “revision number”). If this suffix is not present, it
+-- > is assumed to be -r0.
+instance Arbitrary VersionRevision where
+    arbitrary = VersionRevision <$> nonEmptyDigitGen
+
+-- The composite of an entire version string
+instance Arbitrary Version where
+    arbitrary = Version
+        <$> arbitrary
+        <*> liftArbitrary arbitrary
+        <*> liftArbitrary (liftArbitrary arbitrary)
+        <*> liftArbitrary arbitrary
+
+instance Arbitrary Operator where
+    arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary ConstrainedDep where
+    arbitrary = ConstrainedDep
+        <$> arbitrary
+        <*> arbitrary
+        <*> arbitrary
+        <*> arbitrary
+        <*> liftArbitrary arbitrary
+        <*> liftArbitrary arbitrary
+
+-- The composite of an entire package atom
+instance Arbitrary Package where
+    arbitrary = Package
+        <$> arbitrary
+        <*> arbitrary
+        <*> liftArbitrary arbitrary
+        <*> liftArbitrary arbitrary
+        <*> liftArbitrary arbitrary
+
+-- instance Arbitrary EBuildFileName where
+--     arbitrary = EBuildFileName
+--         <$> arbitrary
+--         <*> arbitrary
+
+-- Generates version numbers with exactly one component. For use with
+-- FauxVersion.
+instance Arbitrary FauxVersionNum where
+    arbitrary = FauxVersionNum . VersionNum . pure <$> nonEmptyDigitGen
+
+-- Generates Versions that are both valid Versions and also valid
+-- parts of PkgNames. This helps test the critera from "3.1.2 Package names":
+--
+-- > It [...] must not end in a hyphen followed by anything matching the
+-- > version syntax described in section 3.2.
+instance Arbitrary FauxVersion where
+    arbitrary = fmap FauxVersion $ Version
+        <$> (unwrapFauxVersionNum <$> arbitrary)
+        <*> liftArbitrary arbitrary
+        <*> liftArbitrary (liftArbitrary arbitrary)
+        <*> liftArbitrary arbitrary
+
+nonEmptyGen :: Gen a -> Gen (NE.NonEmpty a)
+nonEmptyGen = fmap NE.fromList . listOf1
+
+nonEmptyDigitGen :: Gen (NE.NonEmpty Char)
+nonEmptyDigitGen = nonEmptyGen $ arbitrary `suchThat` isDigit
+
+-- | PkgName and Repository share a similar generator
+pkgGen :: [Char -> Bool] -> [Char -> Bool] -> Gen String
+pkgGen
+    (removeHyphens -> wordStart)
+    (removeHyphens -> wordRest ) = do
+        ls <- oneof
+            [ do
+                s <- oneof startChoices
+                -- This generator can get out of hand if we don't limit the size
+                -- of the list
+                k <- choose (0,5)
+                rest <- vectorOf k $ oneof restChoices
+                pure $ s : rest
+            , pure []
+            ]
+        end <- nonVersion
+        pure $ L.intercalate "-" $ ls ++ [end]
+  where
+    nonVersion =
+        wordGen wordStart wordRest
+            `suchThat` (isLeft . runParsable @Version "")
+
+    -- Don't start with @pure ""@ or it will end up creating a string that
+    -- starts with @'-'@ (an invalid Package/Repository string)
+    startChoices =
+        [ nonVersion
+--         Currently not behaving correctly; we're getting invalid package/repository names
+--         , toString . unwrapFauxVersion <$> arbitrary
+        ]
+
+    restChoices = pure "" : startChoices
+
+-- Sometimes hyphens are handled specially and should not be generated with
+-- 'wordGen'. This removes hyphens which would normally be generated when
+-- following specifcations.
+removeHyphens :: [Char -> Bool] -> [Char -> Bool]
+removeHyphens = map $ \f -> \case
+    '-' -> False
+    c   -> f c
diff --git a/test/data/2022-07-16/emerge-world-test.stdout b/test/data/2022-07-16/emerge-world-test.stdout
new file mode 100644
--- /dev/null
+++ b/test/data/2022-07-16/emerge-world-test.stdout
@@ -0,0 +1,463 @@
+
+These are the packages that would be merged, in order:
+
+Calculating dependencies  ...... ..... .. .. ..... done!
+[ebuild   R   ~] dev-haskell/th-abstraction-0.4.2.0:0/0.4.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/file-embed-0.0.15.0:0/0.0.15.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/inspection-testing-0.4.5.0:0/0.4.5.0::haskell  USE="doc hoogle hscolour test -profile" 22 KiB
+[ebuild  N    ~] dev-haskell/nanospec-0.2.2:0/0.2.2::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/some-1.0.4:0/1.0.4::haskell  USE="doc hoogle hscolour newtype-unsafe test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/singletons-3.0.1:0/3.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/hostname-1.0-r1:0/1.0::haskell  USE="doc hoogle hscolour -profile" 2 KiB
+[ebuild   R   ~] dev-haskell/ghc-byteorder-4.11.0.0.10:0/4.11.0.0.10::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/simple-reflect-0.3.3:0/0.3.3::haskell  USE="doc hoogle hscolour -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/first-class-families-0.8.0.1:0/0.8.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/generic-monoid-0.1.0.1:0/0.1.0.1::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild  N    ~] dev-haskell/code-page-0.2.1:0/0.2.1::haskell  USE="doc hoogle hscolour test -profile" 7 KiB
+[ebuild  N    ~] dev-haskell/pretty-hex-1.1:0/1.1::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild  N    ~] dev-haskell/sop-core-0.5.0.2:0/0.5.0.2::haskell  USE="doc hoogle hscolour -profile" 28 KiB
+[ebuild  N    ~] dev-haskell/patience-0.1.1-r1:0/0.1.1::haskell  USE="doc hoogle hscolour -profile" 5 KiB
+[ebuild  N    ~] dev-haskell/monads-tf-0.1.0.3:0/0.1.0.3::haskell  USE="doc hoogle hscolour -profile" 14 KiB
+[ebuild   R   ~] dev-haskell/lift-type-0.1.0.1:0/0.1.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/groups-0.5.3:0/0.5.3::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild  N    ~] dev-haskell/prettyclass-1.0.0.0-r1:0/1.0.0.0::haskell  USE="doc hoogle hscolour -profile" 2 KiB
+[ebuild  N    ~] dev-haskell/dec-0.0.4:0/0.0.4::haskell  USE="doc hoogle hscolour -profile" 3 KiB
+[ebuild  N    ~] dev-haskell/managed-1.0.9:0/1.0.9::haskell  USE="doc hoogle hscolour -profile" 6 KiB
+[ebuild  N    ~] dev-haskell/optional-args-1.0.2-r2:0/1.0.2::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild  N    ~] dev-haskell/ieee754-0.8.0:0/0.8.0::haskell  USE="doc hoogle hscolour -profile" 18 KiB
+[ebuild   R   ~] dev-haskell/compact-0.2.0.0:0/0.2.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/named-0.3.0.1:0/0.3.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/show-combinators-0.2.0.0:0/0.2.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/utf8-light-0.4.2:0/0.4.2::haskell  USE="doc hoogle hscolour -profile" 6 KiB
+[ebuild   R   ~] dev-haskell/js-dgtable-0.5.2:0/0.5.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/call-stack-0.3.0:0/0.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/th-lift-0.8.2:0/0.8.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/microlens-th-0.4.3.10:0/0.4.3.10::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/generics-sop-0.5.1.1:0/0.5.1.1::haskell  USE="doc hoogle hscolour test -profile" 30 KiB
+[ebuild  N    ~] dev-haskell/options-1.2.1.1:0/1.2.1.1::haskell  USE="doc hoogle hscolour -profile" 25 KiB
+[ebuild  N    ~] dev-haskell/singleton-bool-0.1.5-r1:0/0.1.5::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/ap-normalize-0.1.0.1:0/0.1.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/quickcheck-2.14.2-r1:2/2.14.2::haskell  USE="doc hoogle hscolour template-haskell test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hunit-1.6.2.0:0/1.6.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/chell-0.4.0.2:0/0.4.0.2::haskell  USE="color-output doc hoogle hscolour -profile" 13 KiB
+[ebuild   R   ~] dev-haskell/unagi-chan-0.4.1.3:0/0.4.1.3::haskell  USE="doc hoogle hscolour test* -compare-benchmarks -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/optics-th-0.4:0/0.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/optparse-applicative-0.16.1.0-r1:0/0.16.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/utf8-string-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/safe-0.3.19:0/0.3.19::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/dlist-1.0:0/1.0::haskell  USE="doc hoogle hscolour test* -profile -werror" 0 KiB
+[ebuild   R   ~] dev-haskell/split-0.2.3.4:0/0.2.3.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hspec-expectations-0.8.2:0/0.8.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/tagsoup-0.14.8:0/0.14.8::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/emojis-0.1.2:0/0.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/utility-ht-0.0.14:0/0.0.14::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/string-qq-0.0.4:0/0.0.4::haskell  USE="doc hoogle hscolour test -profile" 2 KiB
+[ebuild   R   ~] dev-haskell/raw-strings-qq-1.1:0/1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/pcre-light-0.4.1.0:0/0.4.1.0::haskell  USE="doc hoogle hscolour test -profile" 29 KiB
+[ebuild  N    ~] dev-haskell/selective-0.5:0/0.5::haskell  USE="doc hoogle hscolour test -profile" 34 KiB
+[ebuild   R   ~] dev-haskell/pqueue-1.4.1.4:0/1.4.1.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/quickcheck-text-0.1.2.1:0/0.1.2.1::haskell  USE="doc hoogle hscolour test -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/regex-tdfa-1.3.1.1:0/1.3.1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/hspec-meta-2.9.3:0/2.9.3::haskell  USE="doc hoogle hscolour -profile" 68 KiB
+[ebuild     U  ] dev-libs/openssl-1.1.1q:0/1.1::gentoo [1.1.1o:0/1.1::gentoo] USE="asm sctp verify-sig -rfc3779 -sslv3 -static-libs -test -tls-compression -tls-heartbeat -vanilla -weak-ssl-ciphers" ABI_X86="32 (64) (-x32)" CPU_FLAGS_X86="(sse2)" 9,634 KiB
+[ebuild   R    ] dev-lang/python-3.10.5:3.10::gentoo  USE="bluetooth gdbm hardened* libedit lto ncurses pgo readline sqlite ssl tk verify-sig xml -build -examples -test -wininst" 0 KiB
+[ebuild   R    ] dev-lang/python-3.8.13_p2:3.8::gentoo  USE="bluetooth gdbm hardened* ncurses readline sqlite ssl tk verify-sig xml -build -examples -test -wininst" 0 KiB
+[ebuild     U  ] dev-python/setuptools-62.6.0::gentoo [62.3.3::gentoo] USE="-test" PYTHON_TARGETS="python3_8 python3_10 (-pypy3) -python3_9 (-python3_11)" 2,539 KiB
+[ebuild     U  ] sys-apps/systemd-251.2:0/2::gentoo [250.7:0/2::gentoo] USE="acl apparmor audit cryptsetup dns-over-tls gcrypt http idn kmod lz4 lzma openssl pam pcre (policykit) qrcode resolvconf seccomp (split-usr) sysv-utils xkb zstd -build -cgroup-hybrid -curl -elfutils -fido2 -gnuefi -gnutls -homed -importd -iptables -pkcs11 -pwquality (-selinux) -test -tpm -vanilla (-hostnamed-fallback%)" ABI_X86="32 (64) (-x32)" 11,167 KiB
+[ebuild     U  ] dev-python/docutils-0.18.1-r1::gentoo [0.17.1-r1::gentoo] PYTHON_TARGETS="python3_8 python3_10 (-pypy3) -python3_9 (-python3_11)" 0 KiB
+[ebuild     U  ] net-libs/rpcsvc-proto-1.4.3-r1::gentoo [1.4.3::gentoo] 165 KiB
+[ebuild   R    ] dev-lang/python-3.9.13:3.9::gentoo  USE="bluetooth gdbm hardened* lto ncurses pgo readline sqlite ssl tk verify-sig xml -build -examples -test -wininst" 0 KiB
+[ebuild  N     ] dev-ruby/mini_portile2-2.8.0:2.8::gentoo  USE="-doc -test" RUBY_TARGETS="ruby27 -ruby26 -ruby30 -ruby31" 0 KiB
+[ebuild  N    ~] dev-ruby/rexical-1.0.7-r1::gentoo  USE="-doc -test" RUBY_TARGETS="ruby27 -ruby26 -ruby30 -ruby31" 0 KiB
+[ebuild     U  ] sys-apps/pciutils-3.8.0-r1::gentoo [3.8.0::gentoo] USE="kmod udev zlib -dns -static-libs" ABI_X86="32 (64) (-x32)" 0 KiB
+[ebuild     U  ] dev-python/PyQt5-sip-12.10.1:0/12::gentoo [12.9.0:0/12::gentoo] PYTHON_TARGETS="python3_8 python3_10 -python3_9 (-python3_11)" 119 KiB
+[ebuild     U  ] app-eselect/eselect-timidity-20110513-r1::gentoo [20110513::gentoo] 0 KiB
+[ebuild   R   ~] dev-haskell/happy-1.20.0::haskell  USE="doc test*" 0 KiB
+[ebuild   R   ~] dev-haskell/alex-3.2.7.1::haskell  USE="doc test*" 0 KiB
+[ebuild   R   ~] dev-haskell/config-value-0.8.1:0/0.8.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N     ] dev-util/spirv-headers-1.3.211::gentoo  0 KiB
+[ebuild   R   ~] dev-haskell/postgresql-libpq-0.9.4.3-r1:0/0.9.4.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild     U ~] dev-ruby/nokogiri-1.13.7::gentoo [1.13.6::gentoo] USE="-doc -test" RUBY_TARGETS="ruby27 -ruby26 -ruby30 -ruby31" 6,105 KiB
+[ebuild     U  ] www-client/brave-bin-1.41.96::brave-overlay [1.41.94::brave-overlay] USE="-gnome-keyring" L10N="en-US -am -ar -bg -bn -ca -cs -da -de -el -en-GB -es -es-419 -et -fa -fi -fil -fr -gu -he -hi -hr -hu -id -it -ja -kn -ko -lt -lv -ml -mr -ms -nb -nl -pl -pt-BR -pt-PT -ro -ru -sk -sl -sr -sv -sw -ta -te -th -tr -uk -vi -zh-CN -zh-TW" 131,689 KiB
+[ebuild     U  ] media-libs/phonon-4.11.1-r2::gentoo [4.11.1-r1::gentoo] USE="designer gstreamer pulseaudio vlc -debug" 0 KiB
+[ebuild     U  ] dev-python/sphinx-5.0.2::gentoo [4.5.0-r1::gentoo] USE="latex -doc -test" PYTHON_TARGETS="python3_8 python3_10 (-pypy3) -python3_9 (-python3_11)" 6,572 KiB
+[ebuild     U  ] net-fs/cifs-utils-6.15::gentoo [6.13-r1::gentoo] USE="acl ads caps pam python systemd -creds" PYTHON_SINGLE_TARGET="python3_10 -python3_8 -python3_9 (-python3_11)" 407 KiB
+[ebuild  N     ] media-sound/strawberry-1.0.5::gentoo  USE="cdda gstreamer mtp pulseaudio udisks vlc -debug -ipod -moodbar" 10,950 KiB
+[ebuild   R   ~] dev-haskell/tasty-quickcheck-0.10.1.2:0/0.10.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/syb-0.7.2.1:0/0.7.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/lua-2.1.0:0/2.1.0::haskell  USE="allow-unsafe-gc doc export-dynamic hardcode-reg-keys hoogle hscolour test* -apicheck -lua-32bits -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/monad-loops-0.4.3:0/0.4.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/wl-pprint-annotated-0.1.0.1-r1:0/0.1.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/logict-0.7.0.3:0/0.7.0.3::haskell  USE="doc hoogle hscolour test -profile" 6 KiB
+[ebuild  N    ~] dev-haskell/tasty-travis-0.2.0.2:0/0.2.0.2::haskell  USE="doc hoogle hscolour test -profile" 8 KiB
+[ebuild   R   ~] dev-haskell/jira-wiki-markup-1.4.0:0/1.4.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/doctest-0.20.0:0/0.20.0::haskell  USE="doc hoogle hscolour -profile" 50 KiB
+[ebuild   R   ~] dev-haskell/zlib-0.6.2.3:0/0.6.2.3::haskell  USE="doc hoogle hscolour test* -bundled-c-zlib -non-blocking-ffi -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/cookie-0.4.5:0/0.4.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hourglass-0.2.12:0/0.2.12::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/lua-arbitrary-1.0.1:0/1.0.1::haskell  USE="doc hoogle hscolour -profile" 3 KiB
+[ebuild   R   ~] dev-haskell/rope-utf16-splay-0.3.2.0:0/0.3.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/tasty-kat-0.0.3:0/0.0.3::haskell  USE="doc hoogle hscolour test -profile" 7 KiB
+[ebuild   R   ~] dev-haskell/hsyaml-0.2.1.1:0/0.2.1.1::haskell  USE="doc hoogle hscolour test* -exe -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/th-expand-syns-0.4.8.0:0/0.4.8.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/lpeg-1.0.3:0/1.0.3::haskell  USE="doc hoogle hscolour test* -profile -rely-on-shared-lpeg-library" 0 KiB
+[ebuild  N    ~] dev-haskell/haskell-src-1.0.3.1:0/1.0.3.1::haskell  USE="doc hoogle hscolour -profile" 30 KiB
+[ebuild   R   ~] dev-haskell/ghc-source-gen-0.4.2.0:0/0.4.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/asn1-encoding-0.9.6:0/0.9.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/th-reify-many-0.1.9:0/0.1.9::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/foundation-0.0.26.1:0/0.0.26.1::haskell  USE="doc hoogle hscolour test* -experimental -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/network-byte-order-0.1.6:0/0.1.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/type-errors-0.2.0.0:0/0.2.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/pcg-random-0.1.3.7:0/0.1.3.7::haskell  USE="doc hoogle hscolour test -profile" 25 KiB
+[ebuild   R   ~] dev-haskell/memory-0.15.0:0/0.15.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/crypto-pubkey-types-0.4.3:0/0.4.3::haskell  USE="doc hoogle hscolour -profile" 11 KiB
+[ebuild   R   ~] dev-haskell/cryptonite-0.28-r1:0/0.28::haskell  USE="doc hoogle hscolour integer-gmp target-attributes test* -profile" CPU_FLAGS_X86="sse -aes -rdrand -sse4_1" 0 KiB
+[ebuild   R   ~] dev-haskell/uuid-types-1.0.5-r1:0/1.0.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/text-short-0.1.5:0/0.1.5::haskell  USE="doc hoogle hscolour test* -asserts -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/psqueues-0.2.7.3:0/0.2.7.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/nats-1.1.2-r1:0/1.1.2::haskell  USE="binary hashable template-haskell -profile" 11 KiB
+[ebuild  N    ~] dev-haskell/smallcheck-1.2.1:0/1.2.1::haskell  USE="doc hoogle hscolour -profile" 19 KiB
+[ebuild   R   ~] dev-haskell/primitive-unlifted-0.1.3.1:0/0.1.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/tasty-smallcheck-0.8.2:0/0.8.2::haskell  USE="doc hoogle hscolour -profile" 3 KiB
+[ebuild   R   ~] dev-haskell/regex-applicative-0.3.3.1:0/0.3.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/resourcet-1.2.5:0/1.2.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/base-orphans-0.8.6:0/0.8.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/generic-deriving-1.14.1:0/1.14.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/th-compat-0.1.3:0/0.1.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/constraints-0.13.3:0/0.13.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/reflection-2.1.6:0/2.1.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/path-pieces-0.2.1:0/0.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/validity-0.12.0.0:0/0.12.0.0::haskell  USE="doc hoogle hscolour test -profile" 9 KiB
+[ebuild   R   ~] dev-haskell/word8-0.1.3:0/0.1.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/css-text-0.1.3.0:0/0.1.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/http-date-0.0.11:0/0.0.11::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/unix-time-0.4.7:0/0.4.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/should-not-typecheck-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test -profile" 6 KiB
+[ebuild  N    ~] dev-haskell/logging-facade-0.3.0:0/0.3.0::haskell  USE="doc hoogle hscolour test -profile" 4 KiB
+[ebuild  N    ~] dev-haskell/stringbuilder-0.5.1:0/0.5.1::haskell  USE="doc hoogle hscolour test -profile" 3 KiB
+[ebuild   R   ~] dev-haskell/zlib-bindings-0.1.1.5:0/0.1.1.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/quickcheck-assertions-0.3.0:0/0.3.0::haskell  USE="doc hoogle hscolour test -profile" 6 KiB
+[ebuild   R   ~] dev-haskell/newtype-generics-0.6:0/0.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hlibsass-0.1.10.1:0/0.1.10.1::haskell  USE="doc hoogle hscolour test* -externallibsass -profile -sharedlibsass" 0 KiB
+[ebuild   R   ~] dev-haskell/word-wrap-0.4.1:0/0.4.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/ini-0.4.1-r1:0/0.4.1::haskell  USE="doc hoogle hscolour test -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/indexed-list-literals-0.2.1.3:0/0.2.1.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/unicode-data-0.3.0:0/0.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/email-validate-2.3.2.15:0/2.3.2.15::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/hspec-attoparsec-0.1.0.2-r1:0/0.1.0.2::haskell  USE="doc hoogle hscolour test -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/fgl-5.7.0.3-r1:0/5.7.0.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/vector-0.12.3.1-r1:0/0.12.3.1::haskell  USE="boundschecks doc hoogle hscolour test* -internalchecks -profile -unsafechecks" 0 KiB
+[ebuild  N    ~] dev-haskell/test-framework-0.8.2.0-r3:0/0.8.2.0::haskell  USE="doc hoogle hscolour -profile" 21 KiB
+[ebuild   R   ~] dev-haskell/bifunctors-5.5.11:0/5.5.11::haskell  USE="doc hoogle hscolour semigroups tagged test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/distributive-0.6.2.1:0/0.6.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/time-compat-1.9.6.1:0/1.9.6.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/onetuple-0.3.1:0/0.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/errorcall-eq-instance-0.3.0:0/0.3.0::haskell  USE="doc hoogle hscolour test -profile" 2 KiB
+[ebuild   R   ~] dev-haskell/deriving-compat-0.6:0/0.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/recursion-schemes-5.2.2.1:0/5.2.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/validated-literals-0.3.1:0/0.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/test-framework-hunit-0.3.0.2-r1:0/0.3.0.2::haskell  USE="doc hoogle hscolour -profile" 3 KiB
+[ebuild  N    ~] dev-haskell/test-framework-quickcheck2-0.3.0.5-r2:0/0.3.0.5::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/th-lift-instances-0.1.19:0/0.1.19::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/base-compat-batteries-0.12.1:0/0.12.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/text-metrics-0.3.0:0/0.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/vector-algorithms-0.8.0.4:0/0.8.0.4::haskell  USE="bench boundschecks doc hoogle hscolour properties test* -internalchecks -profile -unsafechecks" 0 KiB
+[ebuild   R   ~] dev-haskell/text-zipper-0.11:0/0.11::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/barbies-2.0.3.0:0/2.0.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/xss-sanitize-0.3.6:0/0.3.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/hashable-time-0.3:0/0.3::haskell  USE="doc hoogle hscolour test -profile" 3 KiB
+[ebuild   R   ~] dev-haskell/listlike-4.7.4:0/4.7.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/test-framework-smallcheck-0.2:0/0.2::haskell  USE="doc hoogle hscolour -profile" 3 KiB
+[ebuild  N    ~] dev-haskell/pgp-wordlist-0.1.0.3:0/0.1.0.3::haskell  USE="doc hoogle hscolour test -profile" 10 KiB
+[ebuild   R   ~] dev-haskell/streaming-0.2.3.1:0/0.2.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/nonempty-vector-0.2.1.0:0/0.2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/vector-th-unbox-0.2.1.9:0/0.2.1.9::haskell  USE="doc hoogle hscolour test -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/async-2.2.4-r1:0/2.2.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/exceptions-0.10.4:0/0.10.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/case-insensitive-1.2.1.0:0/1.2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/base64-bytestring-1.2.1.0:0/1.2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/blaze-builder-0.4.2.1:0/0.4.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/base16-bytestring-1.0.2.0:0/1.0.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/cereal-0.5.8.2:0/0.5.8.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/diff-0.4.0:0/0.4.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/lifted-base-0.2.3.12:0/0.2.3.12::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/glob-0.10.2:0/0.10.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/foldl-1.4.12:0/1.4.12::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/sha-1.6.4.4:0/1.6.4.4::haskell  USE="doc hoogle hscolour test* -exe -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/pem-0.2.4:0/0.2.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/adjunctions-4.4:0/4.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/invariant-0.5.5:0/0.5.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/th-orphans-0.13.11:0/0.13.11::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/fingertree-0.1.4.2:0/0.1.4.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/decimal-0.5.2:0/0.5.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/exception-transformers-0.4.0.9:0/0.4.0.9::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/math-functions-0.3.4.2:0/0.3.4.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/either-5.0.1.1:0/5.0.1.1::haskell  USE="doc hoogle hscolour test -profile" 10 KiB
+[ebuild  N    ~] dev-haskell/keys-3.12.3-r1:0/3.12.3::haskell  USE="doc hoogle hscolour -profile" 17 KiB
+[ebuild   R   ~] dev-haskell/infer-license-0.2.0:0/0.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/bindings-glfw-3.3.2.0:0/3.3.2.0::haskell  USE="X doc hoogle hscolour test* -exposenative -osmesa -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/edit-distance-0.2.2.1-r1:0/0.2.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/double-conversion-2.0.2.0:0/2.0.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/crypto-cipher-tests-0.0.11-r1:0/0.0.11::haskell  USE="doc hoogle hscolour test -profile" 7 KiB
+[ebuild  N    ~] dev-haskell/checkers-0.5.6-r1:0/0.5.6::haskell  USE="doc hoogle hscolour -profile" 18 KiB
+[ebuild   R   ~] dev-haskell/enummapset-0.6.0.3:0/0.6.0.3::haskell  USE="doc hoogle hscolour test* -debug -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/iso-deriving-0.0.8:0/0.0.8::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/process-extras-0.7.4:0/0.7.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/half-0.3.1:0/0.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/temporary-1.3:0/1.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/blaze-markup-0.8.2.8:0/0.8.2.8::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/unliftio-0.2.18:0/0.2.18::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/x509-1.7.7:0/1.7.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/safe-exceptions-0.1.7.1:0/0.1.7.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/vty-5.35.1:0/5.35.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/polysemy-1.7.1.0:0/1.7.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/mono-traversable-1.0.15.3:0/1.0.15.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/crypto-api-tests-0.3-r1:0/0.3::haskell  USE="doc hoogle hscolour -profile" 3,551 KiB
+[ebuild   R   ~] dev-haskell/text-conversions-0.3.1:0/0.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/haskeline-0.8.2:0/0.8.2::haskell  USE="doc hoogle hscolour terminfo test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/filelock-0.1.1.5:0/0.1.1.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/cryptohash-sha256-0.11.102.0:0/0.11.102.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/th-desugar-1.12:0/1.12::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/mwc-random-0.15.0.2-r1:0/0.15.0.2::haskell  USE="doc hoogle hscolour test -profile" 30 KiB
+[ebuild   R   ~] dev-haskell/cipher-aes-0.2.11:0/0.2.11::haskell  USE="doc hoogle hscolour test* -profile" CPU_FLAGS_X86="-aes -ssse3" 0 KiB
+[ebuild   R   ~] dev-haskell/lucid-2.11.0:0/2.11.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/concurrent-extra-0.7.0.12:0/0.7.0.12::haskell  USE="doc hoogle hscolour test -profile" 16 KiB
+[ebuild  N    ~] dev-haskell/cipher-aes128-0.7.0.5-r2:0/0.7.0.5::haskell  USE="doc hoogle hscolour -profile" 26 KiB
+[ebuild  N    ~] dev-haskell/cryptohash-cryptoapi-0.1.4:0/0.1.4::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/bimap-0.4.0:0/0.4.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hinotify-0.4.1:0/0.4.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/enclosed-exceptions-1.0.3:0/1.0.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/blaze-textual-0.2.1.0:0/0.2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/reducers-3.12.3-r1:0/3.12.3::haskell  USE="doc hoogle hscolour -profile" 14 KiB
+[ebuild   R   ~] dev-haskell/language-javascript-0.7.0.0:0/0.7.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/skein-1.0.9.4:0/1.0.9.4::haskell  USE="doc hoogle hscolour test* (-big-endian) -force-endianness -profile -reference" 0 KiB
+[ebuild  N    ~] dev-haskell/xmlgen-0.6.2.2:0/0.6.2.2::haskell  USE="doc hoogle hscolour -profile" 10 KiB
+[ebuild   R   ~] dev-haskell/filestore-0.6.5:0/0.6.5::haskell  USE="doc hoogle hscolour maxcount test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hstringtemplate-0.8.8-r1:0/0.8.8::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/glfw-b-3.3.0.0:0/3.3.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/refinery-0.4.0.0:0/0.4.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/network-3.1.2.5:0/3.1.2.5::haskell  USE="doc hoogle hscolour test* -devel -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/http-types-0.12.3:0/0.12.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/extra-1.7.10:2/1.7.10::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/blaze-html-0.9.1.2:0/0.9.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-core-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/silently-1.2.5.1:0/1.2.5.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/mockery-0.3.5:0/0.3.5::haskell  USE="doc hoogle hscolour test -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/x509-store-1.6.7:0/1.6.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/indexed-traversable-instances-0.1:0/0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/prettyprinter-1.7.0:0/1.7.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/typed-process-0.2.9.0:0/0.2.9.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/zip-archive-0.4.2.1:0/0.4.2.1::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/githash-0.1.6.1:0/0.1.6.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/puremd5-2.1.3:0/2.1.3::haskell  USE="doc hoogle hscolour test -profile" 7 KiB
+[ebuild  N    ~] dev-haskell/system-fileio-0.3.16.4:0/0.3.16.4::haskell  USE="doc hoogle hscolour test -profile" 16 KiB
+[ebuild   R   ~] dev-haskell/hashtables-1.3:0/1.3::haskell  USE="doc hoogle hscolour test* -bounds-checking -debug -detailed-profiling -profile" CPU_FLAGS_X86="-sse4_2" 0 KiB
+[ebuild   R   ~] dev-haskell/clientsession-0.9.1.2:0/0.9.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/cassava-0.5.2.0-r1:0/0.5.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/monoid-subclasses-0.4.6.1:0/0.4.6.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/polysemy-plugin-0.4.3.0:0/0.4.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/threads-0.5.1.6:0/0.5.1.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/weigh-0.0.16:0/0.0.16::haskell  USE="doc hoogle hscolour test -profile" 9 KiB
+[ebuild  N    ~] dev-haskell/drbg-0.5.5:0/0.5.5::haskell  USE="doc hoogle hscolour test -profile" 1,511 KiB
+[ebuild   R   ~] dev-haskell/lukko-0.1.1.3:0/0.1.1.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/direct-sqlite-2.3.26-r1:0/2.3.26::haskell  USE="doc fulltextsearch hoogle hscolour json1 test* urifilenames -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/random-bytestring-0.1.4:0/0.1.4::haskell  USE="doc hoogle hscolour pcg -profile" 79 KiB
+[ebuild   R   ~] dev-haskell/config-schema-1.2.2.0:0/1.2.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/aeson-1.5.6.0-r2:0/1.5.6.0::haskell  USE="cffi doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/conduit-1.3.4.2:0/1.3.4.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/lens-5.1.1:0/5.1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/wai-3.2.3:0/3.2.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/streaming-commons-0.2.2.1:0/0.2.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/haskell-src-exts-1.23.1:1.22/1.23.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/rio-0.1.21.0:0/0.1.21.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hspec-core-2.9.4:0/2.9.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hspec-discover-2.9.4:0/2.9.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/tasty-hslua-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour -profile" 4 KiB
+[ebuild   R   ~] dev-haskell/ghc-exactprint-0.6.4:0/0.6.4::haskell  USE="doc hoogle hscolour test* -profile -roundtrip" 0 KiB
+[ebuild   R   ~] dev-haskell/witherable-0.4.2:0/0.4.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/iproute-1.7.12:0/1.7.12::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/doclayout-0.3.1.1:0/0.3.1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/io-streams-1.5.2.1-r1:0/1.5.2.1::haskell  USE="doc hoogle hscolour network test* zlib -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/prettyprinter-ansi-terminal-1.1.2:0/1.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/sqlite-simple-0.4.18.2:0/0.4.18.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/cryptohash-md5-0.11.101.0:0/0.11.101.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/x509-validation-1.6.11:0/1.6.11::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/markdown-unlit-0.5.1-r1:0/0.5.1::haskell  USE="doc executable hoogle hscolour test -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/hjsmin-0.2.0.4:0/0.2.0.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/filepattern-0.1.2:0/0.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/optparse-simple-0.1.1.4:0/0.1.1.4::haskell  USE="doc hoogle hscolour test* -build-example -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/getopt-generics-0.13.0.4:0/0.13.0.4::haskell  USE="doc hoogle hscolour test -profile" 19 KiB
+[ebuild  N    ~] dev-haskell/vector-instances-3.4:0/3.4::haskell  USE="doc hashable hoogle hscolour -profile" 6 KiB
+[ebuild  N    ~] dev-haskell/rsa-2.3.1:0/2.3.1::haskell  USE="doc hoogle hscolour test -profile" 15 KiB
+[ebuild  N    ~] dev-haskell/port-utils-0.2.1.0:0/0.2.1.0::haskell  USE="doc hoogle hscolour test -profile" 7 KiB
+[ebuild   R   ~] dev-haskell/base64-0.4.2.3:0/0.4.2.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/algebraic-graphs-0.6:0/0.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/polysemy-zoo-0.8.0.0:0/0.8.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/fuzzy-0.1.0.0:0/0.1.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/conduit-extra-1.3.6:0/1.3.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-marshalling-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/http-client-0.7.11:0/0.7.11::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslogger-1.3.1.0-r2:0/1.3.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/shakespeare-2.0.25:0/2.0.25::haskell  USE="doc hoogle hscolour test* test-coffee test-export test-roy -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/pandoc-types-1.22.2:0/1.22.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/unicode-transforms-0.3.7.1:0/0.3.7.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/beam-core-0.9.2.1:0/0.9.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/tls-1.5.8:0/1.5.8::haskell  USE="compat doc hoogle hscolour network test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/genvalidity-1.0.0.1:0/1.0.0.1::haskell  USE="doc hoogle hscolour test -profile" 12 KiB
+[ebuild   R   ~] dev-haskell/hiedb-0.4.1.0:0/0.4.1.0::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/tasty-th-0.1.7:0/0.1.7::haskell  USE="doc hoogle hscolour test -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/snap-core-1.0.5.0:0/1.0.5.0::haskell  USE="doc hoogle hscolour test* -debug -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/websockets-0.12.7.3:0/0.12.7.3::haskell  USE="doc examples hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hackage-security-0.6.1.0:0/0.6.1.0::haskell  USE="doc hoogle hscolour lukko test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/haskell-src-meta-0.8.7:0/0.8.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/generic-lens-2.2.1.0:0/2.2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/postgresql-simple-0.6.4-r1:0/0.6.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/tasty-hspec-1.2:0/1.2::haskell  USE="doc hoogle hscolour -profile" 7 KiB
+[ebuild   R   ~] dev-haskell/pretty-simple-4.1.1.0:0/4.1.1.0::haskell  USE="doc examples executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/quickcheck-classes-0.6.5.0:0/0.6.5.0::haskell  USE="aeson binary-laws doc hoogle hscolour semigroupoids semirings test* unary-laws vector -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/doctemplates-0.10:0/0.10::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/httpd-shed-0.4.1.1-r1:0/0.4.1.1::haskell  USE="doc hoogle hscolour -buildexamples -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/io-streams-haproxy-1.0.1.0-r2:0/1.0.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hi-file-parser-0.1.2.0:0/0.1.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/rebase-1.15.0.3:0/1.15.0.3::haskell  USE="doc hoogle hscolour -profile" 21 KiB
+[ebuild  N    ~] dev-haskell/turtle-1.5.24:0/1.5.24::haskell  USE="doc hoogle hscolour test -profile" 57 KiB
+[ebuild  N    ~] dev-haskell/hspec-contrib-0.5.1:0/0.5.1::haskell  USE="doc hoogle hscolour -profile" 3 KiB
+[ebuild  N    ~] dev-haskell/microlens-aeson-2.3.1:0/2.3.1::haskell  USE="doc hoogle hscolour test -profile" 430 KiB
+[ebuild  N    ~] dev-haskell/trifecta-2.1.2:0/2.1.2::haskell  USE="doc hoogle hscolour test -profile" 59 KiB
+[ebuild  N    ~] dev-haskell/htf-0.14.0.6:0/0.14.0.6::haskell  USE="doc hoogle hscolour -profile" 79 KiB
+[ebuild   R   ~] dev-haskell/apply-refact-0.9.3.0:0/0.9.3.0::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/clay-0.13.3-r1:0/0.13.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/optics-0.4:0/0.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-util/shellcheck-0.8.0:0/0.8.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hsass-0.8.0:0/0.8.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/linear-1.21.8:0/1.21.8::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/yaml-0.11.8.0:0/0.11.8.0::haskell  USE="doc examples executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/http-client-tls-0.3.6.1:0/0.3.6.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/xml-conduit-1.9.1.1:0/1.9.1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/rerebase-1.15.0.3:0/1.15.0.3::haskell  USE="doc hoogle hscolour -profile" 18 KiB
+[ebuild  N    ~] dev-haskell/tasty-lua-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test -profile" 11 KiB
+[ebuild   R   ~] dev-haskell/cryptonite-conduit-0.2.2:0/0.2.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/http-4000.3.16-r1:0/4000.3.16::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/lifted-async-0.10.2:0/0.10.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/commonmark-0.2.2:0/0.2.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/genvalidity-property-1.0.0.0:0/1.0.0.0::haskell  USE="doc hoogle hscolour test -profile" 10 KiB
+[ebuild   R   ~] dev-haskell/unicode-collation-0.1.3.1:0/0.1.3.1::haskell  USE="doc executable hoogle hscolour test* -doctests -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-objectorientation-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/mod-0.1.2.2:0/0.1.2.2::haskell  USE="doc hoogle hscolour semirings test* vector -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/simple-sendfile-0.2.30:0/0.2.30::haskell  USE="allow-bsd doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/project-template-0.2.1.0:0/0.2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/tar-conduit-0.3.2-r1:0/0.3.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/authenticate-oauth-1.6.0.1-r1:0/1.6.0.1::haskell  USE="doc hoogle hscolour -profile" 10 KiB
+[ebuild  N    ~] dev-haskell/interpolate-0.2.1:0/0.2.1::haskell  USE="doc hoogle hscolour test -profile" 8 KiB
+[ebuild   R   ~] dev-haskell/hslua-aeson-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/ipynb-0.2:0/0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/texmath-0.12.4:0/0.12.4::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-classes-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/tree-diff-0.2.1.1:0/0.2.1.1::haskell  USE="doc hoogle hscolour test -profile" 26 KiB
+[ebuild   R   ~] dev-haskell/monad-dijkstra-0.1.1.3:0/0.1.1.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/aeson-casing-0.2.0.0:0/0.2.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/beam-sqlite-0.5.1.2:0/0.5.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/higgledy-0.4.1.1-r4:0/0.4.1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/singletons-base-3.0:0/3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/vinyl-0.13.3:0/0.13.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/happstack-server-7.6.1-r2:0/7.6.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/missingh-1.4.3.0-r2:0/1.4.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hedgehog-1.0.5:0/1.0.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-packaging-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/focus-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/deferred-folds-0.9.18.1:0/0.9.18.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/skylighting-core-0.12.3:0/0.12.3::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hpack-0.34.4:0/0.34.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/commonmark-extensions-0.2.3.2:0/0.2.3.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/haddock-library-1.10.0-r2:0/1.10.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hie-bios-0.9.1:0/0.9.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/js-flot-0.8.3:0/0.8.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/js-jquery-3.3.1:0/3.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/genvalidity-hspec-1.0.0.0:0/1.0.0.0::haskell  USE="doc hoogle hscolour test -profile" 12 KiB
+[ebuild  N    ~] dev-haskell/wreq-0.5.3.3:0/0.5.3.3::haskell  USE="doc hoogle hscolour test -aws -httpbin -profile" 57 KiB
+[ebuild   R   ~] dev-haskell/shelly-1.9.0:0/1.9.0::haskell  USE="doc examples hoogle hscolour test* -lifted -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/citeproc-0.6.0.1:0/0.6.0.1::haskell  USE="doc executable hoogle hscolour icu test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/html-conduit-1.3.2.1:0/1.3.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/floskell-0.10.6:0/0.10.6::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/implicit-hie-0.1.2.7:0/0.1.2.7::haskell  USE="doc executable hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   *] app-portage/hackport-9999::haskell  USE="test*" 0 KiB
+[ebuild   R   ~] dev-haskell/feed-1.3.2.1:0/1.3.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/lsp-1.4.0.0:0/1.4.0.0::haskell  USE="doc examples hoogle hscolour test* -profile" 0 KiB
+[ebuild     U ~] dev-haskell/tasty-hedgehog-1.2.0.0:0/1.2.0.0::haskell [1.1.0.0:0/1.1.0.0::haskell] USE="doc hoogle hscolour test* -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/path-0.9.2:0/0.9.2::haskell  USE="doc hoogle hscolour test* -dev -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/fsnotify-0.3.0.1:0/0.3.0.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-2.1.0:0/2.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/mustache-2.4.0:0/2.4.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/patch-0.0.5.2:0/0.0.5.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/hedgehog-fn-1.0:0/1.0::haskell  USE="doc hoogle hscolour -build-examples -profile" 7 KiB
+[ebuild   R   ~] dev-haskell/hslua-module-path-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-module-system-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-module-text-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hslua-module-version-1.0.2:0/1.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/primitive-extras-0.10.1.4:0/0.10.1.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/implicit-hie-cradle-0.5.0.0:0/0.5.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/retry-0.9.0.0:0/0.9.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/path-io-1.6.3:0/1.6.3::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/uri-bytestring-0.3.3.1:0/0.3.3.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/bsb-http-chunked-0.0.0.4:0/0.0.0.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/linear-base-0.1.0:0/0.1.0::haskell  USE="doc hoogle hscolour test -profile" 130 KiB
+[ebuild   R   ~] dev-haskell/pandoc-lua-marshal-0.1.6:0/0.1.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/stm-hamt-1.2.0.7:0/1.2.0.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/ghcid-0.8.7:0/0.8.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/nonempty-containers-0.3.4.4:0/0.3.4.4::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/auto-update-0.1.6:0/0.1.6::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/http-download-0.2.0.0:0/0.2.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/stm-containers-1.2:0/1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/reflex-vty-0.2.0.0-r1:0/0.2.0.0::haskell  USE="doc examples hoogle hscolour test -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/one-liner-2.0:0/2.0::haskell  USE="doc hoogle hscolour test -profile" 17 KiB
+[ebuild  N    ~] dev-haskell/postgres-options-0.2.0.0:0/0.2.0.0::haskell  USE="doc hoogle hscolour test -profile" 5 KiB
+[ebuild   R   ~] dev-haskell/fast-logger-3.0.5:0/3.0.5::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-graph-1.7.0.0:0/1.7.0.0::haskell  USE="doc hoogle hscolour test* -embed-files -profile -stm-stats" 0 KiB
+[ebuild  N    ~] dev-haskell/tmp-postgres-1.34.1.0-r1:0/1.34.1.0::haskell  USE="doc hoogle hscolour -profile" 33 KiB
+[ebuild   R   ~] dev-haskell/generic-data-0.9.2.0:0/0.9.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/reflex-process-0.3.1.1:0/0.3.1.1::haskell  USE="doc examples hoogle hscolour test -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-plugin-api-1.4.0.0:0/1.4.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/beam-postgres-0.5.2.1:0/0.5.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/warp-3.3.21:0/3.3.21::haskell  USE="allow-sendfilefd doc hoogle hscolour test* x509 -debug -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/persistent-2.13.2.1:0/2.13.2.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/rio-orphans-0.1.2.0:0/0.1.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-explicit-imports-plugin-1.1.0.0:0/1.1.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-floskell-plugin-1.0.1.1:0/1.0.1.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-alternate-number-format-plugin-1.1.0.0:0/1.1.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-haddock-comments-plugin-1.0.1.0-r1:0/1.0.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-module-name-plugin-1.0.2.0:0/1.0.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-qualify-imported-names-plugin-1.0.1.0-r1:0/1.0.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-rename-plugin-1.0.0.2:0/1.0.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/wai-extra-3.1.12.1:0/3.1.12.1::haskell  USE="doc examples hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/persistent-test-2.13.0.4:0/2.13.0.4::haskell  USE="doc hoogle hscolour -profile" 31 KiB
+[ebuild   R   ~] dev-haskell/hls-refine-imports-plugin-1.0.2.0:0/1.0.2.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/yesod-core-1.6.21.0:0/1.6.21.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/persistent-sqlite-2.13.0.4:0/2.13.0.4::haskell  USE="doc hoogle hscolour test* -build-sanity-exe -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/wai-app-static-3.1.7.2-r1:0/3.1.7.2::haskell  USE="doc hoogle hscolour test* -print -profile" 0 KiB
+[ebuild   R   ~] app-text/pandoc-2.17.1.1:0/2.17.1.1::haskell  USE="doc hoogle hscolour test* trypandoc -embed-data-files -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/yesod-persistent-1.6.0.7:0/1.6.0.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/wai-websockets-3.0.1.2:0/3.0.1.2::haskell  USE="doc examples hoogle hscolour -profile" 7 KiB
+[ebuild   R   ~] dev-haskell/hakyll-4.15.1.1-r1:0/4.15.1.1::haskell  USE="checkexternal doc hoogle hscolour previewserver test* usepandoc watchserver -buildwebsite -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/yesod-form-1.7.0:0/1.7.0::haskell  USE="doc hoogle hscolour network-uri test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/wai-cors-0.2.7:0/0.2.7::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/yesod-test-1.6.14:0/1.6.14::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/yesod-static-1.6.1.0:0/1.6.1.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hls-selection-range-plugin-1.0.0.0-r1:0/1.0.0.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/hspec-megaparsec-2.2.0:0/2.2.0::haskell  USE="doc hoogle hscolour test -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/neat-interpolation-0.5.1.2:0/0.5.1.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/config-ini-0.2.4.0-r2:0/0.2.4.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/brick-0.69.1:0/0.69.1::haskell  USE="demos doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/cassava-megaparsec-2.0.2:0/2.0.2::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/stack-2.7.6_pre20220421:0/2.7.6_pre20220421::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild  N    ~] dev-haskell/megaparsec-tests-9.2.0:0/9.2.0::haskell  USE="doc hoogle hscolour test -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/parser-combinators-1.3.0:0/1.3.0::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] dev-haskell/hledger-lib-1.26.1:0/1.26.1::haskell  USE="doc hoogle hscolour test* -profile" 0 KiB
+[ebuild   R   ~] app-office/hledger-1.26.1:0/1.26.1::haskell  USE="doc hoogle hscolour terminfo test* threaded -profile" 0 KiB
+[ebuild  N    ~] app-office/hledger-iadd-1.3.17:0/1.3.17::haskell  USE="doc hoogle hscolour test -profile" 68 KiB
+[ebuild   R   ~] app-office/hledger-web-1.26.1:0/1.26.1::haskell  USE="doc hoogle hscolour test* threaded -library-only -profile" 0 KiB
+
+Total: 453 packages (14 upgrades, 109 new, 330 reinstalls), Size of downloads: 186,415 KiB
+
+ * IMPORTANT: 3 news items need reading for repository 'gentoo'.
+ * Use eselect news read to view new items.
+
