From b8088abbe129eb5e17d7bb55243ec2379e5d1b54 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 16 Jan 2017 15:18:13 +0100 Subject: [PATCH 01/47] Initial import Lifted out of the monolithic Akela library. Signed-off-by: Gergely Nagy --- .gitignore | 2 + COPYING | 674 +++++++++++++++++++++++++++++ README.md | 64 +++ TriColor.md | 35 ++ examples/LEDEffects/LEDEffects.ino | 54 +++ extras/JukeboxEffect.png | Bin 0 -> 90832 bytes extras/MiamiEffect.png | Bin 0 -> 160255 bytes library.properties | 10 + src/Akela-LEDEffects.h | 23 + src/Akela/Jukebox.cpp | 27 ++ src/Akela/Jukebox.h | 25 ++ src/Akela/Miami.cpp | 22 + src/Akela/Miami.h | 24 + src/Akela/TriColor.cpp | 69 +++ src/Akela/TriColor.h | 39 ++ 15 files changed, 1068 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 README.md create mode 100644 TriColor.md create mode 100644 examples/LEDEffects/LEDEffects.ino create mode 100644 extras/JukeboxEffect.png create mode 100644 extras/MiamiEffect.png create mode 100644 library.properties create mode 100644 src/Akela-LEDEffects.h create mode 100644 src/Akela/Jukebox.cpp create mode 100644 src/Akela/Jukebox.h create mode 100644 src/Akela/Miami.cpp create mode 100644 src/Akela/Miami.h create mode 100644 src/Akela/TriColor.cpp create mode 100644 src/Akela/TriColor.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..aead9485 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.#* +*~ diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/README.md b/README.md new file mode 100644 index 00000000..533967f7 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# Akela-LEDEffects + +The `LEDEffects` plugin provides a selection of LED effects, each of them fairly +simple, simple enough to not need a plugin of their own. + +## Using the plugin + +Because of containing a number of different effects, and not wanting to force +all of them on the user, the plugin behaves differently than most others: it +does not enable anything by default, and we will have to selectively enable the +effects we are interested in. + +```c++ +#include +``` + +Then, in the `setup()` method of our Sketch, we will call `Keyboardio.use()`, +with the selected effect objects. + +## Included effects + +All of these effects will scan the active layers, and apply effects based on +what keys are active on each position, thus, it needs no hints or configuration +to figure out our layout! + +### `MiamiEffect` + +Applies a color effect to the keyboard, inspired by the popular Miami keyset: + +![Miami](extras/MiamiEffect.png) + +Alphas, punctuation, numbers, the space bar, the numbers and the dot on the +keypad, and half the function keys will be in a cyan-ish color, the rest in +magenta. + +### `JukeBoxEffect` + +Applies a color effect to the keyboard, inspired by the JukeBox keyset: + +![Jukebox](extras/JukeboxEffect.png) + +Alphas, punctuation, numbers, the space bar, the numbers and the dot on the +keypad, and half the function keys will be in a beige-ish color, the rest in +light green, except for the `Esc` key, which will be in red. + +An alternative color scheme exists under the `JukeBoxAlternateEffect` name, +where the light green and red colors are swapped. + +## Plugin methods + +The plugin provides a single method on each of the included effect objects: + +### `.activate()` + +> When called, immediately activates the effect. Mostly useful in the `setup()` +> method of the Sketch, or in macros that are meant to switch to the selected +> effect, no matter where we are in the list. + +## Further reading + +Starting from the [example][plugin:example] is the recommended way of getting +started with the plugin. + + [plugin:example]: https://github.com/Akela-Plugins/Akela-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino diff --git a/TriColor.md b/TriColor.md new file mode 100644 index 00000000..584ebf8b --- /dev/null +++ b/TriColor.md @@ -0,0 +1,35 @@ +# Akela-TriColor + +The `TriColor` effect extension is a part of +the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of +its own. It is used to implement the effects in that library. + + [plugin:ledeffects]: https://github/Akela-Plugins/Akela-LEDEffects + +It is a class that can be used to create LED effects that all follow a similar +pattern: alphas and similar in one color; modifiers, special keys, and half the +function keys in another, and `Esc` in a third (this latter being optional). If +we have a color scheme that follows this pattern, the `TriColor` extension can +make it a lot easier to implement it. + +## Using the extension + +Because the extension is part of the [`LEDEffects`][plugin:ledeffects] library, +we need to include that header: + +```c++ +#include +``` + +Then, we simply create a new instance of the `TriColor` class, with appropriate +colors set for the constructor: + +```c++ +Akela::LEDEffects::TriColor BlackAndWhiteEffect ((cRGB){0x00, 0x00, 0x00}, + (cRGB){0xff, 0xff, 0xff}, + (cRGB){0x80, 0x80, 0x80}); +``` + +The first argument is the base color, the second is for modifiers and special +keys, the last one is for the `Esc` key. If the last one is omitted, the +extension will use the modifier color for it. diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino new file mode 100644 index 00000000..a0f9099f --- /dev/null +++ b/examples/LEDEffects/LEDEffects.ino @@ -0,0 +1,54 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#include + +#include "LED-Off.h" + +const Key keymaps[][ROWS][COLS] PROGMEM = { + [0] = KEYMAP_STACKED + ( + Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, + Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, + Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, + Key_PageDn, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Esc, + + Key_LCtrl, Key_Backspace, Key_LGUI, Key_LShift, + Key_skip, + + Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, + Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, + Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, + Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, + + Key_RShift, Key_RAlt, Key_Space, Key_RCtrl, + Key_skip + ), +}; + + +void setup () { + Keyboardio.setup (KEYMAP_SIZE); + Keyboardio.use (&LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); + + MiamiEffect.activate (); +} + +void loop () { + Keyboardio.loop (); +} diff --git a/extras/JukeboxEffect.png b/extras/JukeboxEffect.png new file mode 100644 index 0000000000000000000000000000000000000000..647b89bf03948817e2878838602b26660e75cd18 GIT binary patch literal 90832 zcmeFYg;$$R*XSLbrf7@1l|peZ7ThTw+*91z;%=q5Q?$6dL-7Iyio07WuECvfLZ9b; z<$K?A{(^6S-L$hHH3~W6|nbp@S)H55EzQI zaXS}1^hQ1E>K8P9>w%WlZrLc zj4wj*2no0K6bRfzu;olN@ruM}PkiG3Z|`v7(Xj5HfZW40s`p3Hc5z4WS#?{wuRM_)Zr8BD!W8tMU z_LHYEcrK_x6)z*D!|$McTVEUpunt(Ry)jNx--`m~>OVd7U9~TLH*axQmo*92+7Vc( z9L%fYVsIjd&YGzu*LKa7uq-z_59SgD{32wTua1n26t*s*WWwHR3{^(Mtt_*e(>2_E zU@YqG?M3pCG<0(+Ks!4QD1}vhw7~<&n%LvTh|k){Lm;&KIv%}~jc)Ay4u+hhjZ+8! z#-T_=wK)ou#dT+5q16TWHNJJVoCy}ypOy~aDyvNbD0b+xE@xc5*C^yM)V@wld_ma@UY_pNjpPc4}g zC2#B^xy>j^&Sd0iIFL&p1NtETZX(i;E5#@rboA)6R=Zwh%!6Rq7$`mtAMBIK%(to6 zvl44|^P|M@Ml&`Asnnytrp)_SW8zRuR|DjY6QNGx;GHLT|K`I5U3}L!MyjAAaTXUn zsvx^yU0duw-a%g_ZtG>LsnMa6apa{XC8Lfnl?6bkhHu|@XlZ~i?!4fw5_gOiZc;N2 zr68*9u$Gi?j_1mm=VZKBOXh+P*r2G#{&`;2p-T9nSZn2&79GLQC(W>68)dRLL6dr+ zDy;&DUodgJG6wjd(y)j6cMu~`EG>+av22=fevQG`QH|?QxWr>3^qqoU$>k8mNOp)g z4%z@|gVM#a_v?;Bp7W&0_sh#`PPxd|{Jy%O8-E=t?kLCmIksygYs|UzX|^0ga#ja{ z#Xa^qM2xmA;sHCh2M=w6#8w*BxYahX9ePDYMcU`#Ao^>#Zz0+-XK`4eL4@!U0*Kg= zr%Ez4QHcFY3gYBTidBoF`3~*n3Ah*t1k4|7Ep4qW6(t8~gqy#jD0Hb&{Xj^)XIX=08Q2MI#D{_;WPyg$jR^JP@ujY7F~C`SLnpq4|Ry8Xk>h=3xaz z()e&-ED~tzIci|1aaEb#O+`A7-i*D*SGOz$7mI5-6AP8UcA9QLjnoNc+Bei`H@eyx zG1%9vJozSWT`g#7v+f;)JnnC`>)r#G7B0fw;cC5tyIeDF_&40}UL#$i!AK^rIZ1!R}pM1TPI+x zRJ&>24T2o^<>T6N0Q}ky<*%Tcs)lNYskR32h2`Js@t#7_RvF>7`tQv)1qu z_|T?23W^9F4MO(Ip<$dC8`6dgvNP@l;78lgHKJcF6VLK_3`-vppffIR23kcEL~fY9 zU(~O`P$p7~jM-E$xF78FaG7Ft#zi@CGXE_TE2z7C6-gQ>*!r{-!`Ff*m-r-GaqNa* zsOQk4N)ap8XFY>I?f1wT>8X*K+9%xH&l!Z3qm9=L%)1)Gz661I=4E? zLn5jiycitZaqB5=Ds@6jmzb#6G^y468T0795{vbv0a?Pr%8#mQvcSb>k_lmSOl=LU z#B~t>84Cw5RnNrS&76xmX?742JA0;`z3_UhoYedhp4!|vesk2-J}2V=2GF4I&N&6o zqe_?#y)yRVEUf-r4~dts_=wEokVsvqV;tD9o%+u97{!1)Kk*-zl(_@pNYf zPzB6?JJE}~##F%K^Il1UVnwOx2 z;9s^sQ!A_=BQ#~5J_py0l0Wk#DWBJo{0*{jnWO~8GSa>ElBH%`N;(F*Q%Z3AJx~+u z77haJR{v}@#d7FPHLZ}V&7I&k2mQN`MeL^tXeS+RIzm$R`_<^bxiw?YWGc2ktxhQQ zTdOO58N{Fz?bQA%WsgFDivh(7YI|O{b*$)nRC}n`J5=Gb*LyrZs%2T*x<$smN^Fr9 z{C8Ffx#Q68vxd*dN3n=u(ixVR{vS_eItGZ4?5@#o`Dxe*1U2wc#C%_bZ%F_hHPL%@ zm`C3XQDZM6J&oo`8sS&_HN|}$f1trDS5~5k;F6_}Gww{-<)ZG6nP?e8AM!DBramn3 z8{K<|jvG0EJ|S=iNr}$)-FovuCbr_rA7Iz#eqTQVig$lHg6@V@bZ(Ab*OqjoaaD+^ zGx!SL&ZMsnlPB$bXWe$AVEzC~!0#XH7;)~3Ecx|B|bw_WkVSncNz zq#h+WY`*KuVG9VJSx)CN;4ZtMV4X!zJqnf6m`14Z(`_z3Zek3 zMJbq>s2{jGqhh4D_jWi_W^fiqw*e62jP5ma-zSab`>v$Bsf=qW*8mb2!9rjc#qWG8 zf@&$;gbUtoqSBaN5_EnNQv=dJfiy8(a1VqM<6LiKhMP-s%D8cNo7U@2fJbw_?^eOv zml_B-fr7r5T%z?%(wo?BHxxJPyiT5*VCba6gsb>p6R&` zw+5B~rzl=Xn#6VAXir5bjxlL3Y?+vInc9&f8AaNeO!!DuE^pCqV1ccMv4%bzx|=$E zHg+zu?j7B&c+jFcTcTj33p)JF%gh!0k$6gXxpg`{(8u~0Y@USb^j!q52s2>=OL5X7Hea%4i$dbuJbH@d@vb9gY@cOMeb9E8^{TEo|+lRFb{tb@BS+n?U3fh|it-SB>+aY<5ml@a6;3ECp=(hS0(N zKIJ8B1)!)%=5rYbQ4m|9sd(5<-Y3ZSLrBn6rg&X((}%0|s5K1}d}#jajaX59`D92z z%2Ckh;hnCAM(OkmMcD=d2(I{e%4Fj#Na*zEt2hknOq1z&R@g`Rix3g7eJ0YIZpiFw zf+aqWy&6B}0TJPc;FL4X0d*|h7cxf)Ww3B^``hBCDE97W-{$`Gh8y;_JN8Ky9+FZ=&JEOoNH=3aU zF89dh!YD^jerHY+-CcinG{P@w&aaD6%fz4bojkuipiK;|DVp}Eh9%9i5WoCn`$NIi z-+_KXYt3EnEA)#9Y&IhefvyJ)e{r<^_dW;y4s}q6A0Z`ivl4>$pUP|o5?v9;g)kU` zLA3kU8(;VDwH|9G(QH@&zmgGEs&`A6e0JEHe3BLe_4iLlj~$|4B~AO&Ap%I>f_}d@Vdo7k=#JSLLh@6h3QH4-yaW4?i&%d~@r6-2tRl2ZLA6SH`IUfSVQ$J{ALSC<@Q`sI&2tEe@EFC5&#u1~qNM65I`Yz0wGdLOh2LUws3Nwr zl|FC+{HoR#AIz2JvHcLZzwt0O!`37yjkeGLDu@azM7&ndq}S22+WcgGQ(R1S7UV}@ zX?wa0Jn9TDRbQl24X6CDLr9ud^v;~&vBr*J*YCZn3-9tN#9tQn&)y8)Z}>e{iyLWLOOyo&AP=xnJdH6#c`_&rdpccGndN_a#zJn~o} zf2u+e(7M_U4Y3%~{@}#Ou32{tTQ|DxJWrapSvlG{B|1P4{g&MY3zEAAQZd&3fWZ=$%$Lmjl}#g>gjZNOY?CuvN2}%SWhC zUGTw9X*lctb4^c%wBYEvalrx2x|MzjfQqYaXSM~Qk>M+L)O{msH?L49=t(<#4~&~< zG6-$9(jx*O*nosC3$U9r+<_qy?HSJ9i8wSgQ$AkzEa3{u(0EQ7+*}dOVHjkx%*Izp z)W)v4JPl;S1L-PA>J{cV=;o)5|3W-pQ64Fkifyh->Cz@F$*|0EF~Wv=hX9y9L}K;L znvFVfZX=@iA*!kBo9!qeJ?}`L?sFX^dS;q)KRqj9u_WND7{Wm>*|C4OsTBIP7(H~o z0%rV4Wa?A}=LgauwU}ENe1YsOds($$fvU)5X7V`Maoh0`1HjwL^=E)EkdtZ(Jmk%B z8!VWli0I3FR9Vbw*!KQWW_3@OG%WfJCTvshY#aASBjh=e@@oP=>b)(d{SW)qmsl^z z4Cvo(2O`Wq>Se%){ph|4>X2ARKqGndd=h8J#RR+-q}G}rZBm;*&-UI%;@=@i&oWZ7 zsEHV|L{N@0r?03G5$}WpMC(622KJ9?uK!AFEx-}g+!kSYY!q+xu7QTPypWc4#c#&S z0TFRFyG%M)I9$)P3vYcHRcDw<_r2KemH?=EP4$;X!}?29@!zNiWWsKe=PAA3ZqG?S z@H=3PYb#9g>F;)nd81FjfI-gC!$Pv}u;AHfcgG}jpe%lUA&fI>X0iLUA|_h$ev2&_ z_Tguo;BCpm*eVk+Us&dfp~Llb)bMZ;+1a3h`=HfI&6B|?eQEy_1Nuoi5gGxaq@RkB z<^!Mm@@~7>M7x9Chh@D;J{A+I8b^AxFY`bQm@Dqx1xq_n?m43d1%C3i&$?$C65;vj z;r=DghZEXJn?S0IbLI9a%4(^ATO_K*d|_J%MZox#m{a=cTF!<{X;8fKM3@Ug{T!9A z;GeBURGTC--{q#HsgO{L0avtDUK?~kugjM#(?JKe(%7u2h*wU(PoGPlr(AvKTyGxE z!k&$AO1WrW)+2o&OzT&!b6BzqzQiG#a?TWll(kbZ4bu8NxI2jA2U0TsFv{pKkqrFs zxVY@=0lPGo4pKWmhp0ubx*m8MeEm>VJnKgeiMAF`AVMY({&cW_1NW~(t)J9WUc-Zz zW4wxrK6}so-?bUf_V2=+*EO{tj6JC{IMs@HbZHTTA4BXgCDyw@%!uB$OkYB$gi+Y-O?1-uv068M=1cWTxjLfCNa?EqVa<`S;2rd$G_6lW_7f3(7 z8y5O+0D^lZe+KV9?pG@X0o?a5F5`kv@CS0)O4-Lm>}`Kz6W)Z^aq5e*G}Ker2zkk( z%$Zj7)$mkCJgP_I%V-r*ot+ecU;A+D@ZXMzbOwn{ewg+#p{(aEsg`R=vA7{&F%fJC zzP!-(KI01aeo_#x%Uy~%pR^U$yqBP=keyz|PT^^}-xAcE zpMk`3DA&RB6^!}@(L6&+W6j9J-@gLh1Nd3(LKLcAeZN(1iT-Y4LAmre*gO}Cqz?7o z|_fmswo#r_^l;J0SB?IMj^#IE0@N)oQPm^}Y4yeoov-)WeR597L z)YM*JV*d=OMag~t*mG5bKBL}Rr5K2#-Cji_v=JQhF{j^cC&<%rTZc*GF1@w=bpEuc z#xVT#R5^9d0p(eYcwjmhyDcM?+wmPEaEMpsEJQr>g!)xL6aUy#`(G}rlnjj4GQE=6 z5CNQC_fC^>5@Dz)r(+9LoWn)znuK;nl%8}W-iE|(p>;+8-1&;=G{dhwdLC(ML{}!B zMaqk2-&%NQA(5c~?9J?%t73>fGpGQ=Z&pQ?g*SOyw!GQ4+@%C;QHDNDelon4iRCJt za3HeQU24eha*5Vil0CF=wCJ;6T@B*OkXLN8*VA^e(;l`ENxAaSApTHEPkGOFhbY>__<>BsJ%uun+LPoBJK-FG~-uy6Id=&;S6 z8WE$$KVf%R9$Slk%x^@5y*Gy@gZerSniPHYnD=+~tIM5G#6~fF6n`aWFb3QJknDNW zudD`#oNV+B0(mKmQ)Z?Gr_HXoAM~aw#5byP_LZ;DgmSAsm7Sm64CFTQ_0vFr1JtWO zR|zlTTjPUmcfdVt)|`GE1?`@CG{<*;GNtw5<))b-?!6j}S%JZyM3b5&=f?m)bhYTO zFN4WW_m5ayBO#wq2mp2LUd^NST$`1 zIEiI5d z>BRo)=TPTv2j5S|9gNdZp+(0zsk7Ht8q_NfgFIEsWw&StL&DG`_l$|Sn zCYo74&6h0)vr@i0TyBW5qM-2wiV^XG*lkKyl8L{IK0vL{7z#hCNL1jTI>sL%DBU*9H>S$)m^>XO~dX@_F! zDE;I&O~31kLBRY1hCuPoQ9QG{*DBLg0A>qF2xCZwY1iFt#Q;=WPT}+JgWDE?;Ho>r zP2oeo!-dBJUTqrC;B`6c)$LZlm7gW$+=V`DC$h*om-FX}1?zYCE|q>*cZf)|r}66D zY=j&@_I@Mo3d;<`51|O{+uaJ8-A(I*UfPc9-PerMkB&O0-sZr?jU)OSS5H5ggdiWi$N2)B@xo|^@G3qe&53AlPydN!0R z^w~)eey8cUdgbQ-vLxQ{>0?f_I`@m(ZX-;9 z@p6h?@}idSlHUq-slmjjVj%+I`-OJ-uEJTPxH)Z-)L~>HMRE|tt7oG_L19*n%ED)q%*R;eV(|9OLyX}C?S7F_>Jpq({ zt-9mXRyc;f!V3KFxmtB<<(sj?@kX@rcmzL2Qq)J`c8J^KyS5o@!&Wc=Kv3y+lpQ$x zhU%;R<8*d)P4?=&F8|JGDV=gd@Zo~#OUXXk!VB$OB@TdhEff220#7tM`Vy(x1+aM7 z^fWSkjkCaaM$7b23&GD{YZ0cuCMcVGQ9HbrKZ=&NT9X+%EvVI-d^!Jd`h2^E_^JMY zQUDE`8EMdC#7BNmCF`~RGS9G6EWJpe{$Q$$rJXBl?(sgw@PA}5H@ENuT1~H67MKF6 z)~1+}^nL&Qx--wfL;E?g;8<~A(U@oW)@q-2^xLs3v83hO%LBGsg^4!?VV`!IN+0}DX+P##|fcdxQocEo{ z!Mp;_5c7o@jx$EYLq8o|tR0Y!%l1=Qz!v*&!5vr6JZmwoYwN1x_~e*LIb? ziP7_NfwWS@4I3wzl8)|X-^gi#@~VXYTg9uZfr&08>YdVl^$!iWa$Vk$D6^m<pfbJ@+# zYsj>Qeg7GKNeM9Eck&fai=yOyv8%DOn^mnV;P(Lu3uU|B^j0WG8m8jE%4qoNh-dR7 z&z~)H4V#dX`BxrvtJpW70PdRoI3+R{k z?N0-;-j^a`KMousc26RIM`Fuqj#}L3yp-lJ2H*NDlZgIzp<7#)otBlz{#MDbsCvo1 zX#!I&--K$-O`5-DzhI6;%eY~sSq(Eo=UcAaSL}ke-kx7mL?WIcTC&cjpPArLkJB~6 z3SzpjD*ugv{8LXJ3w+Yb$b$oIk-%R1lvN65_TJ>l1eDwrE7WphJ~QGS&59p>{E>#s zFSaBQMIrGAPzL82=oQb@?3o1wIoAQ%;&q|Hv@UOHEq6CpFLLLeK94Vm_ps!$DZ70I zdKD|KHm8K{VWq^I$iG_OJa1s6dw9>>;TiC;_rn(ltJmiB&#g;98ON>(!NQ?F zzIN}*Z$9|a@=XXTz~1;(WA?ixBiH?DnX#gjEGsX@e<)v&hU;md_$;m@{JR=b;K^?; ztiMvQy-p`A3b!)#Jw2XksVe$p)9J@(dAF&}>4G*tCd|{Mcm=*^uY)v=QCG zuB4{bm^OUK;Yj7HCQ^Tk?YQ?K4x+gl7l=1AmcEDoEF-!{l0D|jbR;oza;h5dSpsY% z(X!~C#r2AdkQN#OLXKWd-?N7(@@cpuV=?(bb~cb2eK~(bV$jS(YUjnfT>{o{ z)qv_h3|~cXaQs)oCA&C=gJ8L7@QIt^7A7ok5-NfrOXSiLIiGnBA!x{eJ< zfU@9tNt+W|r$;wF4f@b->J}5?g3??Gqm&X4Z~w)~&!d9(9Q&5iWzw^(YhQW`cuHra zt#iya&EObBF$2|3rOxbWpT|#;9k%y`WEJ!81h%4aImYLvRE&)D)Je-jQNxk=of7{# zq;%1wmlLOY#*fh-*k$2k9~)j4zGP;NldR?-FfwWsOi|1(g~mc6ZXQ76P`1MtBkqeY{<x{OY2>McOU6bHDbELxY>EV}T!D zgUk@cQ_au6bH=g^I&T1B$;@xQl<$0PoyjK;xW{UEsdaLd8pq#M_%fHB?UJ=aR zKn&wA3Rwf8jr}#rF(0^yk8`q{OcpA6%JLp6NfRprJ8$MYJB}4;qX?Ch{Ws`RtdMK>NKtc3aGS2m(%H+ggbk@6Gx`i>Xs+-B_ z;q^ZO(5>=c%Bq2(OsBcTX12l|PXgyA;0cH&%c-vBAc-8PDJ$7)AD==DppuQl3zZBD zKXb_dp|xfP=dm*ZHQ*$VNdN!sos+C04r`68VB&wU!c?tD!mAPgamhgUE9%vM(89oH z{}0@k>c6z||NjimLFdH$zoz8TP=cG6S2|Z!ClL%@MhnoD#zB^gqluOM__2Cd4pxS8 zY(7IfhaO%%i`WEH(*W*#rf*v)Jw8q^*ujJ6I5@o$jUPqv@i&-I`5ca@Y{RLK7IA0< zS*vnyb>u#tWHohA6XU(l#g_eYbA4Z>TL~+l12(%2|2-cIfVG3`zBZmhq2bmE_MQ9A1I%OBfOF9v1oBer!|6)xUZh!Zgh0 zlfhc)BU}95-a0ckxAR~Mhk=lAD>FPE!@y~axpQu{tY@14Ca6Dk+V6VV!YOda?j}P8 zA^>|Yd=l)rNg}0lCtqhm-vz<{Dgzf08EpmOJTYEkSLy3_=imQ6*MIGa!ch#56b?&A zRELjbj4Ac>ra7lHBK{?~yAlKIoj{t2o2Rfgeefp9=7VQ{4F&*B(_LfDADmZJ4rihz zfQw29jATMt%I)><3;f{N`Bp^nSS>9Y6cS~(B$a3eC4{%mC4pUHU1+*K-)uVrC$r&B z=->o5@p!zDj48?*MH8f1}HRO1=4pPI0E3n2NcJH0E!Mg9Zr_aaIV*R zA{_H2^6!C&lx@#pj`kt;-YJcebRaL|kl@Ob$SqXRo93(k3!$9(JMi3oqNqaiR0E%= zwn>);{FS(W(#vaz5aWqa)@eL75VUD1TP}KYBATS433P>qQj0$NKhWYYe~(%!j@K$G zc>{@X3taDkx1+AABZ>u z9xzCJ6MxwS3|(k7m%xIM&aQ<=nt1RJMhtA)^>XG)Z8C6$FkE{{bsB$U*wE~xhZ{8f z#DgBfQ-CxDFZYAt81%>A$DM2NjIv6-D@%%u4Ey^5zh~Uhig*OSFN~1@IL)C0pXj-g~ z6>za%#J`_sO88nyz{7g2F;6tvs{OsiZK*iB8tsNInt}WD!>kr&X4Q|+Yq0Buxt4mV zm)IBXudv&Elm0bJRggDR(pZ7gWO!J?o%Sv?uJ>}Js+L7d7J5XGA;34nw_eQ9Eg34} zUb>l@(yx$SzoFLOMAgSyk*zg8xPWW+2o5{jmly;Vf(;+ZYv+)=UzvO0me-|S{bEo} z8H^wxHTqQNB|0VJp@=iktksZj3_s-XM5C4ip0=o|b>}PTPE+sYtz^&31gOZc0(sC< z_)S7?DT&BmK=-U>OIlRhZlKng-D@94OOO)2d`?xYmp0){frJ0&#d|L?lC+oKb1n0e z_>KQOW~J<1>u%}%AeUJJ!i)@kf5)KF=&kQMoFIILe`28}MUkO*IkvosJ<8GsQ}jI) zv0=-6d8azkA`ZfiKg$gB-6jMijAlf#HOdFM;sv~ha{kLgTr`3fer0Ptf|_v$dr*1n zm4=OW>hs{tSf%SyGG#(X1i>8vs=lK%qYE0Zu4{_|QA~G;C_FLPo3wTxcyCorr zg2ATDJwhfn`DEq*4r%4{wV3?)aJ zMDiqXsK@tggj9n!Sc>@gkn1eD4{ch|_h z^ij)Gb`qTJ=PV}pxWQ+4j_S=`vL-vt2#|I|Y5=hjq%it$IM zgXRV<<~JG_!AeD6JPdX1QdrZXYKTvK~aDR_pH?^Cp`k(05nudPD4v^pZ`= zhj7hMhp{O8fc%+AAo>JnCYw#TWNdRoZSNB79^i*J%=D_{O!S@z?SI+j>3dg@ z=DPy%wW@9b2WpcU@Li{out04npYm@wXzVg)fZb0NsPcB{*1HG3Z|uWJ%;#m17*65p z1xSX5=D@-1hqCZ_p_FX`QO~GvVOz!7#&UA|d^vS$*{8FG3A8?xyRT_XKaD?l5@2B| zr@#98^QH1qlc$N$@sE>`AJXZ6eE%4oX3&PopJu7Fq~7nvF1xaU#d`m&O zL+bcP&PGNrxg;R|_{+m=^))dIc{b(J$Lk|jnFLOUy18BVBJ;P8TRcHUK@PKq%B1{$ z;Fpuq&%Y#r%-Qqvg7|p!)`3jleP9CwfzF~c{8-hIa$_#snvTPh`hW(m3Vl|8+&I#2 z#O^`&#JUyui0l+-J=zR-1MBU7jO9WLh?~y7kr=aa-KHZxa5-iaqjuMSCFY_K!>NOx z9y9+Ra&Dvu4^fMKKf;fYiNR%JX_xkqZbJSIiC&;B2Y0*}x?1c{J_JuyqL?8pdUcto zUo1gsFx@`v>^43LVgttC4P6C1k(3g@r+hE~`yC-7glwswnu$=sm|=xcsKxSSl9I^9 z8t6UhCtmP{NQLMlcz19#LD)53o1gu9DU)_|g%x~>aevZNla$HmY5j@nTZhob(Wg&0 zpNM>1PKtnHhy(}3*Yg_{qrzkYt=yxoI#SN-pX#rk`LDeAjEbTZlGk1#7PHyW_Kn0_ zENcR3b4*p;TBQ7Oz2L`C{~Gc7lnjMU*-5In>iq>vwvSP-{X@&r)KXKf&^GlxNdG`9 z&FwCDN`#;UoZF)|%7_eb9^J-#e1T+vjVF{649F@mKyRxbH#7)f(q(9S_-dyKWOR08=9Otll~Y%C}mA^{{VVBXW=lywe}X@ zhPhJQs6{zBvBx!P*HL%6D2^14)LHMb*7#iaFrR3z1v0=65}F3w9F}W>O9u>AXL^i3 z@QK6YAZcHCH@9CH5E4?v`$|QcVI)}GlY+j(N06Am$0+;H))n6FwdmL6N1+Y8nvysA zxANVuZQ?Jo9zF63*%Ew%#%#Vt>M;h#b0-+jH5`T5DsJ?vd;3Z zJl1(^ZRBM5%-kh)a^+%Pu_<~en25vraxqs!#1EM+97VuFYDwhfksacG&U?p9VI?_? zzSv^t8RFoc;qdruRa0aQhpp_(aABES)69Xz*3vPjwo)9ERR-==fnRBpTVpbJCL?H( zok6%6q(mvXD3eB{o^z(_$8*x=+CZhgDY}<8=+uNGv=V?38X>25|hGskt5zVTsM;_f#58oU-lk zvt&kg1Z|0Eb^-1)h57H-{Yxt{!EKqyIMCY*3$)ggsUJMfh<-Jze#0HG&AG|;Vum?%VDy%e7Y;!$gQn=Ei+-nAPRmjd)r58g^m6G%OC)iGiIqE@_>Zy#3U z^VOI;wm5%(t|(M7{Pk@)Vs2Ph3|dfXM&#py<9=ERGsJ*AWOXL<4smLlI$Cx59Zd{H8>2V{KlPUw?Ecb9`I34?(LWasmdc>5VnHTQ?UNdy2u1w8G$buhu@ zpFf=>^hS|2ncR~_PY`^6r`pm65~lpkly|7`r+*2K*=}z>iz#?O~FCj?kuw zt<}SYue`PLWQc>@P_8f((!DZaCL;H-T@G3QzLj>;FR>mGmPk~tJb9^23et%IaV;;ka?UPM zh5evYvNFYsPA6aUH*suST!_uL> z1*_9pnbW@o@C)Jvz z;wZIt{1F3JJU1^FfCGl(P(Df28o*B&oq?_?Ou;1)HFVb(_=jF^&aW^>THBgZ1HSZI zTzF??Iu0sRpiT^=8U4co$b6yj)u`+-8VY3*WD+XQG-j~v5R&xy{Nu(?xX%{0s~1HM z@{nvW8pqHm#7@d_nvLi)S)$3Ynh5~ebNDO|F|nX__r(;GQa5*4w~5T)az_x=-MRRf|5%FtlN9LbrBobd840pNX+nKN1=}|J|;fa84j7 zyWRACZ4DBFA0{cXQG4zbqNqM>J6ygVT?`O1Fgk3dLH|Xmcqm%D-OBK$LYIHU2>AWR zTS`dnU^7x^V_A~yMv(OA73|W<s`G@N2-vS1wY(s7&-?(As67-&EW5AqsdN zM(;`o4=N8D+$kM4vdOf}VuK_Nz|oW9d{_z~CmGY)UjZvBI}bwK=c1#Tw>g7xo~@-g zxKzz=USXbVd1z-hLTf0wxr)!8C2`j&~B;PA|#Y9RE$>2(B#|vvXegv zQGj^dFFw|8moY}BF$WcYb?9;UZZ%rZH@(UZ8C~iaR25aEqfF6o?7tXioV0nZT$(P# za@#9y3$Kug*^U5ZB`MNeehLaA14IGt)5;ZYHE9?JecQdGI%~5wM&6agjTp-ze+X+| z>z_z#&6nxa!!=&$vRpT*3;-qtqex0xbm5FAvfmAr@;h3Y$5>U;5^14y zhD33!1dM(;uV83v;S^wDVw$cn2#Vp6v3HsNRZi`AHio`*z(X0W0Bi}jkTk9IVq9TY z+i|r&`T084zN45?V^8qmPfqyb#Q9jntxEBS`<}Jux6gV#MnGDYTPBL`7A%4{oL@pW zJdL_eChML_V{cFw9(R_KYGKBY2=o&sAy9$OyiY^5rhPha#2e%_gUd{5^>Vap0H(r97wo;VcBD=>SU;x(QOQ?UWt`7{!AeG z)+%KAz^q@%0PwjVJRz4&?6@myHD&aIQu9u^+H0fH`!_j!_#QA;q@w2N zH+3E2?9wPRSw>oBn_q`lg+dqZNy^%V=VXHp8;J(l5!d>tmlBn@A|Qte4$gK=b@%ej z0KN<{CW`J2YwVPe;>bs9H(Q(E4Na!V06#d3 zQx+*EDb8?V#M3g^iSVw2YL2(Uq7-hVGeFs&Ey7$^Dkq7r`lQCndO`pTsTnH`0GbjX zo(9XQ@L=ZV@0npLr%)NR1HZf((03CQw^b#0a#X7*wv9Xu2GQ?}&tPv)*@6=$(-ZPu z1>_T{zPyMRB^mTM#x@H>p&Fw0wZZFzwbq)t#VT*NPJg_v zB{9M#cr?v|=Gln9PFZcE=f)y}Q1x~0Y@X%d)ConD$NLuHv9b016fg_j$(*M>9D3i5 zFaFE7n=*XWSHfrenfo+>pVdhZe%E*hx}j%HR#JB>6Y@{Vy^D?lX+sVDXK)~3z2aF} zbIaPdB+-NYOecw~LUlP1-ly(Wj6#poj9}{3dROEOx0>A&M_hmh#h*+!*K2sT#l!o) zI`$P`B*AIr*qyuO8;o1FcEzU6kM0}gYWaltf3SW34;^nE6<3$+fi@Co2u^Uf;O_3O z!QI^*f(M773GNWw-Q9z`yF=sdy#8kH+_~?q_5SJAtNZLaXP>J2RqZkbTO7RR;h+k6 zh;=jiDEPDNFu?PSS}Upz0xbT!gw$bax!XNEzgu_MA)@(KFWxT7ds~w5=)iBkd0=1W zBTHR6(d3dOm%88e9|AHt_wPqEF)V+k(`xfqZjziEdm5@N_b0F+NPE9bkoHzImWBx%f&|vH~nbf$!`GRQwgiFj1l+KKn!|-%8?nV;f zCis=_O|`}je!Yl-mbe+T;$rfV!b#&gI)j>{raJdNwqoI9&vPHxke)5L2g2*3c`>}D z4D-2j+0S8X>kb#-rOgo!+4{sA@})Iriuj+Jrx)S1QPGp>EW^PRcJC3P^u4)WCd2OT zH4-~Ep;kC#Ep=@bxV+`I1}<_DXy9|903pkP@i^T=8aLBHZglD~LY>!HPPJ554O*WHqxm*Z051(u5eK07Fa5%O^o%QW1mW2ydJ^#P#dU zu!F-mhtrk;lSz5{&IYUHmVreC6l|!e&FEvqkYA3|eMTma1p`9K4 zAp?=Kishcb$=#z<;1!OLV9*(xF+_&TD_~GF@bjdX*>kxE?L#dIGq`nWtnk=gLLzT2HA^VrLLmWbh18K9)=<1C#P{W zgf^a%`&b*YYW}z%UxZ?IX9nI^2TLp~mDM9TUxiEkINco(04TD)8sq0Iq}_>mYZ#5N z5;C*p000p2@qWPtDV6ymu5Oa;ja>&5)optvxq3B}+CqKpc`F`eg~?aO_USOE+5S^L zwVaKSt(`34DLB60CK9cCs)<*)oxJ@GzcKiVfz_N1;wj>*Vc^+!b-Ve(&vR|kFMT2` z#m-dqZrV9vi>){KSqmv;y~D+DHQe{`Qb#o%DH4{7xOl^5+SgVyL1*_CQG?xDtzNZ;iSF|6`^5i(M6r(>Ms>*=M0 znr^nfuswA#Db54?s$wqhG!K^M6^wnZ81(S_Vp0)uQ{k;{%ZkTEj2I40YB1oR6ec$MR&YCAL*%-o1J-oesZR~z5i>W`z+T+H z^ED!@FfOm%Z#>uUbnn|vU9WYHh6Rme*t^awt(-p!nd{z zDxJ&TaR15&Y2sn!H@L31>oJIkr6CiCpMHK9CEh4MJAH31HQXz^&fD)2^9smn%({0c z?+uFb#Q;az9wRuLQM}a=cD#?*I^Ll#Q~&^ivD1FAG|`83Kra9tB%#Mq1meEIjE+5m zE79V3jbCiN2>1d>K-6_PA-Mcm)lQu*m|{1} zYf8g1AAv^{cNQSa=QLAys+sn=)|y36M|YR zjB)R@mVD;aO|wNwz0b%e=3;#h*|~{)Zrf4KKE6kL$_@9U{pkMk=Rz>>p`nkA{6m{6 zfk*y$RXTfJ4oR9NZ}uW@U8}fBuZ5#}eJZi~1Rss6K7sC6!n}Eqd#O zc>RDf^*RUonqyL#WABGmLn|`WXYy?z<2pej3-ll@`S!wt5I(ZMFt@Rpqb>r;ptIp(EsmIzx z?2Zo1LN+G&$ z=B8gp2!X-#s9F)}?ebmv4h=AO=Xq|x?}4ECr^}S~+kG~rq(8Uku^raD3@*kB3S7 zp?7ifj1}$#U?tw>dYW!p8oZwgiEK-sDvL zua>qHNgBo9$<@D}Kho-Z$~tNSQRf?O_FH1XL%93^aVNiG#~#+12~`vA9=i%Xc9cqd zo8~*{WBUa4t%euHFzA%g>N!IRfX>BfCmVvyKLeT*-`LM73v31(4DAG1y)}}p42RlZY%$ld;b?KG{Ov4 zwVCtalv!QAJ^BlF+_Pdp2;DnqS7o{92Lb>CKM(pG{FieKbeG5h&uJQt@W5N4T zC6I|Tp%2tu60qEG{}$kP0m zRBLPlMUqO}*-9mREIRb`AxcukxDLv6Wn%S+4rMu6Alhbh@!sav8uu+w~Qw zA4Qp@t;I|xgy#H6PA68fgsn)Jff#XrdY2x8x)AI$7Dey!dMiW^+h<(|q7-)~3H>j6 zGaoXPE^tEhHlB7<{O#DylRWc7S*zY2=VTfPzNGCn6PBqdkm1~)x|6e$9UxF7V+*6; z5Baaw60VMz7jTCh@VR=k(f+4CK-%c=8*sd8$Qo|Aneg*<>-M6+=7mMwf)s7&o15C= zWxEpqr7Wna>GV|%r98acM+mTaaPjl2g74w$eAwo@+~#Vf7Euidh^*!Hf&$QrVh?xI z@$Te#NcpCMMSx69P=DIE=|I0drV#L}$za`~LRVlP3Vhkc#zzXR2X@ipn40?Aw2~6; z{DR33yzMW;UUW8o&rsuVK)?~Neyfc1m^b_c9N2XtkLoD3#5d%d_!Zr3?Pom5lHyUL zI_HPZ)?GS5^?ggOuoMud>nIyEh7$kdfCnoWAja`7vl;Zj=KHCa(fpZqL#>|c=}t3Q zJxXU-v~z>qqfcj|rV-p|8(0nLtfEeR=lJLw77$2;k*UZyw^d19=ATu|WC_1y!V&r!?+ zQO4bSw*80GxS+QrnT{f&8vmVeM0qsli5DNwVKt+1RE_HV)h2;XiP)eIPl@Yg#|L$y z9ZO{A>*VEtj(A*xqm^hCln2r;5s>?54!cmi7wchUN}tQU%nN?URd3|6EWrlXZW~bU zhZB3c0nWXA5T=AKtN$4N2i5}lrFjc$$H(MG>X7s|UF6q}PIGs2On3L?0Y@rHUDa+N zd>U~$c5FWxT$<$^cI+!(U{fIMh9}xw@m6Zzs;>1;yd_#9v^?ZD5_r_4;oS0G=dqph zu?g2n*SGhh^OF;k&=&WiA6`TP;tp=|cMlyrt@>(ioDD^?n=`hWdepkLmdN|Ie)xX2 zM{AbuJtBD!#b?V{n6!-qjIRH>#I;TlJeHL%%0CwKdW7iWI=5T zTud0MBK#XUPyjI%CyJC{`(t?#8a4gcJH-oYXTO~Mss)puB)1Kw+2ffmA_~KB+$5BH z!EI=?i@iOXLHC*gFD(y9#VoiVA#E$oeeIwD_@C93d;r zv}Du63H9GB5)k#po`av9$HrQc7fhmSnX=bd(Ww9Qa%N<-_$!hx6c3 zqJ1ODN6Uvy{U8SbP;4s*3iZHehDx5yj0gwp3bgya!n*STgboXkyR31Bjc{V`jxJ*o z+TNAuofa^&aq~d*+uxgxTalQUTo>8(oE^J<^o zB_l*Zb`l`TOnlRTDZxzo!4yX?NSLiK~(pfuGqO9T?slC5bmhJx_XDLn18Z zJ3gs0saW1-%m#@vli7C1@m9W?c%;LR^??~$58j~6ugKd!HYbCUh|qmmiL2Eb(3$!| zi+O#O3hf>rHS1AWDEfCrPOki9~sb|mQtD(f$g@4nX5)bGixLpo3 z023%F3_%;$pT~YU^{)S@)~@AUjr)hE&E9A;HZ_&ynXv>8MMe{8snuhCU69Wh%LFH~ z4et900N1OS2;s%~but_f>=qZuk#Foy(?%<)!)ppU)8=Jh4u|Q?M8V%t1U46Aw-EQe zV=ALh{Lfdq4$7w$Z7xT;^*fY3+#SXwEMnWo-Q1g1jSXi|C=5W!#NXTUn(wJ1y>JWf zrt7&13Tyo3TQVe-Ez#|$Ai}w&9v*v^<3#_*;}*n4%=;w4EILWk!TbsG%`1efP&^0xsTeuREVQbLzm$XlRv#7bu)3x%z{If4_=a8hfjA-cV;M_NfCu(+?*GprB>pm`C;HwP}>6J5%C3!#VHN*+$aE&S&ncFI|i zh9XMv?#aU)GM(m$v|Unoptj1n+enO%x{DbCiLs@_za=lc^SIoBZNwA+Cd`iyzD#}z zulJr6GXuih3*yfIN%Gu#v5}J$5=HMg%j@JMnQ+DC2BKw=XK{?D9c;?%9$!ycApk0n z#b;#aomRtbe`A&pDMVs625lM5?!yM2sbyBP@0E~VR+IaLykQm&{!xV;X;ewygW%AF z^C8l8N_mtDPW5HvHYUah4tx4QZrM`gw}VZG>I0cK988B=WBy92l?b7#oLYQj^Oa_4J6q#ajI0uo9s3VK9NEEB3+jxw!C;-FN2Pkjk(E- zs5eV7Lm-xW_Dg`k0oQ(B-JUP*-$LXD*mL=H!Rq&wD`65-2Zz;$YqmusRS<~W>H3;NG$2YDeac;`|0*q@1rlvIn7&Y_|1$GeBQ%GumV#=|G=Nijo>UmA^T^U8S1fojb{+swOFj-#x1DA^K(Gu zEN&1z#Ia@n#Bu?z2?SAkH5txjd2MSZ4sEZD$x6F6ExB0)_q9=0x%+l?lBsCp1Q(@n zH@k4a!gJBbZO^%wCCik_E)AJNWt&^tk)?;)*YeIsPl!{kzRyf5+WG;su)F!|%E5{n z!HS*dRfqNRDR0AB9=canD&qP=$9^)_TMi%T&kH51J=3h!!5i<@4saD4QH~-_s;z`S z0}V?p*2uz-qjBzWNWg`Q1D9WT+^}3etnoVRVUB~8eic;{HYG9Mc!1EFfVMK-C z^z?Em3pwFn6)MxctC>jcwLSN~Z1-!lWq&aC#2YICk&!l6XkrMAQT^1~w>DSKWL?jM zxK&w2E>w&F02>2oy@v#Wb5rU&_?&=nVQMpglJQQr#E<1M%p9-chJp)kf|xGK=Re!# z)EB(st;gL;Ix@vY<4uhm2oZ;C7`#wNT64GO_e?VAKwo05t65qRw0aYC3o>wGz!jU&e@~ ztJe+Pi}%)^K@&d+uyb+HY=-yiI>2G7vtypZAlCaS`HogHA(i z6S(I%0Ji~x<7J<27162I7O(8u4MaHRIY2rmR9=9T6y>oh6Fekot3+>y&=Q`pmECs; zfDo1`oG?UNY#RB-EjYUT(Ugn&!}R3ieQjgJ$ibgF>&5)Gdg%Rrd0wSW6gb6w^aD1` z=WNE~;gj#)H`*e^vEFVE|JN?+rjGWvN(bLu)q&4cGl~(7o6nZK-k2E`^R{*NSpwwc zxs({XBBCQc0!gJ7?SCUvb?(wB*n>Az`69KfdF|u+SN2qJa=k;xq%A!-lO8uG-t6zs zV`@3!OlG72e@<)-syeTH4*qiRy+blf1z*22=Rg&X6`tDA5)0^=W-N75y0VFg0j56Q zl^%S5h7e6e6VR6=cmDdUPEF?8KF|8%=6eQ{N5hq`#&ghr2?pW(gu4a@b6y?MUCy$H zH*K8;i3=&=dM$ijE$&@UYV6?P0HsaKSF8NVx0~eSeUlTy3`~3xr`HFwW(NMONr`rmRa20y`WCeXa8Xh35AEj)9%l0UuW;DEFULDC? zp!*1^@TsiYuelB#UNp8C&&}Za*P;;26o4|Dzz)qY{ff6S@H7A=NYz4k@Ewq_9D7kF9W~%= zwF)aWObPmK-1GWPpemEYsx1`@`G{52{1$8BG*gc+VG4i>Ek>E^0keXUgro_RoA$Ce zdc4_DS#i?+Z8l*!cEQ(;82abbqZ*CNxE22>1Rxk)B4+>v&})Bo#run~WaQKvG&qFH z2}ltqL=n-m>b6wo+Izf2hBbi_THU!tUv#T#tJ#bl0tyq$xdH0U4)_@fnCba;zvOa9 zX5!T^W}Q4;8Na>jkco;mP`b{ElH*|&TsZu;*ub-gSI{}1SmRXusqlG{OPi1oHt*Mc z!^wqTR_B}9)BA1#0A<90U*BhEdk%eiSbBE=8|@dlELM^K18sw7AG^VFj^6NRd?VStx-*t# zR#qwc0&e?c78)D>UFoSPV{V6e401dQH5!c0T{IWvL2~M6<#26gJMzSi#A)(ec)l)w zuR(B^IV7%9Hzo$u#p6w@rnr5wvyjVi8@nnccR;K;K@QkF*|C?#)|lv!Hvj4bgs|nw zdykm`<}SDmesT4JsQLTZAltT4<|arK8j0&X`+)#?q^ID+7h3}tO{Sxa?Sg5E_=Nv%IR**hpKaa`lo8j% zq^@Pwhl4!<_~>+erlv5kT_(k6tNWNtP2msim)OF> z`k?VXILp;MgJTweHYxb zd~U6>sgdyga4{NTS~*G5`26&+{@&rQD3lP_W%%<;;#^=@TjwUY5R0WgD!$7ps{Wq4 z)}q4@Vy>1DDe9M6CP1{@I})eL;VAe~XqvRR05K6Y9^`P{(N(R1EGJuI2kcl@w#=F% z_>_HU$Zs<|CNvUL^QDllzd^)?yIw+_(D&2kj8TJob5&pwbSkKpS)q;lXV{w^Q--Fx zrj4h`R7usW9{GfqaZ$dGk)8_FKJ_>pEoFI9HIIl;2SA}2gsx2e@T6(zA(hUm=$bUG z8i3-0ij&%+Jc)o)hF$Bzv=BvY{Fete^~Y`taWxN;$6;^qf!p-N(0U8dkJdAs0!vgn z_*t^+L`#6?dahwx;v?NY8m{5~cC+!X0nz7M3g~UG?Hsb(Z(TAKGTn0`7yjpXBDIgX zb6q?D9%U>#h19ME0HE^8ekX1f*M7;Mn4N_5K;Y?1C{m3b6_7lg++3i6(adSGiuTH8 zwyH`+0apPILL?B9yaX4kvIVh%>5rh3N354|SKU2E{DF!$o-tQ2ypTHJrXo=c1$v4N z5}u}qSZoe7Bys+%m0&7`MndyB{MlP@y%MPk4-Xk&B*lFlx2L99dUn$*dYS~eeo^4R zN|ME{Ue2EzJDRY`U5;wx{C!dFbFH)@=7`W!sf`KQdR1o`d~STwuarJwlb=;&p{>pL zz@9|Hv6`@kosoVhzzcM_o7K;3g0RPEX-h8`TTv4}iWEk|x2({Hi=Ia~GZ${+q+$Of`_Y2lMeC)y82f@Bz4?K|f2Ua(nhp&jJ%)N=*FLb5)#M|>Y z_sMF~j*{w|G*!XaU*_#rbO6Bcamx6)4wISejP8a%Q2-($jaISaa(;X?uFr6}qS^)62LjLDCmYFI)#-`P?M+Pr z6si(phd%x<`>b7>H+`)a3hJSQx99T9T>|kwqHyaiicGea4axh8Zg14MsULdMaGJ8; zB%nvrXXf^ycRL87F%Uh->Rj2?NzLVtGF6#^C2ijUOPOEpX!9=ucE+pm?=ew(q9^_ydR$)sy%6XpL@(lx z^P7cPPk-;(2><}+pPo|*M}aDRqQ|tN)-u@VVI)Hw9R2yF!(O{WB?8#NA}Z?@g30gK zZF6PFe#~7^0Ac}|r+fOVi)ak+f#%`W{dGFN#NfU0@PzW0G$L{23qD#W==|tCHwOhR zFyf(U^UmWq5B3BGGVcT3rhyEB7Hf0e|H$O8WTm_ZIRs$m&tBD}HP>4i8cgt|Y`pg& zoTA_=>tUd2FU<}fVGRD4p`4{^gQM5B0pIMi_i?+`ixX&oB~F>oOVXo9;G8mFC0+XJ zxpazjS-fR1PqDyc4~xsI5Kei6R?o95EP)2LKbMB_w9`UGybJyg{_pBYV&3|^KVKG) zLb%Pd`=AG}58U`0&1NlT24d_=8EhL!pqJQvv`5tWYd~lKPn#G~gR%prhJl6F)5vkS zQL^&Zt%&%8#XP$Ir1O{}k0CA`1nB+B7 zzU0jF^B6I6BsYlsT~nRxGf1CeJKCPO9>!8H&ep~e;!aL}c||Mnon%2sJ{KVXNsRya zoVFkiWnvkM4A}+6<e#p;M&a+mlNB6C&KjgL z(0($OAW#pUg*@dV-%RPxGiHQKT4A7F#*?+kIMVQJe1)Y$z<>l^f3 zM62*JE8bUe3BTJZV4>llq)V?pLGxh@KtD$cMp~Is9-V2dfXh5GY+uBhzJfG^K+U`g z1e`MCk>(L&|0wy1u{)wd`3$~9m|<6s8HmKa7#{4;DspFNEmhU&}qhT;Sc-9`9jp=qnFU3QJUsA9b z>bgV#A{-7ID-8`Q@YDk+p`tRzHl)+j!c`L!TbRHOPPap?7t9a^0yvV0n3(foNHf5O`tap*~smNED|jo42q#{0+GLB^ATVaqtkSyOVyUl|7z#~*Z7HP}Tt zXav(&?G-BGQEFREWUoxpOFvg|JS}YVyI)puhp4n#n|#MeM^BR1bc5^s2lHV?)Ma#I z6UDgEtPO6YH9XMD3&X?9C+!Hxybk1-QKk=VM34rcq5CUMOMS;Foyk>SJ9nh?EZ@@Z zO3v-;;nwSP*~HMnb-Ef-;8`CSIaXf3{@&RvNS=rcIEZck^VI)hf(NI52!U0uy(IuV3t^ECxOe_J^JAf{6(hID<4#Lpkv}bG7p5{w6 zVa?~nxRB3`_IMu|lU%&3z~iiZHT(oA#`Qn^0PpOG@_yK8_p8mG;UTizQIun0jpP?X zk-_6n4p~{KQk~2ZoUm2vKGzR57>|Vz{TW%S^(BAKfS8TZ&(m4Xxsya|;vpX&+TK$Y5Hj*w0H25-Y@A-91gfO^1A z*`mwwTfMEVwbAyJ${VawR}~zAZ)up4{C_np5OV);StE)_6;iI_fdz9xJ@5jIm+L>K z;#ji3B!hbM=pM*bvfcf1EnIFFG%{73A#x6ehTB$2XjdxuFLl@r0XmEv(e6kT26ztT^&8v6+#jD}HCd7Az3 zL+TgyZg3(TWw|bw(S9!+EtZ02i(~Hy#UokRx>BHl9hVV+;?XV@U7ewal5THkMi0eT zLZy9b96O`hb~`xn^Z#ohbT+tle#KIoe!H(lhWs)3IBKL!ekvHec;GfHM1eN4)@=T{ zlvGW=v0S@~Dl(6XRs%M{ao<`&vjlw45b$*w)y`n5qY7f!OYx$Y1K6vo{HvLHD~`Rj zW&@HoUL`Bgjr1yDEKQ>4{cN<&7V^5}$@jiN#t3r>hbc1b9ovo_JG6WC2<}87lIwjE z^v*(8C;d0g|9R3{7gQLRJrti@usj~NtEl3EgX1V7epjbu9jbPL%Sl@Q5U1otHQF{c z{_&-j&ZF|B{7umAEzGy1(w`rwx$0)oH=?6nVc`0*n>i{_Syh#6_I><$GRe2ux?ewN z=glPi2eEF8*PFbH|J4TU$L@a-fwNaA8b6S61I!f0nt$DyWBXS@+4IAN!JRC01^tT` zM22HBC0z!gWEA!{E^$RgMbdaBHMPaNQlli=Kw_#$wAdlg$>~rGw~_RJSv8Q%lq%=$ z=2kF!+>Hja8JbZ|4kuuAIj|V2mMnxJb6Ga7AoCCRN5Fq9OT*nrKV8sPMjW+fDHI8Q zyxv%wY2NMp3vK_$csK%E9JhNzMj5DiHDl$;(cH)$9#;~J*!{j26Gs5s=FW*Bp#hEM zx(~76CvSb)rW@GHUtn3;CBEF$IXIRX%e}XJus> zt}s0ow5y=#d(QLIu5eshqvJ2P0E3P}-xkXq2N-TUcf?4q8fX=f(~LVv!XLrk6v@#d z#CFnTCxJO5;hy6K7LL6#|48xwl_Wq&sqS3{luh4O^0k7n=Y7f0wKY1`e+k!$Ob(Tn zuCO^vsg(rM%9Di^m%;-K2vL<1yZ8dp)oK1OEwJK2QK{~qM3$ERXfV2z<$etQ^FYu8 z)*VwyQiSpAX-zG#g|hW{_nkWij}20Q4|G!KLGH<>G$vfr`5&L6aanS$o0UhPLO ziWc)v`C}L7mi$)qi6su!mTNYSY`BOaqQ9t8anX#S!wtom(&{M3fPvuy!BOUx2PTp^ zyem;XwhZag7Qg=PHIA>gHoA|*$LV4*i0-Q@^34B^;2eZSw2Yb?N>BoR>QP=?$P19r z*WT5f+@F*CIzQiGH`>_WD3;Ig<-cZ_+sG+6C_SC@uBO#8;d+WqJ<3E*?>Zu4WU#!7qoxZO5Yz3X({A5T$l|5gaP9D?>fLS@ z5Q(Z58%&E0>d6zE{HNss5{)rYoXFL!lpbocI2}>Az7(!;QJnN`6Z0jzgiP zHxF^Yqb0O#=!+Si2l1^071ZLwi}Z&*Ff26ZgK4js;JAgFm->1(6-rDXgh;po5JHbKG+;XoO~iGb>+4v}75c7* zIdF?e+p7Hby(M+1Km2QO3is4^NNE%u?KGXCb5S6e%0OAhi8OkE@BL<#RqT)Y-+5^# z3vLiXi*C5P@DUVji2M0ZImB#8w#ybDZ$P0)bajdFa0p6-PQ-teP(YBaC3)H2A6#U% zT20jIRs&~KSKl3WJ^btMdOR9B8@2-&&y2>*W@%Y$4;s1&@wkfHGlW1w&;EbI{Hh9X z7T^sCe5*jMJj6(kGlXWvx^Bw_I`EXI^tm*gNVdYlmj&aC3%c4b%VF4Lz5pR%%M}wt zijZEgAI;{|@$Kb;*U?Z`pK<}7njD)D2T@C7ZMPWjBZBI*W~iG*mzAdAsm6<=sDLF% z@>I(JEO#VlQXPC(mB6~$htQ3Lf&B{(OcH2R5C{YtyQCs(c57RSomjW5TS{5C7~Vlz zmG&-QE5gR zVjKBf85n%XpK4YtIHDFFR*l|2i7*z`Aq7wlX4Xm(bQsll8c5S<=((RI^}=~eYbNr) z5coX$>R^JraNu;AZ8fF;B@u`Q4#UG8#>_Twi!JM!gHvSzcVVC&#a@B_?UMNgf2GZ; z&A51PjEl4yZiTntD+S3xK zeuH*JT-H)%Hx^=C9=v2(?%M^GqQ#u23g5<>ts0q%!DX3s>u+@Iu#9i2522W~%liZA z>AUh*Y?S3u)dr%z-TzSuBS+xh!9>%eF9poS!H9o)McW!Gd`Gnkzy4 zjWb*)fPj{=(I)lkF0-54{=Ei$6It1-|GWDR+YKgz(LDNuMyySB+x`SSs*Gwrk-kM6 zYx}$w2&0qI^Cc*otOg(E%l>8+FI_DWAPP&4nb1`w4lPCHkoEFlVKY^Dw-CxAp(SM{ zZNa2g(RHws@w$XldbbhqqfCdlaXBH6n1f@$jb0~eM4MxEX-=x?C$=J;C-xejdV#5Z z7!n2iM-nh^X=$$5jN3>&c$}X8|HwEgInA(402~G>RIxP?3J0R)wfEP?%Z4?QeewzB z6jbCb6(UO+1CIi1d8_ciDYl#vsl+mdHc#2@;106Tkw~E@@op9p*4(HM8={10mSZ+y6iPU0L;>^ZPzJ<%QCPI7RgXd~F zi+lUk$yXJKnIP(-vNk(2xMK^Z_~>GE4N6=_6v18`SY=g3 z7+AV)DJ1z8sSo_qmViM<)_105AjD6^p8ILiY0Ih$+ONS>MrL6&HP&1^{2|c!;GxX4 z(JxKsd<5m4!4kn}>fvN=!il1hO%7b`li=PeNZtv|JULYi{J2=iOar8(y9>XUf(|cez zZ{(5;@kS3HI7;^CJuRHVUlexa@f^u!$A_kd8R@Q_6ORlIy_RVGiaUKM$B%g{@`_t0 za^ci2Vw_U3eLWK+W!z0?tQKQ^`akZhV-uz7yf=eXhO-urmyD|nUtF;I`|rsryvG?V z%Iu}@i(xGrRVc>P_jc6I5tsM1!REs4isj4f zi2IT|)8sRG^kJ~CG%&_Y#G4>d6RUbhD|*eBQRU-IE|WWjKbOFuHKCpGbN#oPCI*M! zH{7FNuBS8IAL&}#GBDwWW5qZmWn|3R?$s7D zORHI^eg7+3C#~dqtvMguHnW_Y@w!}<@711{KzY1h;>ZOY1VrBFV$AST;Ttx=PwL$n zB-PBF3L%MjZG<*+&@VKuW@G8dZdvplOBMuYEY3Zwv>0Yc>!qY^#$e>|CD~}`CuoqY zhS_?5uC*KbQ&m$r4EK^YRfJ{s^|3r{@-~d;Mx9Kgds*=pA7QFicIs_`%wIpc8rN%l zECCyQo%FEOJm*bq*B1)KayVW4iVnDCP|mMB-Q^v%MjAvfdpFI;d+Fr4id%vC2~N6( zUZ?-5!CM=EGwIvkO`jh)drshj`HeDnD#!_>)TNVn=?(37$662KsBbj$nr#;Ox-pS~ zqSVv@1+X(I-bYD(V*6FqLUw{5%VR$4&3@t<^t;O@Oa`Z?A zh>P}r-ubn-pS^}hX#7sobiJQ7gn5jclP5IVeAz-teI;k#6IF@4DJ#28<;T{|L@SWIFzDks^nYD#39j!NHnH^Ca>2~N@7l?CTJL=^ROW}jM9Rp1n5|a~+(>|c?22J~P-wGAj&Pcj zPFGbhf}eXsDMIfCir@?SCieP`z$K(NX0f{j%$ARK3i>@W2^0NiY{JWWF4oX9xab8* zUM_=Jxy9+UEwUsXeOwYi!tM~}pQy>2%us$Cvtt4Gd{cKTJpbxUg{Ml}>A(ps^pWGp zrn4M-rRQ2vQNaKvSqHfP9s;avLxO=!;7HqQh7_h8a=$M3pR5h|F|GyWCXWRGRkyJDL;%M=K3{MgxLy8-O5t` zrxqY}Z0uFI@aA^-&unU=?w^f8aqRB*sjmp0Ivl%J#h`Ou6M*eeyG;uUi zBWvkaH+79oC$+|!aw)C&9h5n>>8*Sw4_8`VE<)fkJktv4!YX$iFV+%m64zffJ`xCk z@9fLTZ$`_}RjDEv015$JRBCaCa~=z6T2<&Rb#AM$@A0R*@d7XKnO`Vh3)`*Q_0=gC z3RdKuN0)>I07ygj(;hmPALu_G-v>b*uauL8db!tUo6b{-%RHEP1R%(_)4DHdt7TM#AMc=I zV=^5-cy=w^%J@f6>eUE8EsI}(C<&w0ao=XeTNDB&IO|qp&~_Hw8X8iOe|rv__Lv-Q zP?*|U;%{#kNe7u3>T5>>bNUCU<_1F%NB}~8vV zFlL-}_eQMPDe|G5M9M8*mzI5@at`j|q)qPr2BRFl+H~gXY@)!_3$9tM)N)2cmbMU% zCOI1d-2edTQ&|xW&BqooTGwp$e&+J}P9oWG8ykG1m~{|ICCZp^SZe5e0$4Pt+X!pl zjEF%-(Qr=vCEslL7a|pk72D%Mj~dqo0PA1vO;W8+Y4*2E!NiTj8WZ1m^e?g&5dpz$ z;jH$cCjW4pp(Mp6yq&ofR48{GRHfvH4Bn!x2O%9%7Z}w z(l4!RGa7RRRhHZ=YS&5t?_FGxU(dNLg&^zCzV*Mm6|F6~?N!Ce#ty zq(No!=BJ+VE9~2ae9ka)K(@8y)ZV!$#{?T4C|~%HR7843OARRtcbqgFv{ii1w-q#BnF*WO}RG1|2zs&p>x6NeRbgVx{xgle8P zpLCX%>C+=lx(PQ9DM^IE&acqbqXYob-t8e8lP~ug>Xrzc?AHx+tb zf66wyytO02Z5@-|et0`OG0RJ*6R#kq$&?>%1O&PJuYhLldP<@TweDjPPXdzqte{UH z^BTOI2BUMjGG$>|sM^&hMip=nt~@jxVg^sO90!rZPC-#^5%1S}Ct>J`eUv?VidH5Q z$-B_Z1s$(EQ9RkcbZsZW9VACSA}Kfn5b-*RHkC7})14Hh?+d#tzZAAJekSz9@Rk%* z?ZQp!lasG6Q~Fo*S?R_(rP5PR>IWJ&sf>6R#D^znJ4bz=EL8-LYIk^@9eiP6Grn>Jy_@Sy)Hc4qqmjlY zh5hwal(K<*p)KU$IuVt(Z59dKx%nA*@PQ#OY?^8`Kos3mE{C+vKeviW3`=L{J7L*TS{0##gIQ966!U#k%UU3k7uLbfklxZ>a_k5dMxeuFAhOsUSXfnh0 zN#SEJ(RUJd-U#y|mPti3uk|pWh}yY?q?;}hgnZnUxWjYs9)7t zg}a!7y&wF)UnJEU7v_J}f=J*_e7TE*)8`HsBGF-|slR2gNq^kwvNdSy+cX*Y+3n1f@m@T(sXNJnGYe8S)d&O_U*+PyDtw`o zL!nea`TDOz?xhG_J0J@?YOxGUA3ej z?J#Fw}HX_X|GT+|D#93#D035w} zT$4Lo5)Rz(jv*4ht(9h6LHw!#=N1zsGUii8)?rO)w|GYbkQIfj@tG?PNT(aitReRY zX4eRXFp3)}s<@0Zq5*T9^;i)29Jw&ugQ=j=2rvB2JX~!n(+A1jZyW5wHT8oTqpP(9 zJgT3T()n*0^W<&{kq}Op&xr^2pf>K2>a5i)BlGNE*_K(5XwRcO)3jJImz<>lVi@VS zD2qd4{YlOK8%y^FvOw-1%M$?{@t@4w-kt}Xv?YXEX9fRE-GeF#={2EhHx^>i@MF>n z>qk}n{NfP-D)!3JRv+Qf$kE99HY;jrkRgp6Wcd$XjegjA^4SjuP~RYTJ277sT$0~s zzyJWIE(dRus<@@-!&QP=T{n&{nP-*n;HSFE)|2W4$A`<@mVt0UYvr;1xZ*l9{k%M+ z1=?5}J=apk>1XITUAPUr>N|O1kcIU_5n&(fjJ>aJ5lPCf^a~v;J}bLg;!|5OB$M@RJmG|sL17n z<$X4bR>DQC7~c*CKZ%Gvc3Z5wAKeif72rb*7VEL)j_KG+t@=(`@Hg2wvast#YNVoB zl(4Vn<%e+E%hXN@M$rlCa!W4v$~J)_#PmKCgv$x2i(vO!Yqc7+QD$A_ z-Z88#|4C`%otT!UxgYEm7wese69fc=*Sm*MKxchS09oPt%~WJ&x9=4uFA{rBZ{QLJ zB%s_|uDvfkDpGP(ndURz7{MZ&-xx$qZlbfQkb6~{+ri4@oXJT58B+!}IW#*N z&&_x-Shnx$*WBC4MC6{y5#6-Afq@YtE)}Zvm;qrJ66R}}1AuJX3LkR}ww~EUT>R+J zL1aZC$Yjc!o)WMP$JWDrk{ zgwBOMo=d6IilK}3=~NS9Jdz-doL~8>gG!}J$YgvU)Ey2%9$DGMVoBA5``P;NOxZrt zHEWN>D12}(T*T=3SHJ5Nw*$G7#Rf%=lJ`eP*HqZpsWt>2^~?zY;B}#V*G+aL?|$U{ zfz%5Q)~Rm{8Wwc5z(9vi3^$f@Nnhz^yHWErTCoWNS-Gd@&D3m5L(>@)nH!B{)zW+W z7sJYdXthYW-iWi*r@nWQHXHlQHJYbTa3l$ww;iQ0ki`D#P==vB=W? zu-_*(?X!8q$U_l-XxzFlfstI@^pIj=FnGryM}+%_*;`TrE}nPUa6!vhd=!2%Egv%W za+$M0T>#z=E#FK8#^WhG769P#QxU01eA9g&4qOR0JKS4NWdD-8r&nhVJCmpguo*;S zKn6nX7@{$_i9nF8bc^NQ@opFFLo}=?-UX(8=O@(}|AIXgR74Ql}~+A%QGb}r6_*|Xx=x0;ZE z39>9+%)NJsZ@Y3o$iFUgr3*3>BZ_mq9 zed>{rhc@%czv8`*NvTY~(je6wDUt`Qw=!N{?)l)bGE)Z}6m%hZEt1R%=wRf~w^x%4 z%UKEtSnqo=p^1r!K}(Q@8I2cJyM%pA~vaDBj}jMb|R^f706!ul*}w`gXOLic-xv!Q*7iU>61 z;3-Gd?t#y5SW$_LG0*@2_*2LcBcC%3R|xu-Ph9Lc=9#m!oWn;EKmy3Nn-Qig?wwl? z=r7a2+yhr64r;@?qfChVQL<3hw_-hfK?ZmbS3fVQf~F1qvv07*tPg(+vg{$M;H_yo zIfp{IkzYzNvrZ~>*WU~HGz@`I3E156h2Gyhj@1jC zx*z0NiSTy0V39?Mh45SlwFedyn_6u|-}9c4tcm9%5@mk;`gg6=fsU2AtDd)W(i`-; zD!eb4Gkddj9p&f_kN1Y@2wj#m_v{lSP0;j8o0_g4@mUn@#yZ{zD^9I*)q~LhYSaXV zst|zMlO}D!jhkMW-#?t~!B`YI-PWXu;aGNq0d1~P>5NUk@v$l>d&l=xCl5Ie)y{Eu zr3uvNG5qH~3A~^dO>S*a?v`|FyuaAEJ&g`^0nl5wpe%ZGFox)$s03H^IDdY1#@L}7 zJj-Z7?rsv*6(Q%MIilct?%j^YuwEox3OrLr2|>;TePjaL%u9UEb}+ukKSF0=w3>Se zSGlbPNPaOsu*Yaxd$*gF`VI+>ONu8X-Eu^SK1;N!@c{r>a8f<+@o%UqFlT0`P_nFO zd;CDXa(s){3Z7Z3h6m^R`U;$Pja&{UDD-$DM!sQ1PDwYG%&+E5-V2Sk0&DIwPq+S# zN0(N_@{XlL1oBwj(zRz)i?_zB_RWqpnd}NTfw<46{#4TB65l!D02T365P2iG+g3n$ ze`ZW^XBrv3^ubm)VT6SV|Dezab}~YJIZ;H9`fr4%iMN_%`!2sdG>pT}&el)P2g&e= zsU06o`!nZ#eyA>FSwb?hfXUaz~A^>_wyp4qt!jXA5=X@}oXl83ZYpaUQPs}h zSr?UFU#1y(vZT8ixXB2fa8R{)a_COuhS+DGxG&PQ1yY51{QDaNN}NE%0bPk7iu}xN4gpU$h>zjy4a}zdIpJ?apqxdv z2@t!Z9OtiEwzfM>Q@(5B?HRw>U3xqb1tlwmgKF}#!4Swg*+NBl?8Ah*-=Exf?OwyY zR^@_UeNSr5r<`$sU#$)j2<}5Ymz*xV2+hH#>m)!@?U2$~mJa@%HskIIQDj%+vOHH; zQ@Fwvdzshk`0mR<3gCB&tan4upKf@{&Qu$VH2cvO+@sB|LCWzE*Db1Fzw9Ep<31p( zS9ao~Ludo9vk|pSC(}WtUhAIAqTi9e;EPeCB`XNf`Zyp_?5TGoJU$BYCz1g^q%&lH z!|M2!Ui!l4<3UuT(&lA$ci{QM(y?!BoV;AJ2o|l+^{KuxT(YnGX!Lbd6}ru;H{5U^&Z{T zT5BbF_v2q1P&4ScIJ8@C*87!qAm6i`>53TMw6T4ny*C(0*1||75XoqszXfr zL&WNtXLf~EoY_GTIJSs|L9D@h|7)gPvUWZrm6+!vI4Xa^P0Rir_z>%%5S*0KvGdS#H+hNv{=2xfoj8H^x9{u7>6m-8ss)$|IQrSy?M|QVwxAsy zki;+q=5~{qD7EWug2IeX5r}!dK7TeKRIgcQOk(q`UL;-fFmpSv3d`4yrTPO-;4tS3 z?4>dt^K3Xry>8eA%=QA^`&Tn!^<~XJ6Zi2SU6?EfFj~J%5N^+YN4U;v@aA{fUtB(| z!9Y-;Kequn9_9%?MI|DTPqZ`eo9nl3&MECQWQB^V*frO&ptNSqt?S2jNTL{UA)IM_ zE|Tx*)zZH6wdxG=Bp^5I_gH`34nyh5i`png3IUkA|J(q;G zEe`#7c#=WA7}EaRv0{NtyjI0tr>N=}6e69gGoGB^ZYDnNRnFOex?7{b)b?>{H!}dc zmc5)%w^X&BA?HB+DP(`Kh!9e^?As^ztA8gUEbGbh|s} z!S_|D(7DSY0gR@2PA)e!lSkK`b2!YS?QxK?xh-mGzF9t3eTFxok4sMeHd3;wzrLAV zWnq(@Gp{?Fdsv_$82x_PxkZ8?C=etqU8bG62Nl5cavKn&(f+iaP8OwDaVTCnAqw4b zwPk8a*L7MF;YQ9q$X{pl5xmNt`*_L|*UR`WRv(}0^S6C(tdutAb z7B3BnnKt#(`bG`#6bx#Se}Cr}0xs-T7?8Pb{ zc?e&;z3e7S;KN4cxS)fv780iN*pqle!O9xV0dt`nsE@l|BIg|DW`;CZT1Z!#RSP*H ze~6p%)5kMUZ7r-h^~|o%2>uQYG~0j%unyAXUj#&yS&jT#a`hR~q***76e@~9!}2YyOqje!3S$*$XlSfRDoAx4el2|qs9}Qi&vimFq3eL8scfX|B z?L*0l6#1`r+=)=spP>FDVhoan51_4AzGKcc&{QQz%AQq7^WkE7i>QR0jWFUdMypvU zJ7JTr_&RS(&rMyw^+hM$*RA4VbaQH+w%1wFtceh$^?F*&ZJIU%ITbK{u`5}Bz(o(c z^+37NkZnC_=`^x*7fI*)xctf*UUc?WR@qXersHU3OVYOVy=<>-==Wmug27_~mZ~;b zSz4ZE!mKHvL7r;g;gJ>D(1cufc$im&{X34V)kG$-c1`1?4%T`z&%8BKFZa{Cx$&q$ zZbP|T3hFjTSyd%IycL#r<&xvv=5d`fpbJNwK5$HU{X{6^oT-Wo9z-`auNZei1b8XM z^4fzRj<1CmRtx`kh!Zq*r|S)#6B8gJmL{-K|4YgmrOOx39%FS=VH}>%Sl*Eu+WJZw z=7sDW@_*v$G~6xsKdiQT_mT~=%qd$*N&zsIUNvZq5&aRZRD}+g7T#{f6u#>{C|@-W zPnCYi>5k1mu1uvtk}@^{_I?yLBZWW*zY`aG?WgP3Vg!8~w`!(nd7UMj!!N=*2@n;S z!(L^MV8+!5Yd({)`9NEaoNIoYsAL|4b{=1|0hZPLUMT(=R;j`oqZh-BTK82H2OXa& z9xK4#k^^VyP@r}>QdqHfYKpASt0$>)u@w=D{9Ge!<&c>+iKffR&5*DY_C8Pq!oelE zUKSgAsYd(SYQ|+OHq+o{4E;ai=PHaTw!Z+1Q8xM%ZNtPEttKc0xq_AHM!?83Jru&n zgh(d=Vk_4kd0eOy>rNCe(-tIrrvS@;d)wsC3-%NZTY50UMV~CR1{`?2YsNJ?LAZ6# z76U)j0maaahg^}cII}emlHhu2Hc2ME?TbKLAS5^<-R@FtR`}&W=;PPc5QL~&!zn&( z9A@0cThDXJ%IX{AzYwp>GzYi>T^{e~%^8|(D9pt(Y9pj{*i~4>_c|Nl&kD?)BV?ZYq0v}9@H){ z95Pa>-4Q#xWWU|yw+z;ND8jEb5w~a{vX2lER)6}wCu4)ZCQ4Cz?KdJ9wjF%_ z*?2y(s!J%rAg8njds5(kwCWZ3?%PL!fREG?&cZl36Hj8Z@D+)O-c%ce0(0S+)?}67 z#*qtg2#KU>*Ym$r;JBHP$d9v;@y*}k5#qp~ay7*1HT)Gx;XuKq*jCQfv?Y4#WR!8Y z0F&cki{_}Cz;ZWw@;dh}T7CDMq^^?`LyT4-iF{ztCaTxyCaD1^;UzsI%ekuUiHU+R zRPICDYyXd_NePIq%TiiJf_Zz(v1q*ff{AMu(>4Y%g>mev+Dlsjhqd~N{F3Cxi>2Co zo_><&8IpgxzYQ#V$mpixT6_Xk15gP$UckusP>Q!s2^l;f{3?@jFk63G*c^w6I`AJY zz~Y1!jv(1(QGr`!*hvp_Fy>uWwZ=Who;3{1w{JS}$4w_#V$$HR)fM0ygRC&xHcn&F zwlu99-X1H4Ama%g`*alS50#JN^T2Q*9a-%;-RGOulK$MxkbWK3M9yf43SPpxM>g|S z%MAW%Pi;=L4QFPFG+1<{E;((}G6kc=S(pA&=Ce;eX|&IkLX2yb4uRWx(b1*-Z$q^y z-@g3Qu8fKAwCAfco+s3Q6rp6k5Bt@gri&hFmEA=lxAV7M-E$~8@lXr9&4U6|j*KIw z8P!6gJs;ZBUtgFuikS6xOJ!kh*&hBjE~%QKZ3#VJ(7%|u`Nq`mxAq@PVdog}#lM1D zO6Y20S&3tO`xu-P5*z^Ay8hRF!>`-AEuSP&M7%v@lmB564NYngbM_ZRqda-mBLmlM zDlJg1g*b(PMj z=IC)zWZ3uzQ)43o^%%Kxb>1EMiwY}sYKS2?zL&xN`q#%*zfK2Iv^`3Qeb_Odok1VI z0kn|Cp9u1~=O~kJ6Ge3bOY{*n<0x|n;eQXxkiZ_d;0;tW^SnA_^x$d6$(s9Xu0`>W!&!Mk1bVTBNOkf^8D*CnX8Sm&=SOh|Dpq#IP`4%I~vv?LXh-e$LzH9mOhN>pAr@(DB{BE7XX>O5NB;? z2yiXoq(N81sOop^WL;||Zk5xlsX0BE1wb&G4K6*&bDDEgG0-5WntRla9nRYQE2U45 z#jgKFyL>7!U}*q{otp4{47s;2vZi;afJ;;zkzP+nkk{RYoz=!|0Eg~6loFO0g*kl< zeb3pnoj%nk>-yV!eU4R?=(i9tMnfRyUVawlDpq@p{yjtZ=U z75qZ)+*1qQ>!_L*(fyCEtBpC= zkvs%Z&je$i0H(H{iFWuLxt(6`Q3bXt`otBzhBlQ+8Z74@(*(=;Rl#z8HU8PvQ(J5O zH%R6P+n6jgi!^1hc)dKs0j|e~=zA1|8TA}ZZWeu1Q-)i1L!L|BsM9p|@Gq{Yjq=feY*w2cci|Y($iNs6B^3xdgYALm-xGZg8K&<|_O3z? za6Zq7gn_q{_vRHlozVHjS&wqY_1kfO6zQwEXUSj5UXn7{$Y|<%nu*Bgg(;0mRossa zOq`_og{qq1A@pLkt;O1~1)*D3ViQ?|p)(>FPOJgp?lY-8hVrb``ExG*t=`sle@K^D3DnhrX}b^9)2$LrI2wbI7_ zr4VZ=bQPeg`U=aUGYowr}7F@PMx zhpHO$d(qLX0&Ntoxf}xY|D7`(+$mqyOJlad2qLmY_{{wLC(47DtXx+;FhZYqRY~H} z;9v;?qr8tgI)WMm)vyU6L&WJki535A*!|Wp?Oo2Rh-{P?oUUE)aA?)H5|}0gPnNQn z1?QM|j;!cE4g~V{b!ydb8@x5TZ_cmue;;-wGnk6dv&;v7(mIna5;=VVj_>&-eu(~y z2L&<(KM#bjD4Zlp>1qDh%{tp@9XnmLDvSIcM>P~TGr_8U*DCs7w4j*~qw*96ObDr| zg0J=@3P%t;8^C)6$pfvArU>nqpjVNK-66z405l*#%Mw~LGIc7;fl1A6V_>S~a}|8t zPbpVZU5*sssD_xSG=@oo%3lQW|6-=v_ru}l{)Li#ujX|^Y5ohU&@0(SCaUFOdapKY zER|Ot7pV+=H9GHgeeZfnMaKX_cehVBdeGkx=9Uw=>!U-HZ!kFjZ}#xtoFJf(_XfEc zImloLf_CI5K@|@~LT2CuFUhFvZDFk(xw|6Qc6d``7{L zwHid2G5UXzjvO4T_@=|9w_wmQyw=H8OijNf?f=DVg$${U^9+Ko(CFc^9l)5QM*~9I z2@|NJnCU)Ipq{Hf%b596OZ|=*x~p|yPp0Z{A}RM1xhM}wOy~Vz1ccv40Rs@;^ZW~>S^JCgi}RBJin|4*j{Uf_;*fDz3cFlKfmd|XE| z+?pe%p)y*2r3aP4SOanm!M|^gyVa}_n@u)tab7h)eYZRoJ&|>NJ^t8r<+IxrZdA)$ zHpklfdO2oF3QjUTT>H!H)qGe)m)p4NQ7TBUCLTTx4=$9d5EKPp}D(5?;v zso_=)sdY+B*xZIzrga1b1by z_g<*&fvCeG97fZ)ahbeBGP|(FCB5<;ddU503E=F!C)xo3!~}Pa=Bo%Q z(8Z3U`aq9)OvsF$2A3!=3lbDxc%5Rl&oU<;c5?%%C{C2qJ;QPT2il|(S+gj2q{RrE zLpSicsFb}U;a9~72H0SC#VpOOdalRYT8r%e7h5e;7z~A0!(E4f#bx;zo0+Gw1;WPg z`t79qaXxIfR(T+iZ*@uO`6M(e^yRolVPN(lkIB`Vc^@Z|%hW>E!oYF-z3zV3Q5nnp zUC~wX{$%WA=&Xk&Eia8b#3S_PZgLjC7R)ZthWpU5RA5ZdDKhpkK#|5I?r&M^_z1I1ZuL- zgA(I`n*9GMj6g$Fc&f&*Awv)J;ZV1Ccl`!*^q^gI@rU*IHw}G_Uju8?A9aC|IM^yO z^e|N)-k`f7W%M+3=|Yzm7hCQm!$X{dkFJR9Jwfu7GH?`=6o@jUnE!It(8# z97`>eX*j%7Nf~~aCPb+y_O&Lf_b^cmUI`Iex0vf^_l_T@I$irK-J81woTFd)HecVw z@PW%Qjq$eswTL$VdSbb-G-Q)Y*_TA0{qdKez^r`N%9|Z<;b5+ z9!E+KYM;3Et}CDG)`M4=hX)`bF7(zB?+5O#vx*_@9UYt=f0^zxFaOy!c?e#=`i_=I z?Xt?{GChH@sYtRd9pDPtqAOy(m}I*Tn+EPG2_P>rr6oZa9Y}&)6&@QHtOPFL2sU}l zFg`FPel?_1#)4ad{M%LRJwI9e$Ge9fHPxZcFid!$`Jcn92KP-S$DIlcQrA~&yq{09 zY+f%yir6b$U0u!OIdTtIgvB}^tvaGILhfE~m4`QcSQq7$VBV0??%>F&_ID~eY~0=5 z2STDp(_14|r+!w@CvpNNrkCfZ(`{|6z@R6+nt?e@yj|rAs?h^DS)&xp&IzpGYyH1Q=9T}lOXC{#$)^7G&5p}WSnAg`m}kpW`F=COT6KurSa zHl5xyrF-Q5wRJg}=V!~+Cd^RD{n*G`KNO${PeN_BDP5tU0)gl+PYFJ)*W@Z zQsIBBRu&kW3Qei~+3=pb@59y+Khno)2q4jX&m54QN4)-(>}tTV#}?sTcSO2F`upi- z<4jnRLh=2B%r=v*xk=c=GdER`;Vm9b#}?UG}0 zR6=0X)2g#Lk|{dhx8PVWSd{GB6QXJ<#_5bkK_bc zK#|#=-HU$_w$@4;MY9!!o{wr4Ak@I>acB!{5?=XXCH6VmCbju^tX=|2{6`)i8m5dq zrOx-F;2}(Pjz3UFah!62U))0=0F(8b%Q58=;BGRdguZw^jP){PVN4A4FHb}R!tiV2 zJ9Psk^M7)Q&i&av%{n>A?4OyPg-Mn$mBI=TB={184GDk#Be9@v}-gK3J z#xOPz(E4bQy?TTDT=(u`@T}Bm?||M)^YQqB7)-W)JW8D}Z4R^-FY&2d37V&oc~3!1bWV*db+}1Nv>H` z`$5wPF9ctMIV+;Ig@u(9QHO*m1z)-^Gay6;oT$McvZOiY9b7!TyeRf3|Emi^y~01N zpgtqB0OzUjCOHE20DzRFdq3EeLLTEi^=hzIYe>6mn_Rk1!isWH~YewA4&M;)Amt!gI0e>ecGv(On~%PsQ*uU zDwPnw5l@QA7Km-3%QLEheKwKI<40M^6j$9ziy^ zW=lfF`dYM{&YJv_EZINZIsr|&bU_uK@#Dcg(SroJ2mwH2yYmI%;>wWV*G^cjF|Epx zFF#Lg(r=SqRc(ipmQy6KRYs=3rh@;@aDV{io9 zy93Dd&eT)5X&Mcmj1;C4NG04<_h7}3B`V#Exs1tEMd5o`O8+q~3Pg{OK_q(7J)YY! zZ^O(&>mx2+*hk5fa(PH#U=0LA$wnXSZ8OCN8|bzxI^5PmO1*K$$7aE+^1Fyl2| znF1D^X77J3ZTu&f4S!1-&!`bmS&vUUhu3W~?(f2e08G}Lh*Dnv!_<5{>#p@02bct_ zzzdM)MaPblwuh2lRx?3G&Lda&3_t0@x8Q=cDa@5`ZcFypz1L~BWY4@M9zH$#J5~7B z`{(dl!(1ZZNbedn#ONp^A~3&PcjxY~0D5U4d0f6ucZae{-UnGA_I&VPvAHl|POJQH zOVNS*y`iGQP0Y8$!|}K5pZF4lX8fPyY#qAhp97KoQD80FOM!R(DfP&f+r)HV`9TY) zzU~>=5Lt&b%NYJgsgHwl%CYl4j}ZrfB0q@p;xRNUz{ZuDcBS#GX54-M;GPE^w&V6& z2+|$ak|3Qpde8ibDAbC;kvbR1_Z5DU0B5J+Q6r%f|JYkG!==!tG7$|D>w7Lt1ztm$NIovpI!-6=P*n*AX{1DjK7{2=`IU475?_Q# zsOF2X-g4erd?}8grm4IvAqLc3nC-~}{&8tOF8DtWp02!^#xuWhHqr6zGc)h5L5N*lFcv1m|U z#ea;IA}0cZ&_E(V0yrPAWmpu;f{9!a02fVPKOPxz-HE=IS`JWP=XvP z=__NZiSkb1!rj`H!#SGxFp)OP+EW_3JPux6oa?5(RP~=r{>WpF-qAIlNki|1PD(;b zl(Mi3r24V)D-Xz555GIh0^M%Vb*>eA4N1~8B-|&fC;A*d9r|mBHEU>aAUwx2$Cyy7 z@Ub%>(a1_udFr(<5$RSJPr8ejh!AZ8NAjT?NW_T6eLtG8!JFuzoWsODl=qMCF@T^# z*;W#|x$(sNzI4(EF(Q>S`L9sdketUvS+Is8y*lvv?qJdfM$4_*Vx!Kg$wQFM*#vBfhEPG8|K85+K*rRZ&nZ4Px?VYoM78 z07{$oNac=wZN}o z)qZYape#t3y0tg=yRLtIa!RY|wjkRsqDB#>YB_J_yI^~No^JJBO>F^N@6I{o!}%b*!($xcPo(M)Ond5t`v zO-3Cbm1zvv=*#>3OBeu*vS2nmWhDyU2w#!SqIxE;hJF#*wKf9ZLPS8$ZoI)9L*8oD zz!XbO#;UMi4I~5egkx~;aAQS5*|>JEWaI^_nF{?qfxYRSVp6T2s;a=fky9`De&syp zjO0vO4nx>wK^9+x4@YveWEm8I)|EU`I}mE+@Ml-GH$(HBmmFjbWju^wX?Rr=oT*u! z^nx-`5k5Fqn*@=bvEe>}+8GoqgTlPVi{#-hlfcMG%pA=AWfF_X9ilR-Vd-fU5it0= z*YHyRKKrnMKn_jTcLER@;=qH?jCoJsf7Tzcn=l)h(@F1M6VvES_B&g9aYogC_jVd} zf9L(8VG0f`aflz*5|7ZF{G3p!7w`9)dV-o=huU6$*QRn4ShS2r_O)~HBp;&!HbuTDB&0}+wG_Luh^2prhCCv_OF|C;bUdsvD<;V%7_Tr$6w%Z2tD zaCrEQylzOS&(;Sd(t$T(+Ih3Kr3mksG5QF{dhTsj;Wlzx;<*hkCTE6Nh;?oPS{M|s z9R1llg^DgiEVCVsHlFbDGu~bxtU3fq@P-@Y`ge||_^NIc&p}`9bJUHsY+YxHh6|Bc}0_Uk+Cp54HiM6ed>$@l3>Z5YWO_-fjai_&v zy03ZvZnez4J?7^YeX?^3-7zG)$x!osMJjXLr3KR#k8d!{LF=k=^t<|5Cyn%!AVk3K zLrok;53j%A5Ndzj=3_cm5#-082+aJviSXQUj7W4CUC4!e8jVcGpP@L1FI=@!{hpgz zSc2s2a)$lPE7G($Md&Fcw_Qm`oEVJ^(eT2KK;TO}kiIT)=u*3ypE4- zXVPuQ*UR(nk>wPWZiPxL@1fFG${9ROrisxX5E{%q*%*N)c}(sw`!wDcGUIPUJ1895 zg!;-S!G0IC9%J)quo1dZKy2^;@e#Ttr1mG@IZ5)k=cjOEu|Drpw9R!pC^UiRTI&-X zmZl_^fOV-@*$xQ;|J|bBl+Y%nj{QWVXbMnM0^zEp;Q0YNS&Nb2Cca9Jgbhb;B2PAZ zbnUVHwfo1Og|iZx)1pSsO!8e?2u5fIBcqEyXKxlJp zF$Ay!JXZ&VsWQt2)WC?=G9EKBbd~++)id~$$ozv-+EWGy{$|4C|(T?ok@+KiYPUt!pYWeQllY=yGOC z-kkB?QGO^^2@mT)-|*S@4ACWAPl~ghEG8#`K2-fyECu zU+D@OiUc@p?M}r*0V!`}lNRYItjt>|uwN9vgiqstZe>iGF1g5(G(E_L<<|fgi z4quvlI|zu0wyKpM7v^_p!=r4T2`(^Mr-I_+zV_}i>$wdD$T@Axdf(U^_FGUV z{R!88OscZ??)&WK&^34D_P9}R|871&rIhCL9^<`oZ`BUt2{13_KhNN3tLyl7m3r@L z;C|?LBzCOZc+9QX`@_70Gyg{nnnw_5$^`0HY0yu>9ukhH?mD;hj|zfP)>4GdX?5cw zN!HnB^`I)d{m1k6`utz3>YvDLCI*U6=KZYOx%xANlPYf9>^UqIEMZ17$v+O7KG26& ze-gE#(d}69YFd6U*24zh_z;FmfN{F{Qi(ZC$@OO>Xw-_*C8l8?foRl{5zf{Yfd zT=b51kcXk2v!>TUqRo2VEAaEVO);?CUX{sFil2VM@SIqFZzqmCv|;Zey1m2|u_AWv zj(9E#P_BOCzYc6tU-6(?`L;HKO2Ag_Bvzboa|lCU8}h;lBk>0}^%P*=#5%j} z(N911@+gzmoe(R>`56w!=PVw0v>I-U9zl=LqdDY zFS4F`-zokuZr+`}>~%p>vRS|(mNYLoP~Fl^YJUf&i9gzF5fD|ZUw+;Y{ae-QB4dRH zD)}(SgV-0adp>ep%VyDdo!ySDUwnSb-$p69v#R`lj`o4j#@ zi)sV#e;Q!5Puzgy@^PB`T_w)}))e<=j<-4w+*Nfb=I%9QpL2@d&QH^t(_8=1odY68 z(l=sO?{-}v&B3hKdZ;sk57v9g>wIO$!@iwQp3EvLFHk$4!u0oXeO+4F&zg_X-K)O3 zF!%va59ktTb;3&ZOcC+KV)w6nHTRv&TTxsa9B*&DOL3f)NUlfbyYE zE%j8_o=Ka?y^F>&^|NbwrHlQ`jyG*{(9Bz%!w5!P>n>(eu>58rKjrW{~G$h=6yF+WK#lw(Fz0MgPj*+liI8=~D+54OjIGNCCn%m;n z^P5EX`ce!22!zlg6QTyAodgq$GN`=UEVRa z6f$PsA=eK;4i^m@3^Ko&oK3#Q&u7aKltskiwDNvV!`pDt?g&$-Ccywg0K77m$HriZ zPmEt)5Gzp78jr|E+;sq!aXdes4f(GX>(&e*I&1nB?MoLsO2^63{CS@9rt`r2dpUZG z$bM*YF~zr}h-+cwCChn&3x~VP&&;}5uX>d@JvqX)hycM#J}1U?NXhgWKZN{m#_l&-3nM9wsuS7K3`r>%OCJ zmQW{^X$sEQzLFhtGP#&fcdu)rf2!_%9|Wt2MEh-V`F{G);LM7v%DRbFvp`zQ@0wuS zrb^H!0RtuCtWREs?{8OI;R(#}=d)5QF6F%3r>>o(W2Kh zBqBXWl4OyMDy%m7s>fp~sfy|PkE7*;_uiK;tGx!){VXvCMZhn@$VWl>cT4ERq3^HV zy*jLEqPN${?ZU$HK*}P%Qf)-@@GPNkkF+>SDX}RZ>f2X8$(zZC{$^c3TE+~m$MQf6 zwek`K(4-11rw9<hvov4SdkPC|2`U`Nv3PA&ch}^V|DTW7l z4lJv(kJd~p#-JC(IB^O;q?Zu;cCatQ0yOV_zWUtGetCyBV)Gkk#8@!k}Yg2ZG_2<={hMo_}x6Kg|qk>>M^YBSQ zU*0l-cvjd_x5i1cRhO;Cr@Kib+CTk{hT6-ks+P#5dGmd2EInaGNta*8S@o}`mOR_c z5u}v>c#U^6&YO+t_r6zxwl4>W`z8?hK6$%2S2f{{0$YVjn_w37_4&9i<_(jE$V}fU zAqz#|^0cWm^gV7VV>_-Eo?Qon_N{XzuI-w&srP}nG$fWF4MJf!><{S}LfCENm~_^q z)j4y-DRwcQcM4Qg?6Vy+iqaM}udY7^qCgE3+%eL}@HN8^Z+A%?Kl`c>9&t^S;Nj{I zJ41^GR_m(AoKRh&TVIb3?Z4LFXA`$S^ZT{z4<*~RZ56iJdzp^&c3jw@9 zytA2ozpboVsneze9ELH*tmY38wO_^AwNzdKOt4;P8PB4p3b~D=}kZ zSzc-P=V`bAe-@9a8uqMMDYoH&cnoYK1bE6k%BA}J5iR8Em#Rm(26V4eae-XxWPZTX z4h}QeFW3g_55w>|U;Hq??aX!zS4_jZ>?YfH{Qz*-rG+{>U2tz(U7^8?<#&vafG+I! zSg25hK#|jpQ-}2h`xCH&An(~ta7?8Tx3PvjuKUax=CEl6s{Wysm;FpUa;6zYIkeB+ zs_=`Xc-Z@6mq}0tn9-Q<3I?sAM%Uon(~tI@q_gx5F7KBK_H2=A*MkMw z4_j{m6bIAn{Vu*Z1a}Dp2p&9GSlr#+H8>%-E$#$&_u#I<-GX}v?yig6eV%jP^L^*u zTSXOBY}F1k(=$EO^Z#{MKaGrGo;>w#A2$Hhw$oiEpB~n|zWFUCvyTbjW@#DgVP(he zdZ?#ILu1|ZW&Ue__N7vMhQya8-;hl)ITTiM%vQ3#-8sMkzIgGk*Ywn0oM3^(^ZQAx zz`=Wz(%jHUlI@|_$ z+}lr|`0m@!J<>1EWfk>j;ip}v8B5+S{i;6u5sZz)@$ygT_>S_1HbJbAIVZnED)AtC zFApWnR zW+oTqi?pjKryf?=h%{6uq{E_8Mu1Z)2%FL_?JIdVz1QZ;!u6~T zh82~{lufZ1bz*j(7WFuB+j&`M zj*TvV>`}#Q$GwNcX9G)#q5DY>+kG1Q)%rzjTf;8*$>lhnFU_hMF#@fqxoNe?xsZy@ zGlBC({^w1PWB+BPi3%3p#g->a2{DDFZ8`*dzsk9UW%Eq8o@S=(`3T&BfErwC6&7}@ z6m4TxJygK-U7^qG4=OT2Kl$_P+$_jg8|xy>uQ+r5)?$tJm*2!bcbrm6T}ZhVhHil2 ze#8%g6#;Bnye8ki9bVr(i?86-b5@F8{P3qn7UyQ=!8D?|*V6QjE|>ddVuWezwn#VM36G{;M{$`u>i+W-&YDsq_FHc#N`=zx$2jU#9{%_0zx~Bk zoxRy_lApI9cDk5XaL-S<(-*o6iH*Qu-g7~d^>)JSRO?Jl;fVsGk1nYY~Q z&emjF>epN%W;t_9e~0|F{&HOlpo06MmN*RuAHi%j>wtVf1^6?M9JV|c$88+7Oe>L21!O(h=6;?Pp2<{=Tq3l1YW^FTF6{p@EQU^ z$_KvLRC0d}T=)&E!LQ%S)NKM+Xpy>4o{Qw3hXU+`)ETF}fOj`pGODz6E_>rmA5YgcXNkN2b`z&C1VC|ZGhq|HLp?J zpGQFDPI{PMUdm!z*dN@vV>2@$%LP7kObf;G3pyb%-ZGli!>qc<==BLw2paLB^xy~& z-ro;Bm#wO2_4d9jPJID7OcpY+^#`#FC~(V-S$011Y~GsAyd2h@>F2iyWv*#EQqt= zi$^r!=Wje=yAN^^8?F(oKKIC-Nbm2xVSkY4xFh@dNX4h)NIU#x0+*a>{!XCi4!-@o zXW&jf@-$>*WsY6veV(o6PD&*_VN%P9UVS{mVtG(pTw8zI;(V&+z2Lpoofqox9MRJO zVlL4XG0z8Lf-EB%Bp52Hxx9ns?YEm?_S+4Map}Wpm8*_a-+goE{&xkhR?whzx&&;I zI+$@Rq+cyvvl>Ar&)Uhhr|?dZ6l;Pa>CiDc)AzXr}(y?}pfMAX(bYQ`mR1Q%kJfDTZ~! zwO;}Ld&p0DlBts8+($uP%Cz7w0Lprr`{9H?W(5IqX{O{)=%zaLRqA9^&Q!o2)VrPi z)(GIO&y{CYw!ifz^ZK?yTCjs_2J39 zEM(Ix#~{J*xsvXXWYDHwQHI#?+T8KaU0ebi;I4lFAuuhIQS%vQ+12K3UdF4Tedf%M_> zm411&xfNJ%ERR-v8h`J^6DTB+H9Apypc&PQm>cf}wEJA7MR{~9mYHuW5Kb&mQBogf zZX9m~*nlr(Nu<`K-vgZ}Bl4wj3Os=s3Ny(-$dV zK(aO0zI-Gd=B>wdbH@ILxo>gm>~BTpFgTFRM1M-`{JkI|2 z_*?Pe)=+@yqB(j&U&CcS)s|XDTrjFMAYik`2T~IIai&57aby{2-Mk8Oyg|tq&*}hK znvcM)0CBDEAMEF7rUu5Rs_Ni$iJ?gF2#`>&XPHP%f<2yBn?)AqO zog8G;rV=&^XSDjO8t5j{+NqwnYe7ZBb8H~nfzm`Ipk^@Q8CgdWcJO<)hLQRnk97p2 zFT`t`5#F?ll;mIi6>AD`10JmRA;SCvzbvq#cGJ1@xfn6nksdojW&QU2I}*vWaE;oK zDLe%V9VV@Gn56Q@r0aDu82AfHSPH>HbPWKERh3z_#RvF{)`xb{1NwM-mE7;JHSZAL zi3Jy=>V^kmledSZ12XKiu)>9Xr-mP^{c(Fg(cQ(phe}HSks6XZf?elXIVAPX-G>OM z&;&72cWGLc0fu;Ux#YY^zgdH8k+vghhyY}Gr$~A7Jt~90a%HUsoUk*6B~P8Aq2Wd9 zOBJcgdp|EOyCw-fqu|{P5bq5T`JKTD&u&p0Q>Q4u^IHjS=Y)ZRF-o^=Uczd#?*~T@t-@9=o|c5$E1-t-MMTn>1Bc;Qpb6+$T}?0 z+7}iQg3I>@bDPP~llF5YkD2v9MRyUnU$y(Q{UR2^Td4aDsd`u7Gk`UEy&O_aL*P2s+CnT00O&&} z1A;IPqo;RW!+w8GEK$w0xl#>Ub^Q`}fZ~xjB^_Ne+dyNwlMshg2cy z`^AzumtkdVSLe=6axH1jc(^Mm{cP|GCdkV^^k*y%+3p4I;M6i6Z%L2M&gDmyhF~mV zc_$1dy+eF%iq=-5&z9i=5ZqoW$>CoJ?Z&hoVY_@hYzB(Tnc)cCJZj=VzZS8N?35 zRf#eAxK@I_HuzvX;AH-XLTD?mKeqBs_5ap&V*TukSUM*zRhjhIV}kd_KThY!?k~un z@aM%h{%3=z!3#hNc^Ek@L|^S@ZmR|ZnYE*>Lg`f+#N#0su+2YaU!wOK)l9;7?%$8n z_DI7ivWS!gN>h;n!AvA*0W?D@WMpoN@$Bv2L8>8k>P!`^ij>Kju@n4{Mm=b4Y(ta= z@+k4L0J=|?3nuW``R$wO!o7#bJqL8k~>G!B>j`ttNAg4#E3lsdLf*`>&i4|j5N zR0G`cLIX<@?rbviT^qegROS;@2^|4v{75+#r_>6cAcm4t|J=$eHADlI@o)mkj;4PJ zUqQ@PK><_6)X#x9s58d~K8u2-Q~P~g?TZvidqeL)bw0_}XwLzyepn!-z*S8+sBDk> z3y>;(j~fx#WqB~)ZWDyHK=Q{^@2{^CNgfYTQZY7&a(Jz-p6%nCvZJmAgh>Gp&nyPY zYoKBMei6dDU@fJp=_xo|xE@5xB`>UfAW;90@-h@ar43Oz|9P)V@;B0v-Xrz2{@3Dd zi{%NvGX|9<9K5A5A}TRy{?A~?44CG_DPLeK%AO1SyT$UEi&Cz$+aHxkXL>nPCoH%Q z|54AE{5l14V32LL|^!c=lx?w9J(~Pjav8(NG=56hb zU;{LlcgUTV*B1RD2iVe*yGyMf5KzGhMOR+j4hr=Dk)VhM#+_X3?xfstl59sh4u3yL zgNL`I3@YgFCS<(Cd-RNxiQRz%ylBC~|I;@kP3&rM6mJ|VE3LJI{zjvdwg1+o$P|u3na9|G1r4-&q_wDk`*$RhRp{3G?B; zcQ0D+XKKr4^DqKo!LcxGGgI?eAkHemng?6yG_A0x@?gcpn$O&Bxi3-x`k3CEB3%Bhd;&tam^#!wAb+IFN^M!6)c@&VK%A@jJ37*&%5c_R zs%XgQ4>L?_2^W_clXrKM@>yK} z5lL^wQPQlQClmjO;`py#YB~7JbOnkvV9Qc2iPLx^SY8B2Reaav&PQ5~aFlH=Z@~_} z|3kiBW2}0K7(y-XMEM~RR3sUo@~!WoAe}eGr&WZ3S@B=>bAO*LO|6I1thZh%2tSBFJAe_czmvqU%v!8>Oa=@#eVQ*GJ_^%kvS|@6!Lh>+J&bq z`aeRq`7clfJmbdW{?qO0qqo9BeMiUuUa(G`uh>qY3u6PT6$f|~)3|d)Lk0%?PFTba z+23oJ|MB*CRkPz-Q6>Lh!7LD!mZuhK0skWNn}pxbZS_a9NssfF$N`{Fg>Gx9u$-BlczkvY>pPq%9e8|Zf`d=9om!Em-wiS zs2KWHb8&X{ek(#fI^%Oj2v5<`@kDyzUTlg_F!DV7W>Cb#N42<$l0*wHh$pwh+0xuh zYZ(XB7!F(i2XMjb4G@Qp$=jom`u<={F}A$h?JZZMwEQfLk8|vy{e8LE`@rDbN5fq7 z5%COz|7ZcMgp3+FkPb+9InnsKMhJEb+?_p_L2x!<+%6(g7_-iA~hB)oDTs zZEWTG4o)W<+k&v_a`En=*HK?bGg-~= zSoZZFdVVFKz|cqFeVqYGQ!&Y15}XVS_knzw3}Op`s?U4{{|lS?hn~8WY?+TUY0OVm z8mAaY?Sl(;q%1WA2V-Ouw_XOtBH~Uhd?68j80M6p<=iwRQr+w5R-vj){NE@S;Xf!B zcPpYqqcXh;JfKD#NDK8G5#2_t66E+-rX(aJn{Dm^I=g}4Do+cYsKn4ekdW*PUwlVP z6J^MH`?ZZ?O#8oqE-*F}=u(0LUGs?fQrOT;FI3PbujpR`JEc5I39O6>B{Wyt8sD_o z?N0V>Lg#}d@)r~xZg)2RL{oU*Ts304Gec^+x;CIudWxUAcV|f3Ls2%Q8bceA`ugDW z>gR(Y9)X7i{x^;PoDu#pz*4!u9?IokrQFow5dc6F5K4Jz#IR`ucB*+u4aQO!wun18 zI9OVim}|#uqY;iX$8pMY$k*4_);4i3U6L~H(f=>H4hq?+K4aT+;f~t;Lu%BfUtJQ& zK#4WA1OYW)yLl^Ap9I|A1gZbS!{LI&gCs{|-54}tE7}-X2HuM4!L&2@5o{4pm!|yu z{I>2ZzUS95Hc!tOIv~1Sd~9?yTUCz$w2v=eK;`M#xK`_@y~zBS9Li-MLpY!d3V3Kr7m-nRw@5&6fTfW zC_P`zLu)wp^z@YWC%R$xn@J;*#YLFPQz%Y#o^3n8Xh=C)xcm5bi&KWmQ`T(N(^Q*+ z5^xMU>;Eyxl{#o{)h=`FdZeZvcq8b*jngHzFs7z=QT$6wV zXhFAQeE$$)>G@I~sq~KH zb(LHE(d0^M5g@Avg#zX=SpTWmScYa{VT1o=yVj`xd>OvvIQi1Ta9!ntV(HiDrm&2B zDBX9ti2Lut`G*iJy~61G8W5J(4k^d+lxxlUe-VOBlwg@42dDm%fUnV{L*Z}Wl?AKF z76ugKWn4db zzVlUZx zq$ZIFXsd_}uRP*ZqyX^zG%g%1CgjqzVEF8`-mC7mk0gDtVPSqgjcWv)4UmEHSCIj3 zNksapqJRN@Y?Ym>QdXnQ)it=G{Z;fDV_aL7PJ%eFiF;)~PEU`|pc~(Gt%qt#ybN(8 z*UObgarQ=6_J*CQ>UJr%eA&}yjr7OiR2`v?d!smW* z>xE2Aks3!+h^&$srs!14P1)Cu{{jSb55_Wkl<4r;t9&L~@7 zY$C`ci)O9sKcr2&Vvr>41Q%9uB3*Mj+?sQw$qfxoqU;*;`P$vpqZPRhNpDLwL|r6O z07xYIFJQCqs69y~)$DwIN7{sAPi>mesn5RgS*4P!`=51 z`A|%NCacwc@8`~33s#Ztl=9v8u0CPp?xf1+@8?-=g3e(#*-rEhD`6U-X3&c>>TWo& z+;4#*HvXZRaU`N3y=t*grSZ^}7RQF9@IjU@*b%@raIv@bdFD&+;K(wCOk_Z5ki(Y?ekD8+ z+0YBF7WA(8gIvSU4NEFAEh>c#Eqz+^Tgd?^bTK&n!fUTivW^br+gKpi{OC1bvybZS zf7kC%H@f~7U zrfJjH>~q#fU2^=VvluxA7KeK?$#c#@7n9m6Q3WPp3C`h~o_2USr?%(6D~@!RNP_n* zsh`S`6a^*M2(kSf`JIR|kCc~MZ*OmZZo4;l)hVzTqBXm;dMi478-HLgYx5l3FGV7A z`JMHyrT;6KSg-i#Xef$eb~a;z;h$?@3+?+#=@OF|wpW3*CoB|V0X0Pg+AzFNh;gG> znab%|i(|&}9d+NC&vDmFO7CAJI0IM3qt(m|%)IE=p(B8-SUSB=0U#YRzLqLQ;>-Z8 z0y&`E)zQB@ii!eNC23wM1K@cl6Y`^m_#58E8&+VD+6B&|$56ld%eU3&4Qn}%s~S#W z?v%!(P#!dj8Qd>Uq=f)_Rl+X2_*LGMs^O#P+h4EjyJ8IPA8#xC8M0qx@=!Ilp!J~V zF4Zdy2X3(hsn;+U;cPha&BdU=vR+duLCd}Q&%v$e=!uB~7&njO7B0}pAVPx8&{u!I zerSyRsRa5-bRP-iKdf=@Pt?5Jp7k++n2qtbBmlAvtCd8AP2AmyWPQP<${HrivYYI} z?F?~_Qvzf$=Ps78;DE_VkR!D9la~<*jX>TP&nu^J3ylN)VsDZvc;D<~&OGR@+MTEh zWRyIxj@a9(4P7Mc6t?^6Av{OvF)%PjJ1}BE z80H0tBs)?*UdbHi0Trldgn5^IXO%TaZCndX9*DPafSF|lg#}5WgkkgPKZK#`LDP9} z>SfSmU)1MCT^%@p*evu5m-+rDa666t*+FQ|X~&oZL!jklShoFbUa%CXkDfh^6Yz?n zE557Zr_+9+-1^ysN&LY53o~lU*8Y``NkO^VDaEI6SgXU50~@3NcnW7a+*O>h?8lz8 z+YM#;#mIl${@0(*T2%czORdn8H}d+X$I<(qG%c#Ji13PBwedA-yGkCwbT~H@s3y9q zX?UrHI-mtM8V)dWbi7Zw4X3v=X>DNZJyhBGs}_^H1e_5Cl$c0(oE zDhgjrW>tMV=I@`gSpH=X4Z;?_+yqVjWx?hbeORZo!r>-n z;o1Fe0P|fanOQ2k$Wpxig?rn67Z?A+P)g_mB*WnqmG5UT~utNOO&;S21_<~hu=mA99X*RR5Y zN{WcPr#9xu=KmTWfRYTu3eNGni~4YtN92AlAk`n?w~xfloyFE?%0o^O{|*^yn;aFC zgKT^94B~o|BqJC<_i^zN$`;`K zFfZ(?xbADpHCu@Li_^FU`-(V|h=TL#D}e}6=3dHyC6GH##sir}{8mI(Coq{+Wczy1 z#Gi^fg=FwF7x^u87$zWe*!-`;C)wl9m;!UU$*v_dZ#&(e^AA9-C3f6J8h#`68u z6g7N|dX|22l=Royf=^=O^h9o|-Bec47+Fw<664OQ_s}S)?&F<`>Ii;O7MwCl` zJrUHvb@VA%sSv(9fb+@S5hXi_@~0>=6u4o33*(mwQ;-?^={e4H3s2J}x*&nXC3TvY z00~M`Gl|war$DGKJmAS)wKD~rfW1}071*TBjf(8S5MT;60g2SI=5q5k*k3nMx z!6=*`F~IZn|2;aKy^~$2il?urgqF|~#OQgNYP$3ZmM1Myr{qzlZBzRlq3J}mF#jX> zSOi(`bB4S78;Xs6Ta86%+{x^h_dC-e>8Q0HtZEDOzL6{%W^ut=~zl+U%mSA7jrbT`J7gKz6$4chc+a z$oJhD3?2W=Lksh70K$<(Osj&TCH4*?eE%})yhj$d))Ph1>mRBxbhJi6e(p7);Qf_? zc?-~wns+^k9h@>lMGaf15*s;)MLf7{&)}(cl|98;qR^ET8CpnflzDKb7K06{3M5yE7j+Si z(djLw663PhhiD)cU(ZN+%uCb(%vfGkN8;JMx~3%aBAE)m8#o zsaSq-R&FD~_TEk!XgNISQ_U84`1IVJAb00^{A4@p?fOd}lN{&XgzVXJ{s53l31zZ; zu|8JVzS>%j)Kly!`!bzzZySsSFj^y*kPX^a`bvNH2?L+t_xA6p8t%N$f=q0u6t}mP z{@{IeDrQ4)mF4~@v0*8}jZjxx<;$}2ulM45=26&8FtzB%MCVwlxDs6>EaPQH$>I|X zA2_JK(}?b=%`vH}`8R#mFUAU?Hv9b>)9`8|hjkFtfSjCJ*^H&BF$?(G26o;x)_&CT z#f(DwOeg@LXhbl)bcDmez*ljo`yIWeA9R(Y7Bg07i)~MbwkiBQV#1avDyEE+G;4tC z6GtdMls(wGL;^tD}%+F3;Ko%h}(B1S_M{hToZ@Ps_-=j0NBUrzr}Gi6HNa`D?t zz0LRuri2&eTS!{%{&H2;5dtl87&rkvqA`W&5IQN$Y?tkIMIaD5js}Dyb6Nj-BydMn zzSX;{s#kcFEOUR|y7rSh(U~rhSB3DYB>u4w?_6ENuhCE+ln6YA1tS#_(OKarjJAS1 z3V#VZlm4xax)?AE2g2kE2y@c}GBOA&a7oO;3o1>9qcaDX8j5w`cV7ia4)guMD%L4X z=wtyoiY?;>5zk@z6GrYPG9Kj-n#3}dBk!x6RTH>xHVEWrB>K)gx3O|}D944}CijrqqILHdqd2t2j2PCTrPy=sC@3+ zv+Zx0pU$78>$px>RvA4NI;Iu;n$NODaptobGU3U&xIFe6%s#+<_%WrPGZr0wZs<_h zxp@6Kp$`WReCELT_BY7KR&jwfvl1POZ=TU6C@V0jBze;l=@SHnm14@Q#a`$h7X%?_0)RCUytq|P0~QLw0A9$YE^#2Fq!!C#U*-bST{f?dQ{3w=^L%xWuW@l|&XhK^T~qsh zEy2f}*8G3)<9%b0I z4Rk43mCV9Z_ar1uG%vzxDYny#uZ1u3v2qQl4j&)Yprl6b)&!eOHjhh9ZcBds*~sDz zRN?qxc_v;;h+Nzg;bBkf6RZZH`kJQivay>{f+foOhj6+ngL0kj6RmAi;<&wtAAh!9mez2;pt*i&0wNpYB{#)SKtIEKVmv zryNG1aVdx5UPc2!%iZ$T>&@})W5)y*6xODtx#$0qB~JlL8S z#U=C`vAddo>9oOon3T_c{n>AI2Xj&2yqJ^Z^CWUSO_J~)Nn5q1bW+wYka}XeQW*4n!&Z+LP#G!GO_{K$1rVt(j z=<|8Y-4P3`_vS}}OZp*nVmcSLc;~clr8Y&!jQ0@sPWA{XpO@OUiEQL}ss#*4_Hu`Y zrZIU-_8x+wMN7UUVG}>`?7h>n7w-IUZUml#>bE`G`J8slbj-oNvw!$*uo9BP(_tEZ zmOv@hQx0+BwyVWW6Q4}C8hC)ejc_OcFlgpOz2o;3)<|?+)AxEPs$k=pkEds>rcZwL z`@3w`kGwbFxpf>{5%;!!04wnBEZ+ySO_9I6~Ivl zyUYE`p;pXU-HL)1Gfxc6l2l*C%e0NcdD5vK->MCuT3In1le<>MJb5iak3$3$xQ{Mw zyzJdnxi%f1RnVQgT#mKVLWxKX-^;)h;f^gZ`T|Kki}wA(SHp9!`^lhc-4ttisQQ25 zWOR?XxnTX6cx6_9I}|2We<V5~+(XuNI*rE*O^h zR|{i$KGvM#Yfzf-r;_5ef;`5(p4ga{Rv-KUB2KW|)8#&0vSD2N?b%u*65pbLbOxqO zwt#vh45-Z_yc2(TMzTFk>(!X^Ml^P@fPf602s6*EnC~(E#0538wZxi%BCl~pXByE| z@zWsjyyWl-sz5_q8G0d=x*K%Y{l&YTP`$&_w%YZi>^ytv`I#5s)G{`0l+`Ue293J zSDfi~2`xP!X>$2=OuVY9zfA&&syfen9IUeD>mH4R_r~J-UaPJB%`h2($P&E zTdd_25U;@^oIzid)#^ntxtzPnDJjW88?jo|xObMV4l#uk$rNTnf(B(Vc&u^6`Q#Qm zOkTdx{(}Emb%c*fTPU5g4oE2W&qniy84(cy`X&=HA}-YDlKJOkcI@mVW1&{4Y73T8 zdg(3Sn+6egWlzbW^ua;z#d$@QJ61y^?QcboKUb$t*aCjr_1XGWZ>}vSU8x&2Odqc9 zClV-M&u>57a~cnH+&h}4vVh&)2VGc8=NJO99H^%M*DHr6eX`0IrTj20`UX`(EtA^FQ>`oWL#$;16$%fjF3@ zYs!b#WA54~cEf?fJ9^nB5csui5HSRK8X>>k)KGhca^9cf%o`u7J>75M8pW3x6 z?G>{hSRx!DiQl=)pt&cDA7oomuq-lZBVDG1G7P&gD2vE^5`@NK!tg-3X$t9wd5p#UC=q^r+79w$1Z8TbV&ZAVj9niOFtU|rF>_tRfy&msjm4ky_uu9R#I z9uIvhW{qNWJT{QOMvL$!8ebQ{lIxsvj*4rE?-H!5#MEmL`k8|=rT9fbw$O}P8n1b) zS0uzYj4>`a@Ey$J5dt9MHnfooad4DZoP z<`18eQwA0Qt+k3>Xay&8fkZ(UXv`(Et#_pqe_RE@I}Rl7hJ1(ff_~mEhNdeD=*KI! zvR~iJ11iMC&%dD%(sl8_LX)CYU(F1zsQpI^z%0(6my1q$-=`DtsMX`Fge&sw4P%Yy z#Pxc;kmh#)Ey#K>D%>#KY8}He`9YrTY&YE|hVKs7k3kcocl>DWoP1314Y3jCm;VS7 z(GZ1wOm!qSD3;0cb$NkAaKn(p;@B++JpCsAteA31r6BTt*q!JYb~0&qmu`lW1~U?g za2l{<8q8ZoT8$oghRxPNyk^$lwF~kgezAV!b_+>`V|r z{JSW+5ST_}_9jQ!Wd-0dodCtyeZf`ju9EbgP)m3hUhFdC%k?Vx7;{dMB0DO{eNrmq z-`AL=h-r_Pt`l@tC4kkExbVZD{z@X9_kBdD-~%;P{%2TI3j)_hJ_n{r*4DiJHq_t3 zPk;YdqrAHCCzK4n;3E=w6U#fAdz6L6Cc{q`I2YUg=?&mP!PmY#3g)%4(!(+5-%Tz> z1o;00MXJ6nO@2_&|J?3#9HKATv+}l(2wZ{eyAwO(ZE)eO0>BMB>|^iI|5n4^N4!5w zj;w0bvPjku_JAS2(#371`gmti4LD-UC7|sacE&)w1@m?EEj;sga^cpND|GWKkZOh_lXQ{ZA(!~nK-7r z_l%iwDaDe&LY^^9AeU6)ZBT9-7uF=Sb`@UJHmJXKIJpaTKVo(~I)0LfS*bau*J`ig z6rb9LL6)AIFOV2=N+nSmK2VZvrPx`$S^#-$uS%3&a8PioYJFNLs(KcU%&hUC8<#h3 z!g&1BOapyBVVoe>g4o@K5Lnp|yqv7skhk<^9`n^+iqPN44azH=aBw&cD~~WbRHV(K z$&xoNqNNvqv25if@~uYUuLa%r9^r8(Q&x`X%T+R@kNO$1JKq)ZRtc!l@B&&8#Kjx! zNLP)awd6er$Q}2J3OF@Mi5Y+&B?|_38yV()pR2Z%Jq(66GvR;V z*(O|2{2=^hUs9so{YzIFEmH_xDx2FJ^)dl_!^_mSPwVCH_Dyp5Angz~1RWA$NmlXn zFJGvU+wDWMNn00%#rQTH>p9iJlT!AfH`iw!*L0Fz>$R}cwf02_qzTq{J~iu!hhPz$ zL_Wo$D2Z5Rh%#Eaj0X-Yhne-@pPv5gNRK_8dGSIHcIMoNG)cBF_85@%S$r1SPV#n&hK?ufgv_s| z){^yWFf2%aE~@8*+NbflR^9HrIh;>y(=d#7T+-E5os}P@9cH6i5T*sm#yhoG#;al| zyQ_B?xWkAfx)I>b;aRFY;{5l*pOjlJoUU_tOa`av3CA=&=Y8xVeeF^;$GxM##3qFTsn&|vWBrVH`bl6$I z1j5$M&Q}^|Vp9BxrVcjS;`?gb6s7kDV6{ZSrbe4{0-kz)-P%mO6vw(!R_X^ zmZ$O9p{a+VURq0DaVLew$EsT0=3klJ6D*U8@Vx-K>>MD8v=uhvAnFtI^!14qyKcNP z%Erg)c&C&L-%2ys%Nx|{raqIf@s7B6BnrYL9Bwk#vZZq+Dl7&%!_*qHXt=%hgLNH1 z_UGzurtY)%NrpbgC#kwCu?+Iep#9SOMn5~No#ghxS8HZ%H*X7Vt#4f!OMATAQgK!6Hi@px4Gt3SEA*3aBwsW^6Ht9t_yM>fhcW00IaCf1{ju z+dRKo8eMt>_g$$nivlhr7>Tzf4OhPP#LQ4Q1e7IH#iG?P>oQq!+%&NCTEy2;vfIpAd~YBT$NAjXX&ekRV;Fe`%`SuaAcZMVYfdCH(KWMT%=t%$+DqWw81QHHId zZ@pu3eF3vb{n3_n81I8bNQAIP6gGY>ubJr&Tk!@@5cME?pij6o@=GlilcbLy(?0PK z>X@=T8sPRNKfwbibGKo(8;*FY>y>}$Q_d8UAy`c%E;?}Z7h55fX!g4a*^Ga!k0F)B zx*uMSjGK5Ow+eiqVmKlsUNDK(r&9yLKYN8txU{S&vqiwqj)1-kzg$s( zt*Z(}iAFYdvJ0Xg%#p$$BG@V|alil^IvnnT+$J^pjX&q86V0v8`eSi#s;^h>Ofi2m zxDV)s800X^v4ezOFU%I5Rx+Eb83e8`M{&odBdKDx0WH*^>Lju^pMe=Hl+QIDpTM~k z<-pnBm?dPO`+-$S`+z3aZf5=-pm{rK|3wZg!4f`BQ$|dsa5iSmN3p8Q^Ixzwr~Em4 z`K>U?%++I7$DN57%FJEgkRxO@{3>KObK&vdaYGTU@ULbUhQd|^ise!f#d@-R1fri4AP5(z}wzL*_IyT><*NP2DIgh~7xc?2V zk|xIhd=fNI#tk*9?)5hzCfaY$Mj~5-IlD<@*vyi|KNJCqs3xajV&bWW3$LgAt73Mq z@KxSw5KQ|VPjDrY1qScJ;{$sz?x>PL%|26Wjq4D?At+V2_&Ji_Ivqk4e8S(wcYNCB zD+LWhZRn($fFDoH-`F9a6g^`C;{b_Qh8^#P=RYMXg#%S*MrX0M2-oV9JACE81!CJ& zvWeY|e$r(ck}ZNM?b7B-98FaDtH}=IZ!|04v|)5v^bNBX@;!}au4a-FEL?oM#14|VuSl-;{-DruSaiE3laOy1l3Ul}qmu~a5~E@Si} zESdUqQmR}x+|^!veuQHAThn!P;h4bsG2M5;`rpTsM+^8cGk-VioRO4@`$P@`NbSX{ zqhm%Qf5-f*joSlhVL}8vV@AH;h6iXJfLN-_riH3BVOfVZUEBg`OC$8yKvKrYqq1B9 zf9)%jiV1NDe^MecyC+rQE9BeYV^B~tD0c)+x=0^oylHH!D+Y^OVe5eL^Tc_jffZBH zujiT11Q?WNz1WD~l+F#&6CRpZ{vWpfGAgbnSObLzhXBDXxI=IPgy8P(Is|uz;2PZB z9R_y|Fu1$By9IZ@Z6vT0+?S3aj zZA1cWVi=I}GQuU)?4TXmU}=3SN}B7z&V`@SOK9=q*iV8a;Z%{CWl*$2grAf9KeXC=;gf)I z8q=BTWD@dG1GizNnj2FfQc_2Y|5=|InjE9hQ!kU{$a=;}hFyS&>C^)&x<~+xR-=2r zD^{+V>PhgbKZgGZ<}galtpPAkW=BRp<+f_10iB8M^K-OrFIC}%VouZ-=bEpPv?{D@ zoa?4k4FyDv@Gwf?D$g1zT2*dv^B(9coa!^;ww|C_a!(kfJ`-5$-5>@JTnS(!Z zH+8M0e(Q<>t6IL32U-91jmPvSeY;g_wbGGW@~ z3wF(4@8*m6j52ELh&@(qUE3oE6%?&iG7l6d#I?{^4z%AO*pd73S}#p--Gm??JE>t% z_Z?m|@-e_(!mg?DT)!3vAtxE!Kiqrxv3@u+CIc4_54tzT9o1a&oGyR0^)W2GcnuiQn`uR|m~@e&!PtF38ak4W zI=Q2|2}=NU>1N(?-y@d}%3Mr|B* zc-fI8Ls>9`P;BuZwnU-7dVAWbL?xGkhr?OgrK{jb>6#C=5CMOTm0=G=!HfA1Ixz*? zWmL-K&0H+o&Z{*Y|2rsuF?78b-woAb4pL#pG;FCJa1}w_#g#AfPQiMSXkRZDC&b=( zHMP9|FDJX=Gl2y{q)q(ai<#?W_3#Wr;ge)C5!FxWtw&4hCRdv=2;w0Oe{h6L4)xgk z=;kvdu=yoIt((l2n%BNBxvVWXX)^v!jJCQwS@8-|lOkVq*|K3kAS$KpYcA#BJ3?|S zL?wmx(2LFf`mp->tOnd9kq;!4^~^g*d*Y>xko#sK$!mr7iK4P`*Y*440YP)ZI&n0c zYYhfq;VukCb*?Rz_E%P#HdFy5DyOI{2G|kL%$43oAa@dXSfBJL2~mv~FzQ>9t5KVP zD8v%LkM;DMqiVb4j*JIFjAE5qWQUr@fHvW-)L8TA%D`~boqFNF_0_|lkP&SB_;n7O zW)Z-f$ZzdGOIGfrPDI;~>8@a+gld3TxxG6l(Ex>3-rNZ7PmDXvQaH8bqWPJMuBz@K z2>m8FhMcrl-dIuciX|amBE2^QWmI6>3;+HxW~x^koHf8VI5Kk3!S3iH9ila#q#2On z4^tYg0ZAN?pwzW6{N@DI6aXobW-++$D1)8pNsX-PyCd;Px3`c7E)APQrV#N{QV|>; z-|XJHVe>q&;*%w$dfvdeFT-#@dd-oVAsunTdIcXI5zcc6`ed%+Kstu`SgV#jAYDAd z>)}p49t;$8K-F6K0O6Y8YE6;1xho)MQ$S9k-?Fc-!?0rOn;`y=bV}cSiDbl@Q|pcAICWa6dHvn1*v@DFWe*+a`u9V#Q`}o z^X)9Kvq%L-S~gmXtleGC{w;@1m@DT0q^uridUY$YrE!*f)OSm9fY*5Zd2pqszc3>H~j zHB4);c(O$Fq+mJ{rjOj6oj8{u0t6=I3J%jLMXq|OR%iB(=Dg-zJ?ab5CzVx52RgZe z^Zy*aZTVs9p#d5x98f9E|HT+8zVz6J*86sK0x>S{MOPH9IO zhNVs=ZKxJQCCw-^Ui)zn1cQr9!01LFjM`BaKpazUm+D|n13H<{n}9PRxrCs+b>qYC zweJ#-Gy(4bE8NZOD>a}jV3q!%@T3F~q4Nb4Cy&J-0x=1hn3E6?0vA+5j1ds22zIt= zj3Hj!*r;>Kwq2K~me@hm!c3b!+;OG^&~Uf<+4q@{kIPl4_^&Ufumn2>5SN;}-<{zv zZe%m;=1a6z#GJ2eEHt?=G4VSci0#7%Z!3!@kyY|`E9!u}B5Yhnx@)K`|*M4{so&ve)HGo@fwQp%cN>V#)^S)_*vw7}|WNb>9KIO+Q zw`bd>#QT@nO;^Y(IhB$Z118^^4fMtD5uttyn@mvX^NUiFohAw$wo@?$2Z}6eA+KaJ z2l6Ce3|My6ken@8R0p0mf7&BCgM|(L<Fhn<&A$JmI|=weGuM6jEglCy?GYorPT zhvF*HyC&X{?_n+$6!h^eQzK4Zc2xC0{ALb>rz6j&6;JWTYa|k~>VlCT@P?AOqpP+| zqx2h>51&CLU`hja)ux|%=+H3@>)2jK{vyupBY^hAd#MChP=-pbFOYcUJ$52d@a23w zeKG_vDSsJw3A1gsZ77TIn@T0PO4Z zHA`Z1#^VZ`Xd$IURVs@-U#fGte(FFKayYe~0_j@Wk^}G;`0IS`ZK{$(Za+Db{{HIX zLQvHsud}e$;c?%8JAvw(_aDN|V3PvCs|)vkmGNmnMH~aZN==Cy1hzcr=!Zc?a@{*?wR!XxH z7!#1{NUDR!7l$WV_rltSps@WKb;(nsxUNV)3+do#B;^2?!(669i07rR?6T3m-h6$K zG`!b%=PyjKJ*XFnC`0nR%a&6$v6T?u6O8>G_I;Ru^p6q271&w$2NP4|+;-7r{+=zK z8!Fg~n=~vpafUnUWL`|X9~KVw?sT2|W}!=`CZ^MDEK8M$2yd;Wxz*7}Z(+64KwP}N zV)ND_tbK>N4P#V)BSq-L^EgfPo@^&h)ol6sWwm+eoe|SC;-H(^{bv-){&r4Ae@qw7 zI_^4j1`kY}oeEI(pNto;;8hXVfmY<}MV8I%D)jWibe_^lTf3gQmI_k9EMRr>bgyU= zbfnGRZ6lGkCop{cYzJGhqQm^NZ--=ACW33KZW9NG7M|5P(XZZtt+vxU|cNj5-7o)K9*1j7WGBtAWQ*mKeC>DVqiP zZLrUNKWV9SB^lsf%RkTs`wP-K6Z{gR;tQ-W%oL&2k`g$=X%JoH{IIV0|GSu(Z=0Dk z>JB%{{Qx86B{*g}xH8M4wk$>uhcM`MIk&-7xSy!HO;p$R_JuEQrm&F4@h5S925l1Z z%XJG4)_L-E*v{NR2Wo|hK66-499%zodhaA9NO|mFhgU1s!sAniSKEJFip&E(W^OLN z?)kG+Q3e9!BOuEjMw@f$u}Ut7oooI~@fieakNut^;)u|lKbwD62HN)f@<=H}+*`^~SHVlJMR zLo7HqrbAGIN%qrp^ZP^HZz5pp&B8rX>$BhQ?4eWM66+=Ec8AR?jQjB+0Kn~%+SJQ@ z2jYI!yLZip^KYYebo2F)C`y&?bO2&;Rcrdg-bXJwpF z-a4!8rt@xza5JW!z2}BWpRx4%G?V4ibHqe61u?$a-Rff7 zdQ^&R`@?W0eSGzoh51nvk=JA7K;%9=0CiyLc020NiAJsG_)usiq$ zQ133M9AEbN-@jJ2D9iM!(~bW>P5U2(V~`~7k4>b#>%q# zgclmZ%*CFWTu5%k^}mKHi`9K7%=gMF!w=dhWXseFO_t12ku*uGM6W<9N-77X5Okl@ z!G6j&)p^^*f@=lLf}lfAlt>h`f6ez0mt}aqx*Um8deIumox@eV?F>Ug>wTt<;dkhX zwEUGwI^(s1w*drSIwM+Q+_xJ54o^-j_3S%0ydQt-2GiTu;z7>rsG!4q0z7lrcs%T{ zJT;!(=}gbWCMW4bYlY)TC(+M=)V^FX^hl2|Lo)P+C&d;je-O3lkD$EF%c>K!7)WyL z6l~g&yZyRuobb7Qw?13%TNx*l3A$KfU>ZyRZcAn%i8XRmbTntpDU{fIj|Bzruw;Q~ z|3ev|lH7I~P5d%cvcRvQ^(Lij>>at@8qzj#;j4#hub$CV;`v&Z#j_V`xctRU&wjCa zJ2n=r)^$9+_c$IC1%zv z$;rv9G-e-rY=M~^Lkdz%Pn*t6fB!-O!kO_DrTFXjlT0}}*c@AApUkzK@KLrZbz5g0 z`vx+ccmN8?kOKRmOj(X&(mm2rn-wzG;aP3_6}sxL1Dywa4HY7OLT?irynEjV%*U~O zo`;pckK!>tSBX?I@I2SZGjQ+LuH3DGP1Ny1b~u?l9S=6%Hjf|0>18SM>J=vXtvgyCxBw|<;CdwTNiDF(wa?F*|EmS4H7a3jn2xc< z18N1KnUMl{#IPB(W>*bd&Q>4wHeN^RP_&m<4bp`sY}W72r1_x$*!l+Uo@@Qml@Biw z#~dHp=<>0|!$Y%&R}H{L2k}X;%F}6f&4Qb9TYh%{gR-BOGS0vzn`}F=c8SVh!OC z{r?N#|6?%91?Rfd1SzWYOU=d)4@sJxZoWqKn($`RgH}qh9!=SPpQuD+0j_EhEsyK% z&_;yzW$+5!VRPVb9QVi)T94g~TChm8s8DhqupBzJ$$%%7rR%JrGiqFx` zqnR_#7uz2^on~}K8Ay}9;l8Ty^Q)YE6ukt`Zcxci7u8~GHL+8wd4V%?6|k z>l}n`crKP72esVX+;uN6S;GPi`uZkgiOu{2u!K%^(UdD%^X6rM^KhCr{xKNDI9c70o&E|2oe z-DIvJ#~O&*YU1H#8S_cwgk#neP^{RFEqj;Mb#XE>a{X!NGx4_n3!geZHxE=y2M0s# z3ZFh{9dkd&Mh;4Fw`IP2pTM8vPLe6v;cUNG)#jT?{d)lYVA#NRcZCYN!3t)|=Jv6f zAA&B`!{l{d>*T4MnVVK7#S9e1v_}=XP~sQPFep)>Pi)yATWfOJh&sbrJyy_9+M*Mq z-KRV;s_o00keGNA!_{Ewe(CW9=@CAGjh7 zCZ2Bi$*1LRo^>uf+dF-(yvKqB9EBXgy4svAdcU`(b{CX zGJk;omqR0nY~Wz zickFC=!&QaB`Fl{;}C~tq|SAXz<{V{+P(8?vbQ6P=nEAY_*m!lSgEY~lf{@;ObT-aVd**Agh+DbGV?@-%rB9NzOyIwW4Nr| z_IWM0$8NEun9_E>^gKWHOH@|t-+UUF|Z^cd>R+9dQG}O_1>h1f32F*|j zlw9&uZ-vVnI$uaxIM*q7XCR{wU=**EbOX%gCK~gKgih&YW3o8MSD~;Q6PGbu((jb; z{M$)$_Hx72_EdBx-4TU`(Ww4%^#3Sgg0pHCYDDn02D@)WBWsq6WoH_M-P_Q(fYk_z zw81Y}S+N{=P@Tw|_*VR&d$@AC9R*t71LwVIg*KkT{Cva9D|MCNfz`|9`hAcNBefw# zSnNJ-FPmWTUZCSK(uTV}F@xVQpqwm`V>7ZLJY&4N@Z=8Hlw2)#leD;hbeb+S6evU z9{~W+p4wE;d|`cxtRy~@J)SvNWb{Iic>iahH#5*zGWVoK3wd9*^|70N)SKl8hEUjE z)bC_s9v)T>qDbTa6Df!;$vu3L^KOua7?pA}>`o;PDJh+nZ7-5|en6g_dsT|3p}j8^0@r=Q}G+>Zy}b68ibVcshTRkI%;7q#d93yWynyzVR8j5<24W{*ChY zvEUst^A+Xv&z_~-vfQ_`oOfdReZhr-?n{odC5dSo#C>zH_8$mOMuP|S2KoF4m0Jcn z(3IQm4S@xv6;`PXk47RAHj%WFunlDg5U zvt;@@A(%rrUz7@0ood?tIOw)Ce(vJ2?E=qF{*!2wtRy8<4ep0Tqg1&Le*GHHo+uoQ zExgq+Z)V&hjrT3*rv*jbQz>nGoN^sZoUd+tXXR9h>a6{UMgPN)4-q^hL^uY6YrD)G z0;hJRIyAqu@ncUs$vAuqT&%xhmCe#1`t7rWhgpe}QiN9YSF1YbyJAyUxWr0FQhL4BFXZ(SYo=-ycuMFIzFwJDUB=hjAmh&1v6?tWEU% zE~tN@5~=uFZ^5(jGqJ5L&#$N7m(w#B-vD|C3_0<;ch7sg!919D1w ztFyDk7N7SN=r0l$17F@;7smjpCywTlnsRC`PZci&XtYeIMzro1J8A z{onBEazrC$sT9QFqCm~AkTln2HQ3gP|=%Ke)3X{;^HB&K!ZK%e52uJHYw$= zUcy3vn&r}lN<2RFAhwMpI3AC!8CvH*O8VJKVV66|&todXlpLkw@Q?D>)^7Sj%+_v0 zI1V+qp#}xcxc({3jHBQaH?%~FaxvO^9N(j>9C($qtz00b;M!;&TLJh9-AVsYSn$oc zJH=a~f(cDof(O*ARxYa8wgPvW+1QGBuajEF*q`29($Vz@=`lp17QrCgtp>;)3R*mmzwug#R!sEygqyg#{ zXmXJMthn}`+z71<8Cf0zlh#kpfYWN%#ERahkOO+_nbq4fmmzA7Zuc@yV}QLne9pbn znP+~B(xz!^#Cy0Qsek9Ihu-fPfIU2^NW2&g@v}4an>RhcC=)5NcBb4d?8R_aul0F@ z&>&adRWJV3{euv?b3!A$bsR76efhk8hjORa>`SyIR)w93?zVrVP_A~F&gAA#z#Tx~ z@RgEkL@Vkp9dK3RK7%HX&aM z(X;FVJu~(vN$6h6b|P-TJn|l+4wVXK*`MD;nbm0+JM6=vn-b@JSeO_RwH5K-c@k8S zR4FhhXTQ?ZMyNzB&4gfq2)ef`N^o($EMz4{jM76)%or)&RVlEDX+ffu)UaEsRvu?9%0>&tNGckAaSvBBBV>8Msb(0K^pA10>isgy9#u z^^_?by*;G0k%=Txwha=bo4DfFv*f;;DK!a*1HGWdH;v6a!FV1)J0TwBdl7|uFoCm+ z-{u^Dyzh4d8m*;g)AmGN)19?$^Fe7R#sY0#K9Vml{g;qTf;cEGtt}fn+3rQYcezj~ zfShk<38!2heUz@`sc;O91BngEzjE>G3+FSB`R6=*Pc{W97X;@zt+h*^o{+dC?@Ysj zM3f8lYCl>*dxV4rpp$LrhT^9UFF>FRVdyP`{iYY50-W&*u&0~|LpE__o$|4g6%H87 z7MAkCff^b9xQc=9mWn4$QA9SBz&yt(DGtiLf6_bZEl>B9nQ|&tZ5fm3{a$#ba0RLV zy4j}@5Fcts7BUg85Yb7CRsoguD|LF);lY;7!wjm`#9g^2L7m%MP{+z}q;H_)Nktp7 z32Z-5dp4(R!9O)PIctjAk#mDL@f{zISaJNG)^YYHW9c~YpCqvn?}Bfs_gJ{U0!5hgxAB9Hf2E6ZPJQ?Uf{KDMyX@o# zRh$|Y;mM%o`+KEJy45uMFU?|vOr$yk@wwBcc~SzqP2MQEe!5Y9s49A8M#!;cSPyz3 z*=nJt@`7QZ(vmMVB*hL){;$Fy55X>F9OCKgaKY9$v-h}dUX-dD(nZBWE04Pu_R)E?_V)Jj&H^J0^k)&&;Io8itY#+ zUoK1j>MUUsy>L`K{hCq+YyB>{57F<&u3B64XM#rFc%oEHtrSi*fr7=AGtu84E82a9 zV>kufJ&KmC<6E=MdP@V;IVje)K5dtrvIl)X_isrO_zzbojNvD3iW`j+mpLhv6^-1v zgrR`r3e{TwhyjJdRkG;}p=3H(kOoQ9EAY>b&_xstWohb#a8yB2la7oGvAAn?gL2qsbND5Q~ ztD-G)T^gBr>&6r0$HTVgY^%CY_grgOb8n{t7N(&Cr<;uY+)b6@ zDu7U79Z{mn{l2`|D83m}+c|x1v2O5%UZVg7^DhIXShDQ+{hnX3&tV-;F1x9QarwHL z3(4;$}DUE3|?BXNS55d3!T3emCpn%>I^RNZsAjH`JMR%EH^5V4Y>6mfKEsEcT-=aEGO^&$)cWTh47{D(9l!G(oe{zU zQtH?oNAa3nI{2DMswxl}qy%*nf&xeurD%bMrum4>QYiZ1kvfvKL^@fN*bCRoDK!5< zFq1r`SPaJs^=2*!U1KO90F@MZkk(M?>bb^Ogr3H|E_Rj@X4{TpWu1fX7>M=pfl9q|1&2t- z2CS?1NJT#DHhh{*7z@cA&s@29Zei0XH-Px#{{jLl@{~E-td!b*ov-)bHe>_4D3sch~kV!5I+r!@asykT2Y1V76ra?sJO zSBiNH<$H)z3oneCmQ)*xCI_uAM_Czb42=rP-Dd~g!yjyStWkUOIIIz3`V#!|ygP)6 zDVscKn)QBvT|W0weZ5e%uHp`%sm0p+yWpQ(NH0e2cGO?aMK?1(V=#nzk1ERdGjx9EAE|1xogobJFonzo~|}uwA&_SaE83HjT`f zt9F0lV4R+eTzbo3{Q5pKDorm&gKxSBm17ssQfp9PAL-ipGaEfi%@4;<~lWoL2XlW)kxOQKfK%F^deJJ2}Wy`XXx zz#S5XNvHsIlNiNP=W`eq8eD1i@FlQ-s?98-Mt`#~&4EghhhsP488z-aq#!o=j}BlP zCS89BSJ?ub54!4Z-qclFcZMB1rB@{!us|P8wqGvNs~(~owln@(pH|4`R#I3(sEScp zD=RIc%&3a?tjhiuBFbq+4Nn}HI&H0F{i9X|BRI{U9ap6u0!Pxe9^K&2$ndjUX4CEP zxkN!B<@dwnC6Ytb8q+W(*0g%}qePu2DSr-G1rH;sx{o*}P|h(u&HdowuP&&mflxLyf?hK{%8pE;RxRfS8Q#bMER5K>(OQ;-Ix6hCL0(XF)v#h_ zqk6U9015{`ug5HG3oQ@bh^=@r+GW2qgmaT<0vZeBvPu5a4Wqerd0r(&_9+S z^6J9IJ&3&}*eZwUprpIRjZOGL0e^bPWU~h<*Yan=Gpd_xz;XLcmC7e`lSK{45j+qc zh5l^zL5pIjd;jutFLT1wVN>M_%Cs%N^?pH|msjNIqI`@uKbTMlqL}Ea^yN1SSNOpK z08pBmt8)%|zdG0v1HRUrBY!Z{u8ctTfVsDmjN}7tv1I{Fn1C>sH9MWNTDXZcj-cYaA*F#N&Yq zVur%2yF(o<)QX_*r>7!ny)OL>JEC_6;!`ixgpxgXLU+#c|xPq)4tvyZ56IGy8{RlRklfgXR0 zI{?RZCis1v*8FdaeD0Pa7l40OcDBz>)D9Rs-fwiNeg4*%c6i#`W>- zq$gF<(bxF6+T@8IZ?g%j;Vcq_4sx{_Isf{eZ_Fs>0&$MDV}8GMuQ_G`FJCfpl|BP< zxH2^D_Q|t3JzQth_3kIN&t4~$cxE!po)-M7PG>^kkG37Js8?C;4y#{W=N=#T0#!)LZ>F4G)aKVTHE-uvA8p4N z=`M|f?&J)WQRSfL>KeOhi?T%bp%kwZ20YkXnBFQ|kOv=eO!p59k@|YB&Uw9e5u+pd zc@ubRj5MOicoDpTVD>_u#N^s7^E|{!Hd_{uQ=lc<8-{-)|Lii}c#cb78!`S*L+(>Z ztsW&ca#PQb`iTCNl-UpH={w?#K6p;<^JsVI?iqN!Ou9$er4e}dYkHHvM1H?&4X06Q zEN{O;(YF0lK#ekaAN)VPkHrc-HRR_e~yu{dJMfp{VjS0OSoZw;IJy_@26CY3u5!m)_I3 z)K+4_1KeirlC6EvLR+hac02$-Y?3~@*!p^)_-tJu!|m;<${pB8ui6oyD!q(3`v^0> zzvAzs1_KlzuWagj3303;l?n3({e?hB<&0@`0}_bL6m(vvK{x0oFxEW8R;$ax!=Xyt z{V2CQorNonUvj@EJ4GJzvohJ_maHqf)f-R@KO|bBX^Z1Mm;bUCv@F++3oWKgOI+{N z;i<%^cM#zn^@+zJ;$(ZjKRMzR2Rro!_5Elb{V~Aj&{G3Ycsji;+q!z*SUhTAs^OqS z$56DA8Ygt$TqLe&d5;4zf(Sd_?zTK~k9ir0Yv0n?SB8swyDV%5vZLPr{%!aUZf+8I z>4szqV5?2DQYO2AR9FIEm1cLr@!huOhb2s}&co?lKY#~p!7ZOA-%ci8kv$LF9S;C1 z`#!fp(^%QwyLRU?h7)MSkNt7Hrq)6rG|j79*Ho@)+1Q$W1cM8*q%+t0VYO;70WgiD z7qMC+{wM`rdi>FrGWty<;VADfOj)Nh#2Rh}S3tyvYU;X}CRUgrKpe>#VtgDrO0JPH z7PPdnDM4CPUf$n2Jx%94cQ*NN8lZ_Bvsb0%bzt*uQILOw%8igu3KOP9a7aFw)`J88 zxa3j+s?z;>4jZ6^*_d*qXY zVH4Q!bGdbSpTYa>W{cu5UU?6kZHqY-H-Mgaf0?DL;(s2toM=0&b$tKU@%SpP66oN6 z#T(z*=NE%YYh351Pur?yJ;4t)a{=89W|yA3%DcSDhr2{O^E|rljV9(7Yq(rCM`yNP z2l%ww-r*(=hxSQ3q08o1%6u(?29OAcd)L%G=fyX+AB;9;+nRk#lryhJq)fEk{OlPB z<1jo39>lP}(O6ltXG6RE>6|}Al4MeziBnOv7LbH&8?tNttuHudt_aTFJRpC}BUsFt zo*{Qec-sGyq9;OKjKz~e8rcQ!0aD2R0vw_#W+Sm(Vo!=9L&U3e> zdTy^r{Hx>CczihD*SSrRmM}Z_MwHNF*^HEruePnce!j(BX9G2_(ACv5?hagtwE7Tr zv!75Nj*pB(gwm&)7py&%NH^6)Rue6OGBB zYlASZ@L8V)BRGb@N$&0;PocN;+HvG+%asZvSK#EV9O!mAc-s`o&(Fpb>i6aUY60xw zsr@eo6P@@#`sNo`NdBRTD*g#U=Cg15zUZ_t3kJqt$4GzpzUjB~aF7&iD#ta$eC_KS`Yn}9Vyx_m;%6*EU^PhF8$Gj$e+ELG(KYE^Y3nR zJKC#f6NGZ4GyG1wh51DMI!si@w#oTjzAK7b6BCNc1bvwpPc*m5o#vC6~Pr~b^y^HaS2op*ThEP5*@T9UkwCu_?n zUb5z^w$CefdO2kgFU~;ij!#ubJASR<9^2T8BlEEnxzDVOIF==H1kN z_KdWa+xM^hZheA20RRb~m+UGIqx*DLGxR=|^I2X)(p6f}kORcW#7LQQgUvg(boyur z_g?!{`uq!QI7b6=gLgO4dB)9*EsPHiZnFfu&-V&!$|&N;zu-{^qhfTY)8N@v^6sNFaZh#}@Y>4_$|Ey8$n^q`{sNG>Q)kvKwiyuD$!YG{4*J6DgDN*`tSC`~E_m(DB!f<5b6Y_udH?lLQvZHybLZF-kI- z)jb3*!3s%uzj2IDdhdc;81I{-$rBfK_uA(5pR@oJYrA1lli%ROW2Jx1J+5n8H>CMU zp$@aXKa7gEPro&w>|@Jec8BJ~;32YpCN&q*QjqOYV&p^08PHuYG|1wsOA;FY;qE7V zY=|l~F9{r=ot4Fi71H7$_(o;@u8zICUvc5y+ki(Ju)=<$J?TsYQGGAPDfOj31R1Xb zf#%2~>w<#}O;4}u#hd)V^JZ%JKKgm_+yN7C)l<~IQ?oOy-x?iAzR>ZQO#N=~JRUC1 zT)$WB^SYY5o`slNcVL+Oy0^&zh}m%KyGtj$QOyh8{D^3^+>P%YG~R-Q2N3+O${LBF zr6+WAm$E6KN!}NlblxO3lB0}3_5p7|EneXECd#kwfap&&dT!g#T#v}_ZD6P6^O1 zIon~>+E$Zt-dgoW#!``W#c$EKmg$#>?*Krp!JT${&j1m>f~;MVnGdj8#@wBl+OITNS|k-M|P;&_c$7Q@PisW zu5o(f^$G3ipJqKC9LND>02!eooM^q)aPT|f zOc`wE_1B*=&_^9n&YS99ZvN(R5BRuipWetDabw8{r4=b`&pel=7nz4y=kcr2sJu$XP$#jwJs<_FP_!;-GRkendf(xV}UFU8c=B{ctE}D>j1Wl}8p}ShQ{@fW;hXQm;-mf7cNt$nXRC&b= z!ke@GQ!Qr1j=n0MT=}N><6-G@ZG;4+Uv;2KkE1zDh|R^SHQFQ@fY`e0=_|mG+7DG9 zfI-!p1Il=ifmZdeRVhqig8za9SqUR3MMvLIpTp>7erti_h^La}Gb(>KRy(N@Uc#n) z`W3eG6O181rB&EpVJL8{$VBFmlAA|ncA6!GhCS^wc3RBym3@f!)FHy$g+3J75Wz<) zs7ilOqa)H~S8;4i^`$XuJS(hfnVE$mc18;@*ugxWx`LNVbfIUbs`+L;aj;Mz_nf#& zQ@W&}orj{w_Rqez5J|~Lx}ncVxs(omQoR=nh0M5!bd;omK2l_&M0;&!BFGSn50o@B{jkSdH#lU{a{4j~w= zBjg9Em)|5XwP_&0?eV|NFH@hFdmoS3&A~as<(?1R@hZ0+1!>7oJs$Qof9^ZOKg9$9 z-g9EpfC%iyQqJs*!UOi;zKZ4KkA6~EpWN0RLyD~lium?9KU!zHB6pT!?G@L5QOyc3 zy%H=INHof8&vYV`_P=%MMA{JjS-9NyJXwl>lFFKwIpRC?vwL8A=g4aNbS!BL=3Ezs zd(6{OMgTEDg4l1eG|m^14Oid>F!*3^j%)`Jri3w#%C@8SX;PG$RyLc@o^jghyf^@Y zRB=qq7a}+a)X)fBp$R!lSMOlM-0KkHFB>hjjj7O~I;?mlmj(9+Sm{c%iMm^;H5$=h z#mm?b@n15zr?8%g2}54w2J`5~kh_ZP-A6 zG!I{$72fXC;kCBKNh4s?p6_C*QMpBcpl*6FP+**($a_C0!U^7MxjyM?cs9EAxUmLB z???Ls#;H2-`Jflo#bR&*0Tdh>pGwdTsWM1L-XXIjJNA=1>)}=$&uegK2ASl14Q~A~ zfMaOgMyfjPpfJtN&nVZhe|GDX=F(N~Tdcmszr3?Rik}jyOIq6}NS|`zC%B14X0dhY zE+pktoalNUi&iTrFfKO3IwN6~s13Vdz)S8PCq~|4NH3=`Zsc3V{0gyMi5- z#5t-nWAHgGK~}%5sG>*ONoY;Nm8l-5YBdfE+i)9GY9Gd_Ut?+M6Bn^)aA8Vq)UA!A z8xve?DeB|zNu6c0$pnm&dLvw!W(}GrQMbw%@K%tB8cmBAYXuoc0##mOch0F3IEM&} zDD7&v;gDGZQOLZjgoQ&Z)h_f%i(wG|Nd>nVmp|$=gXZr~-BU`J0lWr1o&&Gd5835I5J;P-dRs+IeZg_$pJIg*11sWjG`u9g0hv%^OzU72<~q6$^c-i4xXLW+_}+yTOB< zDE}zK3rfO*PEfjR6@H4sP5C6mCZu={(*VoFvIsxQU=QC8cY-G;MT@{P=h@PaM1S`5Xja1tG*ma+ihLhHV(OyL!|fS55Z5*OG-Tb zHpR9&Q#3iM?obl_JJ5K}qEZqlp?M$ir*1?{_(EW^z6H3YdSFom3adBWvr!2s?1}p2 zKsVMnq^-(#-`Q$HR_jXgU;#3~0_;A`fGq+>IJA_u_lqpTw0QhN7}Ai9o?UKBJ)OJ# z3IE}&@H1OTW~YzTVtD%HLI7I?EtOzNII2Jpe>=QZ5Ka~mE#x_|`9+xyJbH{P>HpK# zdB?NWJ${@PO>0Gz8l_dEW9n{_tN{!gD zTcs$qOMS0r{Jy{Ed42O&UN`65oOAEZxhJptdB2bHQU@~I_0e75UXH6q92s{rdz6bb zxffw29NUE#P&{_+W8OKUa8jv`Qx{(dc3$rgHE;za=7t2hCfl=osPtjcOeeJroxy_& z1ggHMC(0XGt|T_6OwniU@V;1C8ri!B!e~=7avq!kPfol;{2zfvn5gsJ%fQBkH26kcI2K|?O>Ji!l;jmv+9%YhTlzRi zzIoQOYZh!A`1+b3wPd8Im?Chwd+#_LhZHjL{kDbp4#U|LIMpOR1b?|5 zpYX$xRvGVNry&NR0z0G2S+0pRd0Qihlj+m*$c4#!KeUHVM0&9_ zIh?J~Q`pIipb+U<7#R;0zCzbwUONvTyeVS2)8alu5m_pKtbhsSB&hw0g>2+kQ9v8X znWYLJf3VvC61q(9tE}OL;o7Q&bqvT>0{xEqx9h}C(^jR|IK#xK1S9q^H|5r!_C6ZN zIvY*AVP0UmD=8TB4C;k2uNi$>#)JYm!e{OC5>+-s(MUEiMqkS}J;0V2rvB8nSmnAd z+mQb01NIOgWNF81#uwy%s63kj&h%r56Uc6nEUOc+VbG#&{Sq%4)Z3_jk^5@|WTl?C zU!WR4k>IK*s}*-?N>y#9GXaei_ z7_ezq#jDB)WE4=4d7FB~Sk2TLlnJ~pbkW!4?*sljB`}u?04NeF92_M3vYVPB4BAC? z6xQ?vTei%2=)|BU2}IOh21anJ`B=#_`IWro#scZc{7*szA-I)79G2()`NE4a9oLP- z1UPYN0;)SxoebP$KNlk*SI0(6Fok&eUfp*yzT8*I6%|)k@y$bYb)!D_;gHJAt;Rqk z<165&mqe5TrNP5W^Hy9ubY6Aw$2ns|k|`>4Kh#zcXFJ-Mfyq}H2|s13xt?lsGQ`kk`u|6^Wim_5u`nh(`^cGx@N;mVdzF-*JdU<&sditJ$OlBSA)kXVc zxQpQV2c(CTm?>2cztT)Bkr-qUlS{#IuX7+u>-RHB(8BkxUQ&X?Ot569568a zU6#6DNhWJWqrJAC#V)?jPuYq)>oY*GIf5;Q@K&`A`pTS&*EabNY;JpI?8zQRvijE1 zCUK9@MQrQepWoKs_4?(pDL(IvPG>w|+SI%4Z0#<57ssW%uO+-9pMl96zanH#ReRFD zK9J){_Y+e%(hyOQ+7X+Kkt}%WW92bumQ! zHlNijBTVw>+rVtb>%K}dXc=n@?^y~}X*TGbsf$*dx0uI3O+DBEroM(Sw1@2K8!EZs zxh!nY7m7zoQQ}{|R5!`@qp6B(yn2+UV!50HN59b&*x|a-v?=;@O*eLQr^oVsShpxl zaN2}%$09*l*FI|S=4t}?!ae_Dnx@3h0OfN5>LxvzFuVnX1atKyQ&~A#0?Eu@X~m`& za*FB_?0V+d`v5t{xUH}Wko$3zc1>gu9Cye|gQ`@D9 z!C;6I#GQRAH&-r;6GHTU({_7n6&*c*x1rJ%I*V$wpT2DxFhBhr5s5I{nr&7%H+v1KDX!Fcx7O&7u@uPxOqR$_e3#~8W zKj-1MB)OlWJ^3<~La{KjURz!>sXR3x_;NKG-0yIHSd8liaQud+*jln5d4Vlj_&E3C zIWIuZf+ym1L8DwH!b#Vva|4a`u5)BbWN%Gs5Gd&+kj+`no~RxBo>CI*_B&PszZ;4g zbPW6f`3}@Bnj-nKFegO>F2?Rxp}(@NBxSZ+dlJ(2x0KD#nxTYrWxpIaeQ=ckz)cO} zHHua3q?gLaNyiP{CX~%)>AwNnIZc?@pBNpC*nt1c1NZ8*`r*K09Q$ zZ=l3-J)kgGKLAy`$q>S86%T+3eHoe(#A9>`5A@tmOz~ts9ln8=fOlbB5ePpA^ppIW?dj=I zY;&0c4BVoc6$zr)t3E!v^xrr7nYV`0l6a!FzjsMhEk#zH1F&zIV+@b^4I?S7feO#Z zre?cbW@I!{pNBG@HOv$|h14#pkshLK6-}BnhZ`1Qs|VY?Mmb9nV)_Mgm-MO<&}}M@ z%(9o>3XXusdkFPD58#(hDE8_~Eqx>OBApil-179m7&w`v4NF6Ux%*tQ)&fk-8J>sXo!Qe6-}C(x(iXMO&VMTiv9_Q2O!Te3 z*_j*dsq$~`*bM8^a6##5_-2=KN+vay+{PCu^%ia!vyO5(^GM?F*5}T(e4Y*&CM~PE zXN|ZI#oMFK8|`>{E;&x{7-8)0|*Wj>>2xaBOU}0XJJJDux_Ux2>=J^k27%ef* z=G|h`8Z82;K9j_aHvYcm=2;CB94?TP%0bV#J2yKvsRljh-eYsKW49GJjB877Wu|<; z9|{GVcuQSudd=#ut$h={+d9|MvNk;#xfZ(I1r=$fVvtM|B`g_LB>ZY_g&Wq>)6|J? z$s#1ex`MCa5ICenwdVaczc+|gwi@cKXc}6HL8pCLiyOQJU-RR|W{MM^Msmxt~(&*~H>2M0<%4Ksbt&V?j|J@MQiE!?CyQu3U0%hOfg!r2ADvALg%?^cdNeeBOizE@Ku(?PJh0va?u%{ zbHgE3dzZ6lkSCUCYQ*R%yJ#63V z32b^t6p=a@A;~LS&$IsML7wGvcJi^B-^s@xJs0RZul7>7?`_UE-on7^0`}I?tLa>1 z9a8@{p6;zpbkMWh1CfW4H}T=$AT8@y+1C;s)4Z6TcrDkh|DOJs?zi$ywGPd%^q?WW z*!@<~h&Q!)2yi*$6TL$`_%hHmn#vP$I+p;3SO*ZKXo;g{6Ba}KEDQ^zVTbcyzW&t3NGUk@*Ru_d!&US52(_z0 z;sCP>aG8#_w)x3X2?Qr6?=HOU9#%GyBEVegQau5flCRfoioZ8u=Xgp7g*vXRPmbR4 z{5|D%@8u}J6q-aWNSodLyT8uNG_kZ1nv^sA3lfe$Z~Osj=T};8NxONtMfY%&QOMp^ zk0l5NXu?w8`VRxIyCi|QCb3<=0r2FcZ^-srsk5C^YI5-Zf z&-lm}_DAlbft7Gc`XqXR9AGX0+}>oL?=?=z>o`Jr5P_%pR!3=XVR@XL!`DUZgQwHwsv=1UP{_q zA0L`}x=?~BLzZ6Fe49DruRiJ_lx0QxjJ-jGn=Wu3Bk?vaA@O6Nk5^v_+M8Hy;rHf8 zuGjkpk=Fz?4QfCEnmM zBvG#|4lTajZ{}Ja#4>$c>uxvRW@~)6ok^R`wN~5n4-j3%OxUPgKgrmx8%Og8 ziw}k};y6KZnv$sk+G)tl$}|-gt(&Ej+3C5uxcem&QG;b|#Imsyxe`1qUeTWSe^hT# z>j{1B<`wG`Vue|u`F@J7Q#-8 z02Ag*_%R5JQlQ?P7aQER{CRNHDI$RB?G*8!Gztm-mi*-7f2s5WgH+vZi!tfyii)3` z8&hH>+6{W@S57{0q@|?+H@g3=K%fR<_q?9Zp7}34m)CxWrUC1|%Jqh1cQ3gePd;1svj6!#=UjFFI@!xNpS1JP^}Ay@yI)GTerE(s z6QiS}?Rrin3nd+YoI1D=?Lp$)Y1f$NRjjkW87#WhuCLu0bsDQYnpH`wARI|~Sd)>F z&)iqOtAC`ysi(q8V8=P0^j>=E=X;DYJMArl+~Hy_FznrGh^Q=k>z`sa9mcJRnTRT) z$8RkW+VrBLqPBN-3{zH&3;@n_K#E#$xJ z+DXSf>N5UERY1)2jKkr-dq1t4%XquP(zQ?w@sEfaL4$NdnCwXP*k99Wc^2mVKeHAU`_lo90{{ggrU#kEB literal 0 HcmV?d00001 diff --git a/extras/MiamiEffect.png b/extras/MiamiEffect.png new file mode 100644 index 0000000000000000000000000000000000000000..b6615fceea322a98a3add9c4902712a7717c8c4e GIT binary patch literal 160255 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 R?HxQPkDt{m_|4|l{{rF`Z`J?+ literal 0 HcmV?d00001 diff --git a/library.properties b/library.properties new file mode 100644 index 00000000..61822d4f --- /dev/null +++ b/library.properties @@ -0,0 +1,10 @@ +name=Akela-LEDEffects +version=0.0.0 +author=Gergely Nagy +maintainer=Gergely Nagy +sentence=An assorted collection of LED effects for Keyboardio boards. +paragraph=A neat effect for every occasion one can possibly think of! +category=Communication +url=https://github.com/Akela-Plugins/Akela-LEDEffects +architectures=avr +dot_a_linkage=true diff --git a/src/Akela-LEDEffects.h b/src/Akela-LEDEffects.h new file mode 100644 index 00000000..bd15539b --- /dev/null +++ b/src/Akela-LEDEffects.h @@ -0,0 +1,23 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#pragma once + +#include +#include +#include diff --git a/src/Akela/Jukebox.cpp b/src/Akela/Jukebox.cpp new file mode 100644 index 00000000..8044c8a7 --- /dev/null +++ b/src/Akela/Jukebox.cpp @@ -0,0 +1,27 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016 Gergely Nagy + * + * 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 . + */ + +#include + +Akela::LEDEffects::TriColor JukeboxEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, + (cRGB){0xc3, 0xee, 0x8c} /* VCO */, + (cRGB){0x21, 0x38, 0xd7} /* RN */); + +Akela::LEDEffects::TriColor JukeboxAlternateEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, + (cRGB){0x21, 0x38, 0xd7} /* RN */, + (cRGB){0xc3, 0xee, 0x8c} /* VCO */); diff --git a/src/Akela/Jukebox.h b/src/Akela/Jukebox.h new file mode 100644 index 00000000..93f415e9 --- /dev/null +++ b/src/Akela/Jukebox.h @@ -0,0 +1,25 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#pragma once + +#include +#include + +extern Akela::LEDEffects::TriColor JukeboxEffect; +extern Akela::LEDEffects::TriColor JukeboxAlternateEffect; diff --git a/src/Akela/Miami.cpp b/src/Akela/Miami.cpp new file mode 100644 index 00000000..e2dc82fb --- /dev/null +++ b/src/Akela/Miami.cpp @@ -0,0 +1,22 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#include + +Akela::LEDEffects::TriColor MiamiEffect((cRGB){0xd6, 0xd6, 0x4e} /* Cyan */, + (cRGB){0xaf, 0x67, 0xfa} /* Magenta */); diff --git a/src/Akela/Miami.h b/src/Akela/Miami.h new file mode 100644 index 00000000..f42f91db --- /dev/null +++ b/src/Akela/Miami.h @@ -0,0 +1,24 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#pragma once + +#include +#include + +extern Akela::LEDEffects::TriColor MiamiEffect; diff --git a/src/Akela/TriColor.cpp b/src/Akela/TriColor.cpp new file mode 100644 index 00000000..735619b9 --- /dev/null +++ b/src/Akela/TriColor.cpp @@ -0,0 +1,69 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#include + +namespace Akela { + namespace LEDEffects { + + TriColor::TriColor (cRGB baseColor, cRGB modColor, cRGB escColor) { + this->baseColor = baseColor; + this->modColor = modColor; + this->escColor = escColor; + previousLayerState = 0xffffffff; + } + + void + TriColor::update (void) { + uint8_t layerState = Layer.getLayerState (); + if (previousLayerState == layerState) + return; + previousLayerState = layerState; + + for (uint8_t r = 0; r < ROWS; r++) { + for (uint8_t c = 0; c < COLS; c++) { + Key k = Layer.lookup (r, c); + + // Special keys are always modColor + if (k.flags != 0) { + led_set_crgb_at (r, c, modColor); + continue; + } + + cRGB color = modColor; + + switch (k.keyCode) { + case Key_A.keyCode ... Key_0.keyCode: + case Key_Space.keyCode: + case Key_Minus.keyCode ... Key_Slash.keyCode: + case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: + case Key_F1.keyCode ... Key_F4.keyCode: + case Key_F9.keyCode ... Key_F12.keyCode: + color = baseColor; + break; + case Key_Esc.keyCode: + color = escColor; + break; + } + + led_set_crgb_at (r, c, color); + } + } + } + }; +}; diff --git a/src/Akela/TriColor.h b/src/Akela/TriColor.h new file mode 100644 index 00000000..f54059ec --- /dev/null +++ b/src/Akela/TriColor.h @@ -0,0 +1,39 @@ +/* -*- mode: c++ -*- + * Akela -- Animated Keyboardio Extension Library for Anything + * Copyright (C) 2016, 2017 Gergely Nagy + * + * 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 . + */ + +#pragma once + +#include + +namespace Akela { + namespace LEDEffects { + class TriColor : public LEDMode { + public: + TriColor (cRGB baseColor, cRGB modColor, cRGB escColor); + TriColor (cRGB baseColor, cRGB modColor) : TriColor (baseColor, modColor, modColor) {}; + + virtual void update (void) final; + + private: + uint32_t previousLayerState; + cRGB baseColor; + cRGB modColor; + cRGB escColor; + }; + }; +}; From 12d993a8b1fbb64846309ea7bfd5d166c0ca9cb9 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 16 Jan 2017 17:16:49 +0100 Subject: [PATCH 02/47] Add a status icon. Signed-off-by: Gergely Nagy --- README.md | 6 ++++++ TriColor.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 533967f7..cde838a8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # Akela-LEDEffects +![status][st:stable] + + [st:stable]: https://img.shields.io/badge/stable-✔-black.png?style=flat&colorA=44cc11&colorB=494e52 + [st:broken]: https://img.shields.io/badge/broken-X-black.png?style=flat&colorA=e05d44&colorB=494e52 + [st:experimental]: https://img.shields.io/badge/experimental----black.png?style=flat&colorA=dfb317&colorB=494e52 + The `LEDEffects` plugin provides a selection of LED effects, each of them fairly simple, simple enough to not need a plugin of their own. diff --git a/TriColor.md b/TriColor.md index 584ebf8b..3c7dbb37 100644 --- a/TriColor.md +++ b/TriColor.md @@ -1,5 +1,11 @@ # Akela-TriColor +![status][st:stable] + + [st:stable]: https://img.shields.io/badge/stable-✔-black.png?style=flat&colorA=44cc11&colorB=494e52 + [st:broken]: https://img.shields.io/badge/broken-X-black.png?style=flat&colorA=e05d44&colorB=494e52 + [st:experimental]: https://img.shields.io/badge/experimental----black.png?style=flat&colorA=dfb317&colorB=494e52 + The `TriColor` effect extension is a part of the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of its own. It is used to implement the effects in that library. From 8fdbf016adb5f7e17770c91f9ecd447248c3527d Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 17 Jan 2017 10:15:07 +0100 Subject: [PATCH 03/47] Move from Akela-Plugins to keyboardio Signed-off-by: Gergely Nagy --- README.md | 2 +- TriColor.md | 2 +- library.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cde838a8..71011bb7 100644 --- a/README.md +++ b/README.md @@ -67,4 +67,4 @@ The plugin provides a single method on each of the included effect objects: Starting from the [example][plugin:example] is the recommended way of getting started with the plugin. - [plugin:example]: https://github.com/Akela-Plugins/Akela-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino + [plugin:example]: https://github.com/keyboardio/Akela-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino diff --git a/TriColor.md b/TriColor.md index 3c7dbb37..15f02f71 100644 --- a/TriColor.md +++ b/TriColor.md @@ -10,7 +10,7 @@ The `TriColor` effect extension is a part of the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of its own. It is used to implement the effects in that library. - [plugin:ledeffects]: https://github/Akela-Plugins/Akela-LEDEffects + [plugin:ledeffects]: https://github/keyboardio/Akela-LEDEffects It is a class that can be used to create LED effects that all follow a similar pattern: alphas and similar in one color; modifiers, special keys, and half the diff --git a/library.properties b/library.properties index 61822d4f..2beb25a9 100644 --- a/library.properties +++ b/library.properties @@ -5,6 +5,6 @@ maintainer=Gergely Nagy sentence=An assorted collection of LED effects for Keyboardio boards. paragraph=A neat effect for every occasion one can possibly think of! category=Communication -url=https://github.com/Akela-Plugins/Akela-LEDEffects +url=https://github.com/keyboardio/Akela-LEDEffects architectures=avr dot_a_linkage=true From a8abf11b1134bf2dfa20aeee3ecc771dc7924a09 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Fri, 27 Jan 2017 09:36:56 +0100 Subject: [PATCH 04/47] Updated to use Keyboardio-LEDControl Signed-off-by: Gergely Nagy --- examples/LEDEffects/LEDEffects.ino | 2 +- src/Akela/TriColor.cpp | 4 ++-- src/Akela/TriColor.h | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index a0f9099f..3f1800e2 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -44,7 +44,7 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { void setup () { Keyboardio.setup (KEYMAP_SIZE); - Keyboardio.use (&LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); + Keyboardio.use (&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); MiamiEffect.activate (); } diff --git a/src/Akela/TriColor.cpp b/src/Akela/TriColor.cpp index 735619b9..39d6ffe4 100644 --- a/src/Akela/TriColor.cpp +++ b/src/Akela/TriColor.cpp @@ -41,7 +41,7 @@ namespace Akela { // Special keys are always modColor if (k.flags != 0) { - led_set_crgb_at (r, c, modColor); + LEDControl.led_set_crgb_at (r, c, modColor); continue; } @@ -61,7 +61,7 @@ namespace Akela { break; } - led_set_crgb_at (r, c, color); + LEDControl.led_set_crgb_at (r, c, color); } } } diff --git a/src/Akela/TriColor.h b/src/Akela/TriColor.h index f54059ec..522d0cab 100644 --- a/src/Akela/TriColor.h +++ b/src/Akela/TriColor.h @@ -19,6 +19,7 @@ #pragma once #include +#include namespace Akela { namespace LEDEffects { From 02cb499154cac32d9412c72ea8206e848ea52f73 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sat, 11 Feb 2017 23:30:17 +0100 Subject: [PATCH 05/47] The Big Rename Renamed the library to Kaleidoscope-LEDEffects, and followed up with other renames. Signed-off-by: Gergely Nagy --- README.md | 9 +++++---- TriColor.md | 12 ++++++------ examples/LEDEffects/LEDEffects.ino | 11 ++++++----- library.properties | 8 ++++---- ...la-LEDEffects.h => Kaleidoscope-LEDEffects.h} | 8 ++++---- src/{Akela => Kaleidoscope}/Jukebox.cpp | 16 ++++++++-------- src/{Akela => Kaleidoscope}/Jukebox.h | 9 ++++----- src/{Akela => Kaleidoscope}/Miami.cpp | 8 ++++---- src/{Akela => Kaleidoscope}/Miami.h | 7 +++---- src/{Akela => Kaleidoscope}/TriColor.cpp | 6 +++--- src/{Akela => Kaleidoscope}/TriColor.h | 8 ++++---- 11 files changed, 51 insertions(+), 51 deletions(-) rename src/{Akela-LEDEffects.h => Kaleidoscope-LEDEffects.h} (79%) rename src/{Akela => Kaleidoscope}/Jukebox.cpp (50%) rename src/{Akela => Kaleidoscope}/Jukebox.h (74%) rename src/{Akela => Kaleidoscope}/Miami.cpp (69%) rename src/{Akela => Kaleidoscope}/Miami.h (80%) rename src/{Akela => Kaleidoscope}/TriColor.cpp (92%) rename src/{Akela => Kaleidoscope}/TriColor.h (86%) diff --git a/README.md b/README.md index 71011bb7..16b0ed6b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Akela-LEDEffects +# Kaleidoscope-LEDEffects ![status][st:stable] @@ -17,10 +17,11 @@ does not enable anything by default, and we will have to selectively enable the effects we are interested in. ```c++ -#include +#include +#include ``` -Then, in the `setup()` method of our Sketch, we will call `Keyboardio.use()`, +Then, in the `setup()` method of our Sketch, we will call `Kaleidoscope.use()`, with the selected effect objects. ## Included effects @@ -67,4 +68,4 @@ The plugin provides a single method on each of the included effect objects: Starting from the [example][plugin:example] is the recommended way of getting started with the plugin. - [plugin:example]: https://github.com/keyboardio/Akela-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino + [plugin:example]: https://github.com/keyboardio/Kaleidoscope-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino diff --git a/TriColor.md b/TriColor.md index 15f02f71..3d79fd7c 100644 --- a/TriColor.md +++ b/TriColor.md @@ -1,4 +1,4 @@ -# Akela-TriColor +# Kaleidoscope-TriColor ![status][st:stable] @@ -10,7 +10,7 @@ The `TriColor` effect extension is a part of the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of its own. It is used to implement the effects in that library. - [plugin:ledeffects]: https://github/keyboardio/Akela-LEDEffects + [plugin:ledeffects]: https://github/keyboardio/Kaleidoscope-LEDEffects It is a class that can be used to create LED effects that all follow a similar pattern: alphas and similar in one color; modifiers, special keys, and half the @@ -24,16 +24,16 @@ Because the extension is part of the [`LEDEffects`][plugin:ledeffects] library, we need to include that header: ```c++ -#include +#include ``` Then, we simply create a new instance of the `TriColor` class, with appropriate colors set for the constructor: ```c++ -Akela::LEDEffects::TriColor BlackAndWhiteEffect ((cRGB){0x00, 0x00, 0x00}, - (cRGB){0xff, 0xff, 0xff}, - (cRGB){0x80, 0x80, 0x80}); +KaleidoscopePlugins::LEDEffects::TriColor BlackAndWhiteEffect ((cRGB){0x00, 0x00, 0x00}, + (cRGB){0xff, 0xff, 0xff}, + (cRGB){0x80, 0x80, 0x80}); ``` The first argument is the base color, the second is for modifiers and special diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index 3f1800e2..f4e67973 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -#include +#include +#include #include "LED-Off.h" @@ -43,12 +44,12 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { void setup () { - Keyboardio.setup (KEYMAP_SIZE); - Keyboardio.use (&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); + Kaleidoscope.setup (KEYMAP_SIZE); + Kaleidoscope.use (&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); MiamiEffect.activate (); } void loop () { - Keyboardio.loop (); + Kaleidoscope.loop (); } diff --git a/library.properties b/library.properties index 2beb25a9..0fb17c84 100644 --- a/library.properties +++ b/library.properties @@ -1,10 +1,10 @@ -name=Akela-LEDEffects +name=Kaleidoscope-LEDEffects version=0.0.0 author=Gergely Nagy -maintainer=Gergely Nagy -sentence=An assorted collection of LED effects for Keyboardio boards. +maintainer=Gergely Nagy +sentence=An assorted collection of LED effects for Kaleidoscope. paragraph=A neat effect for every occasion one can possibly think of! category=Communication -url=https://github.com/keyboardio/Akela-LEDEffects +url=https://github.com/keyboardio/Kaleidoscope-LEDEffects architectures=avr dot_a_linkage=true diff --git a/src/Akela-LEDEffects.h b/src/Kaleidoscope-LEDEffects.h similarity index 79% rename from src/Akela-LEDEffects.h rename to src/Kaleidoscope-LEDEffects.h index bd15539b..4e3fd86e 100644 --- a/src/Akela-LEDEffects.h +++ b/src/Kaleidoscope-LEDEffects.h @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -18,6 +18,6 @@ #pragma once -#include -#include -#include +#include +#include +#include diff --git a/src/Akela/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp similarity index 50% rename from src/Akela/Jukebox.cpp rename to src/Kaleidoscope/Jukebox.cpp index 8044c8a7..c1364356 100644 --- a/src/Akela/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -16,12 +16,12 @@ * along with this program. If not, see . */ -#include +#include -Akela::LEDEffects::TriColor JukeboxEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, - (cRGB){0xc3, 0xee, 0x8c} /* VCO */, - (cRGB){0x21, 0x38, 0xd7} /* RN */); +KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, + (cRGB){0xc3, 0xee, 0x8c} /* VCO */, + (cRGB){0x21, 0x38, 0xd7} /* RN */); -Akela::LEDEffects::TriColor JukeboxAlternateEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, - (cRGB){0x21, 0x38, 0xd7} /* RN */, - (cRGB){0xc3, 0xee, 0x8c} /* VCO */); +KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, + (cRGB){0x21, 0x38, 0xd7} /* RN */, + (cRGB){0xc3, 0xee, 0x8c} /* VCO */); diff --git a/src/Akela/Jukebox.h b/src/Kaleidoscope/Jukebox.h similarity index 74% rename from src/Akela/Jukebox.h rename to src/Kaleidoscope/Jukebox.h index 93f415e9..d1aee9a9 100644 --- a/src/Akela/Jukebox.h +++ b/src/Kaleidoscope/Jukebox.h @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -18,8 +18,7 @@ #pragma once -#include -#include +#include -extern Akela::LEDEffects::TriColor JukeboxEffect; -extern Akela::LEDEffects::TriColor JukeboxAlternateEffect; +extern KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect; +extern KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect; diff --git a/src/Akela/Miami.cpp b/src/Kaleidoscope/Miami.cpp similarity index 69% rename from src/Akela/Miami.cpp rename to src/Kaleidoscope/Miami.cpp index e2dc82fb..8abd2719 100644 --- a/src/Akela/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -#include +#include -Akela::LEDEffects::TriColor MiamiEffect((cRGB){0xd6, 0xd6, 0x4e} /* Cyan */, - (cRGB){0xaf, 0x67, 0xfa} /* Magenta */); +KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect((cRGB){0xd6, 0xd6, 0x4e} /* Cyan */, + (cRGB){0xaf, 0x67, 0xfa} /* Magenta */); diff --git a/src/Akela/Miami.h b/src/Kaleidoscope/Miami.h similarity index 80% rename from src/Akela/Miami.h rename to src/Kaleidoscope/Miami.h index f42f91db..9682a87c 100644 --- a/src/Akela/Miami.h +++ b/src/Kaleidoscope/Miami.h @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -18,7 +18,6 @@ #pragma once -#include -#include +#include -extern Akela::LEDEffects::TriColor MiamiEffect; +extern KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect; diff --git a/src/Akela/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp similarity index 92% rename from src/Akela/TriColor.cpp rename to src/Kaleidoscope/TriColor.cpp index 39d6ffe4..ad1e1484 100644 --- a/src/Akela/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -16,9 +16,9 @@ * along with this program. If not, see . */ -#include +#include -namespace Akela { +namespace KaleidoscopePlugins { namespace LEDEffects { TriColor::TriColor (cRGB baseColor, cRGB modColor, cRGB escColor) { diff --git a/src/Akela/TriColor.h b/src/Kaleidoscope/TriColor.h similarity index 86% rename from src/Akela/TriColor.h rename to src/Kaleidoscope/TriColor.h index 522d0cab..a0c1cf7e 100644 --- a/src/Akela/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -1,5 +1,5 @@ /* -*- mode: c++ -*- - * Akela -- Animated Keyboardio Extension Library for Anything + * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * * This program is free software: you can redistribute it and/or modify @@ -18,10 +18,10 @@ #pragma once -#include -#include +#include +#include -namespace Akela { +namespace KaleidoscopePlugins { namespace LEDEffects { class TriColor : public LEDMode { public: From 14e03cd59839691835dfc8a011a478f107b7ebfa Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 14 Feb 2017 11:59:28 +0100 Subject: [PATCH 06/47] TriColor: Remove a useless optimisation Do not store the previous layer state, and instead of updating only when the layer changes, just update anyway. It's not that costy anymore, with the recent `Layer.lookup` optimisations. Signed-off-by: Gergely Nagy --- src/Kaleidoscope/TriColor.cpp | 6 ------ src/Kaleidoscope/TriColor.h | 1 - 2 files changed, 7 deletions(-) diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index ad1e1484..ad0309be 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -25,16 +25,10 @@ namespace KaleidoscopePlugins { this->baseColor = baseColor; this->modColor = modColor; this->escColor = escColor; - previousLayerState = 0xffffffff; } void TriColor::update (void) { - uint8_t layerState = Layer.getLayerState (); - if (previousLayerState == layerState) - return; - previousLayerState = layerState; - for (uint8_t r = 0; r < ROWS; r++) { for (uint8_t c = 0; c < COLS; c++) { Key k = Layer.lookup (r, c); diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index a0c1cf7e..f7e900dc 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -31,7 +31,6 @@ namespace KaleidoscopePlugins { virtual void update (void) final; private: - uint32_t previousLayerState; cRGB baseColor; cRGB modColor; cRGB escColor; From c0d947b1e95d386db440ece8dcf945b4977c2ba0 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 22 Feb 2017 11:28:11 +0100 Subject: [PATCH 07/47] Test the plugin with Travis CI Signed-off-by: Gergely Nagy --- .gitignore | 2 ++ .travis.yml | 18 ++++++++++++++++++ README.md | 5 ++++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 .travis.yml diff --git a/.gitignore b/.gitignore index aead9485..be16c9be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .#* *~ +/hardware/ +/output/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..77431b24 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,18 @@ +language: cpp +dist: trusty +sudo: required +os: + - linux +before_install: + - pushd .. + - wget http://downloads.arduino.cc/arduino-1.6.11-linux64.tar.xz + - tar xf arduino-1.6.11-linux64.tar.xz + - popd +install: + - git clone --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr +script: + - export DEFAULT_SKETCH=$(cd examples; basename *) + - export ARDUINO_PATH=$(pwd)/../arduino-1.6.11 + - export BOARD_HARDWARE_PATH=$(pwd)/hardware + - export EXTRA_BUILDER_ARGS="-libraries ." + - hardware/keyboardio/avr/libraries/Kaleidoscope/tools/kaleidoscope-builder build diff --git a/README.md b/README.md index 16b0ed6b..a696a032 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # Kaleidoscope-LEDEffects -![status][st:stable] +![status][st:stable] [![Build Status][travis:image]][travis:status] + + [travis:image]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects.svg?branch=master + [travis:status]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects [st:stable]: https://img.shields.io/badge/stable-✔-black.png?style=flat&colorA=44cc11&colorB=494e52 [st:broken]: https://img.shields.io/badge/broken-X-black.png?style=flat&colorA=e05d44&colorB=494e52 From 2c4828ec25329649d6d09868375666a484840b3e Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 20 Mar 2017 12:51:13 +0100 Subject: [PATCH 08/47] README: Add a "Dependencies" section Signed-off-by: Gergely Nagy --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a696a032..f69efda1 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ The plugin provides a single method on each of the included effect objects: > method of the Sketch, or in macros that are meant to switch to the selected > effect, no matter where we are in the list. +## Dependencies + +* [Kaleidoscope-LEDControl](https://github.com/keyboardio/Kaleidoscope-LEDControl) + ## Further reading Starting from the [example][plugin:example] is the recommended way of getting From 195331d1e8740c848314cf3c42b4ccd99d8b1b0d Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Mon, 22 May 2017 13:15:48 -0700 Subject: [PATCH 09/47] Bring up to new keymap api --- examples/LEDEffects/LEDEffects.ino | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index f4e67973..dcfcda12 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -21,24 +21,25 @@ #include "LED-Off.h" + const Key keymaps[][ROWS][COLS] PROGMEM = { [0] = KEYMAP_STACKED ( Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, - Key_PageDn, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Esc, + Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape, - Key_LCtrl, Key_Backspace, Key_LGUI, Key_LShift, - Key_skip, + Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift, + Key_NoKey, Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, - Key_RShift, Key_RAlt, Key_Space, Key_RCtrl, - Key_skip + Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, + Key_NoKey ), }; From e0f3dd0ceaa4c8024e7622f27e94d0860f37c8f4 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Mon, 22 May 2017 13:31:30 -0700 Subject: [PATCH 10/47] Further updates for new key labels --- src/Kaleidoscope/TriColor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index ad0309be..890a4efe 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -43,14 +43,14 @@ namespace KaleidoscopePlugins { switch (k.keyCode) { case Key_A.keyCode ... Key_0.keyCode: - case Key_Space.keyCode: - case Key_Minus.keyCode ... Key_Slash.keyCode: + case Key_Spacebar.keyCode: + case Key_KeypadSubtract.keyCode ... Key_KeypadDivide.keyCode: case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: case Key_F1.keyCode ... Key_F4.keyCode: case Key_F9.keyCode ... Key_F12.keyCode: color = baseColor; break; - case Key_Esc.keyCode: + case Key_Escape.keyCode: color = escColor; break; } From 559994826accc35d91510547d939a7b6ac7cdec2 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:09:42 -0700 Subject: [PATCH 11/47] First pass at simpler travis infrastructure --- .travis.yml | 8 ++------ Makefile | 11 +++++++++++ 2 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 Makefile diff --git a/.travis.yml b/.travis.yml index 77431b24..02319c75 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,15 +4,11 @@ sudo: required os: - linux before_install: - - pushd .. - wget http://downloads.arduino.cc/arduino-1.6.11-linux64.tar.xz - tar xf arduino-1.6.11-linux64.tar.xz - - popd install: - git clone --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - export DEFAULT_SKETCH=$(cd examples; basename *) - - export ARDUINO_PATH=$(pwd)/../arduino-1.6.11 + - export ARDUINO_PATH=$(pwd)/arduino-1.6.11 - export BOARD_HARDWARE_PATH=$(pwd)/hardware - - export EXTRA_BUILDER_ARGS="-libraries ." - - hardware/keyboardio/avr/libraries/Kaleidoscope/tools/kaleidoscope-builder build + - make build-all diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..b028065c --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +# This stub makefile for a Kaleidoscope plugin pulls in +# all targets from the Kaleidoscope-Plugin library + +UNAME_S := $(shell uname -s) + +BOARD_HARDWARE_PATH ?= $(HOME)/Arduino/hardware +ifeq ($(UNAME_S),Darwin) +BOARD_HARDWARE_PATH ?= $(HOME)/Library/Arduino/hardware +endif + +include $(BOARD_HARDWARE_PATH)/keyboardio/avr/libraries/Kaleidoscope-Plugin/build/*.mk From 0a8c489de7009b1af7c784067ab8247f109437b1 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:14:51 -0700 Subject: [PATCH 12/47] try a simpler make invocation --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 02319c75..4bf3c8a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,4 @@ before_install: install: - git clone --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - export ARDUINO_PATH=$(pwd)/arduino-1.6.11 - - export BOARD_HARDWARE_PATH=$(pwd)/hardware - - make build-all + - make build-all BOARD_HARDWARE_PATH=$(pwd)/hardware ARDUINO_PATH=$(pwd)/arduino-1.6.11 From 2a7d457582874310ea15d40775102a08f73ea7e7 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:20:17 -0700 Subject: [PATCH 13/47] try faster checkout of git repos on travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4bf3c8a6..ffe36334 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,6 @@ before_install: - wget http://downloads.arduino.cc/arduino-1.6.11-linux64.tar.xz - tar xf arduino-1.6.11-linux64.tar.xz install: - - git clone --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr + - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - make build-all BOARD_HARDWARE_PATH=$(pwd)/hardware ARDUINO_PATH=$(pwd)/arduino-1.6.11 From f9949bce743f85265acb43ed108bed1a21e30fcb Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:37:52 -0700 Subject: [PATCH 14/47] move arduino download into the makefile --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ffe36334..1d152297 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,7 @@ dist: trusty sudo: required os: - linux -before_install: - - wget http://downloads.arduino.cc/arduino-1.6.11-linux64.tar.xz - - tar xf arduino-1.6.11-linux64.tar.xz install: - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - make build-all BOARD_HARDWARE_PATH=$(pwd)/hardware ARDUINO_PATH=$(pwd)/arduino-1.6.11 + - make travis-install-arduino build-all BOARD_HARDWARE_PATH=$(pwd)/hardware ARDUINO_PATH=$(pwd)/arduino From 305d771acb24c19683b87f18edfc32c8eb0d5cf3 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:44:16 -0700 Subject: [PATCH 15/47] Switch to container-based infrastructure for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1d152297..d51d2d10 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: cpp dist: trusty -sudo: required +sudo: false os: - linux install: From 75d8609112b53e739cff52a344763f43b7e1b4f0 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:50:16 -0700 Subject: [PATCH 16/47] remove the "lang: cpp" which has us install infrastructure we don't want or need --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d51d2d10..968ced93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ -language: cpp dist: trusty sudo: false os: From 184173f765f833778668b5072cac952943a8540b Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 12:54:57 -0700 Subject: [PATCH 17/47] shallow submodules for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 968ced93..01456708 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,6 @@ sudo: false os: - linux install: - - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr + - git clone --depth 1 --shallow-submodules --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - make travis-install-arduino build-all BOARD_HARDWARE_PATH=$(pwd)/hardware ARDUINO_PATH=$(pwd)/arduino From 8370239edafb50a1eeac4bd16c8f2dca8ae772b7 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 13:12:14 -0700 Subject: [PATCH 18/47] slightly simplify the travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 01456708..6e265937 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ os: install: - git clone --depth 1 --shallow-submodules --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - make travis-install-arduino build-all BOARD_HARDWARE_PATH=$(pwd)/hardware ARDUINO_PATH=$(pwd)/arduino + - make travis-test ARDUINO_PATH=$(shell pwd)/arduino BOARD_HARDWARE_PATH=$(shell pwd)/hardware From 18ee016f7d735e025e7bfae3f0e4d157c7876533 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 13:19:37 -0700 Subject: [PATCH 19/47] Turns out travis' git isn't newenough to do --shallow-submodules --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6e265937..d9a42a5d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,6 @@ sudo: false os: - linux install: - - git clone --depth 1 --shallow-submodules --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr + - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - make travis-test ARDUINO_PATH=$(shell pwd)/arduino BOARD_HARDWARE_PATH=$(shell pwd)/hardware From 9d5663c1f8155c515d86f9906a7b1518d84b4479 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 13:23:58 -0700 Subject: [PATCH 20/47] oops --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d9a42a5d..7218fa0e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ os: install: - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - make travis-test ARDUINO_PATH=$(shell pwd)/arduino BOARD_HARDWARE_PATH=$(shell pwd)/hardware + - make travis-test ARDUINO_PATH=$(pwd)/arduino BOARD_HARDWARE_PATH=$(pwd)/hardware From cc354a7069e8048fc9540455baa407a1c701ec0e Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 13:42:18 -0700 Subject: [PATCH 21/47] now that we set these variables in the included makefile, remove em --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7218fa0e..51c353a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ os: install: - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - make travis-test ARDUINO_PATH=$(pwd)/arduino BOARD_HARDWARE_PATH=$(pwd)/hardware + - make travis-test From 235162fb025b05f3e510c80e0239f74f12d8ce77 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 14:25:33 -0700 Subject: [PATCH 22/47] add proper path for hardware in travis --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b028065c..a17842c1 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,16 @@ # This stub makefile for a Kaleidoscope plugin pulls in # all targets from the Kaleidoscope-Plugin library +MAKEFILE_PREFIX=keyboardio/avr/libraries/Kaleidoscope-Plugin/build UNAME_S := $(shell uname -s) +ifneq ($(wildcard $(shell pwd)/hardware/$(MAKEFILE_PREFIX)), "" ) + BOARD_HARDWARE_PATH=$(shell pwd)/hardware +endif + BOARD_HARDWARE_PATH ?= $(HOME)/Arduino/hardware ifeq ($(UNAME_S),Darwin) BOARD_HARDWARE_PATH ?= $(HOME)/Library/Arduino/hardware endif -include $(BOARD_HARDWARE_PATH)/keyboardio/avr/libraries/Kaleidoscope-Plugin/build/*.mk +include $(BOARD_HARDWARE_PATH)/$(MAKEFILE_PREFIX)/*.mk From 6b222f36f0c837721d0156f18fc800caa9156cf5 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 18:18:28 -0700 Subject: [PATCH 23/47] Lift travis-specific bits out of Makefile --- .travis.yml | 2 +- Makefile | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 51c353a3..3e2319e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ os: install: - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - - make travis-test + - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware diff --git a/Makefile b/Makefile index a17842c1..9ce0c4a9 100644 --- a/Makefile +++ b/Makefile @@ -4,10 +4,6 @@ MAKEFILE_PREFIX=keyboardio/avr/libraries/Kaleidoscope-Plugin/build UNAME_S := $(shell uname -s) -ifneq ($(wildcard $(shell pwd)/hardware/$(MAKEFILE_PREFIX)), "" ) - BOARD_HARDWARE_PATH=$(shell pwd)/hardware -endif - BOARD_HARDWARE_PATH ?= $(HOME)/Arduino/hardware ifeq ($(UNAME_S),Darwin) BOARD_HARDWARE_PATH ?= $(HOME)/Library/Arduino/hardware From 07e19a54329e3645c228535658136ffe74b29aac Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 23 May 2017 20:07:07 -0700 Subject: [PATCH 24/47] New build infrastructure --- .travis.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.travis.yml b/.travis.yml index 3e2319e2..e7030acf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,3 +6,16 @@ install: - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr script: - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware +notifications: + irc: + channels: + - "chat.freenode.net#keyboardio" + use_notice: true + skip_join: true + template: + - "%{repository_name}/%{branch} %{commit} by %{author}: %{commit_subject} %{build_url} %{message}" + email: + on_success: change + on_failure: change +cache: + ccache: true From e1fd94e4ff435018df2f8ca6b93827cad1013f38 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Fri, 26 May 2017 16:20:22 -0700 Subject: [PATCH 25/47] make astyle --- examples/LEDEffects/LEDEffects.ino | 44 +++++++++--------- src/Kaleidoscope/Jukebox.cpp | 24 +++++++--- src/Kaleidoscope/Miami.cpp | 8 +++- src/Kaleidoscope/TriColor.cpp | 72 +++++++++++++++--------------- src/Kaleidoscope/TriColor.h | 24 +++++----- 5 files changed, 94 insertions(+), 78 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index dcfcda12..4de34453 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -23,34 +23,34 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { - [0] = KEYMAP_STACKED - ( - Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, - Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, - Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, - Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape, - - Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift, - Key_NoKey, - - Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, - Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, - Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, - Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, - - Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, - Key_NoKey - ), + [0] = KEYMAP_STACKED + ( + Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, + Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, + Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, + Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape, + + Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift, + Key_NoKey, + + Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, + Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, + Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, + Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, + + Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, + Key_NoKey + ), }; void setup () { - Kaleidoscope.setup (KEYMAP_SIZE); - Kaleidoscope.use (&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); + Kaleidoscope.setup (KEYMAP_SIZE); + Kaleidoscope.use (&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); - MiamiEffect.activate (); + MiamiEffect.activate (); } void loop () { - Kaleidoscope.loop (); + Kaleidoscope.loop (); } diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp index c1364356..21409fcb 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -18,10 +18,22 @@ #include -KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, - (cRGB){0xc3, 0xee, 0x8c} /* VCO */, - (cRGB){0x21, 0x38, 0xd7} /* RN */); +KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect((cRGB) { + 0xc8, 0xe8, 0xee +} /* TM */, +(cRGB) { + 0xc3, 0xee, 0x8c +} /* VCO */, +(cRGB) { + 0x21, 0x38, 0xd7 +} /* RN */); -KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect((cRGB){0xc8, 0xe8, 0xee} /* TM */, - (cRGB){0x21, 0x38, 0xd7} /* RN */, - (cRGB){0xc3, 0xee, 0x8c} /* VCO */); +KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect((cRGB) { + 0xc8, 0xe8, 0xee +} /* TM */, +(cRGB) { + 0x21, 0x38, 0xd7 +} /* RN */, +(cRGB) { + 0xc3, 0xee, 0x8c +} /* VCO */); diff --git a/src/Kaleidoscope/Miami.cpp b/src/Kaleidoscope/Miami.cpp index 8abd2719..c6be90de 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -18,5 +18,9 @@ #include -KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect((cRGB){0xd6, 0xd6, 0x4e} /* Cyan */, - (cRGB){0xaf, 0x67, 0xfa} /* Magenta */); +KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect((cRGB) { + 0xd6, 0xd6, 0x4e +} /* Cyan */, +(cRGB) { + 0xaf, 0x67, 0xfa +} /* Magenta */); diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index 890a4efe..406687a6 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -19,45 +19,45 @@ #include namespace KaleidoscopePlugins { - namespace LEDEffects { +namespace LEDEffects { - TriColor::TriColor (cRGB baseColor, cRGB modColor, cRGB escColor) { - this->baseColor = baseColor; - this->modColor = modColor; - this->escColor = escColor; - } +TriColor::TriColor (cRGB baseColor, cRGB modColor, cRGB escColor) { + this->baseColor = baseColor; + this->modColor = modColor; + this->escColor = escColor; +} - void - TriColor::update (void) { - for (uint8_t r = 0; r < ROWS; r++) { +void +TriColor::update (void) { + for (uint8_t r = 0; r < ROWS; r++) { for (uint8_t c = 0; c < COLS; c++) { - Key k = Layer.lookup (r, c); - - // Special keys are always modColor - if (k.flags != 0) { - LEDControl.led_set_crgb_at (r, c, modColor); - continue; - } - - cRGB color = modColor; - - switch (k.keyCode) { - case Key_A.keyCode ... Key_0.keyCode: - case Key_Spacebar.keyCode: - case Key_KeypadSubtract.keyCode ... Key_KeypadDivide.keyCode: - case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: - case Key_F1.keyCode ... Key_F4.keyCode: - case Key_F9.keyCode ... Key_F12.keyCode: - color = baseColor; - break; - case Key_Escape.keyCode: - color = escColor; - break; - } - - LEDControl.led_set_crgb_at (r, c, color); + Key k = Layer.lookup (r, c); + + // Special keys are always modColor + if (k.flags != 0) { + LEDControl.led_set_crgb_at (r, c, modColor); + continue; + } + + cRGB color = modColor; + + switch (k.keyCode) { + case Key_A.keyCode ... Key_0.keyCode: + case Key_Spacebar.keyCode: + case Key_KeypadSubtract.keyCode ... Key_KeypadDivide.keyCode: + case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: + case Key_F1.keyCode ... Key_F4.keyCode: + case Key_F9.keyCode ... Key_F12.keyCode: + color = baseColor; + break; + case Key_Escape.keyCode: + color = escColor; + break; + } + + LEDControl.led_set_crgb_at (r, c, color); } - } } - }; +} +}; }; diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index f7e900dc..b30317f1 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -22,18 +22,18 @@ #include namespace KaleidoscopePlugins { - namespace LEDEffects { - class TriColor : public LEDMode { - public: - TriColor (cRGB baseColor, cRGB modColor, cRGB escColor); - TriColor (cRGB baseColor, cRGB modColor) : TriColor (baseColor, modColor, modColor) {}; +namespace LEDEffects { +class TriColor : public LEDMode { + public: + TriColor (cRGB baseColor, cRGB modColor, cRGB escColor); + TriColor (cRGB baseColor, cRGB modColor) : TriColor (baseColor, modColor, modColor) {}; - virtual void update (void) final; + virtual void update (void) final; - private: - cRGB baseColor; - cRGB modColor; - cRGB escColor; - }; - }; + private: + cRGB baseColor; + cRGB modColor; + cRGB escColor; +}; +}; }; From 3865bd8793f73e079228f63e5f925981166496b6 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Sat, 3 Jun 2017 22:51:34 -0700 Subject: [PATCH 26/47] astyle with current project style guidelines --- examples/LEDEffects/LEDEffects.ino | 48 +++++++++++----------- src/Kaleidoscope/Jukebox.cpp | 12 +++--- src/Kaleidoscope/Miami.cpp | 4 +- src/Kaleidoscope/TriColor.cpp | 66 +++++++++++++++--------------- src/Kaleidoscope/TriColor.h | 16 ++++---- 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index 4de34453..41a1e765 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -23,34 +23,34 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { - [0] = KEYMAP_STACKED - ( - Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, - Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, - Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, - Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape, - - Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift, - Key_NoKey, - - Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, - Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, - Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, - Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, - - Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, - Key_NoKey - ), + [0] = KEYMAP_STACKED + ( + Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, + Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, + Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, + Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape, + + Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift, + Key_NoKey, + + Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, + Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, + Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, + Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, + + Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, + Key_NoKey + ), }; -void setup () { - Kaleidoscope.setup (KEYMAP_SIZE); - Kaleidoscope.use (&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); +void setup() { + Kaleidoscope.setup(KEYMAP_SIZE); + Kaleidoscope.use(&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); - MiamiEffect.activate (); + MiamiEffect.activate(); } -void loop () { - Kaleidoscope.loop (); +void loop() { + Kaleidoscope.loop(); } diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp index 21409fcb..d6b1a101 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -19,21 +19,21 @@ #include KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect((cRGB) { - 0xc8, 0xe8, 0xee + 0xc8, 0xe8, 0xee } /* TM */, (cRGB) { - 0xc3, 0xee, 0x8c + 0xc3, 0xee, 0x8c } /* VCO */, (cRGB) { - 0x21, 0x38, 0xd7 + 0x21, 0x38, 0xd7 } /* RN */); KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect((cRGB) { - 0xc8, 0xe8, 0xee + 0xc8, 0xe8, 0xee } /* TM */, (cRGB) { - 0x21, 0x38, 0xd7 + 0x21, 0x38, 0xd7 } /* RN */, (cRGB) { - 0xc3, 0xee, 0x8c + 0xc3, 0xee, 0x8c } /* VCO */); diff --git a/src/Kaleidoscope/Miami.cpp b/src/Kaleidoscope/Miami.cpp index c6be90de..217500ad 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -19,8 +19,8 @@ #include KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect((cRGB) { - 0xd6, 0xd6, 0x4e + 0xd6, 0xd6, 0x4e } /* Cyan */, (cRGB) { - 0xaf, 0x67, 0xfa + 0xaf, 0x67, 0xfa } /* Magenta */); diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index 406687a6..5bc7a1de 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -21,43 +21,43 @@ namespace KaleidoscopePlugins { namespace LEDEffects { -TriColor::TriColor (cRGB baseColor, cRGB modColor, cRGB escColor) { - this->baseColor = baseColor; - this->modColor = modColor; - this->escColor = escColor; +TriColor::TriColor(cRGB baseColor, cRGB modColor, cRGB escColor) { + this->baseColor = baseColor; + this->modColor = modColor; + this->escColor = escColor; } void -TriColor::update (void) { - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - Key k = Layer.lookup (r, c); - - // Special keys are always modColor - if (k.flags != 0) { - LEDControl.led_set_crgb_at (r, c, modColor); - continue; - } - - cRGB color = modColor; - - switch (k.keyCode) { - case Key_A.keyCode ... Key_0.keyCode: - case Key_Spacebar.keyCode: - case Key_KeypadSubtract.keyCode ... Key_KeypadDivide.keyCode: - case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: - case Key_F1.keyCode ... Key_F4.keyCode: - case Key_F9.keyCode ... Key_F12.keyCode: - color = baseColor; - break; - case Key_Escape.keyCode: - color = escColor; - break; - } - - LEDControl.led_set_crgb_at (r, c, color); - } +TriColor::update(void) { + for (uint8_t r = 0; r < ROWS; r++) { + for (uint8_t c = 0; c < COLS; c++) { + Key k = Layer.lookup(r, c); + + // Special keys are always modColor + if (k.flags != 0) { + LEDControl.led_set_crgb_at(r, c, modColor); + continue; + } + + cRGB color = modColor; + + switch (k.keyCode) { + case Key_A.keyCode ... Key_0.keyCode: + case Key_Spacebar.keyCode: + case Key_KeypadSubtract.keyCode ... Key_KeypadDivide.keyCode: + case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: + case Key_F1.keyCode ... Key_F4.keyCode: + case Key_F9.keyCode ... Key_F12.keyCode: + color = baseColor; + break; + case Key_Escape.keyCode: + color = escColor; + break; + } + + LEDControl.led_set_crgb_at(r, c, color); } + } } }; }; diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index b30317f1..b7cc0774 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -24,16 +24,16 @@ namespace KaleidoscopePlugins { namespace LEDEffects { class TriColor : public LEDMode { - public: - TriColor (cRGB baseColor, cRGB modColor, cRGB escColor); - TriColor (cRGB baseColor, cRGB modColor) : TriColor (baseColor, modColor, modColor) {}; + public: + TriColor(cRGB baseColor, cRGB modColor, cRGB escColor); + TriColor(cRGB baseColor, cRGB modColor) : TriColor(baseColor, modColor, modColor) {}; - virtual void update (void) final; + virtual void update(void) final; - private: - cRGB baseColor; - cRGB modColor; - cRGB escColor; + private: + cRGB baseColor; + cRGB modColor; + cRGB escColor; }; }; }; From cc4d86a98d68a5eb4ac83320c97090bdae3b7ae6 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sun, 4 Jun 2017 19:52:49 +0200 Subject: [PATCH 27/47] Kaleidoscope Style Guide conformance Signed-off-by: Gergely Nagy --- README.md | 26 ++++++++++++++------------ TriColor.md | 12 ++++++------ examples/LEDEffects/LEDEffects.ino | 8 ++++---- src/Kaleidoscope/Jukebox.cpp | 24 ++++++------------------ src/Kaleidoscope/Jukebox.h | 4 ++-- src/Kaleidoscope/Miami.cpp | 8 ++------ src/Kaleidoscope/Miami.h | 2 +- src/Kaleidoscope/TriColor.cpp | 25 ++++++++++++------------- src/Kaleidoscope/TriColor.h | 16 +++++++--------- 9 files changed, 54 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index f69efda1..2110ac3d 100644 --- a/README.md +++ b/README.md @@ -5,27 +5,29 @@ [travis:image]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects.svg?branch=master [travis:status]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects - [st:stable]: https://img.shields.io/badge/stable-✔-black.png?style=flat&colorA=44cc11&colorB=494e52 - [st:broken]: https://img.shields.io/badge/broken-X-black.png?style=flat&colorA=e05d44&colorB=494e52 - [st:experimental]: https://img.shields.io/badge/experimental----black.png?style=flat&colorA=dfb317&colorB=494e52 + [st:stable]: https://img.shields.io/badge/stable-✔-black.svg?style=flat&colorA=44cc11&colorB=494e52 + [st:broken]: https://img.shields.io/badge/broken-X-black.svg?style=flat&colorA=e05d44&colorB=494e52 + [st:experimental]: https://img.shields.io/badge/experimental----black.svg?style=flat&colorA=dfb317&colorB=494e52 The `LEDEffects` plugin provides a selection of LED effects, each of them fairly simple, simple enough to not need a plugin of their own. ## Using the plugin -Because of containing a number of different effects, and not wanting to force -all of them on the user, the plugin behaves differently than most others: it -does not enable anything by default, and we will have to selectively enable the -effects we are interested in. +There are a number of different effects included in the package, all of them are +available once including the header, and one's free to choose any number of +them. ```c++ #include #include -``` -Then, in the `setup()` method of our Sketch, we will call `Kaleidoscope.use()`, -with the selected effect objects. +void setup(void) { + USE_PLUGINS(&JukeBoxEffect); + + Kaleidoscope.setup(); +} +``` ## Included effects @@ -43,7 +45,7 @@ Alphas, punctuation, numbers, the space bar, the numbers and the dot on the keypad, and half the function keys will be in a cyan-ish color, the rest in magenta. -### `JukeBoxEffect` +### `JukeboxEffect` Applies a color effect to the keyboard, inspired by the JukeBox keyset: @@ -53,7 +55,7 @@ Alphas, punctuation, numbers, the space bar, the numbers and the dot on the keypad, and half the function keys will be in a beige-ish color, the rest in light green, except for the `Esc` key, which will be in red. -An alternative color scheme exists under the `JukeBoxAlternateEffect` name, +An alternative color scheme exists under the `JukeboxAlternateEffect` name, where the light green and red colors are swapped. ## Plugin methods diff --git a/TriColor.md b/TriColor.md index 3d79fd7c..1b428f44 100644 --- a/TriColor.md +++ b/TriColor.md @@ -2,9 +2,9 @@ ![status][st:stable] - [st:stable]: https://img.shields.io/badge/stable-✔-black.png?style=flat&colorA=44cc11&colorB=494e52 - [st:broken]: https://img.shields.io/badge/broken-X-black.png?style=flat&colorA=e05d44&colorB=494e52 - [st:experimental]: https://img.shields.io/badge/experimental----black.png?style=flat&colorA=dfb317&colorB=494e52 + [st:stable]: https://img.shields.io/badge/stable-✔-black.svg?style=flat&colorA=44cc11&colorB=494e52 + [st:broken]: https://img.shields.io/badge/broken-X-black.svg?style=flat&colorA=e05d44&colorB=494e52 + [st:experimental]: https://img.shields.io/badge/experimental----black.svg?style=flat&colorA=dfb317&colorB=494e52 The `TriColor` effect extension is a part of the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of @@ -31,9 +31,9 @@ Then, we simply create a new instance of the `TriColor` class, with appropriate colors set for the constructor: ```c++ -KaleidoscopePlugins::LEDEffects::TriColor BlackAndWhiteEffect ((cRGB){0x00, 0x00, 0x00}, - (cRGB){0xff, 0xff, 0xff}, - (cRGB){0x80, 0x80, 0x80}); +kaleidoscope::TriColor BlackAndWhiteEffect (CRGB(0x00, 0x00, 0x00), + CRGB(0xff, 0xff, 0xff), + CRGB(0x80, 0x80, 0x80)); ``` The first argument is the base color, the second is for modifiers and special diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index 41a1e765..3d2c8fb0 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -39,14 +39,14 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, - Key_NoKey - ), + Key_NoKey), }; void setup() { - Kaleidoscope.setup(KEYMAP_SIZE); - Kaleidoscope.use(&LEDControl, &LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect, NULL); + USE_PLUGINS(&LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect); + + Kaleidoscope.setup(); MiamiEffect.activate(); } diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp index d6b1a101..27ea9fe7 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -18,22 +18,10 @@ #include -KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect((cRGB) { - 0xc8, 0xe8, 0xee -} /* TM */, -(cRGB) { - 0xc3, 0xee, 0x8c -} /* VCO */, -(cRGB) { - 0x21, 0x38, 0xd7 -} /* RN */); +kaleidoscope::TriColor JukeboxEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ + CRGB(0xc3, 0xee, 0x8c), /* VCO */ + CRGB(0x21, 0x38, 0xd7)); /* RN */ -KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect((cRGB) { - 0xc8, 0xe8, 0xee -} /* TM */, -(cRGB) { - 0x21, 0x38, 0xd7 -} /* RN */, -(cRGB) { - 0xc3, 0xee, 0x8c -} /* VCO */); +kaleidoscope::TriColor JukeboxAlternateEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ + CRGB(0x21, 0x38, 0xd7), /* RN */ + CRGB(0xc3, 0xee, 0x8c)); /* VCO */ diff --git a/src/Kaleidoscope/Jukebox.h b/src/Kaleidoscope/Jukebox.h index d1aee9a9..3a50252c 100644 --- a/src/Kaleidoscope/Jukebox.h +++ b/src/Kaleidoscope/Jukebox.h @@ -20,5 +20,5 @@ #include -extern KaleidoscopePlugins::LEDEffects::TriColor JukeboxEffect; -extern KaleidoscopePlugins::LEDEffects::TriColor JukeboxAlternateEffect; +extern kaleidoscope::TriColor JukeboxEffect; +extern kaleidoscope::TriColor JukeboxAlternateEffect; diff --git a/src/Kaleidoscope/Miami.cpp b/src/Kaleidoscope/Miami.cpp index 217500ad..206821f9 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -18,9 +18,5 @@ #include -KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect((cRGB) { - 0xd6, 0xd6, 0x4e -} /* Cyan */, -(cRGB) { - 0xaf, 0x67, 0xfa -} /* Magenta */); +kaleidoscope::TriColor MiamiEffect(CRGB(0xd6, 0xd6, 0x4e), /* Cyan */ + CRGB(0xaf, 0x67, 0xfa)); /* Magenta */ diff --git a/src/Kaleidoscope/Miami.h b/src/Kaleidoscope/Miami.h index 9682a87c..0dcead0c 100644 --- a/src/Kaleidoscope/Miami.h +++ b/src/Kaleidoscope/Miami.h @@ -20,4 +20,4 @@ #include -extern KaleidoscopePlugins::LEDEffects::TriColor MiamiEffect; +extern kaleidoscope::TriColor MiamiEffect; diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index 5bc7a1de..ca81a537 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -18,13 +18,12 @@ #include -namespace KaleidoscopePlugins { -namespace LEDEffects { +namespace kaleidoscope { -TriColor::TriColor(cRGB baseColor, cRGB modColor, cRGB escColor) { - this->baseColor = baseColor; - this->modColor = modColor; - this->escColor = escColor; +TriColor::TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color) { + base_color_ = base_color; + mod_color_ = mod_color; + esc_color_ = esc_color; } void @@ -33,13 +32,13 @@ TriColor::update(void) { for (uint8_t c = 0; c < COLS; c++) { Key k = Layer.lookup(r, c); - // Special keys are always modColor + // Special keys are always mod_color if (k.flags != 0) { - LEDControl.led_set_crgb_at(r, c, modColor); + LEDControl.led_set_crgb_at(r, c, mod_color_); continue; } - cRGB color = modColor; + cRGB color = mod_color_; switch (k.keyCode) { case Key_A.keyCode ... Key_0.keyCode: @@ -48,10 +47,10 @@ TriColor::update(void) { case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: case Key_F1.keyCode ... Key_F4.keyCode: case Key_F9.keyCode ... Key_F12.keyCode: - color = baseColor; + color = base_color_; break; case Key_Escape.keyCode: - color = escColor; + color = esc_color_; break; } @@ -59,5 +58,5 @@ TriColor::update(void) { } } } -}; -}; + +} diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index b7cc0774..5a19fb26 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -21,19 +21,17 @@ #include #include -namespace KaleidoscopePlugins { -namespace LEDEffects { +namespace kaleidoscope { class TriColor : public LEDMode { public: - TriColor(cRGB baseColor, cRGB modColor, cRGB escColor); - TriColor(cRGB baseColor, cRGB modColor) : TriColor(baseColor, modColor, modColor) {}; + TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color); + TriColor(cRGB base_color, cRGB mod_color) : TriColor(base_color, mod_color, mod_color) {}; virtual void update(void) final; private: - cRGB baseColor; - cRGB modColor; - cRGB escColor; -}; -}; + cRGB base_color_; + cRGB mod_color_; + cRGB esc_color_; }; +} From 3e1a3e0f3a0a5ced42343bf975e6471abbd6316c Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sun, 4 Jun 2017 19:53:01 +0200 Subject: [PATCH 28/47] TriColor: Fix the keydap subtract/devide range Signed-off-by: Gergely Nagy --- src/Kaleidoscope/TriColor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index ca81a537..cb0313f1 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -43,7 +43,7 @@ TriColor::update(void) { switch (k.keyCode) { case Key_A.keyCode ... Key_0.keyCode: case Key_Spacebar.keyCode: - case Key_KeypadSubtract.keyCode ... Key_KeypadDivide.keyCode: + case Key_KeypadDivide.keyCode ... Key_KeypadSubtract.keyCode: case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: case Key_F1.keyCode ... Key_F4.keyCode: case Key_F9.keyCode ... Key_F12.keyCode: From e54dc2a4fd2b532e764c4e913b219581efb88bef Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sun, 4 Jun 2017 20:56:33 +0200 Subject: [PATCH 29/47] Make the linter happy Signed-off-by: Gergely Nagy --- src/Kaleidoscope/Jukebox.cpp | 4 ++-- src/Kaleidoscope/TriColor.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp index 27ea9fe7..c1fde095 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -23,5 +23,5 @@ kaleidoscope::TriColor JukeboxEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ CRGB(0x21, 0x38, 0xd7)); /* RN */ kaleidoscope::TriColor JukeboxAlternateEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ - CRGB(0x21, 0x38, 0xd7), /* RN */ - CRGB(0xc3, 0xee, 0x8c)); /* VCO */ + CRGB(0x21, 0x38, 0xd7), /* RN */ + CRGB(0xc3, 0xee, 0x8c)); /* VCO */ diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index 5a19fb26..1d9a2f3e 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -25,9 +25,9 @@ namespace kaleidoscope { class TriColor : public LEDMode { public: TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color); - TriColor(cRGB base_color, cRGB mod_color) : TriColor(base_color, mod_color, mod_color) {}; + TriColor(cRGB base_color, cRGB mod_color) : TriColor(base_color, mod_color, mod_color) {} - virtual void update(void) final; + void update(void) final; private: cRGB base_color_; From e8901c55a0776f71b2b606884aad85fc823b4144 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Mon, 24 Jul 2017 14:59:07 -0700 Subject: [PATCH 30/47] CamelCaseifcation of LED related functions s/led_set_crgb_at/setCrgbAt/ s/hsv_to_rgb/hsvToRgb/ s/led_get_crgb_at/getCrgbAt/ s/led_sync/syncLeds/ s/get_led_index/getLedIndex/ s/send_led_data/sendLedData/ s/led_power_fault/ledPowerFault/ --- src/Kaleidoscope/TriColor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index cb0313f1..d23ef418 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -34,7 +34,7 @@ TriColor::update(void) { // Special keys are always mod_color if (k.flags != 0) { - LEDControl.led_set_crgb_at(r, c, mod_color_); + LEDControl.setCrgbAt(r, c, mod_color_); continue; } @@ -54,7 +54,7 @@ TriColor::update(void) { break; } - LEDControl.led_set_crgb_at(r, c, color); + LEDControl.setCrgbAt(r, c, color); } } } From 821ec5861bcca2120f02129495f374e7a4ef8923 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 25 Jul 2017 15:52:15 -0700 Subject: [PATCH 31/47] Update Makefile to fix OS X build --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 9ce0c4a9..2b04143a 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,10 @@ MAKEFILE_PREFIX=keyboardio/avr/libraries/Kaleidoscope-Plugin/build UNAME_S := $(shell uname -s) -BOARD_HARDWARE_PATH ?= $(HOME)/Arduino/hardware ifeq ($(UNAME_S),Darwin) -BOARD_HARDWARE_PATH ?= $(HOME)/Library/Arduino/hardware +BOARD_HARDWARE_PATH ?= $(HOME)/Documents/Arduino/hardware +else +BOARD_HARDWARE_PATH ?= $(HOME)/Arduino/hardware endif -include $(BOARD_HARDWARE_PATH)/$(MAKEFILE_PREFIX)/*.mk +include $(BOARD_HARDWARE_PATH)/$(MAKEFILE_PREFIX)/rules.mk From b829d6371b283e4caa38169bbd6be273c3ac9b95 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 15 Aug 2017 23:03:07 +0200 Subject: [PATCH 32/47] Updated to use the new LEDMode/LEDControl API Signed-off-by: Gergely Nagy --- src/Kaleidoscope/TriColor.cpp | 3 +-- src/Kaleidoscope/TriColor.h | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index d23ef418..ead2d6fe 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -26,8 +26,7 @@ TriColor::TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color) { esc_color_ = esc_color; } -void -TriColor::update(void) { +void TriColor::update(void) { for (uint8_t r = 0; r < ROWS; r++) { for (uint8_t c = 0; c < COLS; c++) { Key k = Layer.lookup(r, c); diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index 1d9a2f3e..09aa6de6 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -27,6 +27,7 @@ class TriColor : public LEDMode { TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color); TriColor(cRGB base_color, cRGB mod_color) : TriColor(base_color, mod_color, mod_color) {} + protected: void update(void) final; private: From 7eded65ba3856854034262611adcb2bcdb3e2069 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 17 Aug 2017 00:43:32 +0200 Subject: [PATCH 33/47] Fix the LEDControl references Signed-off-by: Gergely Nagy --- src/Kaleidoscope/TriColor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index ead2d6fe..410ccae6 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -33,7 +33,7 @@ void TriColor::update(void) { // Special keys are always mod_color if (k.flags != 0) { - LEDControl.setCrgbAt(r, c, mod_color_); + ::LEDControl.setCrgbAt(r, c, mod_color_); continue; } @@ -53,7 +53,7 @@ void TriColor::update(void) { break; } - LEDControl.setCrgbAt(r, c, color); + ::LEDControl.setCrgbAt(r, c, color); } } } From df4a6f58cf4c25178bd03f8ed30f57276b44a454 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 17 Aug 2017 12:04:50 +0200 Subject: [PATCH 34/47] Stop using deprecated interfaces Use `Kaleidoscope.use` instead of `USE_PLUGINS`, which is getting deprecated. Signed-off-by: Gergely Nagy --- README.md | 4 ++-- examples/LEDEffects/LEDEffects.ino | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2110ac3d..99b14cbd 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [st:experimental]: https://img.shields.io/badge/experimental----black.svg?style=flat&colorA=dfb317&colorB=494e52 The `LEDEffects` plugin provides a selection of LED effects, each of them fairly -simple, simple enough to not need a plugin of their own. +simple, simple enough to not need a plugin of their own. ## Using the plugin @@ -23,7 +23,7 @@ them. #include void setup(void) { - USE_PLUGINS(&JukeBoxEffect); + Kaleidoscope.use(&JukeBoxEffect); Kaleidoscope.setup(); } diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index 3d2c8fb0..6a93af99 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -44,7 +44,7 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { void setup() { - USE_PLUGINS(&LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect); + Kaleidoscope.use(&LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect); Kaleidoscope.setup(); From 387cc95109250337afcc7f7ec4dab2821b4eaa73 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Mon, 21 Aug 2017 22:24:21 -0700 Subject: [PATCH 35/47] Update Makefile with OSX fixes and new paths --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 2b04143a..8f830f44 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,14 @@ # This stub makefile for a Kaleidoscope plugin pulls in # all targets from the Kaleidoscope-Plugin library -MAKEFILE_PREFIX=keyboardio/avr/libraries/Kaleidoscope-Plugin/build UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) -BOARD_HARDWARE_PATH ?= $(HOME)/Documents/Arduino/hardware +SKETCHBOOK_DIR ?= $(HOME)/Documents/Arduino/ else -BOARD_HARDWARE_PATH ?= $(HOME)/Arduino/hardware +SKETCHBOOK_DIR ?= $(HOME)/Arduino endif -include $(BOARD_HARDWARE_PATH)/$(MAKEFILE_PREFIX)/rules.mk +BOARD_HARDWARE_PATH ?= $(SKETCHBOOK_DIR)/hardware +KALEIDOSCOPE_PLUGIN_MAKEFILE_DIR ?= keyboardio/avr/build-tools/makefiles/ +include $(BOARD_HARDWARE_PATH)/$(KALEIDOSCOPE_PLUGIN_MAKEFILE_DIR)/rules.mk From 7044060ebf074c7a6bf84f18e9158394bbd89a08 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 9 May 2018 22:53:56 +0200 Subject: [PATCH 36/47] Updated the README and the example to use the new plugin APIs Signed-off-by: Gergely Nagy --- examples/LEDEffects/LEDEffects.ino | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index 6a93af99..b525b808 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017, 2018 Gergely Nagy * * 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 @@ -21,7 +21,7 @@ #include "LED-Off.h" - +// *INDENT-OFF* const Key keymaps[][ROWS][COLS] PROGMEM = { [0] = KEYMAP_STACKED ( @@ -35,17 +35,21 @@ const Key keymaps[][ROWS][COLS] PROGMEM = { Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, - Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, + Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, Key_NoKey), }; +// *INDENT-ON* +KALEIDOSCOPE_INIT_PLUGINS(LEDControl, + LEDOff, + MiamiEffect, + JukeboxEffect, + JukeboxAlternateEffect); void setup() { - Kaleidoscope.use(&LEDOff, &MiamiEffect, &JukeboxEffect, &JukeboxAlternateEffect); - Kaleidoscope.setup(); MiamiEffect.activate(); From 7a9b315f85f56d66571fba906823422b4f09936b Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 22 Aug 2018 12:16:25 +0200 Subject: [PATCH 37/47] Relicense under the GPLv3 (only) Signed-off-by: Gergely Nagy --- examples/LEDEffects/LEDEffects.ino | 19 +++++++++---------- src/Kaleidoscope-LEDEffects.h | 19 +++++++++---------- src/Kaleidoscope/Jukebox.cpp | 19 +++++++++---------- src/Kaleidoscope/Jukebox.h | 19 +++++++++---------- src/Kaleidoscope/Miami.cpp | 19 +++++++++---------- src/Kaleidoscope/Miami.h | 19 +++++++++---------- src/Kaleidoscope/TriColor.cpp | 19 +++++++++---------- src/Kaleidoscope/TriColor.h | 19 +++++++++---------- 8 files changed, 72 insertions(+), 80 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index b525b808..2e092fd7 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017, 2018 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #include diff --git a/src/Kaleidoscope-LEDEffects.h b/src/Kaleidoscope-LEDEffects.h index 4e3fd86e..a11d9b63 100644 --- a/src/Kaleidoscope-LEDEffects.h +++ b/src/Kaleidoscope-LEDEffects.h @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #pragma once diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp index c1fde095..ff9b8229 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #include diff --git a/src/Kaleidoscope/Jukebox.h b/src/Kaleidoscope/Jukebox.h index 3a50252c..a79dda40 100644 --- a/src/Kaleidoscope/Jukebox.h +++ b/src/Kaleidoscope/Jukebox.h @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #pragma once diff --git a/src/Kaleidoscope/Miami.cpp b/src/Kaleidoscope/Miami.cpp index 206821f9..249fc7e8 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #include diff --git a/src/Kaleidoscope/Miami.h b/src/Kaleidoscope/Miami.h index 0dcead0c..770cc323 100644 --- a/src/Kaleidoscope/Miami.h +++ b/src/Kaleidoscope/Miami.h @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #pragma once diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index 410ccae6..bfe91338 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #include diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index 09aa6de6..fa0ff132 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -2,18 +2,17 @@ * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope * Copyright (C) 2016, 2017 Gergely Nagy * - * 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 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, version 3. * - * 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. + * 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 . + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #pragma once From f7b9c65d347cd8bb749d64f6c87a684a01458e05 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 22 Aug 2018 12:16:28 +0200 Subject: [PATCH 38/47] Assign my copyright to Keyboard.io While the original plugin was written independently, significant developments were made while working for Keyboard.io. As such, I feel it is appropriate to assign copyright to the company. Signed-off-by: Gergely Nagy --- examples/LEDEffects/LEDEffects.ino | 2 +- library.properties | 2 +- src/Kaleidoscope-LEDEffects.h | 2 +- src/Kaleidoscope/Jukebox.cpp | 2 +- src/Kaleidoscope/Jukebox.h | 2 +- src/Kaleidoscope/Miami.cpp | 2 +- src/Kaleidoscope/Miami.h | 2 +- src/Kaleidoscope/TriColor.cpp | 2 +- src/Kaleidoscope/TriColor.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/LEDEffects/LEDEffects.ino b/examples/LEDEffects/LEDEffects.ino index 2e092fd7..0c88da2e 100644 --- a/examples/LEDEffects/LEDEffects.ino +++ b/examples/LEDEffects/LEDEffects.ino @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017, 2018 Gergely Nagy + * Copyright (C) 2016, 2017, 2018 Keyboard.io, Inc * * 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 diff --git a/library.properties b/library.properties index 0fb17c84..fe8dc009 100644 --- a/library.properties +++ b/library.properties @@ -1,7 +1,7 @@ name=Kaleidoscope-LEDEffects version=0.0.0 author=Gergely Nagy -maintainer=Gergely Nagy +maintainer=Gergely Nagy sentence=An assorted collection of LED effects for Kaleidoscope. paragraph=A neat effect for every occasion one can possibly think of! category=Communication diff --git a/src/Kaleidoscope-LEDEffects.h b/src/Kaleidoscope-LEDEffects.h index a11d9b63..abc86147 100644 --- a/src/Kaleidoscope-LEDEffects.h +++ b/src/Kaleidoscope-LEDEffects.h @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017 Keyboard.io, Inc * * 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 diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/Kaleidoscope/Jukebox.cpp index ff9b8229..b174ed09 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/Kaleidoscope/Jukebox.cpp @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016 Gergely Nagy + * Copyright (C) 2016 Keyboard.io, Inc * * 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 diff --git a/src/Kaleidoscope/Jukebox.h b/src/Kaleidoscope/Jukebox.h index a79dda40..76769893 100644 --- a/src/Kaleidoscope/Jukebox.h +++ b/src/Kaleidoscope/Jukebox.h @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017 Keyboard.io, Inc * * 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 diff --git a/src/Kaleidoscope/Miami.cpp b/src/Kaleidoscope/Miami.cpp index 249fc7e8..d0fdddf3 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017 Keyboard.io, Inc * * 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 diff --git a/src/Kaleidoscope/Miami.h b/src/Kaleidoscope/Miami.h index 770cc323..add5bea1 100644 --- a/src/Kaleidoscope/Miami.h +++ b/src/Kaleidoscope/Miami.h @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017 Keyboard.io, Inc * * 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 diff --git a/src/Kaleidoscope/TriColor.cpp b/src/Kaleidoscope/TriColor.cpp index bfe91338..c2779364 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/Kaleidoscope/TriColor.cpp @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017 Keyboard.io, Inc * * 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 diff --git a/src/Kaleidoscope/TriColor.h b/src/Kaleidoscope/TriColor.h index fa0ff132..6693608f 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/Kaleidoscope/TriColor.h @@ -1,6 +1,6 @@ /* -*- mode: c++ -*- * Kaleidoscope-LEDEffects -- An assorted collection of LED effects for Kaleidoscope - * Copyright (C) 2016, 2017 Gergely Nagy + * Copyright (C) 2016, 2017 Keyboard.io, Inc * * 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 From 561b5d1fb18d537a5a85cef862e99842943096bc Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 22 Aug 2018 12:16:30 +0200 Subject: [PATCH 39/47] Add CONTRIBUTING.md Copied from Kaleidoscope, as it is applicable here too. Signed-off-by: Gergely Nagy --- CONTRIBUTING.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..c490e3ce --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,50 @@ +# Developer Certificate of Origin + +All contributions must include acceptance of the DCO: + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +1 Letterman Drive +Suite D4700 +San Francisco, CA, 94129 + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +## Sign your work + +To accept the DCO, please add this line to each commit message with your name +and email address (`git commit -s` will do this for you): + + Signed-off-by: Jane Example From 2a3a8341c312d4849f6b45a5d07ca8754d0e9cc1 Mon Sep 17 00:00:00 2001 From: Ben Gardiner Date: Tue, 28 Aug 2018 09:14:33 -0400 Subject: [PATCH 40/47] fix: yellow was cyan the 'r' and 'b' values for cyan were swapped. Signed-off-by: Ben Gardiner --- src/Kaleidoscope/Miami.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kaleidoscope/Miami.cpp b/src/Kaleidoscope/Miami.cpp index d0fdddf3..4e6777f0 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/Kaleidoscope/Miami.cpp @@ -17,5 +17,5 @@ #include -kaleidoscope::TriColor MiamiEffect(CRGB(0xd6, 0xd6, 0x4e), /* Cyan */ +kaleidoscope::TriColor MiamiEffect(CRGB(0x4e, 0xd6, 0xd6), /* Cyan */ CRGB(0xaf, 0x67, 0xfa)); /* Magenta */ From a0970bf7c80bfada0bcd954f86cb00f98f623c5a Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 4 Sep 2018 18:24:01 -0700 Subject: [PATCH 41/47] Update travis.yml to point to new bundle repo --- .travis.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e7030acf..e3e64f77 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,15 @@ dist: trusty sudo: false os: - linux +addons: + apt: + packages: + - shellcheck install: - - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr + - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Kaleidoscope-Bundle-Keyboardio hardware/keyboardio script: - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware + - shellcheck bin/kaleidoscope-builder notifications: irc: channels: @@ -13,7 +18,7 @@ notifications: use_notice: true skip_join: true template: - - "%{repository_name}/%{branch} %{commit} by %{author}: %{commit_subject} %{build_url} %{message}" + - "%{repository_name}/%{branch} %{commit} by %{author}: %{commit_subject} %{build_url} %{message}" email: on_success: change on_failure: change From 2d3eeebbeaef4ae05f8bcef3620a70fb927b1dc6 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 4 Sep 2018 18:42:30 -0700 Subject: [PATCH 42/47] shellcheck should only be run in the Kaleidoscope repo --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index e3e64f77..23d30ccc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,10 @@ dist: trusty sudo: false os: - linux -addons: - apt: - packages: - - shellcheck install: - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Kaleidoscope-Bundle-Keyboardio hardware/keyboardio script: - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware - - shellcheck bin/kaleidoscope-builder notifications: irc: channels: From 6c8bf9e99a810d0e9febaf07091c6233a4181ad6 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 10 Oct 2018 06:46:19 +0200 Subject: [PATCH 43/47] README.md, TriColor.md & Travis cleanup Remove the IRC notifications from Travis (we're not using IRC anymore), and the stable/experimental badge from README.md and TriColor.md (because they aren't being kept up to date). Signed-off-by: Gergely Nagy --- .travis.yml | 7 ------- README.md | 10 +++------- TriColor.md | 6 ------ 3 files changed, 3 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 23d30ccc..49b8c498 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,13 +7,6 @@ install: script: - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware notifications: - irc: - channels: - - "chat.freenode.net#keyboardio" - use_notice: true - skip_join: true - template: - - "%{repository_name}/%{branch} %{commit} by %{author}: %{commit_subject} %{build_url} %{message}" email: on_success: change on_failure: change diff --git a/README.md b/README.md index 99b14cbd..ea16b0f2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,10 @@ # Kaleidoscope-LEDEffects -![status][st:stable] [![Build Status][travis:image]][travis:status] +[![Build Status][travis:image]][travis:status] [travis:image]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects.svg?branch=master [travis:status]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects - [st:stable]: https://img.shields.io/badge/stable-✔-black.svg?style=flat&colorA=44cc11&colorB=494e52 - [st:broken]: https://img.shields.io/badge/broken-X-black.svg?style=flat&colorA=e05d44&colorB=494e52 - [st:experimental]: https://img.shields.io/badge/experimental----black.svg?style=flat&colorA=dfb317&colorB=494e52 - The `LEDEffects` plugin provides a selection of LED effects, each of them fairly simple, simple enough to not need a plugin of their own. @@ -22,9 +18,9 @@ them. #include #include -void setup(void) { - Kaleidoscope.use(&JukeBoxEffect); +KALEIDOSCOPE_INIT_PLUGINS(LEDControl, JukeBoxEffect); +void setup(void) { Kaleidoscope.setup(); } ``` diff --git a/TriColor.md b/TriColor.md index 1b428f44..1d5030d5 100644 --- a/TriColor.md +++ b/TriColor.md @@ -1,11 +1,5 @@ # Kaleidoscope-TriColor -![status][st:stable] - - [st:stable]: https://img.shields.io/badge/stable-✔-black.svg?style=flat&colorA=44cc11&colorB=494e52 - [st:broken]: https://img.shields.io/badge/broken-X-black.svg?style=flat&colorA=e05d44&colorB=494e52 - [st:experimental]: https://img.shields.io/badge/experimental----black.svg?style=flat&colorA=dfb317&colorB=494e52 - The `TriColor` effect extension is a part of the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of its own. It is used to implement the effects in that library. From 046846c650c74228f126a16d32286eb770ea5cbb Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sat, 13 Oct 2018 14:57:08 +0200 Subject: [PATCH 44/47] Rearrange the file layout in preparation of becoming a monorepo Move the documentation to `doc/plugin/LEDEffects.md`, sources under `src/kaleidoscope/plugin/` (appropriately namespaced). This is in preparation of merging plugins into a single monorepo. Signed-off-by: Gergely Nagy --- README.md | 70 +----------------- doc/plugin/LEDEffects.md | 71 +++++++++++++++++++ TriColor.md => doc/plugin/TriColor.md | 0 src/Kaleidoscope-LEDEffects.h | 6 +- .../plugin}/Jukebox.cpp | 4 +- .../plugin}/Jukebox.h | 6 +- .../plugin}/Miami.cpp | 2 +- .../plugin}/Miami.h | 4 +- .../plugin}/TriColor.cpp | 2 + .../plugin}/TriColor.h | 2 + 10 files changed, 87 insertions(+), 80 deletions(-) create mode 100644 doc/plugin/LEDEffects.md rename TriColor.md => doc/plugin/TriColor.md (100%) rename src/{Kaleidoscope => kaleidoscope/plugin}/Jukebox.cpp (85%) rename src/{Kaleidoscope => kaleidoscope/plugin}/Jukebox.h (82%) rename src/{Kaleidoscope => kaleidoscope/plugin}/Miami.cpp (91%) rename src/{Kaleidoscope => kaleidoscope/plugin}/Miami.h (89%) rename src/{Kaleidoscope => kaleidoscope/plugin}/TriColor.cpp (98%) rename src/{Kaleidoscope => kaleidoscope/plugin}/TriColor.h (98%) diff --git a/README.md b/README.md index ea16b0f2..be3f5077 100644 --- a/README.md +++ b/README.md @@ -5,72 +5,4 @@ [travis:image]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects.svg?branch=master [travis:status]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects -The `LEDEffects` plugin provides a selection of LED effects, each of them fairly -simple, simple enough to not need a plugin of their own. - -## Using the plugin - -There are a number of different effects included in the package, all of them are -available once including the header, and one's free to choose any number of -them. - -```c++ -#include -#include - -KALEIDOSCOPE_INIT_PLUGINS(LEDControl, JukeBoxEffect); - -void setup(void) { - Kaleidoscope.setup(); -} -``` - -## Included effects - -All of these effects will scan the active layers, and apply effects based on -what keys are active on each position, thus, it needs no hints or configuration -to figure out our layout! - -### `MiamiEffect` - -Applies a color effect to the keyboard, inspired by the popular Miami keyset: - -![Miami](extras/MiamiEffect.png) - -Alphas, punctuation, numbers, the space bar, the numbers and the dot on the -keypad, and half the function keys will be in a cyan-ish color, the rest in -magenta. - -### `JukeboxEffect` - -Applies a color effect to the keyboard, inspired by the JukeBox keyset: - -![Jukebox](extras/JukeboxEffect.png) - -Alphas, punctuation, numbers, the space bar, the numbers and the dot on the -keypad, and half the function keys will be in a beige-ish color, the rest in -light green, except for the `Esc` key, which will be in red. - -An alternative color scheme exists under the `JukeboxAlternateEffect` name, -where the light green and red colors are swapped. - -## Plugin methods - -The plugin provides a single method on each of the included effect objects: - -### `.activate()` - -> When called, immediately activates the effect. Mostly useful in the `setup()` -> method of the Sketch, or in macros that are meant to switch to the selected -> effect, no matter where we are in the list. - -## Dependencies - -* [Kaleidoscope-LEDControl](https://github.com/keyboardio/Kaleidoscope-LEDControl) - -## Further reading - -Starting from the [example][plugin:example] is the recommended way of getting -started with the plugin. - - [plugin:example]: https://github.com/keyboardio/Kaleidoscope-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino +See [doc/plugin/LEDEffects.md](doc/plugin/LEDEffects.md) for documentation. diff --git a/doc/plugin/LEDEffects.md b/doc/plugin/LEDEffects.md new file mode 100644 index 00000000..5ad77a4d --- /dev/null +++ b/doc/plugin/LEDEffects.md @@ -0,0 +1,71 @@ +# Kaleidoscope-LEDEffects + +The `LEDEffects` plugin provides a selection of LED effects, each of them fairly +simple, simple enough to not need a plugin of their own. + +## Using the plugin + +There are a number of different effects included in the package, all of them are +available once including the header, and one's free to choose any number of +them. + +```c++ +#include +#include + +KALEIDOSCOPE_INIT_PLUGINS(LEDControl, JukeBoxEffect); + +void setup(void) { + Kaleidoscope.setup(); +} +``` + +## Included effects + +All of these effects will scan the active layers, and apply effects based on +what keys are active on each position, thus, it needs no hints or configuration +to figure out our layout! + +### `MiamiEffect` + +Applies a color effect to the keyboard, inspired by the popular Miami keyset: + +![Miami](extras/MiamiEffect.png) + +Alphas, punctuation, numbers, the space bar, the numbers and the dot on the +keypad, and half the function keys will be in a cyan-ish color, the rest in +magenta. + +### `JukeboxEffect` + +Applies a color effect to the keyboard, inspired by the JukeBox keyset: + +![Jukebox](extras/JukeboxEffect.png) + +Alphas, punctuation, numbers, the space bar, the numbers and the dot on the +keypad, and half the function keys will be in a beige-ish color, the rest in +light green, except for the `Esc` key, which will be in red. + +An alternative color scheme exists under the `JukeboxAlternateEffect` name, +where the light green and red colors are swapped. + +## Plugin methods + +The plugin provides a single method on each of the included effect objects: + +### `.activate()` + +> When called, immediately activates the effect. Mostly useful in the `setup()` +> method of the Sketch, or in macros that are meant to switch to the selected +> effect, no matter where we are in the list. + +## Dependencies + +* [Kaleidoscope-LEDControl](https://github.com/keyboardio/Kaleidoscope-LEDControl) + +## Further reading + +Starting from the [example][plugin:example] is the recommended way of getting +started with the plugin. + + [plugin:example]: https://github.com/keyboardio/Kaleidoscope-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino diff --git a/TriColor.md b/doc/plugin/TriColor.md similarity index 100% rename from TriColor.md rename to doc/plugin/TriColor.md diff --git a/src/Kaleidoscope-LEDEffects.h b/src/Kaleidoscope-LEDEffects.h index abc86147..b4a7ba2c 100644 --- a/src/Kaleidoscope-LEDEffects.h +++ b/src/Kaleidoscope-LEDEffects.h @@ -17,6 +17,6 @@ #pragma once -#include -#include -#include +#include +#include +#include diff --git a/src/Kaleidoscope/Jukebox.cpp b/src/kaleidoscope/plugin/Jukebox.cpp similarity index 85% rename from src/Kaleidoscope/Jukebox.cpp rename to src/kaleidoscope/plugin/Jukebox.cpp index b174ed09..33622d6b 100644 --- a/src/Kaleidoscope/Jukebox.cpp +++ b/src/kaleidoscope/plugin/Jukebox.cpp @@ -17,10 +17,10 @@ #include -kaleidoscope::TriColor JukeboxEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ +kaleidoscope::plugin::TriColor JukeboxEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ CRGB(0xc3, 0xee, 0x8c), /* VCO */ CRGB(0x21, 0x38, 0xd7)); /* RN */ -kaleidoscope::TriColor JukeboxAlternateEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ +kaleidoscope::plugin::TriColor JukeboxAlternateEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ CRGB(0x21, 0x38, 0xd7), /* RN */ CRGB(0xc3, 0xee, 0x8c)); /* VCO */ diff --git a/src/Kaleidoscope/Jukebox.h b/src/kaleidoscope/plugin/Jukebox.h similarity index 82% rename from src/Kaleidoscope/Jukebox.h rename to src/kaleidoscope/plugin/Jukebox.h index 76769893..4b250088 100644 --- a/src/Kaleidoscope/Jukebox.h +++ b/src/kaleidoscope/plugin/Jukebox.h @@ -17,7 +17,7 @@ #pragma once -#include +#include -extern kaleidoscope::TriColor JukeboxEffect; -extern kaleidoscope::TriColor JukeboxAlternateEffect; +extern kaleidoscope::plugin::TriColor JukeboxEffect; +extern kaleidoscope::plugin::TriColor JukeboxAlternateEffect; diff --git a/src/Kaleidoscope/Miami.cpp b/src/kaleidoscope/plugin/Miami.cpp similarity index 91% rename from src/Kaleidoscope/Miami.cpp rename to src/kaleidoscope/plugin/Miami.cpp index 4e6777f0..d25a1649 100644 --- a/src/Kaleidoscope/Miami.cpp +++ b/src/kaleidoscope/plugin/Miami.cpp @@ -17,5 +17,5 @@ #include -kaleidoscope::TriColor MiamiEffect(CRGB(0x4e, 0xd6, 0xd6), /* Cyan */ +kaleidoscope::plugin::TriColor MiamiEffect(CRGB(0x4e, 0xd6, 0xd6), /* Cyan */ CRGB(0xaf, 0x67, 0xfa)); /* Magenta */ diff --git a/src/Kaleidoscope/Miami.h b/src/kaleidoscope/plugin/Miami.h similarity index 89% rename from src/Kaleidoscope/Miami.h rename to src/kaleidoscope/plugin/Miami.h index add5bea1..08e6b342 100644 --- a/src/Kaleidoscope/Miami.h +++ b/src/kaleidoscope/plugin/Miami.h @@ -17,6 +17,6 @@ #pragma once -#include +#include -extern kaleidoscope::TriColor MiamiEffect; +extern kaleidoscope::plugin::TriColor MiamiEffect; diff --git a/src/Kaleidoscope/TriColor.cpp b/src/kaleidoscope/plugin/TriColor.cpp similarity index 98% rename from src/Kaleidoscope/TriColor.cpp rename to src/kaleidoscope/plugin/TriColor.cpp index c2779364..c13eb626 100644 --- a/src/Kaleidoscope/TriColor.cpp +++ b/src/kaleidoscope/plugin/TriColor.cpp @@ -18,6 +18,7 @@ #include namespace kaleidoscope { +namespace plugin { TriColor::TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color) { base_color_ = base_color; @@ -58,3 +59,4 @@ void TriColor::update(void) { } } +} diff --git a/src/Kaleidoscope/TriColor.h b/src/kaleidoscope/plugin/TriColor.h similarity index 98% rename from src/Kaleidoscope/TriColor.h rename to src/kaleidoscope/plugin/TriColor.h index 6693608f..b4d62ef9 100644 --- a/src/Kaleidoscope/TriColor.h +++ b/src/kaleidoscope/plugin/TriColor.h @@ -21,6 +21,7 @@ #include namespace kaleidoscope { +namespace plugin { class TriColor : public LEDMode { public: TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color); @@ -35,3 +36,4 @@ class TriColor : public LEDMode { cRGB esc_color_; }; } +} From 566e3978f902a20522015da1bfc46a097be3675f Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sat, 13 Oct 2018 14:57:10 +0200 Subject: [PATCH 45/47] Remove files we do not need in the monorepo Signed-off-by: Gergely Nagy --- .gitignore | 4 - .travis.yml | 14 - CONTRIBUTING.md | 50 ---- COPYING | 674 --------------------------------------------- Makefile | 14 - README.md | 8 - library.properties | 10 - 7 files changed, 774 deletions(-) delete mode 100644 .gitignore delete mode 100644 .travis.yml delete mode 100644 CONTRIBUTING.md delete mode 100644 COPYING delete mode 100644 Makefile delete mode 100644 README.md delete mode 100644 library.properties diff --git a/.gitignore b/.gitignore deleted file mode 100644 index be16c9be..00000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.#* -*~ -/hardware/ -/output/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 49b8c498..00000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -dist: trusty -sudo: false -os: - - linux -install: - - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Kaleidoscope-Bundle-Keyboardio hardware/keyboardio -script: - - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware -notifications: - email: - on_success: change - on_failure: change -cache: - ccache: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index c490e3ce..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,50 +0,0 @@ -# Developer Certificate of Origin - -All contributions must include acceptance of the DCO: - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -1 Letterman Drive -Suite D4700 -San Francisco, CA, 94129 - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -## Sign your work - -To accept the DCO, please add this line to each commit message with your name -and email address (`git commit -s` will do this for you): - - Signed-off-by: Jane Example diff --git a/COPYING b/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - 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. - - - Copyright (C) - - 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 . - -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: - - Copyright (C) - 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 -. - - 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 -. diff --git a/Makefile b/Makefile deleted file mode 100644 index 8f830f44..00000000 --- a/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# This stub makefile for a Kaleidoscope plugin pulls in -# all targets from the Kaleidoscope-Plugin library - -UNAME_S := $(shell uname -s) - -ifeq ($(UNAME_S),Darwin) -SKETCHBOOK_DIR ?= $(HOME)/Documents/Arduino/ -else -SKETCHBOOK_DIR ?= $(HOME)/Arduino -endif - -BOARD_HARDWARE_PATH ?= $(SKETCHBOOK_DIR)/hardware -KALEIDOSCOPE_PLUGIN_MAKEFILE_DIR ?= keyboardio/avr/build-tools/makefiles/ -include $(BOARD_HARDWARE_PATH)/$(KALEIDOSCOPE_PLUGIN_MAKEFILE_DIR)/rules.mk diff --git a/README.md b/README.md deleted file mode 100644 index be3f5077..00000000 --- a/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Kaleidoscope-LEDEffects - -[![Build Status][travis:image]][travis:status] - - [travis:image]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects.svg?branch=master - [travis:status]: https://travis-ci.org/keyboardio/Kaleidoscope-LEDEffects - -See [doc/plugin/LEDEffects.md](doc/plugin/LEDEffects.md) for documentation. diff --git a/library.properties b/library.properties deleted file mode 100644 index fe8dc009..00000000 --- a/library.properties +++ /dev/null @@ -1,10 +0,0 @@ -name=Kaleidoscope-LEDEffects -version=0.0.0 -author=Gergely Nagy -maintainer=Gergely Nagy -sentence=An assorted collection of LED effects for Kaleidoscope. -paragraph=A neat effect for every occasion one can possibly think of! -category=Communication -url=https://github.com/keyboardio/Kaleidoscope-LEDEffects -architectures=avr -dot_a_linkage=true From c5b16e1087b082a105586fee0f4fb744da964a9c Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 17 Oct 2018 21:21:57 +0200 Subject: [PATCH 46/47] Update the documentation links Updates the example and dependency links in the documentation, to use URLs that are valid within the monorepo. Signed-off-by: Gergely Nagy --- doc/plugin/LEDEffects.md | 4 ++-- doc/plugin/TriColor.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/plugin/LEDEffects.md b/doc/plugin/LEDEffects.md index 5ad77a4d..b6e358c2 100644 --- a/doc/plugin/LEDEffects.md +++ b/doc/plugin/LEDEffects.md @@ -61,11 +61,11 @@ The plugin provides a single method on each of the included effect objects: ## Dependencies -* [Kaleidoscope-LEDControl](https://github.com/keyboardio/Kaleidoscope-LEDControl) +* [Kaleidoscope-LEDControl](LEDControl.md) ## Further reading Starting from the [example][plugin:example] is the recommended way of getting started with the plugin. - [plugin:example]: https://github.com/keyboardio/Kaleidoscope-LEDEffects/blob/master/examples/LEDEffects/LEDEffects.ino + [plugin:example]: ../../examples/LEDEffects/LEDEffects.ino diff --git a/doc/plugin/TriColor.md b/doc/plugin/TriColor.md index 1d5030d5..d653e36e 100644 --- a/doc/plugin/TriColor.md +++ b/doc/plugin/TriColor.md @@ -4,7 +4,7 @@ The `TriColor` effect extension is a part of the [`LEDEffects`][plugin:ledeffects] library, not a stand-alone base library of its own. It is used to implement the effects in that library. - [plugin:ledeffects]: https://github/keyboardio/Kaleidoscope-LEDEffects + [plugin:ledeffects]: LEDEffects.md It is a class that can be used to create LED effects that all follow a similar pattern: alphas and similar in one color; modifiers, special keys, and half the From 1b970625331e29f74cc67a01c1d7bd00797faa8b Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 18 Oct 2018 00:57:06 +0200 Subject: [PATCH 47/47] LEDEffects: astyle Signed-off-by: Gergely Nagy --- src/kaleidoscope/plugin/Jukebox.cpp | 4 ++-- src/kaleidoscope/plugin/Miami.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kaleidoscope/plugin/Jukebox.cpp b/src/kaleidoscope/plugin/Jukebox.cpp index 33622d6b..dc0f3eb8 100644 --- a/src/kaleidoscope/plugin/Jukebox.cpp +++ b/src/kaleidoscope/plugin/Jukebox.cpp @@ -18,8 +18,8 @@ #include kaleidoscope::plugin::TriColor JukeboxEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ - CRGB(0xc3, 0xee, 0x8c), /* VCO */ - CRGB(0x21, 0x38, 0xd7)); /* RN */ + CRGB(0xc3, 0xee, 0x8c), /* VCO */ + CRGB(0x21, 0x38, 0xd7)); /* RN */ kaleidoscope::plugin::TriColor JukeboxAlternateEffect(CRGB(0xc8, 0xe8, 0xee), /* TM */ CRGB(0x21, 0x38, 0xd7), /* RN */ diff --git a/src/kaleidoscope/plugin/Miami.cpp b/src/kaleidoscope/plugin/Miami.cpp index d25a1649..c23d63d5 100644 --- a/src/kaleidoscope/plugin/Miami.cpp +++ b/src/kaleidoscope/plugin/Miami.cpp @@ -18,4 +18,4 @@ #include kaleidoscope::plugin::TriColor MiamiEffect(CRGB(0x4e, 0xd6, 0xd6), /* Cyan */ - CRGB(0xaf, 0x67, 0xfa)); /* Magenta */ + CRGB(0xaf, 0x67, 0xfa)); /* Magenta */