summaryrefslogtreecommitdiff
path: root/keyboard/ergodox_ez/keymaps/algernon
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard/ergodox_ez/keymaps/algernon')
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/COPYING674
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/Makefile4
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/README.md133
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/compiled.hex1257
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/config.h27
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/images/base-layer.pngbin0 -> 95356 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/images/emacs-layer.pngbin0 -> 114267 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/images/hun-layer.pngbin0 -> 78171 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/images/one-handed-layer.pngbin0 -> 85970 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/algernon/keymap.c932
10 files changed, 3027 insertions, 0 deletions
diff --git a/keyboard/ergodox_ez/keymaps/algernon/COPYING b/keyboard/ergodox_ez/keymaps/algernon/COPYING
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 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 General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is 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. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ 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.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ 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 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. Use with the GNU Affero General Public License.
+
+ 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 Affero 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 special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 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 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 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 General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ 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 GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/keyboard/ergodox_ez/keymaps/algernon/Makefile b/keyboard/ergodox_ez/keymaps/algernon/Makefile
new file mode 100644
index 0000000000..34e574220f
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/Makefile
@@ -0,0 +1,4 @@
+BOOTMAGIC_ENABLE=no
+COMMAND_ENABLE=no
+SLEEP_LED_ENABLE=no
+UNICODE_ENABLE=no
diff --git a/keyboard/ergodox_ez/keymaps/algernon/README.md b/keyboard/ergodox_ez/keymaps/algernon/README.md
new file mode 100644
index 0000000000..b8578e438f
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/README.md
@@ -0,0 +1,133 @@
+algernon's layout
+=======================
+
+This is an unconventional layout for the ErgoDox EZ. For more details about the
+history of the layout, see my
+[blog posts about my ErgoDox journey][blog-ergodox].
+
+ [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/
+
+Some of the things in the layout only work when one uses Spacemacs and GNOME
+under Linux. Your mileage may vary.
+
+## Base layer
+
+[![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/28f7eb305fdbff943613e1dc7aa9e82b)
+
+At its core, this is a Dvorak layout, with some minor changes (for example, `-`
+being on the left half, and on the innermost key of the bottom row on the
+right). The more interesting parts are how certain keys behave:
+
+* The keys on the number row double as function keys, when held for a bit longer
+ than an usual tap. This allows me to use the function keys without having to
+ switch layers.
+* The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they
+ are considered active for the next key press only. When double tapped, they
+ toggle on, until a third, single tap sometime later. When held, they act as
+ expected. My usual pattern is that I use these for the next keypress only, so
+ this behaviour is perfect. If I need them held, I'll just double-tap.
+* The `GUI` key is special, because when I double-tap it, it sends `GUI + w`,
+ which pops up an application selector. It also switches to a one-shot layer,
+ where the number row on the left half turns into app selector macros, for the
+ most common things I usually want to switch to. Otherwise it behaves as on a
+ normal layout.
+* The `ESC` key also doubles as a one-shot cancel key: if tapped while any of
+ the one-shot modifiers are in-flight (as in, single-tapped, and not expired
+ yet), it cancels all one-shot modifiers. Otherwise it sends the usual keycode.
+* The **Emacs** and **Hun** layer keys are one-shot, the **1Hand** is a toggle.
+* The **Lead** key allows me to type in a sequence of keys, and trigger some
+ actions:
+ - `LEAD u` enters unicode input mode, by sending the GTK+ key sequence that
+ does this.
+ - `LEAD l` uses the unicode input method to enter a `λ`.
+ - `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯`
+ - `LEAD w m` maximises the currently focused window.
+
+## Hungarian layer
+
+[![Hungarian layer](images/hun-layer.png)](http://www.keyboard-layout-editor.com/#/gists/b160f6ec90d58c127c114c89f66e9dc9)
+
+On this layer, the accented characters are at the same position as their base
+variant. For some, which can have other diatribes, the long one is on top,
+short's on bottom. Tapping any of the accented characters takes us back to the
+base layer.
+
+## Emacs layer
+
+[![Emacs layer](images/emacs-layer.png)](http://www.keyboard-layout-editor.com/#/gists/c59c453f9fe1a3238ba1494e7e5c6892)
+
+This layer is primarily for navigating text - and for some mousing and other
+things, because there was space. Most of the keys should be pretty
+self-explanatory, except for a few:
+
+* There are three keys on the bottom row of the left side, that change how some
+ of the other keys - explained just below - work. The keys are for *Emacs
+ mode* (the default), *Terminal mode*, and *Traditional mode*, respectively.
+* The *Visual mode* key (the top big key on the left side) sends the `v` key in
+ *Emacs mode*, to enter Visual mode in Spacemacs. In all other modes, it is a
+ no-op.
+* The *Copy/Cut* key (the bottom big key on the left side) sends the copy
+ command on tap, the cut one when held for longer than a normal tap. The **copy
+ command** is `y` in *Emacs mode*, `Ctrl-Shift-c` in *Terminal mode*, and
+ `Ctrl-c` in *Traditional mode*. The **cut command** is `x` in *Emacs mode*,
+ `Ctrl-Shift-x` in *Terminal Mode* and `Ctrl-x` in *Traditional mode*.
+* The *Paste/Delete* key (the leftmost key on the left thumb cluster) sends the
+ paste command on tap, the delete one when held longer than a normal tap. The
+ **paste command** is `p` in *Emacs mode*, `Ctrl-Shift-v` in *Terminal mode*,
+ and `Ctrl-v` in *Traditional mode*. The **delete command** is `d` in *Emacs
+ mode*, and `DEL` in the other two.
+* The `A`, `I` and `R` keys will - after sending themselves - clear the layer
+ back to the base layer. This allows a quick escape from the layer.
+
+## One-handed layer
+
+[![One-handed layer](images/one-handed-layer.png)](http://www.keyboard-layout-editor.com/#/gists/edff2495135955b8963198dace7f7ece)
+
+The one-handed layer is used in situations where the right hand is occupied, by
+mousing around, for example. Tapping the `OTHER` key switches which side is
+active. For the most part, keys remain in their usual position. When the right
+half is active, keys are mirrored to the left half.
+
+The differences are as follows:
+
+* The `ESC` key has been moved to the bottom row, so the `OTHER` key is easier
+ to tap.
+* Most keys on the thumb cluster now have dual uses, and these do not change
+ when switching sides:
+ - The `Space`/`Backspace` key sends `Space` on tap, `Backspace` when held
+ for longer than a normal tap.
+ - The `Enter`/`Shift` key sends `Enter` on short-tap, `Shift` on long-tap.
+* The `Apps`/`BASE` key can be used to go back to the base layer, by
+ long-tapping it. A short-tap will send the `App` key, as usual.
+
+# Building
+
+To make my workflow easier, this layout is maintained in
+[its own repository][algernon:ez-layout]. To build it, you will need the
+[QMK][qmk] firmware checked out, and this repo either checked out, or symlinked
+to `keyboard/ergodox_ez/algernon`. One way to achieve that is this:
+
+ [algernon:ez-layout]: https://github.com/algernon/ergodox-layout
+ [qmk]: https://github.com/jackhumbert/qmk_firmware
+
+```
+$ git clone https://github.com/jackhumbert/qmk_firmware.git
+$ cd qmk_firmware/keyboard/ergodox_ez
+$ git clone https://github.com/algernon/ergodox-layout.git keymaps/algernon
+$ make KEYMAP=algernon
+```
+
+From time to time, updates may be submitted back to the QMK repository. If you
+are reading it there, you can build the firmware like any other firmware
+included with it (assuming you are in the root directory of the firmware):
+
+```
+$ cd keyboard/ergodox_ez
+$ make KEYMAP=algernon
+```
+
+# License
+
+The layout, being a derivative of the original TMK firmware which is under the
+GPL-2+, this layout is under the GPL as well, but GPL-3+, rather than the older
+version.
diff --git a/keyboard/ergodox_ez/keymaps/algernon/compiled.hex b/keyboard/ergodox_ez/keymaps/algernon/compiled.hex
new file mode 100644
index 0000000000..6146c48fd8
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/compiled.hex
@@ -0,0 +1,1257 @@
+:100000000C941C040C9460040C9460040C94600424
+:100010000C9460040C9460040C9460040C946004D0
+:100020000C9460040C9460040C94DC130C94AE14D7
+:100030000C9461220C9460040C9460040C94600491
+:100040000C9460040C9460040C9460040C946004A0
+:100050000C9460040C94C9220C9460040C94600409
+:100060000C9460040C9460040C9460040C94600480
+:100070000C9460040C9460040C9460040C94600470
+:100080000C9460040C9460040C9460040C94600460
+:100090000C9460040C9460040C9460040C94600450
+:1000A0000C9460040C9460040C9460046E08AA071D
+:1000B000B807BF07C907ED072708F807D807DF0704
+:1000C000E5075C0862086808850788078D079007C0
+:1000D0009307960799079E07A107A508AC08B308E0
+:1000E000BA08C108C808C808C808C808C808C808A5
+:1000F000C808C808C808C808C808E308FA08CC082F
+:100100001D092F0973071B153D152B163D152B16C1
+:100110008215A5152B16FA150D1683188318AF181E
+:10012000AF18F21812196D1A6D1A1D196D1ACA1925
+:10013000CA195E1A6D1A6D1A671AD719D719D71905
+:10014000D719D719D719D719D719D719D719D7192F
+:10015000D719D719D719D719D719E819F519FC19CB
+:10016000031A0D1A0128022800012C022C00012A72
+:10017000022A00016502650001150215010B020B40
+:10018000011C021C01170217010B020B01100210C7
+:100190000105020501120212011B021B012802289F
+:1001A0000001060206010B020B01150215011202E5
+:1001B000120110021001280228000117021701087D
+:1001C0000208011502150110021001280228000181
+:1001D00008020801100210010402040106020601CF
+:1001E0001602160128022800011602160106020650
+:1001F000011802180107020701060206010F020F8B
+:100200000112021201180218010702070128022830
+:100210000001040204000115021500010C020C008B
+:1002200001E40119021902E40001E401E5011902E7
+:100230001902E502E400011302130002E501300295
+:10024000300113021301E500014C024C00010702CA
+:10025000070001E40106020602E40001E401E501F1
+:1002600006020602E502E400011C021C0001E40192
+:100270001B021B02E40001E401E5011B021B02E575
+:1002800002E400011B021B00011902190000810495
+:100290008900C800220024002135002B002D00AE6B
+:1002A000004A0000001C303400040033004D002CD4
+:1002B000301D30360012001400510003201E30376C
+:1002C0000008000D0052002A001F30130018000E15
+:1002D000003302052020301C000C001B000000042D
+:1002E0002065002F0000002602000002206500307B
+:1002F0000000002702000003552130090007000517
+:100300000000002A3022300A000B0010002D0014DB
+:10031000502330060017001A0050002C002430151E
+:1003200000110019004F00280025300F0016001D95
+:10033000004B000120263038003100AD004E000097
+:10034000000100010001000100010000001B30015C
+:10035000000100010001000100173001000100014F
+:10036000000100010018300100010001000100013E
+:10037000001930010001000100010001001A3001E4
+:100380000001000100000001000100010000000167
+:100390000000000100010001000000010000000158
+:1003A0000000000100010001000000010000000148
+:1003B0000001000100010001000000010001000136
+:1003C0000001000100000001000100010001000126
+:1003D0000000000100010001000100010001000116
+:1003E0000001000100010000000000000000000109
+:1003F0000001000000000000000E300000010001BC
+:1004000000000015300F3013300100010000000023
+:1004100000103000000100010000001630113014FF
+:100420003000000100000000001230000000000158
+:1004300000010000000000000000000100010000B9
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000010001000000008A
+:10047000000000000001000100000000000000007A
+:10048000000100002000000000000000000100004A
+:1004900000FD00FE00FF00AE00083000001C300030
+:1004A000000D300000093001001D304A0050004DA1
+:1004B000000A3001001E30520051005100000006B9
+:1004C000301F304B004F004E000000010020300074
+:1004D000000B301B00000001000F08053000000772
+:1004E00030000001000F08F9000000FA00000001D0
+:1004F0000021302102070000000000F60022300138
+:1005000030F2000330A900AC002330F000F1001AF3
+:1005100000AA00F50024300230F3000430A800F4F3
+:100520000025300C30000000000000AB00263046F3
+:10053000000000AD000000000035002B002D00AED3
+:10054000004A0000001C303400040033004D002B32
+:10055000301D30360012001400510028301E303794
+:100560000008000D00520027301F30130018000E45
+:10057000002C30010020301C000C001B000000018A
+:100580000029302F000000260200000100000000BA
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E00000263038003100AD004E00000025300FED
+:1005F0000016001D004B002A302430150011001990
+:10060000004F0028302330060017001A0050002742
+:100610003022300A000B0010002C3001002130097C
+:10062000000700050000000100293030000000270D
+:1006300002000001000000000000000000000000B7
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:100680000000000000000000001603450072006733
+:10069000006F0044006F007800200045005A000001
+:1006A0000016034500720067006F0044006F007879
+:1006B00000200045005A0000000403090409026DEF
+:1006C00000040100A0FA090400000103010100096F
+:1006D0002111010001223F000705810308000A09DA
+:1006E0000401000103010200092111010001224D52
+:1006F000000705820308000A090402000103000044
+:1007000000092111010001223600070583030800BA
+:100710000A0904030001030000000921110100017E
+:1007200022390007058403100001120110010000A6
+:100730000008EDFE07130100010200010501090692
+:10074000A101050719E029E71500250195087501A4
+:100750008102050819012905950575019102950188
+:100760007503910105071900297715002501957872
+:1007700075018102C005010980A1018502160100F1
+:1007800026B7001A01002AB700751095018100C034
+:10079000050C0901A1018503160100269C021A011E
+:1007A000002A9C02751095018100C005010902A173
+:1007B000010901A100050919012905150025019567
+:1007C0000575018102950175038101050109300953
+:1007D000311581257F950275088106093815812517
+:1007E0007F950175088106050C0A38021581257F61
+:1007F000950175088106C0C005010906A10105071C
+:1008000019E029E715002501950875018102950178
+:1008100075088101050819012905950575019102E1
+:100820009501750391010507190029FF150025FFA2
+:10083000950675088100C00011241FBECFEFDAE0D5
+:10084000DEBFCDBF04B603FE24C080914402909168
+:100850004502A0914602B09147028730904BA740D5
+:10086000B04BB9F410924402109245021092460225
+:100870001092470214BE84B7877F84BF88E10FB609
+:10088000F89480936000109260000FBEE0E0FFE3F8
+:10089000099511E0A0E0B1E0EAE2FEE402C00590B3
+:1008A0000D92A035B107D9F712E0A0E5B1E001C083
+:1008B0001D92A434B107E1F70E9422110C94132772
+:1008C0000C9400001092B9008AE08093B80008955B
+:1008D00094EA9093BC009091BC0097FFFCCF90915C
+:1008E000B900987F983021F0903111F081E008959F
+:1008F0008093BB0084E88093BC008091BC0087FF9C
+:10090000FCCF8091B900887F883111F0803471F775
+:1009100080E0089584E98093BC008091BC0084FD50
+:10092000FCCF08958093BB0084E88093BC00809145
+:10093000BC0087FFFCCF9091B900987F81E098328E
+:1009400009F480E0089584E88093BC008091BC00A5
+:1009500087FFFCCF8091BB00089580910101811138
+:1009600015C080E40E9468048093010181110CC0CD
+:1009700082E10E94920480930101811105C08FEFF2
+:100980000E949204809301010E948A0484B1807FB6
+:1009900084B985B1807F85B98AB1837F8AB98BB1EB
+:1009A000837F8BB93E98469808950E94680680938D
+:1009B00001010E94AD0480B38C7080BB81B3836F52
+:1009C00081BBA1E5B1E0EFE5F1E08EE08E0F119281
+:1009D0001D928E13FCCF0C945206BF92CF92DF92E1
+:1009E000EF92FF920F931F93CF93DF9380910101BA
+:1009F000882379F0809150018F5F8093500181119D
+:100A000008C00E94680680930101811102C00E9403
+:100A1000FA0501E511E0C0E0D0E0DD24D39482E0E6
+:100A2000C82EEE24E394F12CC730D10500F5809157
+:100A30000101811164C080E40E9468048093010177
+:100A4000811112C082E10E94920480930101811100
+:100A50000BC0C7010C2E01C0880F0A94EAF78095DD
+:100A60000E949204809301010E948A0448C0CA3007
+:100A7000A1F028F4C83059F0C93061F005C0CC307D
+:100A800089F070F0CD3089F0209A289810C0219A12
+:100A900029980DC0229A2A980AC0239A2B9807C039
+:100AA000529A01C0539A5B9802C03E9A469890EAC7
+:100AB0009A95F1F79FB1799902C082E001C080E078
+:100AC00091709D25982B7C9902C084E001C080E044
+:100AD000892B7D9902C038E001C030E0832B7E99DC
+:100AE00002C020E101C020E0822B9FB19095991FA8
+:100AF0009927991F9295990F907E892B0FC080910D
+:100B00000101811149C080E40E94680480930101C1
+:100B1000882379F1B12C0E948A048B2DF8019081F1
+:100B2000981719F08083C09200010E94AD042196AD
+:100B30000F5F1F4FCE30D10509F076CF80910001B5
+:100B4000882361F1815080930001882339F08FE977
+:100B50009FE00197F1F700C0000020C0AFE5B1E0D1
+:100B6000E1E5F1E0CF01825F91919D938E13FCCF7F
+:100B700015C083E10E949204809301018111CACFC4
+:100B800081E40E946804809301018111C3CF0E9417
+:100B9000A304B82EB094BFCF80E0C0CF0E94F80568
+:100BA00081E0DF91CF911F910F91FF90EF90DF9047
+:100BB000CF90BF900895E82FF0E0E15AFE4F80817A
+:100BC000089508950F931F93CF93DF93CFE5D1E05E
+:100BD00010E00C2F025F899190E00E94C621180F4F
+:100BE0000C13F9CF812FDF91CF911F910F910895B1
+:100BF0000C94AF0956985E9825982D9826982E98B3
+:100C000027982F988FEF90E0909389008093880029
+:100C100090938B0080938A0090938D0080938C003A
+:100C2000259A2D9A2FEF80E792E021508040904046
+:100C3000E1F700C00000269A2E9A2FEF80E792E09D
+:100C4000215080409040E1F700C00000279A2F9A81
+:100C50002FEF80E792E0215080409040E1F700C004
+:100C6000000025982D982FEF80E792E021508040DA
+:100C70009040E1F700C0000026982E982FEF80E703
+:100C800092E0215080409040E1F700C0000027989A
+:100C90002F9856985E9825982D9826982E982798E4
+:100CA0002F98089589EA8093800089E080938100DD
+:100CB00024982C983F988AB18F748AB96E98479A75
+:100CC0008BB1806B8BB9769A0E94FA050C945E0901
+:100CD00080E28093010180916D0181110EC00E941C
+:100CE000620481E080936D012FEF83ED90E321504A
+:100CF00080409040E1F700C0000080E40E9468045A
+:100D00008093010181112EC00E9492048093010101
+:100D1000811128C00E94920480930101811122C098
+:100D20008FE30E9492048093010181111BC00E94F5
+:100D30008A0480E40E94680480930101811112C03A
+:100D40008CE00E9492048093010181110BC00E94EB
+:100D5000920480930101811105C08FE30E949204E7
+:100D6000809301010E948A04809101010895FF92FD
+:100D70000F931F93CF93DF93EB01F42EFC0182813D
+:100D8000882309F458C082E00E94301FE0910E01D0
+:100D9000F0910F01808181FF05C081EE0E9414183F
+:100DA00011E001C010E00E947C2181FF0AC00E9476
+:100DB0002220811106C081EE0E94141810E001E08B
+:100DC00001C0012F0E94752186EE0E94801786EED9
+:100DD0000E941418C433F2E0DF0719F485EE0E9474
+:100DE00080178C2F0E9480178C2F0E9414180023CC
+:100DF00041F0C43382E0D80759F085EE0E94801795
+:100E000007C0C433E2E0DE0719F485EE0E9414182F
+:100E10008F2D0E9480178F2D0E941418011103C07E
+:100E2000C433D24019F485EE0E941418112319F02E
+:100E300081EE0E94801780E090E0DF91CF911F91BA
+:100E40000F91FF9008950F931F93CF93DF931F92FD
+:100E5000CDB7DEB724EE260FFC018281022F10E011
+:100E6000882381F00E9493229801220F331F225E73
+:100E70003D4FF901918380830F90DF91CF911F91B6
+:100E80000F910895C801880F991F825E9D4FFC0144
+:100E90008081918169830E949F226981893C9105AB
+:100EA00010F0625E05C0663211F06E5F01C06EE246
+:100EB000862F69830E9480176981862F0F90DF91AA
+:100EC000CF911F910F910C941418CF93DF93EC01E5
+:100ED000462F50E04D32510508F0EBC1FA01EA5AB5
+:100EE000FF4F0C94C3268A81882369F00E947C21DD
+:100EF000882339F00E942220811103C00E947521AD
+:100F0000D8C189E297C189E291C144E050E002C0B2
+:100F100042E150E064E370E018C048E050E0FACFEE
+:100F200048E150E0F7CF4CE050E0F4CF42E150E030
+:100F300002C048E150E064E372E007C042E150E0E3
+:100F400002C048E150E06EE270E0CE01DF91CF9147
+:100F50000C94B7068A81882311F080EF14C080EFCB
+:100F60000E944B2482EF0E944B240E94D024A1C1F6
+:100F70008A81882311F080EF10C080EF15C08A812C
+:100F8000882329F081EF0E94E32382EF09C081EFDB
+:100F9000E7CF8A81882339F081EF0E94E32383EF32
+:100FA0000E94E323E2CF81EF0E944B2483EFDBCF4B
+:100FB0008A81882309F47DC110926E017AC18A81E9
+:100FC000882309F476C181E005C08A81882309F469
+:100FD00070C182E080936E016CC180916E018111BD
+:100FE00068C18A81882309F464C188E892E063C1FA
+:100FF0008A81882339F00E94932290937E01809306
+:101000007D0157C180917D0190917E010E949F22B8
+:1010100020916E01893C910568F0213041F008F47F
+:1010200030C1223009F045C18DE692E044C186E727
+:1010300092E041C1213041F008F426C1223009F08C
+:1010400038C182E592E037C18BE592E034C18A81F4
+:10105000882339F00E9493229093800180937F012E
+:1010600028C180917F01909180010E949F22209150
+:101070006E01893C910548F0222309F408C1233010
+:1010800008F017C188E492E016C1213009F402C1CA
+:1010900030F0223009F00DC180E292E00CC1E09105
+:1010A0000E01F0910F01808185FFF7C085EE0E944F
+:1010B00014188BE392E0FFC08A818111F1C00E9475
+:1010C000F01EF7C08A818823D1F386E192E0F3C055
+:1010D0008A818823A1F381E192E0EDC08A8188238F
+:1010E00009F183EE0E9480178D81982F907F91F0F7
+:1010F00080FD10C082958F7090E0029774F08AE1B5
+:101100000E94801781E00E940F1F63E081E00E942F
+:101110007A2003C08D818F708D8310927C01109294
+:101120007B01C7C08D8182958F7090E0029734F06B
+:101130008AE10E94141881E00E9491200E9493226B
+:1011400090937C0180937B01B4C08A81882309F449
+:10115000B0C088EE91E0AFC08A81882309F4A9C0AD
+:101160008FEC91E0A8C08A81882309F4A2C08AEBA1
+:1011700091E0A1C08A81882309F49BC081EA91E0B3
+:101180009AC08A81882309F494C088E791E093C0CB
+:10119000CE010E9423078DC08A81882339F00E94E6
+:1011A000932290937A018093790183C08091790191
+:1011B00090917A010E949F22893C910508F07FCF8F
+:1011C00083E791E078C08A81882339F00E949322D6
+:1011D00090937801809377016CC080917701909112
+:1011E00078010E949F22893C910508F05CC089E645
+:1011F00091E061C08A81882339F00E949322909304
+:1012000076018093750155C08091750190917601AA
+:101210000E949F22893C910508F448C0E0910E018C
+:10122000F0910F01808181FF04C081EE0E941418AB
+:1012300040C081EE0E9480173CC08A818823C9F19A
+:1012400084E00E94FA1E81E0809374010E94932240
+:101250009093730180937201259A2D9A2AC08A81F6
+:10126000882339F185E00E94FA1E81E080937101A4
+:101270000E9493229093700180936F01279A2F9A76
+:1012800018C083E892E017C088E692E014C08DE4AD
+:1012900092E011C089E292E00EC086E392E00BC0BA
+:1012A0008BE192E008C08EE691E005C084E691E013
+:1012B00002C080E090E0DF91CF9108958FE090E050
+:1012C000909389008093880090938B0080938A008C
+:1012D00090938D0080938C00569A5E9A259A2D9A51
+:1012E000269A2E9A279A2F9A2FEF83ED90E321507A
+:1012F00080409040E1F700C0000056985E98259825
+:101300002D9826982E9827982F98089584EE0E945D
+:10131000801785EE0E94801788E10E94801788E17F
+:101320000E94141885EE0E94141884EE0C94141870
+:101330000F931F93CF93DF93EC018E0188819981E6
+:10134000009741F00E9480172296F80180810E9448
+:101350001418F3CFDF91CF911F910F9108951F9330
+:10136000CF93DF93CDB7DEB76A970FB6F894DEBFA1
+:101370000FBECDBF6091EC017091ED018091EE0147
+:101380009091EF010E94D221182F80917B019091C2
+:101390007C01009741F00E949F22893C910518F042
+:1013A00083EE0E941418143049F410927101123027
+:1013B00051F4269A2E9A279A2F9A0BC010927401F4
+:1013C000153099F706C0133021F4259A2D9A269AE4
+:1013D0002E9A8CEF810F823008F050C0269A2E9AF8
+:1013E00080917401882319F18091720190917301A9
+:1013F0000E949F22853F914048F0E0910E01F091BC
+:101400000F01808181FD02C025982D988091720185
+:10141000909173010E949F22893E934040F0259A4B
+:101420002D9A0E9493229093730180937201809170
+:101430007101882319F180916F01909170010E94D0
+:101440009F22853F914048F0E0910E01F0910F01FD
+:10145000808180FD02C027982F9880916F01909124
+:1014600070010E949F22893E934040F0279A2F9A54
+:101470000E9493229093700180936F01E0910E017E
+:10148000F0910F01808181FF09C08FEF90E0909370
+:10149000890080938800259A2D9A14C00E947C218F
+:1014A00081FF04C00E942220882379F38FE090E01E
+:1014B00090938900809388008DEF810F823010F027
+:1014C00025982D98E0910E01F0910F01808182FF07
+:1014D00009C08FEF90E090938B0080938A00269A4A
+:1014E0002E9A14C00E947C2182FF04C00E942220F8
+:1014F000882379F38FE090E090938B0080938A00AB
+:101500008EEF810F843010F026982E98E0910E0116
+:10151000F0910F01808180FF09C08FEF90E09093E0
+:101520008D0080938C00279A2F9A14C00E947C21F2
+:1015300080FF04C00E942220882379F38FE090E08E
+:1015400090938D0080938C00153021F0123011F0B3
+:1015500027982F9880918C01882309F410C18091DD
+:101560008A0190918B010E949F22893E934008F44A
+:1015700006C110928C010E94D00B80918401909141
+:101580008501489771F48091860190918701892B9C
+:1015900041F48091880190918901892B11F40E9476
+:1015A000860980918401909185010F97D9F48091EB
+:1015B000860190918701892BA9F4809188019091EF
+:1015C0008901892B79F40E9486098CE0E5E1F1E03C
+:1015D000DE01119601900D928A95E1F7CE010196F8
+:1015E0000E9498098091840190918501469709F0A5
+:1015F00086C08091860190918701892B09F07FC078
+:101600008091880190918901892B09F078C00E940E
+:10161000860984E00E94801784E00E94141889E003
+:101620000E94801789E00E9414188CE20E948017A3
+:101630008CE20E94141881E30E94801781E30E94CB
+:10164000141885EE0E9480178DE20E9480178DE2AB
+:101650000E94141886E20E94801786E20E941418E5
+:1016600085EE0E9414180E94860980E20E9480176D
+:1016700080E20E94141887E20E94801787E20E948D
+:10168000141886E00E94801786E00E94141881E2F8
+:101690000E94801781E20E9414188CE20E94801739
+:1016A0008CE20E94141885EE0E94801787E20E9447
+:1016B000801787E20E9414188DE20E9480178DE245
+:1016C0000E94141885EE0E94141888E30E94801767
+:1016D00088E30E9414180E94860984E00E94801703
+:1016E00084E00E94141889E00E94801789E00E941B
+:1016F00014188CE20E9480178CE20E9414188091CA
+:101700008401909185014A97D1F58091860190914D
+:1017100087014097A1F58091880190918901892BDB
+:1017200071F582EE0E9480178BE30E9480178BE395
+:101730000E94141882EE0E9414188FEF93ED20E39C
+:10174000815090402040E1F700C000008AE1E1E2D2
+:10175000F1E0DE01119601900D928A95E1F7CE013C
+:1017600001960E94980983EE0E94801782E50E94EC
+:10177000801782E50E94141883EE0E9414186A965E
+:101780000FB6F894DEBF0FBECDBFDF91CF911F9192
+:10179000089581E0089581E008950C94CB0B08959D
+:1017A00008950F931F93CF93DF938C01FC01C081A9
+:1017B000D181CE010E94CB1FBE010E94760CEC01AC
+:1017C000B8010E94CD0B882309F489C0F8018281F9
+:1017D000882309F446C080918C0181111FC0C43157
+:1017E000F0E5DF0709F04DC00E94CF0B81E0809348
+:1017F0008C010E94932290938B0180938A01109216
+:101800008301109285011092840110928701109239
+:101810008601109289011092880161C080918A012D
+:1018200090918B010E949F22883E934070F480919A
+:101830008301E82FF0E0EE0FFF1FEC57FE4FD1833E
+:10184000C0838F5F809383014AC0C43880E5D80786
+:10185000B9F5F8018281882341F01092810182E07C
+:101860001EC0C43880E5D80759F5809181018111E7
+:1018700006C086E20E94801786E20E94141882E069
+:101880001CC0C438F0E5DF0741F3C538D045D9F4B2
+:10189000F8018281882331F01092820180E20E9457
+:1018A0003C181DC080918201811106C087E20E9410
+:1018B000801787E20E94141880E20E9443180FC02C
+:1018C000C538D04529F381E080938101809382015E
+:1018D000C801DF91CF911F910F910C94C90B80E04B
+:1018E000DF91CF911F910F910895089596E0799F10
+:1018F000F001112494E5899FE00DF11D1124E60FFC
+:10190000F11DEE0FFF1FE756FD4F8591949108954D
+:10191000880F991FFC01E35FFE4F85919491089514
+:10192000880F991FFC01E357FD4F8591949108950D
+:101930000F931F93CF93DF93EC01811520E3920760
+:1019400050F5C11580E2D80708F0C3C0CB3BD105E4
+:1019500090F4C83AD10508F06AC0C53AD10508F03C
+:101960005BC0C430D10508F0D0C1219709F0CAC1CD
+:1019700001E010E00AC2CF3FD10511F008F0C5C167
+:10198000C03FD10508F0A2C0CE01805E9109089742
+:1019900008F4BBC1B7C1C13090E5D90709F4A2C0B2
+:1019A00020F5C0318FE4D80770F4C11590E4D90751
+:1019B00008F094C0C11521E3D20708F0A3C1DD27C8
+:1019C0008E01106CE2C1C115D04509F09BC10E9487
+:1019D000D21A8FEF94E32CE0815090402040E1F741
+:1019E00000C000000E94EE22D0C1C11597E5D907C2
+:1019F00058F4C03121E5D20708F01CC1C43180E59C
+:101A0000D80708F475C07EC1CE019057811590416A
+:101A100008F078C1DF7073C1C53AD10509F477C108
+:101A2000C63AD10509F076C102E810E4AEC1C83A61
+:101A3000D10509F472C1C93AD10509F471C1CA3A94
+:101A4000D10509F470C1CB3AD10509F46FC1CC3A84
+:101A5000D10509F46EC1CD3AD10509F46DC1C03B81
+:101A6000D10509F46CC1CE3AD10509F46BC1CF3A66
+:101A7000D10509F46AC1C13BD10509F469C1C23B72
+:101A8000D10509F468C1C33BD10509F467C1C43B62
+:101A9000D10509F466C1C53BD10509F465C1C63B52
+:101AA000D10509F464C1C73BD10509F463C1C83B42
+:101AB000D10509F462C1C93BD10509F461C1CA3B32
+:101AC000D10509F460C100E014E45FC18E01106526
+:101AD0005CC1CE019F700E94900C58C1DF708E01D6
+:101AE000106A53C180910E02816080930E024DC135
+:101AF0000E944523811102C00E942B230E9458237B
+:101B000090E09093440280934302C23080E5D8076E
+:101B100021F480914302816086C0C43090E5D907EA
+:101B200021F48091430282607EC0C63020E5D20756
+:101B300021F480914302846076C0C83080E5D807E4
+:101B400019F48091430227C0CA3090E5D90721F4E7
+:101B500080914302806167C0CC3020E5D20721F438
+:101B60008091430280625FC0CE3080E5D80721F4C7
+:101B700080914302806457C0C03190E5D90721F4B9
+:101B80008091430280684FC0C23120E5D20729F41A
+:101B9000809143028460886046C0C33080E5D807E6
+:101BA00021F4809143028E7F3EC0C53090E5D90775
+:101BB00021F4809143028D7F36C0C73020E5D207E3
+:101BC00021F4809143028B7F2EC0C93080E5D80775
+:101BD00019F48091430226C0CB3090E5D90721F457
+:101BE000809143028F7E1FC0CD3020E5D20721F4C3
+:101BF000809143028F7D17C0CF3080E5D80721F454
+:101C0000809143028F7B0FC0C13190E5D90721F449
+:101C1000809143028F7707C0C331D04531F4809162
+:101C200043028B7F877F80934302809143020E940F
+:101C30005C23ABC08D2F99278F7099278130910538
+:101C4000D9F49E012370332702C0880F991F2A956B
+:101C5000E2F79C688E0144E0000F111F4A95E1F7FE
+:101C600000271370802B912B53E0CC0FDD1F5A956A
+:101C7000E1F7C076DD272FC08230910531F4DC2FEB
+:101C8000CC278E01016F106A80C08330910569F402
+:101C9000CE018370992701E010E002C0000F111FF0
+:101CA0008A95E2F7C8019C680FC084309105B9F4A9
+:101CB000CE018370992701E010E002C0000F111FD0
+:101CC0008A95E2F7C8019A6823E0CC0FDD1F2A95B8
+:101CD000E1F7C07ED7708C010C2B1D2B56C08530D0
+:101CE000910531F4DC2FCC278E01046F106A4DC0B2
+:101CF000069709F04AC0CF71DD27DC2FCC278E0173
+:101D0000106243C000E010E040C08E013EC001E818
+:101D100010E43BC003E810E438C002EE14E435C020
+:101D200009EE14E432C00AEE14E42FC005EB14E40B
+:101D30002CC006EB14E429C007EB14E426C00CEC1D
+:101D400014E423C00DEC14E420C003E815E41DC026
+:101D50000AE815E41AC002E915E417C004E915E41D
+:101D600014C001E216E411C003E216E40EC004E25E
+:101D700016E40BC005E216E408C006E216E405C04E
+:101D800007E216E402C00AE216E4C801DF91CF912F
+:101D90001F910F91089596E0799FF001112494E529
+:101DA000899FE00DF11D1124E60FF11DEE0FFF1FBD
+:101DB000E756FD4F85919491803E9105E0F4803C7B
+:101DC000910558F58133910509F46FC048F48932C3
+:101DD000910509F463C08A32910509F46DC072C09F
+:101DE00089339105E9F082389105D1F08533910569
+:101DF00009F44DC067C0833E910581F138F4803EFF
+:101E00009105B9F0823E9105D9F05CC0863E9105FE
+:101E100061F1873E9105A1F155C00E94880C08959B
+:101E20002091430220FD02C021FF4CC080EE90E0D3
+:101E300049C08091430280FFF9CF89E390E042C01E
+:101E40008091430282FF0EC08091430284FF03C051
+:101E500080E090E037C083EE90E034C08091430290
+:101E600082FFF2CF82EE90E02DC08091430283FF8B
+:101E70000BC08091430284FDEBCF87EE90E022C03F
+:101E80008091430283FFF5CF86EE90E01BC08091E6
+:101E9000430285FF07C089E290E014C080914302AD
+:101EA00085FFF9CF85E390E00DC08091430286FF66
+:101EB00007C08AE290E006C08091430286FFF9CF16
+:101EC00081E390E00E94980C089508950C94650FAA
+:101ED00080919D010895CF93DF9300D01F92CDB7DD
+:101EE000DEB79C0180913A02843019F593E0998322
+:101EF0003B832A839093E9008FEF9091E800815013
+:101F000095FD06C095ED9A95F1F700008111F5CF8A
+:101F10008091E80085FF0DC040E050E063E070E094
+:101F2000CE0101960E94CC118091E8008E778093BB
+:101F3000E8000F900F900F90DF91CF910895CF930D
+:101F4000DF9300D01F92CDB7DEB720913A02243044
+:101F500021F522E029839B838A8383E08093E90033
+:101F60008FEF9091E800815095FD06C095ED9A9510
+:101F7000F1F700008111F5CF8091E80085FF0DC0D9
+:101F800040E050E063E070E0CE0101960E94CC1189
+:101F90008091E8008E778093E8000F900F900F906B
+:101FA000DF91CF91089520913A022430F1F422E09C
+:101FB0002093E9002FEF3091E800215035FD06C055
+:101FC00035ED3A95F1F700002111F5CF2091E800A9
+:101FD00025FF0BC040E050E065E070E00E94CC11AE
+:101FE0008091E8008E778093E8000895CF93DF9387
+:101FF000EC0190913A02943009F046C080910C01B6
+:102000008823D9F080910D018823B9F09093E900DD
+:102010008FEF9091E800815095FD06C095E19A956B
+:10202000F1F700008111F5CF8091E80085FF2CC009
+:1020300040E050E060E170E017C081E08093E9008B
+:102040008FEF9091E800815095FD06C095ED9A952F
+:10205000F1F700008111F5CF8091E80085FF14C0F1
+:1020600040E050E068E070E0CE010E94CC11809129
+:10207000E8008E778093E80080E1FE01ADE8B1E0F2
+:1020800001900D928A95E1F7DF91CF9108958091AB
+:102090003902811109C00E9461130E94BE13809110
+:1020A000E20084608093E20008951092390208955E
+:1020B000089508950C945B2242E061EC81E00E9457
+:1020C000DB1242E061EC82E00E94DB1242E061EC54
+:1020D00083E00E94DB1242E161EC84E00C94DB12AD
+:1020E00080913C02833009F455C030F4813071F0A6
+:1020F000823009F48EC008958A3009F47AC08B309A
+:1021000009F460C0893009F09CC020C080913B0276
+:10211000813A09F096C08091E800877F8093E800BB
+:1021200080913F0290914002892B21F460E18DE87B
+:1021300091E003C060E080E090E070E00E94171240
+:102140008091E8008B778093E800089580913B02AE
+:10215000813209F076C080913F0290914002009751
+:1021600019F0039709F06DC08091E800877F809394
+:10217000E8008091E80082FD05C080913A0281115B
+:10218000F8CF5FC08091F10080939D018091E800BD
+:102190008B7753C080913B02813A09F052C0809105
+:1021A0003F0290914002892B09F04BC08091E800DA
+:1021B000877F8093E8008091E80080FFFCCF8091CA
+:1021C0000C0136C080913B028132D9F580913F02EB
+:1021D00090914002892BA9F58091E800877F809338
+:1021E000E8000E94101380913D0280930C010C9432
+:1021F000D21A80913B02813221F58091E800877FDD
+:102200008093E8000E94101380913E0280939E010B
+:10221000089580913B02813AA1F48091E800877F84
+:102220008093E8008091E80080FFFCCF80919E01C0
+:102230008093F1008091E8008E778093E8000C9401
+:102240001013089584B7877F84BF88E10FB6F89490
+:1022500080936000109260000FBE90E080E80FB69F
+:10226000F89480936100909361000FBE0E94B316B2
+:102270000E9461130E94BE138091E20084608093EB
+:10228000E20078940E9444160E94B51682E091E024
+:102290000E945F1680913A02853069F40E942222E2
+:1022A000809138028823B1F30E944D22882391F354
+:1022B0000E94B611EFCF0E94BB16ECCF292F332717
+:1022C00023303105C9F064F42130310581F022302A
+:1022D000310509F043C08DE690E02DEB36E042C0B9
+:1022E00021323105F1F02232310541F137C082E16E
+:1022F00090E02AE237E036C099278130910541F01D
+:102300008230910541F0892B49F5E9EBF6E005C0F3
+:10231000E1EAF6E002C0E9E8F6E0849190E09F018E
+:1023200021C06430D8F4E62FF0E0EE0FFF1FE95B28
+:10233000FE4F2081318189E090E014C0643070F458
+:1023400070E0FB01EE0FFF1FE15CFE4F2081318149
+:10235000FB01E55CFE4F808190E004C080E090E0EE
+:1023600020E030E0FA0131832083089580E189BDC7
+:1023700082E189BD09B400FEFDCF8091D8008F7D38
+:102380008093D8008091E00082608093E00080918B
+:10239000E00081FDFCCF0895CF92DF92EF92FF9293
+:1023A0000F931F93CF93DF93EC018B016A010E947F
+:1023B0002F13811133C0C114D10439F0F60180818B
+:1023C0009181081B190BC80FD91FE12CF12C0115A5
+:1023D000110519F18091E80085FD16C08091E80093
+:1023E0008E778093E800C114D10449F0F601808112
+:1023F0009181E80EF91EF182E08285E00FC00E9413
+:102400002F13882321F30AC089918093F100015092
+:102410001109FFEFEF1AFF0ADACF80E0DF91CF91C9
+:102420001F910F91FF90EF90DF90CF900895209132
+:102430004102309142022617370748F061157105B5
+:1024400039F42091E8002E772093E80001C0B9010B
+:1024500040E061157105A9F120913A02222309F4A7
+:1024600043C0253009F442C02091E80023FD40C05C
+:102470002091E80022FD32C02091E80020FFE9CF42
+:102480004091F3002091F20030E0342BFC01CF01A9
+:102490006115710559F02830310540F48191809320
+:1024A000F100615071092F5F3F4FF1CF41E02830BB
+:1024B000310509F040E02091E8002E772093E800F4
+:1024C000C8CF4111C9CF0AC080913A02882361F078
+:1024D000853061F08091E80083FD0AC08091E800BA
+:1024E00082FFF2CF80E0089582E0089583E00895AE
+:1024F00081E008952091410230914202261737076A
+:1025000048F06115710539F42091E8002E77209389
+:10251000E80001C0B901FC0120E06115710591F1ED
+:1025200080913A02882309F440C0853009F43FC005
+:102530008091E80083FD3DC08091E80082FD2FC0BE
+:102540008091E80080FFE9CF2091F3008091F200B4
+:1025500090E0922B6115710559F08830910540F497
+:1025600024912093F1003196615071090196F2CFC8
+:1025700021E0089709F020E08091E8008E778093B1
+:10258000E800CBCF2111CCCF0AC080913A0288233A
+:1025900061F0853061F08091E80083FD0AC0809190
+:1025A000E80082FFF2CF80E0089582E0089583E0A2
+:1025B000089581E00895982F973058F59093E90099
+:1025C000981739F07091EC002091ED005091F000D7
+:1025D00003C0242F762F50E021FF19C03091EB006B
+:1025E0003E7F3093EB003091ED003D7F3093ED0066
+:1025F0003091EB0031603093EB007093EC0020934E
+:10260000ED005093F0002091EE0027FF07C09F5F80
+:10261000D3CF8F708093E90081E0089580E0089522
+:1026200080913B0287FF11C08091E80082FD05C0C8
+:1026300080913A028111F8CF11C08091E8008B7728
+:102640000BC080913A02882349F08091E80080FF16
+:10265000F8CF8091E8008E778093E800089520916C
+:10266000E4003091E50095E64091EC00842F817004
+:1026700040FF22C08091E80080FD1CC080913A029A
+:10268000882391F0853091F08091EB0085FD10C09A
+:102690004091E4005091E5004217530729F39A0155
+:1026A000915011F784E0089582E0089583E0089541
+:1026B00081E0089580E008954091E80042FFDECF78
+:1026C00008950E94CF130E94D713E0EEF0E08081BE
+:1026D00081608083E8EDF0E080818F77808319BC92
+:1026E000A7EDB0E08C918E7F8C9380818F7E80836C
+:1026F0001092390208950F931F93CF93DF930E9496
+:10270000CF130E94D713C8EDD0E088818F778883DC
+:1027100088818068888388818F7D888319BC109226
+:102720003A0210923602109238021092370200EEEE
+:1027300010E0F80180818B7F8083888181608883AD
+:1027400042E060E080E00E94DB12E1EEF0E0808198
+:102750008E7F8083E2EEF0E08081816080838081E3
+:1027600088608083F80180818E7F8083888180618A
+:102770008883DF91CF911F910F910895E8EDF0E0EC
+:1027800080818F7E8083E7EDF0E0808181608083AF
+:1027900084E082BF81E0809339020C947B13E8EDE2
+:1027A000F0E080818E7F80831092E2000895109285
+:1027B000DA001092E10008951F920F920FB60F9267
+:1027C00011242F933F934F935F936F937F938F9336
+:1027D0009F93AF93BF93EF93FF938091E10082FFAC
+:1027E0000BC08091E20082FF07C08091E1008B7FE7
+:1027F0008093E1000E9443168091DA0080FF1FC0A1
+:102800008091D80080FF1BC08091DA008E7F80937A
+:10281000DA008091D90080FF0DC080E189BD82E19E
+:1028200089BD09B400FEFDCF81E080933A020E9489
+:10283000471005C019BC10923A020E9455108091B1
+:10284000E10080FF19C08091E20080FF15C08091F7
+:10285000E2008E7F8093E2008091E20080618093AD
+:10286000E2008091D80080628093D80019BC85E096
+:1028700080933A020E9459108091E10084FF30C099
+:102880008091E20084FF2CC080E189BD82E189BD96
+:1028900009B400FEFDCF8091D8008F7D8093D800D1
+:1028A0008091E1008F7E8093E1008091E2008F7E35
+:1028B0008093E2008091E20081608093E200809149
+:1028C0003602882311F084E007C08091E30087FD81
+:1028D00002C081E001C083E080933A020E945A1056
+:1028E0008091E10083FF29C08091E20083FF25C031
+:1028F0008091E100877F8093E10082E080933A023B
+:10290000109236028091E1008E7F8093E1008091E9
+:10291000E2008E7F8093E2008091E20080618093EC
+:10292000E20042E060E080E00E94DB128091F00073
+:1029300088608093F0000E945810FF91EF91BF9142
+:10294000AF919F918F917F916F915F914F913F9147
+:102950002F910F900FBE0F901F9018951F920F92FE
+:102960000FB60F9211242F933F934F935F936F9362
+:102970007F938F939F93AF93BF93CF93DF93EF9307
+:10298000FF93C091E900CF708091EC00D82FD170F7
+:1029900080FDD0E81092E9008091F000877F80935D
+:1029A000F00078940E94F2141092E9008091F000F7
+:1029B00088608093F000CD2BCF70C093E900FF9129
+:1029C000EF91DF91CF91BF91AF919F918F917F91C7
+:1029D0006F915F914F913F912F910F900FBE0F908C
+:1029E0001F9018951F93CF93DF93CDB7DEB7AA97AB
+:1029F0000FB6F894DEBF0FBECDBFEBE3F2E088E088
+:102A00008E0F9091F10091938E13FBCF0E94701066
+:102A10008091E80083FF1FC180913B0290913C02AE
+:102A2000492F50E04A30510508F015C1FA01ED5721
+:102A3000FF4F0C94C326803881F0823809F00BC117
+:102A400080913F028F708093E9008091EB0085FBBD
+:102A5000882780F91092E90006C080913702909192
+:102A60003802911182609091E800977F9093E8007E
+:102A70008093F1001092F100C8C0282F2D7F09F03B
+:102A8000EAC0882319F0823061F0E5C080913D02F0
+:102A9000813009F0E0C0933009F080E08093380283
+:102AA0002BC080913D02811127C080913F028F7021
+:102AB00009F4D1C08093E9002091EB0020FF1CC0F5
+:102AC000933021F48091EB00806214C09091EB0070
+:102AD00090619093EB0021E030E0A90102C0440F27
+:102AE000551F8A95E2F74093EA001092EA00809120
+:102AF000EB0088608093EB001092E9008091E80081
+:102B0000877F86C08111A7C010913D021F778091F9
+:102B1000E3008078812B8093E3008091E800877F39
+:102B20008093E8000E9410138091E80080FFFCCFA2
+:102B30008091E30080688093E300111102C082E07D
+:102B400001C083E080933A0286C08058823008F04A
+:102B500082C080913D0290913E028C3D53E09507EA
+:102B600079F583E08A838AE289834FB7F894DE019E
+:102B7000139620E03EE051E2E32FF0E0509357003F
+:102B8000E49120FF03C0E295EF703F5FEF708E2F5E
+:102B900090E0EA3010F0C79601C0C0968D939D93E7
+:102BA0002F5F243149F74FBF8091E800877F8093E2
+:102BB000E8006AE270E0CE0101960E94171214C08C
+:102BC000AE014F5F5F4F60913F020E945E11BC01FA
+:102BD000009709F440C09091E800977F9093E80037
+:102BE00089819A810E947A128091E8008B77809384
+:102BF000E80031C0803879F58091E800877F8093C4
+:102C0000E800809136028093F1008091E8008E7791
+:102C10008093E8000E9410131EC081111CC0909187
+:102C20003D029230C0F48091E800877F8093E800F5
+:102C3000909336020E94101380913602811106C0D3
+:102C40008091E30087FD02C081E001C084E08093B1
+:102C50003A020E945C108091E80083FF0AC08091D4
+:102C6000E800877F8093E8008091EB00806280938A
+:102C7000EB00AA960FB6F894DEBF0FBECDBFDF9172
+:102C8000CF911F9108950895CF9380913A028823A0
+:102C9000A1F0C091E900CF709091EC00892F817074
+:102CA00090FD80E8C82B1092E9008091E80083FD38
+:102CB0000E94F214CF70C093E900CF9108959093D1
+:102CC000A4018093A3010895E091A301F091A401D0
+:102CD000309721F00190F081E02D099480E0089573
+:102CE000E091A301F091A401309721F00280F381DB
+:102CF000E02D09940895E091A301F091A40130978B
+:102D000021F00480F581E02D099408952091A1011E
+:102D10003091A2018217930771F09093A2018093E2
+:102D2000A101E091A301F091A401309721F0068068
+:102D3000F781E02D0994089520919F013091A00121
+:102D40008217930771F09093A00180939F01E09107
+:102D5000A301F091A401309721F00084F185E02DCA
+:102D60000994089508950C94B2160E948A220E9434
+:102D7000D5040C9410239F92AF92BF92CF92DF9212
+:102D8000EF92FF920F931F93CF93DF9300D000D069
+:102D900000D0CDB7DEB70E94ED040DE010E0AA240C
+:102DA000A394B12C902E802F0E94DB0598012A5508
+:102DB0003E4F6901F901F080F826A1F40150110994
+:102DC00088F78FEF89838A831B820E949322816018
+:102DD000782F9D838C8349815A816B818D810E94DC
+:102DE00052172FC090910E0291FF04C08E830E9453
+:102DF000E1058E8125E030E0A501022E01C0440FDF
+:102E00000A94EAF7E42E4F21C1F029839A828E2199
+:102E100091E009F490E09B830E9493228160782FD7
+:102E20009D838C8349815A816B818D810E945217C9
+:102E3000F6018081E826E08204C021503109E0F6E5
+:102E4000BDCF0E94DB241091A5010E9464161817C3
+:102E5000B9F00E9464168093A50126960FB6F894E7
+:102E6000DEBF0FBECDBFDF91CF911F910F91FF90BD
+:102E7000EF90DF90CF90BF90AF909F900C94660F33
+:102E800026960FB6F894DEBF0FBECDBFDF91CF916F
+:102E90001F910F91FF90EF90DF90CF90BF90AF9078
+:102EA0009F900895CF93DF93CDB7DEB72B970FB6E2
+:102EB000F894DEBF0FBECDBF4F83588769877A87EE
+:102EC0008B87DE01119686E0FD0111928A95E9F764
+:102ED00085E0FE01379601900D928A95E1F74981D0
+:102EE0005A816B817C818D819E810E94701D2B9601
+:102EF0000FB6F894DEBF0FBECDBFDF91CF9108951E
+:102F0000882309F490C09CEF980F913A18F40E941E
+:102F1000B3200DC090E2980F983058F4877091E07C
+:102F200001C0990F8A95EAF7892F0E943C210C94E1
+:102F300090219BE5980F933070F4853A29F0863AFA
+:102F400031F083E890E005C081E890E002C082E8BB
+:102F500090E00C94861698E5980F933108F063C0C2
+:102F6000883A39F1893A41F18A3A49F18B3A51F17B
+:102F70008C3A59F18D3A61F1803B69F18E3A71F1E9
+:102F80008F3A79F1813B81F1823B89F1833B91F169
+:102F9000843B99F1853BA1F1863BA9F1873BB1F1D7
+:102FA000883BB9F1893BC1F18A3BC9F180E090E0EF
+:102FB00038C082EE90E035C089EE90E032C08AEEF3
+:102FC00090E02FC085EB90E02CC086EB90E029C00C
+:102FD00087EB90E026C08CEC90E023C08DEC90E075
+:102FE00020C083E891E01DC08AE891E01AC082E920
+:102FF00091E017C084E991E014C081E292E011C031
+:1030000083E292E00EC084E292E00BC085E292E09F
+:1030100008C086E292E005C087E292E002C08AE240
+:1030200092E00C949C160895882329F19CEF980F48
+:10303000913A18F40E94F5200DC090E2980F983054
+:1030400058F4877091E001C0990F8A95EAF7892FAB
+:103050000E9442210C9490219BE5980F933020F41C
+:1030600080E090E00C948616885A833120F480E04A
+:1030700090E00C949C160895882321F00E943C2136
+:103080000C9490210895882321F00E9442210C94F1
+:10309000902108958F929F92AF92BF92DF92EF920C
+:1030A000FF920F931F93CF93DF937C01D62FC72FEF
+:1030B000FC010281158112951F700E944F20882308
+:1030C00019F082E00E94912001110E9459210E9472
+:1030D000AC20882379F0002369F080E28D0F8830DE
+:1030E00048F082E00E9491200E94AC2091E0D82E0E
+:1030F000D92601C0D12CEC2FE295EF70F0E0E35718
+:10310000FF4F0C94C3268C2F807FCF70882311F043
+:10311000C295C07F002389F0CC2309F4C4C180E2AA
+:103120008D0F883020F48C2F0E943C2103C08C2FFF
+:103130000E944C210E949021B6C18D2F0E9414182C
+:10314000CC2309F4CAC1D05E8C2FD83018F40E9469
+:10315000422102C00E9452210E949021BEC18C2FA8
+:10316000807FCF70803211F0C295C07FDD2319F0CF
+:10317000D13029F12DC0002381F0112369F11130E4
+:1031800021F48C2F0E946C21A8C1123029F50E94D5
+:1031900075218C2F0E941C201FC0112369F0113053
+:1031A00041F40E9439218C2309F497C10E941F2009
+:1031B00003C0123009F491C10E94752111C000238F
+:1031C00021F0123008F089C107C0111186C108C072
+:1031D000002321F0111167C18C2FF1C011116AC1B8
+:1031E0008C2FF3C08C2F86958695837090E0009786
+:1031F00019F0019761F071C1002321F08D2F9C2FF0
+:10320000937002C080E090E00E94861666C10023A1
+:1032100021F08D2F9C2F937002C080E090E00E94DF
+:103220009C165BC18D2F002319F00E94E32302C07E
+:103230000E944B240E94D02450C18C2F837009F02F
+:1032400050C001114AC18D2F829586958770880FD5
+:10325000880F9D2F9F70892E912CA12CB12C082EA8
+:1032600004C0880C991CAA1CBB1C0A94D2F7D4FF7A
+:1032700014C00FE010E020E030E0B901A80104C064
+:10328000440F551F661F771F8A95D2F7CB01BA01ED
+:10329000609570958095909503C060E070E0CB01DB
+:1032A000C695C695C370D0E0C230D10561F0C33079
+:1032B000D10581F0682979298A299B29219771F004
+:1032C0000E94B81E0AC1682979298A299B290E946F
+:1032D000D41E03C10E94B81EC501B4010E949C1EE9
+:1032E000FCC0002319F08C2F817001C086958823C3
+:1032F00009F4F3C08D2F829586958770880F880F0B
+:103300009D2F9F70892E912CA12CB12C082E04C0CA
+:10331000880C991CAA1CBB1C0A94D2F7D4FF14C0B9
+:103320000FE010E020E030E0B901A80104C0440F34
+:10333000551F661F771F8A95D2F7CB01BA0160959A
+:1033400070958095909503C060E070E0CB01C695C4
+:10335000C695C3704C2F50E04230510569F04330A0
+:10336000510589F0682979298A299B29413051051D
+:1033700071F00E94921FB1C0682979298A299B297E
+:103380000E94AE1FAAC00E94921FC501B4010E94F4
+:10339000761FA3C08D2F90E0FC01E05EF109E531BE
+:1033A000F10508F07BC0E356FF4F0C94C326DF7095
+:1033B0008C2F8F71002331F00E940F1F8D2F0E94E0
+:1033C0003C188BC00E94301F8D2F0E94431885C06F
+:1033D000002339F0111181C08C2F8F710E94551F6D
+:1033E0007CC0123008F079C0F7CF002339F08C2F61
+:1033F0008F710E940F1F71C00023C9F38C2F8F7132
+:103400000E94301F6AC0002329F08C2F8F710E9408
+:10341000FA1E63C00E94F01E60C00023B9F00E9433
+:1034200019200E9442210E944B20843029F40E94DE
+:103430008A208C2F8F7162C0123008F06CC0CF715F
+:103440008C2F0E940F1F63E08C2F0DC00E9419204B
+:103450000E943C211230A0F00E948A200E941F206E
+:1034600064E08C2F8F71DF91CF911F910F91FF90AE
+:10347000EF90DF90BF90AF909F908F900C947A2048
+:1034800081E0DF91CF911F910F91FF90EF90DF903E
+:10349000BF90AF909F908F900C949120002339F0B3
+:1034A000112309F4A4CF8D2F0E94801716C0112379
+:1034B00009F4A4CF8D2F0E9414180FC04C2F4F7009
+:1034C0006D2FC7010E9465070E94141E06C04C2F75
+:1034D0004F706D2FC7010E94750CDD20E1F00E9436
+:1034E0004B2080FD18C0F70112820E9445200E94E7
+:1034F0000F1FC7010E94971A0E944520DF91CF91AC
+:103500001F910F91FF90EF90DF90BF90AF909F9031
+:103510008F900C94301FDF91CF911F910F91FF90EE
+:10352000EF90DF90BF90AF909F908F9008950F9392
+:103530001F93CF93DF93EC01888199812B813C818C
+:10354000232BB9F09F3F11F48F3F99F0CE010E94D9
+:10355000D10B882371F0688179818A810E941520BE
+:103560008C010E94CA1F0E94911EB801CE010E94C8
+:103570004A18DF91CF911F910F9108950E94592110
+:103580000E9469210E942B210E9490210E94812586
+:103590000E94D02480E090E00E94861680E090E0B7
+:1035A0000C949C160E9449210C94BE1A0E940A2079
+:1035B000292F22952F7030E02C3031054CF42A3021
+:1035C00031056CF42250310922303105A8F407C0CE
+:1035D0002C30310569F02F30310551F00DC0803F9E
+:1035E00069F018F4803E40F409C0843F29F406C015
+:1035F00093FB882780F9089580E0089581E008957D
+:10360000CF93DF9300D000D01F92CDB7DEB70F90DD
+:103610000F900F900F900F90DF91CF910895CF935F
+:10362000DF9300D000D000D0CDB7DEB726960FB61E
+:10363000F894DEBF0FBECDBFDF91CF9108951F93E9
+:10364000CF93DF93C091B40116E08091B501C81704
+:1036500099F0D0E01C9FF0011D9FF00D1124EA5459
+:10366000FE4F4081518162817381848195810E94E6
+:103670000F1B2196C770E9CFDF91CF911F9108955D
+:103680004091E6015091E7016091E8017091E901F4
+:103690008091EA019091EB010C940F1B8091EB015A
+:1036A00082958F7009F054C08091E801882309F455
+:1036B0004FC08091B401A091B5016091E601709175
+:1036C000E7014091E9015091EA01B6E08A1709F457
+:1036D0003FC090E041155105C1F17F3F11F46F3FAC
+:1036E000A1F1B89FF001B99FF00D1124EA54FE4FEB
+:1036F000218172132AC02081621327C022812111E7
+:1037000024C0238134812417350710F42150310956
+:10371000241B350B283C3105C0F42091EB012F70A0
+:1037200020612093EB0126E0289FF001299FF00DF6
+:103730001124E554FE4F80818F708061808386EE76
+:1037400091E00E94971A0C941F1B01968770BECFC0
+:103750000895CF92DF92EF92FF920F931F93CF9332
+:10376000DF93CDB7DEB762970FB6F894DEBF0FBE1A
+:10377000CDBF8C0185E0F801DE011D9601900D9210
+:103780008A95E1F7D8014C9111965C9111971296A8
+:103790006C9112971396CD90DC9014973091E601BE
+:1037A0007091E7018091E9019091EA01009709F495
+:1037B0006BC17F3F19F43F3F09F466C1E090E80117
+:1037C000EE2009F4C0C02091EB01C816D90628F0FC
+:1037D000F601E81BF90BCF0104C0809590958C0D84
+:1037E0009D1DFF24F394883C910578F0F12C207FF7
+:1037F00009F0C6C07C2DD98AC88A89890E94001B1D
+:1038000086EE91E00E94971AB1C0822F807F09F066
+:1038100046C0751314C0341312C0611110C02F704C
+:1038200020612093EB010E94401B86EE91E00E94F4
+:10383000971A8091EB01D80115968C932EC0CD2854
+:1038400019F15F3F11F44F3FF9F0F62E61111CC0E2
+:103850008091B4012091B50136E0821709F45AC075
+:1038600090E0389FF001399FF00D1124EA54FE4F8B
+:103870007181571306C07081471303C072817111A3
+:1038800003C001968770E9CFF62E662309F418C1AC
+:103890008091EB0181608093EB01F12C11C17513D4
+:1038A00008C0341306C0611104C08091EB01D80137
+:1038B000C3C04D875E878D859E856A8B0E94D61A10
+:1038C0006A898823E1F16623D1F12091EB01822FEF
+:1038D00082958F7090E0029774F08091E60190914C
+:1038E000E70198878F831986DB86CA862C87CE01ED
+:1038F00007960E94971A86E0F801A6EEB1E00190C3
+:103900000D928A95E1F70E944E1B0E94401BFF24F6
+:10391000F394D6C04D875E878D859E850E940A20D0
+:10392000292F22952F7030E0223031050CF0BCC0D9
+:103930009F7009F0B6C0805E883008F4C1C0C8012D
+:103940000E94971AE4CFC816D90608F453C0F601AE
+:10395000E81BF90BCF01883C910508F450C0F12C0D
+:103960007C2DD98AC88A89890E94001BE6EEF1E085
+:1039700086E0DF011D928A95E9F70E94401BA0C0F6
+:10398000751314C0341312C0611110C08091EB0183
+:10399000F8018583C8010E94971A86E0E6EEF1E0FF
+:1039A000DF011D928A95E9F7FE2C8AC04D875E875C
+:1039B0008D859E856A8B0E94D61A6A89882309F4B0
+:1039C000BECF662309F4BBCF2091EB01822F8295F5
+:1039D0008F7090E002970CF48ECF8091E601909169
+:1039E000E7019A8389831B82DD82CC822E83CE01FC
+:1039F00001967FCF809590958C0D9D1DACCFF62EB6
+:103A0000662309F49CCF75132EC034132CC020916B
+:103A1000EB0120FD1FC0822F82958F70D9F0D80155
+:103A200015962C9315978F3049F08F5F982F9295AC
+:103A3000907F822F8F70892B15968C93C8010E94DE
+:103A4000971A86E0F801A6EEB1E001900D928A95F2
+:103A5000E1F793CF86E0F801A6EEB1E001900D9278
+:103A60008A95E1F72DC04D875E878D859E850E94E2
+:103A7000D61A811140CF8091EB0181608093EB01D8
+:103A8000C8010E94971A1CC0662309F458CF4D87BD
+:103A90005E878D859E850E94D61A882309F44FCFB4
+:103AA0002ACF811148CF0CC0243031050CF047CF0C
+:103AB0009F7009F440CFF8019581907F09F03BCFCA
+:103AC0008F2D62960FB6F894DEBF0FBECDBFDF918B
+:103AD000CF911F910F91FF90EF90DF90CF900895BD
+:103AE0001F93CF93DF93CDB7DEB72C970FB6F89423
+:103AF000DEBF0FBECDBF4F83588769877A878B871C
+:103B00009C87CE0107960E94A91B882369F08F81AC
+:103B100098852A853B85232BF1F19F3F09F063C0EF
+:103B20008F3F09F060C037C086E0FE013796DE01A6
+:103B3000119601900D928A95E1F76F817885EA855B
+:103B4000FB85309741F17F3F11F46F3F21F12091C8
+:103B5000B50130E0C9010196877099274091B40101
+:103B600050E08417950709F447C069837A83FD8381
+:103B7000EC8396E0929FD001939FB00D1124AA543C
+:103B8000BE4FFE01319601900D929A95E1F7809318
+:103B9000B5010E941F1B16E08091B4019091B50100
+:103BA0008917C1F1189FC00111248A549E4F0E94A9
+:103BB000A91B882379F1E091B4011E9FF001112423
+:103BC000EA54FE4F408151816281738184819581E5
+:103BD0000E940F1B8091B40190E001968770992795
+:103BE0008093B401D9CF4F81588569857A858B85BB
+:103BF0009C850E940F1BCFCF0E94D21A1092B50154
+:103C00001092B401E6EEF1E086E0DF011D928A95A4
+:103C1000E9F7C1CF2C960FB6F894DEBF0FBECDBF2B
+:103C2000DF91CF911F910895EF92FF920F931F9311
+:103C3000CF93DF938C01009709F46CC0F12CEE2434
+:103C4000E394E8012196F8018491843740F48430AC
+:103C500008F051C0813081F0823019F15BC08537A6
+:103C600009F444C0A8F19CE7980F903708F052C0BF
+:103C70008F770E94141841C00E5F1F4FFE01C49140
+:103C800080E28C0F883048F4C7708E2D01C0880FF9
+:103C9000CA95EAF70E945C2114C08C2F0E948017FD
+:103CA0002DC00E5F1F4FFE01C49180E28C0F883043
+:103CB00058F4C7708E2D01C0880FCA95EAF70E948C
+:103CC00062210E9490211AC08C2F0E94141816C0E5
+:103CD0000E5F1F4FFE01C491CC2381F08FE99FE05E
+:103CE0000197F1F700C00000C150F6CF0E5F1F4FE3
+:103CF000FE01F49003C00E9480178E018F2D88234F
+:103D000009F49FCFEFE9FFE03197F1F700C0000021
+:103D10008150F5CFDF91CF911F910F91FF90EF90E0
+:103D2000089508956093F0017093F1018093F2017A
+:103D30009093F3010C94BE1A0F931F930091F0011E
+:103D40001091F1012091F2013091F301DC01CB01DE
+:103D5000802B912BA22BB32B8093F0019093F10138
+:103D6000A093F201B093F3011F910F910C94BE1A2E
+:103D70000F931F930091F0011091F1012091F20136
+:103D80003091F301DC01CB0180239123A223B323E3
+:103D90008093F0019093F101A093F201B093F301AD
+:103DA0001F910F910C94BE1A0F931F930091F00175
+:103DB0001091F1012091F2013091F301DC01CB016E
+:103DC00080279127A227B3278093F0019093F101D8
+:103DD000A093F201B093F3011F910F910C94BE1ABE
+:103DE0001092EC011092ED011092EE011092EF0191
+:103DF0000C94BE1A41E050E060E070E004C0440F53
+:103E0000551F661F771F8A95D2F74093EC01509398
+:103E1000ED016093EE017093EF010C94BE1A41E046
+:103E200050E060E070E004C0440F551F661F771F2C
+:103E30008A95D2F78091EC019091ED01A091EE016D
+:103E4000B091EF01482B592B6A2B7B2B4093EC014F
+:103E50005093ED016093EE017093EF010C94BE1A44
+:103E600041E050E060E070E004C0440F551F661F61
+:103E7000771F8A95D2F740955095609570958091FF
+:103E8000EC019091ED01A091EE01B091EF0148237A
+:103E900059236A237B234093EC015093ED016093F7
+:103EA000EE017093EF010C94BE1A41E050E060E027
+:103EB00070E004C0440F551F661F771F8A95D2F724
+:103EC0008091EC019091ED01A091EE01B091EF0194
+:103ED000482759276A277B274093EC015093ED012F
+:103EE0006093EE017093EF010C94BE1A0F931F9331
+:103EF0000091EC011091ED012091EE013091EF0164
+:103F0000DC01CB01802B912BA22BB32B8093EC01F6
+:103F10009093ED01A093EE01B093EF011F910F91EB
+:103F20000C94BE1A0F931F930091EC011091ED01B8
+:103F30002091EE013091EF01DC01CB018023912330
+:103F4000A223B3238093EC019093ED01A093EE01A3
+:103F5000B093EF011F910F910C94BE1A0F931F9312
+:103F60000091EC011091ED012091EE013091EF01F3
+:103F7000DC01CB0180279127A227B3278093EC0196
+:103F80009093ED01A093EE01B093EF011F910F917B
+:103F90000C94BE1A0895CF92DF92EF92FF920F9386
+:103FA0001F93CF93DF938C01C090F001D090F1016B
+:103FB000E090F201F090F3018091EC019091ED011D
+:103FC000A091EE01B091EF01C82AD92AEA2AFB2A72
+:103FD000CFE1D0E0D701C6010C2E04C0B695A7955D
+:103FE000979587950A94D2F780FF06C0B8018C2F69
+:103FF0000E94CB0E019721F4219760F780E001C069
+:104000008C2FDF91CF911F910F91FF90EF90DF9058
+:10401000CF900895CF93DF93EC010E94CB1FBE0198
+:104020000E94CB0EDF91CF910895CB010E940A2010
+:1040300008958091F90108958093F90108951092EF
+:10404000F90108950E9493222091F7013091F8011F
+:104050008217930750F00E9493222091F70130912C
+:10406000F801821B930B9C010AC00E9493222091AD
+:10407000F7013091F80120953095280F391F81E024
+:10408000283B3B4008F480E008958091F601859537
+:104090008595859508958091F601877008950E9411
+:1040A00093222091F4013091F50182179307A8F033
+:1040B0000E9493222091F4013091F501821B930B11
+:1040C000883B9B4010F480E013C08091F60182FB96
+:1040D000882780F991E089270BC00E9493222091C4
+:1040E000F4013091F50120953095820F931FE8CFB0
+:1040F0008170089598E0899F90011124262B2093C8
+:10410000F6010E940F1F0E9493229093F501809365
+:10411000F40108951092F6011092F5011092F40145
+:1041200008952091F601809582238093F601982FBF
+:10413000977089F430E0482F552747FD5095241794
+:10414000350749F08595859585950E94301F109219
+:10415000F5011092F40108959091F601977081E0B5
+:1041600009F480E0089590910C01992321F0909139
+:104170000D01911109C020910E0130910F01F9013B
+:1041800032969FEF40E01FC0982F96959695969592
+:104190009F3050F5E0910E01F0910F01E90FF11DF4
+:1041A000877021E030E0A90102C0440F551F8A95B5
+:1041B000E2F7CA019181892B818308959F3F39F0ED
+:1041C0004F5F4E3041F051915813F8CF0DC051114F
+:1041D000F7CF942FF5CF9F3F39F0F901E90FF11D8B
+:1041E00097FDFA9582830895089590910C01992383
+:1041F00021F090910D01911109C020910E01309193
+:104200000F01F9013296205F3F4F1FC0982F9695FE
+:10421000969596959F30F0F4E0910E01F0910F0184
+:10422000E90FF11D877021E030E0A90102C0440FC1
+:10423000551F8A95E2F7CA01809591818923818370
+:1042400008953196E217F30729F090819813F9CF7A
+:104250001082F7CF089581E090E0E0910E01F09197
+:104260000F01E80FF91F1082019680319105A9F71F
+:10427000089580910D02089590910D02892B8093ED
+:104280000D020895809590910D02892380930D026F
+:10429000089510920D02089590910C02892B80933D
+:1042A0000C020895809590910C02892380930C0252
+:1042B000089510920C02089590910B02892B80931F
+:1042C0000B020895809590910B02892380930B0235
+:1042D000089510920B0208958093FA010E94932290
+:1042E0009093F8018093F70108951092FA011092CB
+:1042F000F8011092F70108958091FA0108958091D4
+:104300000E0190910F01FC0131969C01205F3F4FFF
+:1043100080E0919191118F5FE217F307D1F7089533
+:10432000E0910E01F0910F0180910D028083E091E8
+:104330000E01F0910F01908180910C02892B8083F6
+:10434000E0910E01F0910F01908180910B02892B79
+:1043500080838091FA01882399F00E9422208111A4
+:104360000E947521E0910E01F0910F0190818091E2
+:10437000FA01892B80830E947F2181110E9475217F
+:1043800080910E0190910F010C94701620E000971F
+:1043900039F0AC0141505109842395232F5FF7CFA9
+:1043A000822F0895CF92DF92EF92FF926C01EE245C
+:1043B000FF24C114D104E104F10421F0C701B601C6
+:1043C00020E101C020E0C72ED82EE92EFF24C11421
+:1043D000D104E104F10419F0285FC701B6016B01B3
+:1043E0007C0154E0F694E794D794C7945A95D1F79A
+:1043F000C114D104E104F10419F02C5FC701B60126
+:104400006B017C0142E0F694E794D794C7944A95F7
+:10441000D1F7C114D104E104F10419F02E5FC701F2
+:10442000B601DC01CB01B695A79597958795892BA9
+:104430008A2B8B2B09F02F5F822FFF90EF90DF905C
+:10444000CF90089580913A02843021F110920F02AA
+:1044500020E488E190E00FB6F894A895809360007E
+:104460000FBE2093600080E00E94660F83B7817FBB
+:10447000846083BF83B7816083BF7894889583B756
+:104480008E7F83BF88E10FB6F8948093600010920E
+:1044900060000FBE0895089508950E944B220E9467
+:1044A000ED040E944C220E94E20591E0811101C0BE
+:1044B00090E0892F08950E94D21A0E9464160C94ED
+:1044C000660F1F920F920FB60F9211248F939F9336
+:1044D000AF93BF9380910F02811113C0809110029E
+:1044E00090911102A0911202B09113024196A11D68
+:1044F000B11D8093100290931102A0931202B09309
+:104500001302BF91AF919F918F910F900FBE0F90AB
+:104510001F90189582E084BD93E095BD9AEF97BDFA
+:1045200080936E0008952FB7F894809110029091B7
+:104530001102A0911202B09113022FBF0895CF92E1
+:10454000DF92EF92FF920F931F932FB7F894409151
+:1045500010025091110260911202709113022FBF4C
+:104560006A017B01EE24FF248C0120E030E0C016BC
+:10457000D106E206F30610F4415051099A01281BB6
+:10458000390BC9011F910F91FF90EF90DF90CF90F1
+:1045900008951F920F920FB60F9211248F939F933D
+:1045A000AF93BF938091100290911102A0911202DB
+:1045B000B09113020196A11DB11D8093100290933A
+:1045C0001102A0931202B0931302BF91AF919F9179
+:1045D0008F910F900FBE0F901F9018950E9461133E
+:1045E000F8942FEF87EA91E6215080409040E1F760
+:1045F00000C0000087E090EBDC01809344029093C0
+:104600004502A0934602B09347029CE088E10FB6B2
+:10461000F894A895809360000FBE90936000FFCF40
+:104620000E944523811102C00E942B230E94502327
+:1046300080930E020E9458238093430287FB8827B1
+:1046400080F980930D010E945423682F70E080E070
+:1046500090E00C94921E6DEE7EEF80E090E00E9460
+:10466000FD2660E082E090E00E94EB2660E083E0BF
+:1046700090E00E94EB2660E084E090E00E94EB2650
+:1046800060E085E090E00C94EB2680E090E00E94F2
+:10469000E52621E08D3E9E4F09F020E0822F08950F
+:1046A00082E090E00C94DD2683E090E00C94DD261F
+:1046B00084E090E00C94DD26682F84E090E00C9478
+:1046C000EB268091170280FF0BC06091130185E0FB
+:1046D000689FB001112475956795759567952BC0F6
+:1046E00081FF09C06091130185E0689FB00111242A
+:1046F0007595679520C082FF07C06091130185E022
+:10470000689FB001112417C0909118029923D1F02D
+:1047100060911201961788F72091130185E0289F78
+:1047200090011124929FA001939F500D112470E0DD
+:10473000CA010E94AF266038710540F46115710509
+:1047400039F002C065E070E0862F08958FE7089584
+:1047500081E008958091170280FF08C060911101E7
+:1047600070E0759567957595679521C081FF06C0C6
+:104770006091110170E07595679519C082FF04C0C2
+:104780006091110170E010C0909118029923C1F05E
+:10479000609110019617A0F780911101899FC001C7
+:1047A000112470E00E94AF266038710528F461156D
+:1047B000710521F0862F08958FE7089581E008950F
+:1047C00061E070E0F4CF803F21F40E946123819585
+:1047D00004C0813F29F40E94612380931B02089545
+:1047E000823F21F40E946123819504C0833F29F414
+:1047F0000E94612380931A020895893F19F40E9450
+:10480000AA2305C08A3F31F40E94AA238195809390
+:104810001C0208958B3F21F40E94AA23819504C0B5
+:104820008C3F29F40E94AA2380931D020895843F9F
+:1048300021F480911902816017C0853F21F4809195
+:104840001902826011C0863F21F4809119028460B0
+:104850000BC0873F21F480911902886005C0883F12
+:1048600031F48091190280618093190208958D3F7F
+:1048700021F48091170281600BC08E3F21F480915A
+:104880001702826005C08F3F29F48091170284606F
+:10489000809317020895803F39F480911B0287FFAF
+:1048A0006CC010921B0269C0813F29F480911B02E9
+:1048B0001816BCF362C090911A02823F29F497FF48
+:1048C0005CC010921A0259C0833F19F41916CCF338
+:1048D00054C0893F41F480911C0218160CF04DC061
+:1048E00010921C024AC08A3F29F480911C0287FF63
+:1048F00044C0F6CF8B3F39F480911D0287FF3DC045
+:1049000010921D023AC08C3F29F480911D021816A6
+:10491000BCF333C0843F21F4809119028E7F17C00D
+:10492000853F21F4809119028D7F11C0863F21F4CB
+:10493000809119028B7F0BC0873F21F4809119026F
+:10494000877F05C0883F31F4809119028F7E809364
+:10495000190213C08D3F21F4809117028E7F0BC086
+:104960008E3F21F4809117028D7F05C08F3F29F47F
+:10497000809117028B7F8093170280911A02811118
+:104980000EC080911B0281110AC080911C0281110E
+:1049900006C080911D02811102C010921802089574
+:1049A00089E192E00E947B160E9493229093150267
+:1049B0008093140208951F93CF93DF938091140284
+:1049C000909115020E949F22AC01909118029923A8
+:1049D00021F02091140130E006C0209116028AE0F7
+:1049E000289F900111244217530708F486C0809134
+:1049F0001A02C0911B02D0911C0210911D0281115C
+:104A000007C0C11176C0D11174C0111172C075C038
+:104A10009F3F19F09F5F90931802181624F40E948C
+:104A2000612380931A0280911A0287FF05C00E94B9
+:104A30006123819580931A021C1624F40E9461233D
+:104A400080931B0280911B0287FF05C00E94612397
+:104A5000819580931B0260911A02662339F1C091FF
+:104A60001B02CC2319F1772767FD7095872F972FAD
+:104A70000E94C02523E333E343E35FE30E9424263F
+:104A80000E948D2560931A026C2F772767FD709521
+:104A9000872F972F0E94C02523E333E343E35FE38F
+:104AA0000E9424260E948D2560931B021D1624F46B
+:104AB0000E94AA2380931C0280911C0287FF05C0DC
+:104AC0000E94AA23819580931C02111624F40E944F
+:104AD000AA2380931D0280911D0287FF05C00E94BA
+:104AE000AA23819580931D02DF91CF911F910C9491
+:104AF000D0249F3F09F08ECF96CFDF91CF911F91A9
+:104B00000895E9E1F2E085E0DF011D928A95E9F779
+:104B10001092180210921702089504D06894B111EF
+:104B20008DC0089570D088F09F5790F0B92F9927C5
+:104B3000B751A0F0D1F0660F771F881F991F1AF0A8
+:104B4000BA95C9F712C0B13081F077D0B1E00895BD
+:104B500074C0672F782F8827B85F39F0B93FCCF33E
+:104B6000869577956795B395D9F73EF4909580959E
+:104B7000709561957F4F8F4F9F4F0895E89409C0BE
+:104B800097FB3EF490958095709561957F4F8F4F80
+:104B90009F4F9923A9F0F92F96E9BB279395F69596
+:104BA000879577956795B795F111F8CFFAF4BB0F14
+:104BB00011F460FF1BC06F5F7F4F8F4F9F4F16C078
+:104BC000882311F096E911C0772321F09EE8872F02
+:104BD000762F05C0662371F096E8862F70E060E0BE
+:104BE0002AF09A95660F771F881FDAF7880F969537
+:104BF000879597F9089557FD9058440F551F59F020
+:104C00005F3F71F04795880F97FB991F61F09F3FB9
+:104C100079F087950895121613061406551FF2CFE2
+:104C20004695F1DF08C0161617061806991FF1CF32
+:104C300086957105610508940895E894BB27662759
+:104C40007727CB0197F908950BD078C069D028F069
+:104C50006ED018F0952309F05AC05FC01124EECF32
+:104C6000CADFA0F3959FD1F3950F50E0551F629FC7
+:104C7000F001729FBB27F00DB11D639FAA27F00DB5
+:104C8000B11DAA1F649F6627B00DA11D661F829FDC
+:104C90002227B00DA11D621F739FB00DA11D621FC1
+:104CA000839FA00D611D221F749F3327A00D611DDE
+:104CB000231F849F600D211D822F762F6A2F1124C0
+:104CC0009F5750408AF0E1F088234AF0EE0FFF1F13
+:104CD000BB1F661F771F881F91505040A9F79E3F4A
+:104CE000510570F014C0AACF5F3FECF3983EDCF39F
+:104CF000869577956795B795F795E7959F5FC1F787
+:104D0000FE2B880F911D9695879597F9089597F931
+:104D10009F6780E870E060E008959FEF80EC089561
+:104D200000240A941616170618060906089500248A
+:104D30000A9412161306140605060895092E039404
+:104D4000000C11F4882352F0BB0F40F4BF2B11F478
+:104D500060FF04C06F5F7F4F8F4F9F4F089597FB99
+:104D6000072E16F4009407D077FD09D00E94C926BB
+:104D700007FC05D03EF4909581959F4F089570955E
+:104D800061957F4F0895EE0FFF1F0590F491E02D80
+:104D90000994AA1BBB1B51E107C0AA1FBB1FA61782
+:104DA000B70710F0A61BB70B881F991F5A95A9F7D4
+:104DB00080959095BC01CD010895F999FECF92BDE3
+:104DC00081BDF89A992780B50895A8E1B0E042E046
+:104DD00050E00C940527262FF999FECF92BD81BD96
+:104DE000F89A019700B4021639F01FBA20BD0FB629
+:104DF000F894FA9AF99A0FBE08950196272F0E9407
+:104E0000EC260C94EB26DC01CB01FC01F999FECFDA
+:104E100006C0F2BDE1BDF89A319600B40D92415042
+:0A4E20005040B8F70895F894FFCF52
+:104E2A000220680FF60FD30F9F0F6B0F0101FB01D2
+:104E3A0028080102142700200005000500280000A8
+:104E4A0000100004001B002D0009001200060018C3
+:104E5A0000160008000700280000003F4D3639F808
+:104E6A0007AB0775073C07CF06E80601071A0700D4
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/algernon/config.h b/keyboard/ergodox_ez/keymaps/algernon/config.h
new file mode 100644
index 0000000000..724618cc48
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/config.h
@@ -0,0 +1,27 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H 1
+
+#include "../../config.h"
+
+#undef MOUSEKEY_TIME_TO_MAX
+#undef MOUSEKEY_MAX_SPEED
+
+#define MOUSEKEY_TIME_TO_MAX 1
+#define MOUSEKEY_MAX_SPEED 2
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_DELAY
+#define MOUSEKEY_WHEEL_DELAY 0
+
+#define ONESHOT_TAP_TOGGLE 2
+#define ONESHOT_TIMEOUT 3000
+
+#undef LOCKING_SUPPORT_ENABLE
+#undef LOCKING_RESYNC_ENABLE
+
+#undef LEADER_TIMEOUT
+#define LEADER_TIMEOUT 1000
+
+#endif
diff --git a/keyboard/ergodox_ez/keymaps/algernon/images/base-layer.png b/keyboard/ergodox_ez/keymaps/algernon/images/base-layer.png
new file mode 100644
index 0000000000..e335859205
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/images/base-layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/algernon/images/emacs-layer.png b/keyboard/ergodox_ez/keymaps/algernon/images/emacs-layer.png
new file mode 100644
index 0000000000..1aa23cc00e
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/images/emacs-layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/algernon/images/hun-layer.png b/keyboard/ergodox_ez/keymaps/algernon/images/hun-layer.png
new file mode 100644
index 0000000000..3c76653921
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/images/hun-layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/algernon/images/one-handed-layer.png b/keyboard/ergodox_ez/keymaps/algernon/images/one-handed-layer.png
new file mode 100644
index 0000000000..283559b3a9
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/images/one-handed-layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/algernon/keymap.c b/keyboard/ergodox_ez/keymaps/algernon/keymap.c
new file mode 100644
index 0000000000..7ded1e1aee
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/algernon/keymap.c
@@ -0,0 +1,932 @@
+/*
+ * algernon's ErgoDox EZ layout, please see the README.md file!
+ */
+
+#include "ergodox_ez.h"
+#include "led.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "action_util.h"
+#include "mousekey.h"
+#include "timer.h"
+
+/* Layers */
+
+#define BASE 0 // default layer
+#define APPSEL 1 // application select layer
+#define HUN 2 // Hungarian layer
+#define EMACS 3 // (Spac)Emacs layer
+#define OHLFT 4 // One-handed, left side
+#define OHRGT 5 // One-handed, right side
+
+/* Macros */
+
+#define A_GUI 0 // GUI magic
+#define A_ESC 44 // OSM-clearing ESC
+
+#define A_MUL 1 // mouse up-left
+#define A_MUR 2 // mouse up-right
+#define A_MDL 3 // mouse down-left
+#define A_MDR 4 // mouse down-right
+
+#define AE_VIS 5 // Visual mode
+#define AE_PSTDEL 6 // Paste/Delete
+#define AE_CPYC 7 // Copy/Cut
+#define AE_EMACS 8 // Emacs copy & paste mode
+#define AE_TERM 9 // Terminal copy & paste mode
+#define AE_OTHER 10 // Other copy & paste mode
+#define AE_INS 11 // Insert mode
+#define AE_OVR 12 // Overwrite mode
+#define AE_APPND 13 // Append
+
+#define HU_AA 14 // Á
+#define HU_OO 15 // Ó
+#define HU_EE 16 // É
+#define HU_UU 17 // Ú
+#define HU_II 18 // Í
+#define HU_OE 19 // Ö
+#define HU_UE 20 // Ü
+#define HU_OEE 21 // Ő
+#define HU_UEE 22 // Ű
+
+#define APP_SLK 23 // Slack
+#define APP_EMCS 24 // Emacs
+#define APP_TERM 25 // Terminal
+#define APP_CHRM 26 // Chrome
+#define APP_MSIC 27 // Music
+
+#define KF_1 28 // 1, F1
+#define KF_2 29 // 2, F2
+#define KF_3 30 // ...
+#define KF_4 31
+#define KF_5 32
+#define KF_6 33
+#define KF_7 34
+#define KF_8 35
+#define KF_9 36
+#define KF_10 37
+#define KF_11 38 // =, F11
+
+#define OH_BSSPC 39
+#define OH_ENTSFT 40
+#define OH_BASE 41
+#define OH_LEFT 42
+#define OH_RIGHT 43
+
+/* Fn keys */
+#define F_BSE 0
+#define F_HUN 1
+#define F_GUI 2
+#define F_SFT 3
+#define F_ALT 4
+#define F_CTRL 5
+
+/* States & timers */
+
+uint8_t m_visual_state = 0;
+static uint16_t m_cutdel_timer;
+static uint16_t m_copypaste_timer;
+
+uint16_t gui_timer = 0;
+
+uint16_t kf_timers[12];
+
+uint16_t oh_base_timer = 0;
+uint16_t oh_bsspc_timer = 0;
+uint16_t oh_entsft_timer = 0;
+
+#define OH_BLINK_INTERVAL 500
+
+uint8_t oh_left_blink = 0;
+uint16_t oh_left_blink_timer = 0;
+uint8_t oh_right_blink = 0;
+uint16_t oh_right_blink_timer = 0;
+
+enum {
+ CP_EMACS = 0,
+ CP_TERM = 1,
+ CP_OTHER = 2,
+};
+
+uint8_t cp_mode = CP_EMACS;
+
+/* The Keymap */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Keymap 0: Base Layer
+ *
+ * ,-----------------------------------------------------. ,-----------------------------------------------------.
+ * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Apps | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| = F11 |
+ * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
+ * | Tab | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | / |
+ * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
+ * | - | A | O | E | U | I |------| |------| D | H | T | N | S | \ |
+ * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
+ * | Play/Pause| ; | Q | J | K | X | | | | B | M | W | V | Z | Stop |
+ * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
+ * | Home | End | Down | Up | : | | - | Left | Right| PgUp | PgDn |
+ * `-----------------------------------' `-----------------------------------'
+ * ,-------------. ,-------------.
+ * | LAlt | GUI | |EMACS | 1HND |
+ * ,------|------|------| |------+------+------.
+ * | | | Ctrl | | LEAD | | |
+ * |Backsp|LShift|------| |------| Enter| Space|
+ * | | | ESC | | HUN | | |
+ * `--------------------' `--------------------'
+ */
+[BASE] = KEYMAP(
+// left hand
+ KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),KC_APP
+,KC_TAB ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
+,KC_MINS ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
+,KC_MPLY ,KC_SCLN ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
+,KC_HOME ,KC_END ,KC_DOWN ,KC_UP ,KC_COLN
+
+ ,F(F_ALT),F(F_GUI)
+ ,F(F_CTRL)
+ ,KC_BSPC,F(F_SFT),M(A_ESC)
+
+ // right hand
+ ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,M(KF_11)
+ ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_SLSH
+ ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_BSLS
+ ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
+ ,KC_MINS,KC_LEFT,KC_RGHT ,KC_PGUP ,KC_PGDN
+
+ ,OSL(EMACS),M(OH_LEFT)
+ ,KC_LEAD
+ ,F(F_HUN),KC_ENT ,KC_SPC
+ ),
+
+/* Keymap 1: Application select layer
+ *
+ * ,-----------------------------------------------------. ,-----------------------------------------------------.
+ * | |Music |Slack |Emacs |Term |Chrome| | | | | | | | | |
+ * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
+ * | | | | | | | | | | | | | | | |
+ * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
+ * | | | | | | |------| |------| | | | | | |
+ * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
+ * | | | | | | | | | | | | | | | |
+ * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+
+[APPSEL] = KEYMAP(
+// left hand
+ KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS
+,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+
+ ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS
+
+ // right hand
+ ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+
+ ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS
+ ),
+
+
+/* Keymap 2: Hungarian Layer
+ *
+ * ,-----------------------------------------------------. ,-----------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
+ * | | | Ő | | Ű | | | | | | | | | | |
+ * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
+ * | | Á | Ó | É | Ú | Í |------| |------| | | | | | |
+ * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
+ * | | | Ö | | Ü | | | | | | | | | | |
+ * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | BASE | | |
+ * `--------------------' `--------------------'
+ */
+
+[HUN] = KEYMAP(
+// left hand
+ KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
+,KC_NO ,KC_NO ,M(HU_OEE),KC_NO ,M(HU_UEE),KC_NO ,KC_NO
+,KC_NO ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
+,KC_TRNS ,KC_NO ,M(HU_OE) ,KC_NO ,M(HU_UE) ,KC_NO ,KC_NO
+,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_NO
+
+ ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS
+ ,KC_TRNS ,KC_TRNS ,KC_TRNS
+
+ // right hand
+ ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+
+ ,KC_NO ,KC_NO
+ ,KC_NO
+ ,F(F_BSE),KC_TRNS ,KC_TRNS
+ ),
+
+/* Keymap 3: Spacemacs layer
+ *
+ * ,-----------------------------------------------------. ,-----------------------------------------------------.
+ * | MS Slow | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |ScrLCK| |ScrLCK| 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
+ * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
+ * | MS Normal | | Home | Up | PgUp | |Visual| |Scroll| $ |MsUpL | MsUp |MsUpR | R |PrintScreen|
+ * |-----------+------+------+------+------+------| Mode | | Up |------+------+------+------+------+-----------|
+ * | MS Fast |APPEND| Left | Down | Right| INS |------| |------| D |MsLeft| MsDn |MsRght| | |
+ * |-----------+------+------+------+------+------| Cut | |Scroll|------+------+------+------+------+-----------|
+ * | Play/Pause| | End | Down | PgDn | X | Copy | | Down | |MsDnL | W |MsDnR | | Stop |
+ * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
+ * |EmacsM|TermM |OtherM| | | |Vol Up|Vol Dn| Mute | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | Alt | GUI | | BASE | MClk |
+ * ,------|------|------| |------+------+------.
+ * |Delete| | Ctrl | | Prev |Left |Right |
+ * | |LShift|------| |------| Click| Click|
+ * |Paste | | ESC | | Next | | |
+ * `--------------------' `--------------------'
+ */
+[EMACS] = KEYMAP(
+// left hand
+ KC_ACL0 ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,LGUI(KC_L)
+,KC_ACL1 ,KC_NO ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,M(AE_VIS)
+,KC_ACL2 ,M(AE_APPND) ,KC_LEFT ,KC_DOWN ,KC_RIGHT,M(AE_INS)
+,KC_MPLY ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_X ,M(AE_CPYC)
+,M(AE_EMACS),M(AE_TERM) ,M(AE_OTHER),KC_NO ,KC_NO
+ ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS
+ ,M(AE_PSTDEL),KC_TRNS ,KC_TRNS
+
+ // right hand
+ ,LGUI(KC_L),M(KF_6) ,M(KF_7) ,M(KF_8) ,M(KF_9) ,M(KF_10) ,M(KF_11)
+ ,KC_WH_U ,KC_DLR ,M(A_MUL),KC_MS_U ,M(A_MUR),M(AE_OVR),KC_PSCR
+ ,KC_D ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO ,KC_NO
+ ,KC_WH_D ,KC_NO ,M(A_MDL),KC_W ,M(A_MDR),KC_NO ,KC_MSTP
+ ,KC_VOLU ,KC_VOLD ,KC_MUTE ,KC_NO ,KC_NO
+
+ ,KC_TRNS ,KC_MS_BTN3
+ ,KC_MPRV
+ ,KC_MNXT ,KC_BTN1 ,KC_BTN2
+ ),
+
+/* Keymap 5: One-handed, left side
+ *
+ * ,-----------------------------------------------------.
+ * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A BSE|
+ * |-----------+------+------+------+------+-------------|
+ * | Tab | ' | , | . | P | Y | [ |
+ * |-----------+------+------+------+------+------| |
+ * | - | A | O | E | U | I |------|
+ * |-----------+------+------+------+------+------| ( |
+ * | Play/Pause| ; | Q | J | K | X | |
+ * `-----------+------+------+------+------+-------------'
+ * | Home | End | Down | Up | ESC |
+ * `-----------------------------------'
+ * ,-------------.
+ * | LAlt | GUI |
+ * ,------|------|------|
+ * |BackSp|LShift| Ctrl |
+ * | | |------|
+ * |Space |Enter |OTHER |
+ * `--------------------'
+ */
+[OHLFT] = KEYMAP(
+// left hand
+ KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,M(OH_BASE)
+,KC_TAB ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
+,KC_MINS ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
+,KC_MPLY ,KC_SCLN ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
+,KC_HOME ,KC_END ,KC_DOWN ,KC_UP ,M(A_ESC)
+
+ ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS
+ ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)
+
+ // right hand
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+
+ ,KC_NO ,KC_NO
+ ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO
+ ),
+
+/* Keymap 6: One-handed, right side
+ *
+ * ,-----------------------------------------------------.
+ * | = F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A BSE|
+ * |-----------+------+------+------+------+-------------|
+ * | / | L | R | C | G | F | ] |
+ * |-----------+------+------+------+------+------| |
+ * | \ | S | N | T | H | D |------|
+ * |-----------+------+------+------+------+------| ) |
+ * | Stop | Z | V | W | M | B | |
+ * `-----------+------+------+------+------+-------------'
+ * | PgDn | PgUp | Right| Left | ESC |
+ * `-----------------------------------'
+ * ,-------------.
+ * | LAlt | GUI |
+ * ,------|------|------|
+ * |BackSp|LShift| Ctrl |
+ * | | |------|
+ * |Space |Enter |OTHER |
+ * `--------------------'
+ */
+[OHRGT] = KEYMAP(
+// left hand
+ M(KF_11) ,M(KF_10) ,M(KF_9) ,M(KF_8) ,M(KF_7) ,M(KF_6) ,M(OH_BASE)
+,KC_SLSH ,KC_L ,KC_R ,KC_C ,KC_G ,KC_F ,KC_RBRC
+,KC_BSLS ,KC_S ,KC_N ,KC_T ,KC_H ,KC_D
+,KC_MSTP ,KC_Z ,KC_V ,KC_W ,KC_M ,KC_B ,KC_RPRN
+,KC_PGDN ,KC_PGUP ,KC_RGHT ,KC_LEFT ,M(A_ESC)
+
+ ,KC_TRNS ,KC_TRNS
+ ,KC_TRNS
+ ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)
+
+ // right hand
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
+
+ ,KC_NO ,KC_NO
+ ,KC_NO
+ ,KC_NO ,KC_NO ,KC_NO
+ ),
+
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
+ ,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
+ ,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
+ ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
+ ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
+ ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
+};
+
+macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
+{
+ uint8_t need_shift = 0;
+ uint8_t hold_shift = 0;
+
+ if (!record->event.pressed)
+ return MACRO_NONE;
+
+ layer_off (HUN);
+
+ if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
+ hold_shift = 1;
+ need_shift = 1;
+ unregister_code (KC_LSFT);
+ }
+ if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
+ need_shift = 1;
+ hold_shift = 0;
+ unregister_code (KC_LSFT);
+ }
+
+ clear_oneshot_mods ();
+
+ register_code (KC_RALT);
+ unregister_code (KC_RALT);
+ if (accent == (KC_DQT)) {
+ register_code (KC_RSFT);
+ }
+ register_code (accent);
+ unregister_code (accent);
+ if (need_shift && accent != (KC_DQT)) {
+ register_code (KC_RSFT);
+ } else if (accent == (KC_DQT) && !need_shift) {
+ unregister_code (KC_RSFT);
+ }
+ register_code (hun_char);
+ unregister_code (hun_char);
+ if (need_shift || accent == (KC_DQT))
+ unregister_code (KC_RSFT);
+ if (hold_shift)
+ register_code (KC_LSFT);
+
+ return MACRO_NONE;
+}
+
+void ang_handle_kf (keyrecord_t *record, uint8_t id)
+{
+ uint8_t code = id - KF_1;
+
+ if (record->event.pressed) {
+ kf_timers[code] = timer_read ();
+ } else {
+ uint8_t kc;
+
+ if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
+ // Long press
+ kc = KC_F1 + code;
+ } else {
+ if (id == KF_11)
+ kc = KC_EQL;
+ else
+ kc = KC_1 + code;
+ }
+
+ register_code (kc);
+ unregister_code (kc);
+ }
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ switch(id) {
+ case A_ESC:
+ if (record->event.pressed) {
+ if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
+ clear_oneshot_mods ();
+ } else {
+ register_code (KC_ESC);
+ }
+ } else {
+ unregister_code (KC_ESC);
+ }
+ break;
+
+ /* Hungarian layer */
+ case HU_AA:
+ return ang_do_hun (record, KC_QUOT, KC_A);
+ case HU_OO:
+ return ang_do_hun (record, KC_QUOT, KC_O);
+ case HU_EE:
+ return ang_do_hun (record, KC_QUOT, KC_E);
+ case HU_UU:
+ return ang_do_hun (record, KC_QUOT, KC_U);
+ case HU_II:
+ return ang_do_hun (record, KC_QUOT, KC_I);
+ case HU_OE:
+ return ang_do_hun (record, KC_DQT, KC_O);
+ case HU_UE:
+ return ang_do_hun (record, KC_DQT, KC_U);
+ case HU_OEE:
+ return ang_do_hun (record, KC_EQL, KC_O);
+ case HU_UEE:
+ return ang_do_hun (record, KC_EQL, KC_U);
+
+ /* Mouse movement */
+ case A_MUL:
+ if (record->event.pressed) {
+ mousekey_on(KC_MS_UP);
+ mousekey_on(KC_MS_LEFT);
+ } else {
+ mousekey_off(KC_MS_UP);
+ mousekey_off(KC_MS_LEFT);
+ }
+ mousekey_send();
+ break;
+
+ case A_MUR:
+ if (record->event.pressed) {
+ mousekey_on(KC_MS_UP);
+ mousekey_on(KC_MS_RIGHT);
+ } else {
+ mousekey_off(KC_MS_UP);
+ mousekey_off(KC_MS_RIGHT);
+ }
+ mousekey_send();
+ break;
+
+ case A_MDL:
+ if (record->event.pressed) {
+ mousekey_on(KC_MS_DOWN);
+ mousekey_on(KC_MS_LEFT);
+ } else {
+ mousekey_off(KC_MS_DOWN);
+ mousekey_off(KC_MS_LEFT);
+ }
+ mousekey_send();
+ break;
+
+ case A_MDR:
+ if (record->event.pressed) {
+ mousekey_on(KC_MS_DOWN);
+ mousekey_on(KC_MS_RIGHT);
+ } else {
+ mousekey_off(KC_MS_DOWN);
+ mousekey_off(KC_MS_RIGHT);
+ }
+ mousekey_send();
+ break;
+
+ /* EMACS layer stuff */
+ case AE_EMACS:
+ if (record->event.pressed) {
+ cp_mode = CP_EMACS;
+ }
+ break;
+
+ case AE_TERM:
+ if (record->event.pressed) {
+ cp_mode = CP_TERM;
+ }
+ break;
+
+ case AE_OTHER:
+ if (record->event.pressed) {
+ cp_mode = CP_OTHER;
+ }
+ break;
+
+ case AE_VIS:
+ if (cp_mode == CP_EMACS && record->event.pressed) {
+ return MACRO(T(V), END);
+ }
+ break;
+
+ case AE_CPYC:
+ if (record->event.pressed) {
+ m_copypaste_timer = timer_read ();
+ } else {
+ if (timer_elapsed (m_copypaste_timer) > TAPPING_TERM) {
+ // Long press: Cut
+ switch (cp_mode) {
+ case CP_EMACS:
+ return MACRO(T(X), END);
+ break;
+ case CP_TERM:
+ return MACRO(D(RCTRL), D(RSFT), T(X), U(RSFT), U(RCTRL), END);
+ break;
+ case CP_OTHER:
+ return MACRO(D(RCTRL), T(X), U(RCTRL), END);
+ break;
+ }
+ } else {
+ // Short press: Copy
+ switch (cp_mode) {
+ case CP_EMACS:
+ return MACRO(T(Y), END);
+ break;
+ case CP_TERM:
+ return MACRO(D(RCTRL), D(RSFT), T(C), U(RSFT), U(RCTRL), END);
+ break;
+ case CP_OTHER:
+ return MACRO(D(RCTRL), T(C), U(RCTRL), END);
+ break;
+ }
+ }
+ }
+ break;
+
+ case AE_PSTDEL:
+ if (record->event.pressed) {
+ m_cutdel_timer = timer_read ();
+ } else {
+ if (timer_elapsed (m_cutdel_timer) > TAPPING_TERM) {
+ // Long press: Delete
+ switch (cp_mode) {
+ case CP_EMACS:
+ return MACRO(T(D), END);
+ break;
+ case CP_TERM:
+ case CP_OTHER:
+ return MACRO(T(DEL), END);
+ break;
+ }
+ } else {
+ // Short press: Paste
+ switch (cp_mode) {
+ case CP_EMACS:
+ if (keyboard_report->mods & MOD_BIT(KC_RSFT)) {
+ unregister_code (KC_RSFT);
+ return MACRO(U(RSFT), T(RBRC), T(P), D(RSFT), END);
+ }
+ else
+ return MACRO(T(P), END);
+ break;
+ case CP_TERM:
+ return MACRO(D(RCTRL), D(RSFT), T(V), U(RSFT), U(RCTRL), END);
+ break;
+ case CP_OTHER:
+ return MACRO(D(RCTRL), T(V), U(RCTRL), END);
+ break;
+ }
+ }
+ }
+ break;
+
+ case AE_INS:
+ if (record->event.pressed) {
+ return MACRO(T(I), END);
+ } else {
+ layer_clear();
+ }
+ break;
+
+ case AE_OVR:
+ if (record->event.pressed) {
+ return MACRO(T(R), END);
+ } else {
+ layer_clear();
+ }
+ break;
+
+ case AE_APPND:
+ if (record->event.pressed) {
+ return MACRO(T(A), END);
+ } else {
+ layer_clear();
+ }
+ break;
+
+ /* GUI & AppSel */
+ case A_GUI:
+ if (record->event.pressed) {
+ register_code (KC_LGUI);
+ if (record->tap.count && !record->tap.interrupted) {
+ if (record->tap.count >= 2) {
+ register_code (KC_W);
+ layer_on (APPSEL);
+ set_oneshot_layer (APPSEL, ONESHOT_START);
+ }
+ } else {
+ record->tap.count = 0;
+ }
+ gui_timer = 0;
+ } else {
+ if (record->tap.count >= 2)
+ {
+ unregister_code (KC_W);
+ clear_oneshot_layer_state (ONESHOT_PRESSED);
+ }
+ gui_timer = timer_read ();
+ }
+ break;
+
+ case APP_SLK:
+ if (record->event.pressed)
+ return MACRO(T(S), T(C), T(U), T(D), T(C), T(L), T(O), T(U), T(D), T(ENT), END);
+ break;
+
+ case APP_EMCS:
+ if (record->event.pressed)
+ return MACRO(T(E), T(M), T(A), T(C), T(S), T(ENT), END);
+ break;
+
+ case APP_TERM:
+ if (record->event.pressed)
+ return MACRO(T(T), T(E), T(R), T(M), T(ENT), END);
+ break;
+
+ case APP_CHRM:
+ if (record->event.pressed)
+ return MACRO(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
+ break;
+
+ case APP_MSIC:
+ if (record->event.pressed)
+ return MACRO(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
+ break;
+
+ /* Function keys */
+ case KF_1 ... KF_11:
+ ang_handle_kf (record, id);
+ break;
+
+ /* 1HAND layout */
+ case OH_BASE:
+ if (record->event.pressed) {
+ oh_base_timer = timer_read ();
+ } else {
+ if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {
+ layer_clear ();
+ } else {
+ return MACRO (T(APP), END);
+ }
+ }
+ break;
+
+ case OH_BSSPC:
+ if (record->event.pressed) {
+ oh_bsspc_timer = timer_read ();
+ } else {
+ if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {
+ return MACRO (T(BSPC), END);
+ } else {
+ return MACRO (T(SPC), END);
+ }
+ }
+ break;
+
+ case OH_ENTSFT:
+ if (record->event.pressed) {
+ oh_entsft_timer = timer_read ();
+ } else {
+ if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {
+ if (keyboard_report->mods & MOD_BIT(KC_LSFT))
+ unregister_code (KC_LSFT);
+ else
+ register_code (KC_LSFT);
+ } else {
+ return MACRO (T(ENT), END);
+ }
+ }
+ break;
+
+ case OH_LEFT:
+ if (record->event.pressed) {
+ layer_move (OHLFT);
+ oh_left_blink = 1;
+ oh_left_blink_timer = timer_read ();
+ ergodox_right_led_1_on ();
+ }
+ break;
+
+ case OH_RIGHT:
+ if (record->event.pressed) {
+ layer_move (OHRGT);
+ oh_right_blink = 1;
+ oh_right_blink_timer = timer_read ();
+ ergodox_right_led_3_on ();
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+ ergodox_led_all_set (LED_BRIGHTNESS_LO);
+ ergodox_led_all_on();
+ _delay_ms(1000);
+ ergodox_led_all_off();
+};
+
+LEADER_EXTERNS();
+
+void ang_do_unicode (void) {
+ register_code (KC_RCTL);
+ register_code (KC_RSFT);
+ register_code (KC_U);
+ unregister_code (KC_U);
+ unregister_code (KC_RSFT);
+ unregister_code (KC_RCTL);
+}
+
+void ang_tap (uint16_t codes[]) {
+ for (int i = 0; codes[i] != 0; i++) {
+ register_code (codes[i]);
+ unregister_code (codes[i]);
+ }
+}
+
+#define TAP_ONCE(code) \
+ register_code (code); \
+ unregister_code (code)
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
+ unregister_code (KC_LGUI);
+
+ if (layer != OHLFT)
+ oh_left_blink = 0;
+ if (layer != OHRGT)
+ oh_right_blink = 0;
+
+ if (layer == HUN) {
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ } else if (layer == EMACS) {
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ }
+
+ if (layer == OHLFT || layer == OHRGT) {
+ ergodox_right_led_2_on();
+
+ if (oh_left_blink) {
+ if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {
+ if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)
+ ergodox_right_led_1_off ();
+ }
+ if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {
+ ergodox_right_led_1_on ();
+ oh_left_blink_timer = timer_read ();
+ }
+ }
+
+ if (oh_right_blink) {
+ if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {
+ if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)
+ ergodox_right_led_3_off ();
+ }
+ if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {
+ ergodox_right_led_3_on ();
+ oh_right_blink_timer = timer_read ();
+ }
+ }
+ }
+
+ if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
+ ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
+ ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
+ ergodox_right_led_1_on ();
+ } else {
+ ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
+ if (layer != OHLFT && layer != EMACS)
+ ergodox_right_led_1_off ();
+ }
+
+ if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
+ ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
+ ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
+ ergodox_right_led_2_on ();
+ } else {
+ ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
+ if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != EMACS)
+ ergodox_right_led_2_off ();
+ }
+
+ if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
+ ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
+ ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
+ ergodox_right_led_3_on ();
+ } else {
+ ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
+ if (layer != OHRGT && layer != HUN)
+ ergodox_right_led_3_off ();
+ }
+
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end ();
+
+ SEQ_ONE_KEY (KC_U) {
+ ang_do_unicode ();
+ }
+
+ SEQ_ONE_KEY (KC_L) {
+ /* λ */
+ ang_do_unicode ();
+
+ uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
+ ang_tap (codes);
+ }
+
+ SEQ_ONE_KEY (KC_S) {
+ ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
+ TAP_ONCE (KC_BSLS);
+ register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
+ ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
+ register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
+ TAP_ONCE (KC_SLSH);
+ ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
+ }
+
+ SEQ_TWO_KEYS (KC_W, KC_M) {
+ register_code (KC_LALT);
+ register_code (KC_F2);
+ unregister_code (KC_F2);
+ unregister_code (KC_LALT);
+
+ _delay_ms (1000);
+
+ uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};
+ ang_tap (codes);
+ register_code (KC_LGUI);
+ register_code (KC_UP);
+ unregister_code (KC_UP);
+ unregister_code (KC_LGUI);
+ }
+ }
+}