From b3b5584f0b8016f3602d5e6bf73556b8d9fdc686 Mon Sep 17 00:00:00 2001 From: MuK IT GmbH Date: Tue, 5 Mar 2019 00:20:26 +0000 Subject: [PATCH] publish muk_web_preview_markdown - 12.0 --- muk_web_preview_markdown/LICENSE | 619 ++ muk_web_preview_markdown/README.rst | 109 + muk_web_preview_markdown/__init__.py | 18 + muk_web_preview_markdown/__manifest__.py | 51 + muk_web_preview_markdown/doc/changelog.rst | 14 + muk_web_preview_markdown/doc/index.rst | 109 + muk_web_preview_markdown/i18n/de.po | 16 + .../i18n/muk_web_preview_markdown.pot | 16 + .../static/description/banner.png | Bin 0 -> 43606 bytes .../static/description/icon.png | Bin 0 -> 9474 bytes .../static/description/index.html | 131 + .../static/description/logo.png | Bin 0 -> 38064 bytes .../static/description/screenshot.png | Bin 0 -> 37869 bytes .../static/lib/showdown/showdown.js | 5460 +++++++++++++++++ .../static/src/js/markdown.js | 68 + .../static/src/scss/markdown.scss | 23 + .../static/src/xml/content.xml | 29 + muk_web_preview_markdown/template/assets.xml | 29 + 18 files changed, 6692 insertions(+) create mode 100644 muk_web_preview_markdown/LICENSE create mode 100644 muk_web_preview_markdown/README.rst create mode 100644 muk_web_preview_markdown/__init__.py create mode 100644 muk_web_preview_markdown/__manifest__.py create mode 100644 muk_web_preview_markdown/doc/changelog.rst create mode 100644 muk_web_preview_markdown/doc/index.rst create mode 100644 muk_web_preview_markdown/i18n/de.po create mode 100644 muk_web_preview_markdown/i18n/muk_web_preview_markdown.pot create mode 100644 muk_web_preview_markdown/static/description/banner.png create mode 100644 muk_web_preview_markdown/static/description/icon.png create mode 100644 muk_web_preview_markdown/static/description/index.html create mode 100644 muk_web_preview_markdown/static/description/logo.png create mode 100644 muk_web_preview_markdown/static/description/screenshot.png create mode 100644 muk_web_preview_markdown/static/lib/showdown/showdown.js create mode 100644 muk_web_preview_markdown/static/src/js/markdown.js create mode 100644 muk_web_preview_markdown/static/src/scss/markdown.scss create mode 100644 muk_web_preview_markdown/static/src/xml/content.xml create mode 100644 muk_web_preview_markdown/template/assets.xml diff --git a/muk_web_preview_markdown/LICENSE b/muk_web_preview_markdown/LICENSE new file mode 100644 index 0000000..faf7bf4 --- /dev/null +++ b/muk_web_preview_markdown/LICENSE @@ -0,0 +1,619 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/muk_web_preview_markdown/README.rst b/muk_web_preview_markdown/README.rst new file mode 100644 index 0000000..ccecce1 --- /dev/null +++ b/muk_web_preview_markdown/README.rst @@ -0,0 +1,109 @@ +==================== +MuK Preview Markdown +==================== + +Extendes the Preview Dialog to support markdown files. Currently the following +extensions are supported: + +* Markdown (\*.md, text/markdown) + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Another way to install this module is via the package management for Python +(`PyPI `_). + +To install our modules using the package manager make sure +`odoo-autodiscover `_ is installed +correctly. Then open a console and install the module by entering the following +command: + +``pip install --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +The module name consists of the Odoo version and the module name, where +underscores are replaced by a dash. + +**Module:** + +``odoo-addon-`` + +**Example:** + +``sudo -H pip3 install --extra-index-url https://nexus.mukit.at/repository/odoo/simple odoo11-addon-muk-utils`` + +Once the installation has been successfully completed, the app is already in the +correct folder. Log on to your Odoo server and go to the Apps menu. Trigger the +debug mode and update the list by clicking on the "Update Apps List" link. Now +install the module by clicking on the install button. + +The biggest advantage of this variant is that you can now also update the app +using the "pip" command. To do this, enter the following command in your console: + +``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +When the process is finished, restart your server and update the application in +Odoo. The steps are the same as for the installation only the button has changed +from "Install" to "Upgrade". + +You can also view available Apps directly in our `repository `_ +and find a more detailed installation guide on our `website `_. + +For modules licensed under OPL-1, you will receive access data when you purchase +the module. If the modules were not purchased directly from +`MuK IT `_ please contact our support (support@mukit.at) +with a confirmation of purchase to receive the corresponding access data. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +If you installed the module using the "pip" command, you can also update the +module in the same way. Just type the following command into the console: + +``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +When the process is finished, restart your server and update the application in +Odoo, just like you would normally. + +Configuration +============= + +No additional configuration is needed to use this module. + +Usage +============= + +Go to a binary that contains a markdown file and open the preview dialog to view +the preview. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_web_preview_markdown/__init__.py b/muk_web_preview_markdown/__init__.py new file mode 100644 index 0000000..21f21ae --- /dev/null +++ b/muk_web_preview_markdown/__init__.py @@ -0,0 +1,18 @@ +################################################################################### +# +# Copyright (C) 2017 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### diff --git a/muk_web_preview_markdown/__manifest__.py b/muk_web_preview_markdown/__manifest__.py new file mode 100644 index 0000000..0986a77 --- /dev/null +++ b/muk_web_preview_markdown/__manifest__.py @@ -0,0 +1,51 @@ +################################################################################### +# +# Copyright (C) 2017 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +{ + "name": "MuK Preview Markdown", + "summary": """Markdown Preview""", + "version": "12.0.2.0.1", + "category": "Extra Tools", + "license": "AGPL-3", + "website": "http://www.mukit.at", + 'live_test_url': 'https://mukit.at/r/SgN', + "author": "MuK IT", + "contributors": [ + "Mathias Markl ", + ], + "depends": [ + "muk_web_preview", + ], + "data": [ + "template/assets.xml", + ], + "qweb": [ + "static/src/xml/*.xml", + ], + "images": [ + 'static/description/banner.png' + ], + "external_dependencies": { + "python": [], + "bin": [], + }, + "application": False, + "installable": True, + +} \ No newline at end of file diff --git a/muk_web_preview_markdown/doc/changelog.rst b/muk_web_preview_markdown/doc/changelog.rst new file mode 100644 index 0000000..f10b321 --- /dev/null +++ b/muk_web_preview_markdown/doc/changelog.rst @@ -0,0 +1,14 @@ +`2.0.0` +------- + +- Migrated to Python 3 + +`1.1.0` +------- + +- Lazy load javascript + +`1.0.0` +------- + +- Init version diff --git a/muk_web_preview_markdown/doc/index.rst b/muk_web_preview_markdown/doc/index.rst new file mode 100644 index 0000000..ccecce1 --- /dev/null +++ b/muk_web_preview_markdown/doc/index.rst @@ -0,0 +1,109 @@ +==================== +MuK Preview Markdown +==================== + +Extendes the Preview Dialog to support markdown files. Currently the following +extensions are supported: + +* Markdown (\*.md, text/markdown) + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Another way to install this module is via the package management for Python +(`PyPI `_). + +To install our modules using the package manager make sure +`odoo-autodiscover `_ is installed +correctly. Then open a console and install the module by entering the following +command: + +``pip install --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +The module name consists of the Odoo version and the module name, where +underscores are replaced by a dash. + +**Module:** + +``odoo-addon-`` + +**Example:** + +``sudo -H pip3 install --extra-index-url https://nexus.mukit.at/repository/odoo/simple odoo11-addon-muk-utils`` + +Once the installation has been successfully completed, the app is already in the +correct folder. Log on to your Odoo server and go to the Apps menu. Trigger the +debug mode and update the list by clicking on the "Update Apps List" link. Now +install the module by clicking on the install button. + +The biggest advantage of this variant is that you can now also update the app +using the "pip" command. To do this, enter the following command in your console: + +``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +When the process is finished, restart your server and update the application in +Odoo. The steps are the same as for the installation only the button has changed +from "Install" to "Upgrade". + +You can also view available Apps directly in our `repository `_ +and find a more detailed installation guide on our `website `_. + +For modules licensed under OPL-1, you will receive access data when you purchase +the module. If the modules were not purchased directly from +`MuK IT `_ please contact our support (support@mukit.at) +with a confirmation of purchase to receive the corresponding access data. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +If you installed the module using the "pip" command, you can also update the +module in the same way. Just type the following command into the console: + +``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +When the process is finished, restart your server and update the application in +Odoo, just like you would normally. + +Configuration +============= + +No additional configuration is needed to use this module. + +Usage +============= + +Go to a binary that contains a markdown file and open the preview dialog to view +the preview. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_web_preview_markdown/i18n/de.po b/muk_web_preview_markdown/i18n/de.po new file mode 100644 index 0000000..637a783 --- /dev/null +++ b/muk_web_preview_markdown/i18n/de.po @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-19 10:10+0000\n" +"PO-Revision-Date: 2018-01-19 10:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + diff --git a/muk_web_preview_markdown/i18n/muk_web_preview_markdown.pot b/muk_web_preview_markdown/i18n/muk_web_preview_markdown.pot new file mode 100644 index 0000000..637a783 --- /dev/null +++ b/muk_web_preview_markdown/i18n/muk_web_preview_markdown.pot @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-19 10:10+0000\n" +"PO-Revision-Date: 2018-01-19 10:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + diff --git a/muk_web_preview_markdown/static/description/banner.png b/muk_web_preview_markdown/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0c63b4a864b7172893e21959bf0eded1e00b0f GIT binary patch literal 43606 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

&9UEVNJb9Tn# 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�uC~=X%0Fi@`#ISmG^J`aimVBo<{Q|=wOE# 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 MiD;->q+=iUKPS=6O#lD@ literal 0 HcmV?d00001 diff --git a/muk_web_preview_markdown/static/description/icon.png b/muk_web_preview_markdown/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fbce4e673ba853aba20d1dcaac7cd108cbd56a72 GIT binary patch literal 9474 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 +

+

Preview Markdown

+

Preview your Markdown files directly in Odoo.

+

MuK IT GmbH - + www.mukit.at

+
+ +
+
+ + +
+
+
+

Overview

+

Extendes the Preview Dialog to support + Markdown files. Currently the following Markdown file extensions are + supported:

+

+ Markdown (*.md, + text/markdown) +

+
+
+
+ +
+ +
+ +
+
+
+ + +
+
+
+ +
+

Help and Support

+
Feel free to + contact us, if you need any help with your Odoo integration or + addiontal features.
+ + +
\ No newline at end of file diff --git a/muk_web_preview_markdown/static/description/logo.png b/muk_web_preview_markdown/static/description/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9427ce33ea36c2ec961356d01d612bae02d48ce2 GIT binary patch literal 38064 zcmeFYWmlVBv;`X63l#T4u~3S;y99SAg(Ag@yGwD`AjOIWcXuchcXxMpx0{}O-un;k zxAP$*BYF1NkFCAeTyxG9rmQH9fl7=D001y#Wh7Jq0GR84A7n)6KSQ%?;Q+t~fUJb5 zx|{xS27()&^jzN?4#9^;U3=F8WqQ>th=`oMt1EJ<2(qYu3&AG{4=%kjYAX-)+tu~` zCfAuG*PVVI7S$cCtLvD+*xd!!LPo|Fe}W)CyEJ?wD-3NXdq`K&9_|3+rPz*>!SW=Y`x zgwFXtmqOx{3HRSf4iP_$W<+p5)&CyDF$frS{CD<$BmEGOD@Eu0-s`~scMDeI?(hB^ zISzncBC#@6#DBK{z1gwA^iGaYaGDU^`6#wPFRcxSf2IfwjFCmnkWJ zO(-%zYrrtlI7+7=fHMedZuo`tGzNw6Uz%?+z=l;FWCEDV05ia4A1GG==CpxXc>LV7 zSr)LWAYH&mKqR~Yrk~Jv?un2xEGn_7t{OX8DL)L4`0TmU00>wI<}2d*Y$ z_V@y+z!IySi(h7paQ=6}WFF&x>GQw`7|b=TX|AtfaYAa?#Q6FBw1FZCh&Su3mE5Gq zCkN>EjDGfFp)v}{V`BT6eqc5X?@|!Za;@nOVC{j?n_Hly@RfMB4BvY7dW2O*9UI=d?KM>GvrqA{CTJ3&X0#@K36vle}ATmljt4` z@DhlHb}bi0GlvQTq-m2&hBYU`BK*GQ3+BG1;C;<>t^w*)bmrI$b9?D3Gy}-u%!ADT^8r2Sf#7{chLB zaneTqjKktJteP3bYG`Pf!siQ2Dy8L)f2${5s5Tg=z37kQMB@!p#1})KU?WNTY!3}B zrLU{0Ua1>FF6bfyf=KToUUPdXsjsJGtJq9rVswNu>Gc}{7ma|dpIH9sK~ShVgB`2N zg;+^X#m2TXSeLfWZoEool9fy65KY3K$E>$yoAUIeLC1kP&j6jg0aRCLrX0LY6ajET z#>A9ie7uy$a$~(n2F$0HCN!1*sum z&NlAIKF7Rot=PNNX)n~yryhCP1E3PW*3nM5F)~m?0dWwhCZCd|b#X2zC}=4%g#{ta z^_l2sL!(UlU4p=J9IXb(Azl|H>!VqG1gB6tOBi&OMZjodemFb0dds;xXLY-bJigi^ z334b;5hT)KH={;s0s?}o0`~WsF7R0Y;aPU-Rd{rr^>+YzIh5~@QJ2y7B`?O9htt(4 z%bu>BuRmb-ykZ*o?t3Mmk-vAIR)h&iz4i=&x@M3BtPDnj%>1hG&%R#LDCXbO!bp z(zh5I(-~fk3W5(g^*40(2dmBs zIBbHeS5n54Xw(oHGx^Bf+p{Eev)YD;TM>RK7khOyp^T?d6Jc7myBVC#yrKZk-RBdCN+AnN%Vuh1Uj` zl$5k^i3ss*&A?G8;K>Nqo(4L7SLG*-!_7oX^A*Pru&_8b!%L9V1 ztN^dZ;Mxa5MCWIFzo{FYw1pJCliRE{3PPp-lr&7lKAr|1Wz|KaoR?*?KR>z!st%$e(ls(ZVNys7 zW7@(a(2Uj&CDGvEE8U2elP(M#c?V(nM>jXJ{v3O65b&xa@z~y}?6t$-_jSqT3@@OK zmWm2nbMH*GLbFK#Uy)q;6F%GFHdtC}AN{^jQBjd1MUlsxc*d7o)zl<>?0rY(hv-bN zLhuamq6_4~{Umx%MT;c|UHG?PTc; z>u<~qG7NAB6QBtK>S>m)1P(Y7^flpD(kS!r@foa2Fsm0SCp8ybl{+AwxylJdKdJLV zLy18vizb*EQi@=}9h9%q`mk8W&v=pIb|+hP;7I53v$z%}%Z?A!iA{L+?mWFluJiJ2O~#T`HQB8Mo0T*6dP;oYOzJCV zrF2i#{{{)H1z~MJtp1E@uKO|c*h>Q;MKVxUwyO;2`+ET5;<2>htv3BrftF9HM|`QJ zQNOyvJJ-T#$#~J%izs;UOLqqc0=5Cv$M4;*6^!MW+`(w_j>cdd&LK>x8-kwB_3H?$T5O}gMo6a@!5v4-Fb=$1E|MBxvG`N_mr8%v&(#YI4SXT9wQ5aUI{@(Nne5cfxVWQCr_ zT_3tKkve4oK%b>njLdd+ETW?F;bIz8g1^jH`CWhh{8U8gzsdlW(^{_!jD0To_yLk9 zZtg%oBaS&RaUVCwuE~ z;m4aYnTv}H;bP0DMJ@;_CCK!1Feg_(nPyp#rh@b#!g0L2q?MUZkfCpsKH-GmerKEUAweQ*S zUoJ_gsN%V#JxL|*w;^JH?nfu-r`@On;^H$9ikV_suI;IK26Uq>QL{xMuY)EcKN`yH zY(+h!sK0SIvT9UpfBe020-oI+3~yR3Wa0#f^h7;NGy<_+lRPpxZ!B4icmeWxpG`$B z60;+Lwc$$zbY`MJ6Bxi7T&&MgxgepC4XRjoZ9)u9M+3rQ`-XZW06VVfx<#X)@uZvaf`EN!>|*KFq{t8#2-HEHaSFy!HTs(J1Lf z!*)}_@eIGLz^a<==liVfwo@3ku(i5i+rfRq!Z!sBsKhYU~XfI zE*;&$QL(;>vFz$0_YRGlQvknY%?e5=xX%m3CLeJ}YfLq*_6gb-)95p>>H4=%Flo zQWKgEFyTH08oKIs$sZ#Mq|;g}d4?8LO(Up#q~i=nza+ zxb2BaCfN~Zj7=&Qq484dWT9%@9naejW)(zH=mWL|Vr@K9X4%RvWF3jT1()59Y=5ZT z>omN!yPN(wO+j!`0@_(W;>9gmUN$dr$M^d)>oZFasfANswo_bH2U)y*U_m9Z2{d{h z5D`F$Hst4JBc);^o&2+tz~@>C^JUvn?6=V{rp3tHabkP|K%W4R)a4;kxs@ z>TOqhGvsmn=}@*`v#_w3^MHB7`a^`7PpM#M37+z=xh2G~zfKrm1ScGluUDs`<ewk~ZM)mg>IHb1_H@$sbcvEJi`FS7J=}0Cn^SC+e%$=`s{-s_{DI`61 zYAeJK=rIGFS)8vx$*-^-b_g@y=vP*sqHUJ;ZPk+BPvh#%uq zF`9dCK0_EW*3H$`!7os5gw^`b7;!R>%VreWB1Ke32^v4YuE#_jftWJ=?->rDi34Cw zIhY$jM2~*58G-EfN)|fOU}X0l{GQ7Y#;(m1)SjW#MisbXpo~K}Nd1&a8C<^qbor3f~Ft(01Kf zD1YU?AkYZOvVdn$-KGpw_Vp0(F1e|htPy=W zLY&}wPBs5w!zP5ROf0H_Hh2iQHn7|Rx@(|z?$rCj=cl9e=BH(6mE9_F5h2Vi^~GKe z+VBW=yrX=3dX2V||H<7{vZ)b=80w&2z3*Miy9CQw&1+zXLg4jlA#-%@;7{#huHyn^ zwt6!`H5z`M2$$4|+oxBcbfNV#<&>D(oy(5}c(`Wgz_vCr-rgAkG4oGkdHJ;_K;nC`SbL>wQ^Voi<7J`D{F9(WGtSV)^R`i`fL?AOS*FH*sNeC9k-)bC zyPNW$4Az`lG`8kNLh+S;7G>gvt6<}ZymiSlrtprpfcV4GuMH?$W=zW7_LPqP^1rBf zlSZy3H(=e1borz!XadK5(u;X1i%XfIm|9KSD&!M{5q+I`v0U$VNlHGo4zPi3?-USy z(yi{L_ouZf@z9F5+Jq8V4|mU66$Rc%PZw(Mmobfsf3IsBWH|cp;kb#SCZM|Q%{Z^I znqx+6%0pnuU}*ZjLpHs^;%v};YZ%8gI@sq&#O_V z-tTe4ZhhPSP`Co1S=^preNQ>mPspP|C zqH4BpEAIkq*(HCrr=b}bWXpCe4Ktke6)9tFby(v2*OzXf& zvTvw+bjg%d;v+wXqr_w=u{PonnL!+qBIV4&K$12dRX$WFhW)^aov$00^{FJ@f-ZPs zDS}*+vAG%PmtWLSrt8}fx3-(m>^CdsB1$wED!@7!Q(PPWc>xeaD2kv&faA@e*pNew z=v=G|hKb7Dc>UrE66Qp!rLcf^`GCQ8}knl zS|4GDK0^jsFxW}zem|7Qk3cygQwCI5kG&sECcBVg5bg zY6Jfw*9#067uU9xiY)StUs5f5=R>hzi{%5_0F=$u0s9kh8bT2OC)=TDvu8T!txe z_We)>Eev9@?L8mmud&)Jetq{Ra_DbrGnK3|-7Q>Dj8#a68b?WJzBUgXqgpCkMEkPjxQ^ z6G}*lPNH{IiuY7OK=%eB6c`8gFn zg&)_xng8& z9MJqtt7n_F+tAEXjxQ(uOx)<`*u-v`*h*$D^`n4l_~!;O)*X2)MZpLWZS*F?;}>$u znFkCzZ#&I_ds7A9tU(F61QH*F!@q9rilWvJY705WqI5LFpLMPu_%dF`k@jRLB}%WV ziG|c%Vd(959u+36`{|c`WeO;lH^nl9XRq5U zh4@$_Wk5PV!$kpECg~dXk)fd?GBWh^nY=vI5)a%Q9JtsU*rB135_aZ=4qPOJq_9LL z_j=#2&-R6W!2A@=3SZpVz(z(xQ+q^44S&VY_66cuxVbf2EU~k&c)*Z|jfI7ZNJvoY zw|Yc9#Y{h4TCcUTBHr!G|EiZcKNUj;u|5u%%7}l-q(TR5M})?M2p88s!f1O6GWNC} zQ86L|ZAe89*)0u73}5iNVA=8iTvc0RWm2ITo?{Ku43h*|vLpjJ|}a z&Bw>5>alrOUeiz$l$$%{DV&?bII0-^*0k2M5T?0xrgwCB=wGh@u5o&NVC{aJ@NM+j z)|2A9ujEz!-isuhCp!5;Q6IB%hTe%wZrJ$qH4UG&EeJ~;FJ4ywSv!$3yzf5Y8ozsC zUls5x!RdqMqg@BLEsM*b)lAY4XM304{#U_^sXON|mY(x^e6jH#7sAjoHfpm9W;!c* zCSsjFQW!6ECt3VlV0&tBn~Dl|z=kY%X-3e_%bjF%>eODdzy$P>Bn3jPPhjnLj{8f9 zS4fLL%STZf{qu?c=EUC7bTo-eqNXoHUnAIo+)uIM`S~O`CJnt9w{TW7$4*q9g#SHM zO;ImFP9o>_?ol;@d}G98`e6Z6n(fQAk1`GAV=4W<2|pV}MTU!g2YcBbyxz{U61QBw zVGz5OAYa7&o`{3+Y2aZIhW=x!FEJmIiz-x{xj>k@^xw!QVaUSNam7+vF)(zy)G?y; zrI5qG_b;Z%i^uK(v4r)r*mx*Qodo@MZcORF^{UE0XYv#SCsz^12J0maMp0wAZhu2z zjE(oFrW{Xfg2wq@yVpJdF!x4g=qLdukVe5}lb4x+0ktN%w6m0Eo26oO_i!_EWN7!J z*=^||Zs%og{+7%lOl}W$13Z>;L86RbXHugEXraq)wAf8WrRC}x&xhYlb6{L*$^3gv z?i*fZ9rmD0a@2;IQ(IeE)FqX=4_!`$mJi}MZ~5gK*Wg*Muhf#wL`RKEButM=noq&9 znOC%OrbTP?tM^k&gK?IS`6m{S^asjBf zLrDv*)~!{FpdrWQ?x3uk^SBkt?pPn8$$mtWPZ$<*E!A(<9AkqfmEvPLqvq*LD5EZepY~zg_0$3p z{aO&)x8dnDZI@AhA6%)Y)$>^9N2UmP5P}E_07zH${r&Vi^v5f-2lR}WFU+#dP^s`z z*i*Q6{hlR&dW8b}=FiLfLHp$p1@~8Im}9aW-gUF8{J!>K0Dpc7iNHDZXLyLh6C?DF z8Abz1w^fO92UKHxLUr&@H9wAiRep8dK=fI4oJ3c;zmHIPC^G!@R!+6{ZJ5Lb?zIL- zoIv(=Wj7oiNYoCX!L6DvbwOE`WKlI!wsCqOsB-g+P<{-PD}A z#yu|_@xT*%amRnD zzZdXLia}~G(x3VM_c=hUa<@}Qz?;l3w4XlE+nj#jjOMr-KInb+MjQp}Dg_1hL;G_< zQc<{8o&@^9RyTqIeFreEc`+`Zh8%Z&o&h&Idd1Fi4F()Jc}_rv9c$NuikQ?AUa zAWXpbd4(jaqYK}vo%s&rw|;{1B#WKlSX9A|vOsiTuF80_a9b8q%r8G~7%4L!XYBin z7Cyp-4y5=dsi#)~jPS1JBg%6@vOs>A-}T#60`Q|T%nTRXqe@Ighv@?C#Nl=_h#mgU z7qnV<63Q<(O10p3uy7!rToWNw$6T_U{g@t4O!Dlj&W%R-OG1$M(!`|YFy2Bmxs!dErtgk&b`z8CLDQod_Pt=7Gn+5UN` zq^JsX5|ySEe7i$LV~X#4E1;>m^7X%#Cg?nP;GCBzQrZpN4;7H1B1_mZnFu}~)558I z8L#4PcJ)AsBY1AMT~_9aBFhx?{du#wo~+u66+4WISJN`B1sie7VGL_eTy;X zaSi|_9F=H%ibpGJXF>?MYrFA<8>bX{AiI`iwwbIJjUlNR)3+{k;)Hz z!b$gw@kWANIEPYfFi|kNa}q6C9PJ|wS1#PY<}8aZ6*>X~IDM#Oq z6g&CnlBJtsbaaQl3a;;CwbjW>E7XcNocyI(@g61^PI@PJsPQmBZnqtFA-7}Az)jUx+b?CJ_E6(HkRCU@uou>6UI+fy>Qm-f)Z7cq&@& zgRM?ool(%G@n|4xe~J*<>)i)jjD|Le^KMI-r!i(b4|}~CL-V9rNpNLPM7;V)8EWya zYzT()N^F;+(aRZ>wHC`s)ZlJONgPc2dtH?)BIy&^`#j#WqcJr*xBT%=i+Q z5OO{z77D28-g}1!Whp=NKAKWJW)@Zyi@w?>YfXu4vIAPmMSA}B|mESH67*B-$?`(NWlC9-NbTtAjmRYMdW z%B7z)0KzDgqdFOv92_6G_VG2LWkOfl{%~RZ1snqlH9F4hS$9T3#ph?Iqr=Q}qet%h z_d(TWEHBwe2q9U{V?TL(4;)InO-f~p5uJZ@dCmi3KThW@L{whSInQzkl#rpFSe2&i zlu+w7dA?El9M9wUydFBaFr^DK?<$f83=`#+OiXY+K|GaM4Fz|GC$v5qpRP6%Pg1+G zqAD`wx}x)Lxu>mkP5s1Z4uTxVw3^ns~f)Zu@GLll6H686$<(Lq(%e?HqU;> zbVzdNmMB`Iw@rV#t3DLr;pNM6EvVmLE(ZGh2W)Vb9uGv*UkaUOUFP@xZgazdkI`tkpq+n=uus8JEB-!8IGe}EmM?E} zcssk|SvZ%IpgJ!ZW!-+JJzc0O8&-A3W)44>6C)b7C5_Id`P60idqBJ429vXx)Itr? zWgB5iEg;p1;g!eoAw3sO%1`caD2J8BBKq`3^%BuB3r-$e@n#f@qCs1LNAA zN3v=X+w|P1?Q_qTmMx3pk>RrMMlw`EeUvtlI||lc(-6y_wvAxT5c0)-5$xUg^ASXt zU!DZD&@iU6z3V~6>wJ*Y8aG)-p6ON5jTfN#Ld2OxkVBPQY0&dyX4kwR;}=w<%r%`E z%>QBP^OI7$@`{jYS!L~6A#@Zd{yk*TM5Rh3+O>re8T>orQvnUU4e6Ol0J*dQO54|e zJ`7U;Z(s+7nz6weWJpgQf?*wAgx)XNu+E}q7*=T`8EWq3&|u?d-eHa(rv()$K7kfK(+2Ta3U z@5<;azD5W;d!|Ox0$qJ&)7o_%s-0}&#aqrEw0KnP!unQu(Heu{A@GN08!Ci+27Cgf z`~d1Vy`iJIlJ~LuI_FD9F~^`j)MQ&nv7JEzpG~^)??-h?LB=vw2UD$5AFL16wHus~ zq!iN2aeK!-b7L}0YP{n3AS8;JEqk8FS9SSglka27c&tr&tO6w5!|Wp>34 zZ9hSN?|!!p!Jh$TeVJH3Lsc+D6%WJ$&nD_pK^5-I{?4eF1Xb1i#I-ffLxMAb-d5r0 zKf*HK%no<1%*6W^cSM+xf7GgeYjnWKXTE>P)yRyOF{$!kgaleIZ6l$d&5`}{g>jf+ zC%s7>AYU)3QY!@`B((jLPro+Vqmex}Zyh)~2jAVCP9y5+a);z@Ev0X(Ys6J|dTX1= z9}(L=Xvj{}$31lyN5H`huP3@sn*YY|n6%?2E~f?H!?Gko_&g4{lFkH!K9E^=sD;fU z?x1Zvp#~|i9zqo_!V`YDG?(Y1yis+vk7q9z9}%++SH6H`7s*e_?~gjMS7>mkGE|C} zCjuU`CK}d0@bJJ3277FdU-(YvDVmh#_0g`)1tfb4PtA9Kq`KHUDA9IQ{+2zX?*H&~ z88lugw&8k1C?A~u{*8#?eX(NS7eW@2YwGD7a6D?b+T^d_QFx2y&X0F9p4yLlVKHD8 z`K~`-?k8|_6{TKU91zyRR4{|@rg^pRS{_@o$ViV_-LLJYi}WS!FOT@l;mcQBtqsFx zXW9bV1Rq_G{1iW@eGm{JJzZ^|ulKB|hRdzLb>2ZG6#fzF@ZG@5b8NMf`AO-e;I(n_ zd&H4j3Bgbl{K3v=K!u9(oYM%J420uoXLnm~ zMpIQ0&5OOci5>-uJIYP51K+TizqLtKK$Ypu+DA=M9d?tysX^?qlzLy3wO5rgJpPP* z6RsL?ZZ8jqig4ix>s@#qMu%RYo~&{y=KdUnE90BzgM4e3$EVhZdq_NK_#yZR5(oEn zp;c#MYbpG!_ZJQTwa=O%FiV54ff`C53ZiU~P*@j^&ysag13*y&P+!=wpeI=enLtP- z@=Ghn^4Ik75+52G-k>T$k4xNtf-uxj_vL5(CRZS=yMyrtuI=~1Sp9_`TYW<3%mv<{L;^t zR!r}Lx?CZJ5vjyG?gft9K6*=^qzngJX|$_7G7i&UjJgFRtG}lR+29s~nFE&Y$g>Js zLKwV}_8SA=_kkJkPwpi>JkPr@YZ}OUx|3h4M6-WchHv-#o!&4|HC;V9AHxhIjB6oh zk6uToPK@h{&S&ZVRE2=Sa5pSub9(JQaK69!LS}_IIf$G=U#fnr0grh-S5T$W+{F9S z`FI6%r~PXJ98j}c)h(9V#NV=!(beZr!@3rNZ%@NrMts!ci>}p+8eHWU8*1u$1lFqV zi;Z|qPPq=2brbujsXv;$lxP;U9@xfCvX9MsAZt+wD76X$KDoVzSln9a<6KwR$BDY* znF~QR+}p}*tj$5gR0Q&d9Z==`&xb(vCZ+eyf~m~u%N43%7~V&SJjOb#pS&g4%ex9-4K_J; zHV@9oIeF0F4k%5Ekd!zYfj?$z8smiU=hz0_*y3Q21O4h*FCHvWmn`_C@RP` z>S1bcjCI^mAUZ?9I5i*4Ss~q`Sy@v9IS*PCLw1PYN(zK}Cg>==fHdy4V<^bzwRD&^ zgZ3|mL+Px7N%Coa0^eH8zF#wZAarb?=t)Exi?_QDdol+JOqGJ{rx}0ET^syk#GFc* zZ%IGg!QF5yT9_*r{I%k9nw;uDtW$=#0LdQ z=VTG@Cv?x20ku)yFo0r-KP>Xct4U#L zbnF=xTwUUtSv0i8PuXbk1hxMp4QDK<69(wFo;;%WRwbBeB>%J$X?V9kUyVYan>u#g zqzzTcGzLU^pZADx6633&3eR}^8CH6S6DK8uV!Y>2B4aQwPTvQU@O{cd&6X^#qPdphPcwdMDxtGG$W#pMD0d{o1`%XA2Ho%A#>WdL{yW+jQ7RSW*ob86~dikp06;xIfoEl{>5CqsL8V# z4mx9@E;Ce@GvVt2EV)aU0x=2oSY$xr*b@lZUY~inR6&tzUp5OHXky9m8$`Y&7#!WZ z8c@aWF&Gbo<9ZdqELv7g(L5Y`fn#+U`Icqv*2clDMd#M=hzR^jsz6FE9Th%`-yES(*rQzc;xfhd&n(NafmfulOS!pMq!b|aK&i1ubKO>#A%4Wg}w?8eS z91;YQhFXr&>4iQ)_?Z5|J&$-*)prAAs)IRcZ}&LeeG1WPVdJO}Ir`PVV2b6&ocp^| zoZ$r@b*&t#y4|0)CTAyEOZ2imwbRM|V8O9hLsP4qt! zhb{SfbLi6s9Ptfj9zP?a#prQ-$vD(twQQwB5qsxw;&vox;WUUS7}q2R+ym@mm&x3x)$FuRs3(KZmnkYt4MwR^32lYzn&qDoBk?d1> z?b-5SIofR2t?zH^UdFulxd-`+LarzFlIc~kBJ%J3T=4tFe@F98&#E>xZS4KRNyMZ# z_Pn7*7Ed}E*Qmma&&ZJ`)?z{=Ni$ay;b+1zWBxlibF^7HyHn$(Qe*{eW`-A0qzrVn zp};X!o>)haMMlR`t0`NOmI6a1_PzkKsXVZLjZNlWdT&n0s&JU-mi^ZlqU z-SZW+oAa05B(6&ms9sRJR&Uk!R|id93q7v~bIsWNw@ud70m6`$@oapeX5A%(@DZVX zHQaHxL#rYe+PSgZR8gLe4CXOC9)B&=%1s5%E(_C30P7t#qJ54rc~gA!1h`W*fi|cJ z5LaYgQ^jwUxV7t{mX309=#~T{Qc&md{wyA#8I5u}agw!MOn2eNY8*$FQgsj=urE>! zTh@u_7A>co&+Z`g(0)6Yvdw$lhFi5~E8JE4IYgZxEdz^Fohb$G-eY5K*A@DEfC%(|GC#!^W`dn z(?Z4}vPAm~As6_<_oOc`%DJ%|Yf(@353B5jpUw=r@)3xxG-p76M!8bqh#UtGSS&`V z#vk0hmXw@Gp)DekHsiBTF=C;57bg*C5&Y0f+1?DlfwNEclN}Z zadC(%5@I(FVujN4Q{sM)d4b&z(!`=!N2BzaarA{S6+Tw)F334cv78iJ`_DMM@HlAS~t)7OPV# zd}wCsgH;t{j#KqPF`xs?U9j&OE~H|Z>WWT*axITcK{h7Fxf*?$>~ocmzP2@dH0p?! z9c!~vS^B?V@2gZ*rrZt8&FNe7M|&4P^Ot(xpGC!Jc1PqtD3@C;``!~?!^rT~CKO{F zuVRyZdCvPg6qCV5(qXmiFOx{4doWXl(OhR;&T~nmm8afg_avO`oQP0v)m{oBHZlJ5 z(a3&%e{KJa_1&xOFwQH8(oa{DG3&Ca_Mi$^M2iw061rn*_>XWx*9QH1*J;BL^LTgQ z2yJS}l8g^&ygLntGMt?Q7uI3o#gO(FD7O~4&a=3b?Reslm7K(S#vfGWd@Ot{tW(Zd zdJFHWw8KxJL=v;iTVwnNH7xT_l8F8ZBT1EE4zacLje_c-^a9+^?Kru#igJ}!VGA%( zx(kTp%X44^CIPnhz8OvBC7Aj~ncR+FoGP?nEYuoP)$OkT0#MqU;NhUwKMM7nA{U@JHN1Cqh|dPFZ4Z9R~!`?2Y-yBv`5!-++SM){Yi|qdyz;^TKoN< z7a(wZ1dOB-M8e@9-#^D@8KjlDR~?dTFJZ#J6^6F?~+XC9=Sf+2qE%%cyrVP^!1P zDgBZMZPn1#ViZ~AC=#WRh+1^kB5TyE*24)ZzKXX9iJvcyt%)glE`4sh?`ymh&uy-gXRgi~XEBj<*uK<@5MKL2 z9{bT7bY1j~=m5Pg-Qp|Vn7;BTDutkm5`>Shfqb$A4Qg8u9Y|KxUG;sw5sol&v3KeE zt8!X+<*c#nd5-*#9k{F`!S~K@;vY-qr-OQa#a5Xe+FuG=?$m)lwh3_WVi_G{n5!Oh z2Q35(9lrEV=aYS6m|ODhFO=X7K7`VLg{D8DCThHltmcEHjMgxOSI-{*`pwPhP4&P$FL_g!i*{nznpY58b}fAr@J(in~gvM2Vj`~DbxR9^a8r+^xp_d8MJjmv>eI*eybbOozotRx; z_Cs#|Kboxvc(h^_{*%&>u*xC1T$Q>2v>W+HSY2|q7O3#a@e=q@C9bsWd(ESw4nnZq zee%e5y2!b1Z3Fy3p}baWXHuc>@J1$aLIWhLsyggLTXvY=taIbtfdWZD+!0RF!8=7s zy7prA)$h~5pS}LV(Ob_Me;;13wpvD1ucHSN zmnq{bkcIfWU!~~Ve4mznsV1p_yRJFWevXjeUt1q)Fe_3~VM!{5s3-rhK)BjPgv{mD zmY6Yp6-yXxGbZ&oRJSqLF2FA=9Ha2WT)%#ZU=2>2h)6aHwFucu#?am1G)XFs{T#eOphs*huVPB5(YdQh=$$cgyc{h|aj*do_@) z*1z6)nz4Vk9i}adY)_T#aQX7~uW>Z8rpsX1VwQ>8EWsu~YGb}AFACue>b8}?A6K5-P^;>FdCaSr&Kt8uH@1E_vef8( zN3Kuw%xCU1d`A`$c`&u{_rP(V-+?i+O?m7&iwvEQA*+kES87K|>r^nzSnE_rpH=e` z-jkoC_NAGlo$)!y!sK;uOi8x7_GHXkmJ5_xp$?a&Ue(2c2*O=cMaF&uJIT_9ISZ#? zG!xx?gyg+9ubt61fXXX`hl0E+0`bChVo*H8I@JgF;OJ}EeEoVgmr}do>qb@>lgNi> zXYs0mGEGn3rYriHg;|7549%wpne8NLoQ!e~@FaF3XfUaA>Ksh6%sUlG0h% zJQWOrBS>JPR5F^%&A4H59?bP>KR$yv-K21k9W}gS7ZgV)5kAdnFfh~sWCQ_=Xp}y6 ze;u!v=}4T|Exv(dfra=m=HlP}Dzsepl=08ju+eK40!$y==vjMuZ_k4|s>vR07#Ro#Ej%_5;1LbaQ&8p|*X`0DWd|dG?&JM1f)m?M9<0QtjnNkq31*;& z1;;o2=%X@O7ePsw+WQMn6K9*}P?VU^ze&af7f)ewvej+rxGeqB+kGI(bL$2FGp|ZS z!`V%|LFwOh91JaTlA-95x(vvaqq;-$wJh(r_Dv^qz}138*Zuu6OE%(CIws|oY=`W9 z?(}BGy)F;0YQw88@UNoR6QwUn!vlY|8NY*Xp}p4TYjcA75UYf6!bBZN`kAw(mkC$y z>eLF3=R5MMa6QPpgZ0DK9pP+43lL)YT^$!%DI<`?q|a%9=7RB1fxYR~G{j5GCLIQ& z@rhOC7Ua6SC{57}D6f3Je5eHd(krD161vBDML~OyM(L6bI@_ z@uAdS45$zv%4h+6Q*z>WKBa=1BT*NFwd6jjuGO^Xzw$;WqCRUR)wi4{g1M;Z=wMb42$Kv zruCxhIs~U1gsmQJwpPWxHndqm|`XZ$a1~L{Cnq~)kd`i?FL&^z%8QAA9w{JXxDLIYARoGR-#jM zHh;`{h9QMi^;*~#tDkRR;#vlvv?m>pb9>LoVaM_GLh$?f+EB8l2r6H($K=j2wsPyA z#QC_UH5Zrb)KIHf@EShL(v3j_AlzF2hVd3OaeDhHf*511LDHoEvsUen$GkuSE1pNkf)*f*? zGnO4iuIR-6$*8ryP@{=}qIrS-kHRLiKx2TOgcBq~N&o=#e^d~ug?^;3fHG{p99qW> z{T22?-oLt7&d2p`u(6VhBLY);jS-W^izAgF`TP+$aNSwni*Bu<%OWA{n&AKZPHP|a zkRoVfZmY#EEz5daE2Uendcf5CFU5wD56#8>#}BpLaCDLP6;1_mdSlFl^p5L*7U$0l z`-9T@Lczg?vM>}dgU_SS68JzX&0F|U1dIbU>>+bc@B|R1LOq| z5Z_I4yiDN&MkygW47>d8Hr+tqvRkhl!0ESYT|Iq0)&fKH@70DwcXbGe$U`&2pS{`LiBnqD8Por#L^jkz@6WMlSiOvYX84Wo@~K zEkd5PzS;;wlaP;xhZ$t}kO#@@bW&`lkb)9IZ#RUey#Z*E-IqupO=9Oq6XpIMGs{gr*hH*un8ugE;q9x7`CRwy&|9wE>6Mueogmf+ zoxEI(OJ^DFc%JY)^P>#MveoZW$QzY7gn{09&30u=mu8^qx-b;bb|K&fdx}30(FyF4yPFxsbXH6B56-KPK zAk%VcahgU0h?1^{+vdWw*9=+9KAH(vWCN-^bb%I|rNr*Y2z zUo8k_P*rrP5LD(eJ+HKSjph-dXJhRWxa;wJM&3 z)69P4KtU6$i}E!exyW0;#*t`FGR-F{GAo`W565#ceRNjjQYC@eKI8Qr?XL$afSsAn z()0%ZZhMlgGdnv_g*TlVOX_MrB{;8{+cjJJ@tAX+Gouk;IKW=~_h%;hS>ZcP8-x~P zC}?OolCYri462Z?27>74$)uusnX5q=@-UgxtXf6MBfP~R%a1$X>{nJRK{@{G^$a!3#qTH3iG~t% z$P%#Q1{8|sJr93Zu4V0FF+8&SWuQecIF${y_S4Z7KM?P$f+yt!Uk^Jl1Rk8-lksf|DF&2CY!wxe2B#SkaM*Exw<0B@Voy@s8(twC&*OLywOs z$~-<&v*TX(E9mRt(E#=QB+m{8MrZlFA9mAKcF2)}8ZU9tk^jIh1=A_Qd(VAZ9EE4! zWl+BR@+W~y#Zzf&v_GQRRrxD8%tRza1*gIcrBj?FYG_ezVU=$P?#H=~b|G7YecvR& z5nw1y`?Zfbeg9q*2hhS!885j^6om__&hzg-6@KtdrQ*qU`n=b$# zTiwh?ubX+W?U94wnE)dorJ@>?%sdOyp#B=g{|9z4%MEC8Kc8H&(;8V1l>+_N%J zAJ3ty@iJu>4#m9UvG#ii20Rx85}Z6dFaDq@W^A|wvAL28u#;)sJITKu2%Cs3#saCo z4>lc+b1GkWuwUsosNGv1Db0(Po5XBfTCf<1Es9csjY2{@ce@p)J8C5on2gy17lQEe zHv?K=I#A5b(N=u?o7HrnlzRL}PLU)&v%V;pa@%_RN>Q!F8Q=$2X23Dk=nc+2Wsn*| zt^Tdpkhlof(I@8-8HALO&&R(mu)yEqdu}f9_hc83PxW%MvC|pO+P1;2?fz1J$y@Io z_sFDhKx~;EXtRDJlQRByCOZ0GZ1;m{;84rbT6Mb(eHv33odH$+S9Mo8edj*{{`<_S z?`~M4`P*$<34;1^{}H;{GaZUHK99ZPuH-wAaxCNL-7tDNIcy_+q>YuD`Gx?rU3xJD zKk9$K`a;3$g~mu{#tea9lsqY~Q8NG*R(1mc-Dv>znwQNvR^Cy}--e$aQglU>Zt)GZ zVnJs|H;P`WEtn(S=C@q&s;Wh3?(`=7x8=j5v4&|Bx(5nhP5lp#8J_F~AS!Ty5vhEw z$Z+3*M3ChQC}aZu!FhZS|6DfALe+ zr>(fFbnJpdpviWsoj&Pqvo{`;Aw&jr{Ws|TxXb`n>~P`?PN=Zx6rJ&1D|I2C>x%rQ zG7{x(KU^NfY*kKP+8k^&hC)?BMoz(DB3(pEu2Z66_^Z4JxzVKc@gnp7)i}FFYO;LAVWI+0x|1DNA$Z2!8GM@lUjFS;RcUW) zG3wo`{bqP#hsQ&Iw_EQ{p8I@CHOSXmPqjv@32oO*OpN8SN2ubt zz!klrKZnYovBm2mp=}a~s!xvVZqI`h?&#zwTX1G5E~>B4V?9_kmK;snFzxGUL5u@up&)+3%xI@x1i8y`O6VtKAe-mGqPh_eTE~g-wpV zZKz`tOc>JQ2!DO(>uAzY)6>%rDn1HETGfxM&kA%XMX!*qx4)`*-Y(O|XD5F{_TDw~ zVJqDj)7CKnH7>AAGn#A!%r2atL<@hCh7BwbaL!%0@!e<>T3LC%Z^ji2spv;TnX}maW!9W3qpjnHB~{;_{_0%Z==1{4eCIqvS)f|s9~_B_5^&Czny zde?IT+W1J__1+_TkCJlKX$}%+?lV^}`x>-eD1K)w{iAiq#Vl$lay>Z3+MmqnZa35U-QYk5hGqPNi{=D@)& zW%}2Ux1jaKDZ0ot#Vno8uT5=Y2`4R?pttEV;6`%%se;X2BGt*j^UeT;bk49%7`Mkt zj&AHyvAGRs0hta9?6bLi!&mCMqwi*uK03FbuY=7E*dx0;TWGW{>M}LN%+36cy?Q&* zJ;l{~-j8Y;Q2^G`)FsU16Qjo$9KL%f1i{E|IN$HL>;=120@{#5n@gD`ChHmzw2ai~ z$^WF~@<0rcu6J2KhKy^-j;wnKzeJmPP+jrP)@Y*pUgcRZNFO&d6#sl#pP8r&u5L`V z{RSTY(INQ!>bO9oX*||Mn(9yR#m?8goh$unPTX>_O?_U*%|Qh*_s#Pw*Ev@JSL4IP zj8k8RctUQna+v!<9J1rCU|c$1)#0(J)b6$ux0nfik*xoN177vNfPnb(z5|CuBF{76 z1&@p4BfY8o*yz>h>gDbL_XeAApm)R73&V%`ILxvgm#hh^1YIML%z@mcxvmaqh`2>l zvuM+PliE&6-e8+R3!-TcQ90D{*JyHEeb{;)sb^A=7i>3!`*0gnE}}`L%}wBPv9G2) zc}1FN);|s19@^gKx0jHT+##st_PB@ZcwUFX(WQ18r+aVP`O~|Osj0%NNYHWp@p*L@ z%Dr{1Ra)Y;C#>inAX(ZMw3zFKBMx_$VmQhdZfjO=`;Sl_scnHz*BQ#DD(++BI`_8+Kk6j={mTkJxyf7TA|>bi z#LNr%EOw2+GX@|r2_@<0gzvt?>UDn+p*h?2FZbchXQ%a*-N+<(byC`ocmD$tJ)a@J zR3i|E)TqXC8hJN4bDF$CNmL5pl3PO9WII;__bv@muhwPJewF641GVxt-JWd)efP=~ zeha)0g_8AO)thw^n_+7dM(GrHG%Pp5PQiyan2!72A}P}Q^$JNB-{*}}8HI0#8u5g` z^kD~D4%aWEnW8i-*H^jvm=2@=tYm&gDOwsGSlm!xtBHUYfnw|SesufkVaagKHw%$n zom@A_Jp%otBL}{pI^HMbDz}=c?uhRos#p%LHFvdmFQ?UEKXc+V>BtIwFlyaj)G z^f?MCPaWo_XyQ_mA6&jO-1c&~@5YUlhkes+}i?Y+sK(Bk$2vEL&+MG$#mS4^htmDG8xx#{ju_?$?mJ5xk4^=y%=VP?d$D+D5h4tU?F(wswP^nc7{FV6f)5 zVmab6{(FC2c?54s8qSfgbAIj@VtP)uIal6QDn6|nd1V+5-!@BXI-ZnTE^eYK=^JGA z`tVzYO=n1MHFK>K69b(NN#nlK{Z{YivRw%lHgv&mvX6WBMc~%+qGRqp5@v$fA~5^>tW~!wenrIiYUWjwRX15s_QLn-ke*w|AZ4$VptwLY-jJK>-l8N>6(1%5BuZJJD zB^7vFSuI(4CC)zt_A*nQ9xduW;F~sRYUeA4zJ+AS zU**6``RMC%_9|M$1*+{OeoeR(ertiyTzB?R5Gu9E^TxX9eCDI>Pm^wtf9pHE)z~EP zhWdXmfXR&B?Nr6DPUZ;I#W+%P#x%7-RNM6~Z0^m+Z_fCib4Hh#4!*2G3))Oq%epl( zKVUMLz43btlK~}peC&-to2sN@bLK$i%7wk{?6GR&k`e;nTkM_P=uugCjeYw2r>i`N z17np9ymUXfX6g2WmV-IU__xcHFO;uoLxOKOa&o4H8=-gdSTLO*mqT0b=W#w-ZT1Yg zc>?eT*k{Ex$MZ6-{7(1f;-GrJs0#6@$SAgpgzG2o3eLpCx&Cjd{sEI#w7Ws8)e&RI z$rAVh069M_`S&O(Lj?x#64ol7oC^g}P=kZbrv(`RGHc`xnNh^8vhcMu~l9j2jzFK(62Mcinb;DM5_ z0O|8UEn5i2#L!#`4l{{Ybb>IjZe(T{de^YWCy5c;0avkKrM)TH@#8Wew+f}hPpgS3 z%j;x4Iha{@7GfA2czB7)iV@7`_qhDMBHo8A9V?;{Wj<&yv$5WOPL7D1vNP}C-+zO; zO65^V(2>{?eTWKnkG{AE&0(i$=;(yElLwUavJ<%$e?cb2x&jhJWCa<-eo~K4gmM z)*7PSq9rTu{=$RV0f=1osdrtrF=2s!7X3dS7*ljgJEtC8HiT!OE8}bozO3o^VYUoQB0MCmV4|FRp`m zQV->F$Mp5SEFD7A!@Uk+=Uy@U9J?~_u6(4P$Jg*bPxR4V(R!B66?shgL>F~DQsu0B zjsA}LBz5(?D+yYJTg*6fxt?anT%$*eAEKRC+NL4dVRz+5Oteqvld`c*hA}9Sg>I1Q zT+~qIb)##pdvoJ4Rpr^K9GBA#F62%3(U7ZpF)%Xqh1U4@*KIase0aGo*~PED9-^P3 zwy&EnG3e6Meq5>waBQQ>__;I`-FNj6;(+f z^0~%cYM5V}ZHPHcLFz6A^xEvm?@|ggtTuIqdA=l(|7F@-qv~(y=h5?caXQLw?B>fU zqW`#^=QdXIcWs^<{dJH_T+;_@k<%2A+Oyk-oMd78?6BaO7w+cZ07KWt(1bl|`BwG$ zj9#Q|T<1ewx6BX?t9=<@)U~xlk?IInCf0*x^I=WmuusSLKtx)lmAj^$!%<@lE0dKOf+P) zoYt1AC|j1#ZIw7T!f^XPtsoz{xoT!Szu@&e%h9Q-W3VRy$NUp78y9k@Z`A0uGF}UZ z)Gk+yV-oINf2;Z3E)P*oFQkzF)qTXOLDn!$Ggld7t|4s7jk>hY{0iG<% zlZK^zBD|92ouj&Iub{%Ui>|f5FZ1JaW@C ztkE=d*@~NSe5}sstm)8ms*0EHPwx8pqsnn$TQ{0-qk{Ez+(iwiYpn-q-|yjwQGrY6Wsd+&>c9B9&LNx zEDR~L7FO}&gbu2z^zOWR1m3JPv z;d1dJ+sNtazcWnlU#PCi+{sjhr#gpVGi^x8_tYQK^x`@3*Ye zkyO8QcPwqjaz`HV5G-LNf9u`pd9=y09U^NuXXPcE`rUx^la*RG?|X)MDo+@#P?Hp& zD%k0|o6!fN=V(01NK~6nTX%$)J}~aikJ$~~4uRi!j<^&R6YEfL(l1NSoa6EK-!sS* z1(CxzzCPr%lLWjT+C90gdviR6agl@vQtLgBd0A{f1Q@6{7R%rK3h3U`^nL0Bs4Ah# z>nzp7c?^-ikgJ>d7(20%JwM7n9Yr}<-;c}uBaq#jZB!kqxLv$l3c>G6k0N~?Cx=K) zNrE0d=5$wiujW$meL{6NQ zGV4hUS-yKvSiHXLKA)hV_dL9P>EQ7~TeytZqI7AVgW+Z-=D-+oO~&Qt z!V2^y?$V>9snv>U;xrc}zXwBDe=Weta-LV=bX)HVsU}xg@B1szFKfXKj?$-OGp`m# z74K8$&}QHUR?nUIqVo!-!Ky95RXgnisTqDVFS6tOpvDX1(tW3GHk?Flwu9@8S~ojc zktu5HN65-u$l+X0;JWeS-SNhIMs*JVn#yA(=Nc|i6%e^D_C4IN>@4=TT)u$Zuc~P* z%SArqxD7Ytm&Xh3Mj<_2Q~I&$$>-%YU3}dV+TE4e2%uupjZxD|Qvm?|<8~rWt8Vg* z6P+4uyCA`jwLltv$+q!xDISXHQRtab=<~p5mgRcxq19U9&?=@F(!sI+g=V%eE1Ydq znWzy6O+~sKGA95#&oY|r`Rq+Wp|TLS>1Shx8OFC>+cF-N)}0+y{B??dBi{?|g2w@8 zhaQl;0JqYgEt%f-Gv+u<)*W6?$Q%OB%???%Ky_6^O)og>!VhNl@NL-IrZJ4b^zc~Z zO34Oa;ge#p4cFa+s1*o({uBtOtvnit)WoXp3T@N55Vhh5-$+SPW$bOXsw4pO|macG|w z73EYOw1^zg8zIcd;oO+jN$7U)>Kc?>T4k4XNar!Fl+F>5pyCz7^a9hB$4l(hZ5MqI z^VVy0mDuq-yBTu;hLtPe@&l_j6jV64n%u^g2}=F(iFNI?9TQlvOm4vM3T2Q-uB4C| zBp8-3GQdQotL+inIDSxy#)D*mdI70TD+EYlbdkSl+5xj8rp&_av-aZ7VtVtb9iUFV z_XMfb&dDmLkG}?PL>Y^X3)&?ZcW8oA z+|9HwY2xK&k{zlb)6-tmX70KYgOmF(ADzabO9tk?(HQ>tc57(=RYHEY?}?=^9r>M( z&fV4V&I$9Jgl3bUZb_Ihw1{3N#WZa>;a3mGOGs7hsugwH^Nj&WNV3<}73^hhon%ur zhEUUZcSa(@In5M@=Cbix-Kmm?_9YmuqDg{Adm+jvKWO$_3qaqFR06Go<*QdZus^dJ zaZZ~r!~QID-<1ZhmpHx?_JJzJqpV9eA8}H*Haxnce$%^QrKgfyvX}f*I-1QWunB&o zocSuD3JM___y9O$p^lkne7zP^>t~tyfx7Q)2an3XQl2xLEOx6Li~dM}e-0tmo=6%dWz*nF;g0NkNj?MdH%R@tiRv`$Z3$rWgtL}nU>+hSk!Mgj8WVvn}QE|j%A+&+XETR^(PJRRrNY066 z{g-TEvYn}@^|9*yXQP9`#O5jg#xgfG)JBOIN*4F^q`6hA&0n{yRBDgsd1kgvmOj>c z9mlU;cl)SmUMctYFNclJsbBK(gt7Bk?*H&v1NQtRD7bh2GhGq}kj*!X!U&e#`*`_q z8ANj06s=@hWtPLN6BMJ9+=l^9&=VdoUI_=p{sy3s;4~9L;NDi@Gh@-e>0N|I_kru!~iF@sNBqKbHCBLh3H@ahj_C^z*_Q zoVxDco#D+@cN7#uKdJcbc0oCPK~ z+&#tFab>9-aRFk2$>tJb@jq=iJP{wU@L2x zy8o&KCs^HM3i9tf87vPg{17q8u3S0tuGx%(?Y0-2oDnef?kpp-pd+HuLUwJVgweN2 z_JsN{l@q2SSRW(7I?uWM$O0K$$1G&3P3F$+=-SDd z+cs!wCXV2(4B!0?8OPwS+4jHi^%G1Q?hF9PEIBtfp+$kNAqIyV$-78K=aLVABLOwX zXTizVuMc%xA)iJ;r)9?HJ&~%Peme#SK794P1$&jZi7<;JuHKgqOw(;v^ocub^L+Jx z=S&q!S#;V7v)rA&+jr6meUBm*13~w04V)e*1<*E-adj0c&>iiB$NEJW7Lmj@Q>p8u z1aCZ%U1*&|z=6$wcb=$63!OXzAy_Z(~cHxcA z_^&hV1r@IL?LWQ4VI5b(e4I0W8@wyFi8;?AGweI>i&O8eH-yJ7a}Zq=?Q}U`sB>TX z&dtsXGzI0C;NJc5f5*Z)qpQ!KV@ufjAsPoGX;7FL*x|{<0f=VOuiIdLby}ZK7Qw|# zvpQAJ`YFGt!KmBaXwc+pW=3r)a>zBP!I7cDqoRvd0TACzF zK@D|JccddBv(H|r~>9$%wvFu0W^dQ9HxJn2%9X$5V% z@0pIYF%1gdHl3GGoO_}ns$rIKi^4E$mLXwVq;(A5>0!Mi;YmxqJ&zFp^H5-mB}Qr zMQWj*hV~^$v3j;io6oz^A*fe>HDA{HzBR3*3u57N$+YOtyVE_K?fNXwLP=APkz75{o4w9zVS#maAGW@%`Aa&Ghey~hUg;|z1ShwsLKjmo3n$YT+{H0Yh zh100jo2-KSvE7q8-*6r@npRxJ*MG-@;?ExNhsF!mtxf!=*dg znzcDp>K>qfVxl}cnj6Wny;M3G)-Z{S14`J|k#bkdG+Hbsq6G z-*1?Oeqb(dfk4#0j_Jq3_Oc962vI^8lz-2hhZg;A_c6|UZ>1@|F-8R5B)jeeaea5r zswT`!oV##e1+PnG#D-CYAYWy7hgGQKk!#15^TBc~0Zp|Nwtk<{o%!@;Ytyo{Jtt}m zTrd^^GvCcNF85YFu4BHsjnTj{>-UPWd~s`m7Agfc}Pq z6-0)rpowQF5Iq(}P&g$9tZ0C2v!b^qYdilZ~?evNZx%NcO49f z@qxUE5&%$RxTa5sV3qQhlwf}XDDC&~CPl{t|7pcDKqN zP_mDVqoo7dpB}pq-oaV2P27F|#rW+gzq?Ez5k@8u#`+5eohUk7$mPLA-iIbcQ09fz z!=|nQXiUDc>0Oi#g(tC|?#Mg<*ODB(B7RuEl7aA0AGP3`{?;M%N>&NR8uA4hLgGHF z+0~MAz3x2HDj?H)O!IE=rHQD5WDwfWP8w|v4_y<*D?{N7 zb3%Wlb82Pd;vywoEgkbIhjWKS-gNAum%6&2i%t;*ew>oq>WDy5W30lQfC1*E9(;`+ zf56M`vhL zrq31jiXP)x3e4IKD#Zn#yjoGTaiFE&GwETYb7dFqrI%Zq@xRL^dUvJ;}kfCrQ}A0OBiBWa8+k+-|2q_t@!e zYo|dT_%#u2eqDhK1Sl;61`c{X$7^~Ir|aUXZ*-Vind!iwtvGzidHjre%If+Gn$x) z6{V`07>T{JBfyoV7~#*oJKUTM5DxQ-HA62on#()IeYtmO*tl>`rdc6DWZu8xOQxDM zZuY@+<-;XG>z=rf23cu3S{Co-t7kSX&)AKoR_Aj-6fFa1@?GJAhv$&2kmwaZs(^{7 zQ#c!RI8an@=>1V~>+sF1q@&yLr1i~ZI4nPMv0Vx_xZ81=$vGfouk%-NP^^8wKidfK ze847q2^iOJAx={PIXeP3DuaAs8{t7ddzYYK#FFV-eK*Y#;3CVV<;KLa^;Qp# zZcoC&%tZr`DIKy*Z7JS*Rwe}1Dn3uH*t%*4*OeWp7wArJdLYW%IK!L~rmXzK@_gn- z^`ojm)f~mTf{AqA1~3UVI5&`;=)EFcb>*GlVXPFtW_*PKkM@Rq#Vu^tMuu?;6dg(gGvBcx z=eyoznwjcBcF12_6Dx#3L;MfNGI-1F)=!dhd4J7r3A!RrQRtREnA}nGc23Fep@|0>pW+I)Z|D zRl|4|HDd@zCG(*;x?gS>+HUqTo+YzG_ufMH4(5tjG~BsYX0^1D3T4vL`1_AS`jFEQtsRxQec~7H z-{p!A86$aMOM|On#*iur$_W7WjH{%?EK=vRQ_d9McB$Cau?D|MP!8VX6~`S`;Mu2% zMSm32iQr=^e;X4Bj2McNmW~T#sx<6wk)IOi-Uk^&M|_u^;#uBz&O5n%0muuQT_t;| zXr1(SOh`UCD^haprS%@LgiL6{?I(5n0N>31zA}93UkBXq8`7zP7PlIMrO^mO;T^gm znKC(1vkHE_gw`C2vSTe+*sN3IE@tx)RI!Wa>BlEL!{;dsKBXCot2n(sJSuaEnnk#` zU?vMs@>ojy4or=HMoEJxKUqFw#X-kX9jh^Hq)ATBL(~mFVx)buSAT^#w&$4fm06^C zbs8RAuJONrG#k8|y?nkK?mjmG^3c&P=P6*m9iay2aHEC=F6exz`GDNY!!@%rJ28BQ zBFd|I-0FQE&`Kc>qz%j*I)xOr-7r}ag#DX_`|pA-bV3y&q7X!S? zf{RpvDRPDgV%5m7FW8^bvYSu4eLuf8b>oExt2T)LEnoNf652l!Kbbw0cS}wRl=DkO z4++ZtIVlv#U%s4nxzmm+>Eu%eBT0y zG=8DP+!sX^rAVFvh9BWy%0j8bG%O%ONI?-mZ%IJtLoSWI5g~iLu$qP7t0tpy?Lt7{ zNXtrys&RSO8by$Q$V~LZLn}j)CvU0>VH=G@cp4#l#^kXR8{MXTcAj_)UhaDs>}KEW z?p>w~`2eBFP>$D0w3$5E^*%{e^0dLz{u2#4& zw!sKbK6(CO*EL-sUkn{ThZisC$sviUesTw=e7d)wKYL_TE;&cLx6n^|P+HdTOm4%S z8K09>O`koCaAkuA!`STfcxq#ituE*()9SKSA$@5Bk^x!P9R%nUL2zG1L>-LauO9NT zK{{ilRli)0e!Cg? zYExV66HXeE#qVTK%PsY@72}Xq=%c953&J1fiZIY28GvOrDFqc13jy0X-5O0QlpJWA z1WnO5VgvaGD^d{sQ~s@|DG}mpHGLlggIsMD^+Uh83^II4c0zdnyG;`%uU2B?xK?V! zZ{DcrqfeRd&9kv%KS%;a^;g5+V8zX)$#j&X;SbX!>|3d@2G#V$g|>cJ@AkKR{65Ov z7Rl5lx3{PVa~ z*hpqN*OmW`{R;si@e6n3ZVtBUG!0WnLYqQs0G|i%*Qw9q17Hsk--+vz(?adKliX+Z z-&HaBV;ww@r;8b#eYSpR-O>2RB9cQQ_EGLd&(Q+2-Wn&Gw3%9p(Kpz?L_H)B4h+Q- z!^<)~-@(gwwTzifwuk8&9^-N{evQzLH0KJl@)VEXAe=GsaH}0tTQ5N1QXVL<%7g&m)7SU0K*_B-A8h+Gm&)7S)H0TNd9;M6iq2h;K zwejGCQop|AP`JzIPmCXGc@QKj#69O5$0Gf5ojOf=!;C2lHR?t;LVCEN?p)GgRkS1)Uj^hAxx#~8Kc6pK=|R14{*sS!I*DoBqxN}mKl7<@RB;r&6h8@mJ9 zpF58HhNf7Z6SL|94ys1UMOOu3u3nOl#uVFDCKI_b+}WM<+;?KLmQ*26-c*^hZ?mWz z+dy<6Z0Q$A2h-S68}UNnxQ?}E!;#C0*sSCAIN_e2n@aNUr3;#gjxQf@NS$FRKk6F4 zGvPf>Hte2b13;CsmQ;swS?;(vyYmh%*SAt5QO-{bHL47H>}|pT?3f&X&L*t9LF}l= z>!X4feU3ErvTbd&?2QdOm{!@MwmJOjZ)0?Bb;6LWs6Ahbac2K69LbUynS*bG!zZmN zOi{#!$z`40x|>wQd>{6wjz1uGh#=>quGwF#jlX#1?_01!%h;oQ#QcTdBmbY(uF@43 z?$$Z=MuRvQDx{PCfX;+fPvy*eg6v_Cq`k zvej75BgMJMMv)Sg48_*uGgCuZFbWER!S*JHGYxInWdybIZi(9v_E4-c3(IExT~n2{ zCUN9SEOfo4rv+*D8tmBH@43cQ!2`>kg|1?F2& zAd&dUQLzvb0v7;C#GMRZ_RJ<<(nnqEiIJc^9oz`JHunY!a{SNkCEV@X>=IFve#mkL z|D*3`E;2Z@Ta7_9{Io1m?tYo;wOnKrEV_;K69u1tm^ew<@l~2t3ZKiVlcPaG(zTR~ z8<mmY-u80BZ{w(gRU&i%O~POZ^qha)={XR?*ORK?gF>!wAWuB}BV^x%kvQ z?LB3XucZk-Hjn$!Ogv(-QX1M-tO(euUTuPBE?qCPA{$MET(yrD0l_X=gVZ7V<`4saS;O2H+4=EnFVP{V>}uc2>L}qDp&g+6jSLLuRHNh_Ki?Ah zN|RDvWg}mjWZhA0FM2lHhfF=?X{kB%C3CKsAX1?`)kDD{da-MaILe?tFq?6EOc8{D z34V6FHy1)?Lu@%ftc(@Q`-=VDjuSA?HMIr zqyfC1Q&5hy5F>PXItk>kw@qHx!@*eN>lfl((u?$RU5bgQvx6m+{G1)Z%n|kK&TGP5 zWi3CbT$)K`JXRew;PD6Vl|*c0s|_|J`X8avA-6D#=MpX14&7vXMqzlwn(H2|eC80r zoA$kvHn10BvZ`$TBDJpY6bUN5c_LzJ(d&8wjs@x8ADRu$iCFGfrNQ{r#I5QF#fA6J zdvVGQgZ=XPVF8BTaF@Dup7JVW=uF;e#(a9B07ElJ;=t$eQUf3IYXvNXFmQ3ikrN1q z`627Hzwh>oqrU_$o!#cW z>EYkWK?XZqE0n+Pou}|_UU-Z6^!9m%ThrU_o>;8s8rYZp(q)p)wCTWdfBF&qPwMWP zp|!Jic^r6b3LMB*Ziy&xY-?iPw)ms_$^?JpO?{bmU7Y2^ zH(<3bJh*qUp6+~5w z>%Ea_U$bP@A`Ms3M}KV_%2QI#UEJX*Z!#;D3s@Hg@0jQo(b#Zp7i+^}h8U&?{R~1! z-tA3w{4?qO@#U3qd-krn0u0Zcm+UQ7MQdkG3(uUqHuL%!og=$ffA2q&s{ecG-A6q! zujU57Wf!ZTc;d_d)gJ#gg=ucR%~g}B%xO{vY zOZ(EOApltKN3Bj=K@djeC{)5}X<-PROcTqanqD)`C%?I+3BB(XOil8=eW zpL_k}*asc)s#Gh1aJ?r+?*F+P{xkmIJK(Pqcq+Y%MM|HMtLpJr*=j!~cEJ@VyvnT@ zZn|Atn#6r)q3e~@=$SpoR5!d8WVm0vT2fv`$bg-ZYnSC84{eVHT@J1ab9-*NGYT|L zPq50g4|yX#f7z5Mw-jJu|4hlj(R{jnCNJloK44GPYZu#;piOSTcDhPJ5HPeSTTM#? zjV=PyZ8tEMqy8=13K|0ijbj4!txV1o1IbNj*vb)bVeQlWC~uJ5sMgV78chFVdQ&MBb@0Pcg`)c^nh literal 0 HcmV?d00001 diff --git a/muk_web_preview_markdown/static/description/screenshot.png b/muk_web_preview_markdown/static/description/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f83567e2fabfa485ca23b7fe24120b0f113750c2 GIT binary patch literal 37869 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 i$M{MWTfTzH^8X*PygtMfuYV-~0000 (GFM Style)', + type: 'boolean' + }, + requireSpaceBeforeHeadingText: { + defaultValue: false, + description: 'Makes adding a space between `#` and the header text mandatory (GFM Style)', + type: 'boolean' + }, + ghMentions: { + defaultValue: false, + description: 'Enables github @mentions', + type: 'boolean' + }, + ghMentionsLink: { + defaultValue: 'https://github.com/{u}', + description: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.', + type: 'string' + }, + encodeEmails: { + defaultValue: true, + description: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities', + type: 'boolean' + }, + openLinksInNewWindow: { + defaultValue: false, + description: 'Open all links in new windows', + type: 'boolean' + }, + backslashEscapesHTMLTags: { + defaultValue: false, + description: 'Support for HTML Tag escaping. ex: \
foo\
', + type: 'boolean' + }, + emoji: { + defaultValue: false, + description: 'Enable emoji support. Ex: `this is a :smile: emoji`', + type: 'boolean' + }, + underline: { + defaultValue: false, + description: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``', + type: 'boolean' + }, + completeHTMLDocument: { + defaultValue: false, + description: 'Outputs a complete html document, including ``, `` and `` tags', + type: 'boolean' + }, + metadata: { + defaultValue: false, + description: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).', + type: 'boolean' + }, + splitAdjacentBlockquotes: { + defaultValue: false, + description: 'Split adjacent blockquote blocks', + type: 'boolean' + } + }; + if (simple === false) { + return JSON.parse(JSON.stringify(defaultOptions)); + } + var ret = {}; + for (var opt in defaultOptions) { + if (defaultOptions.hasOwnProperty(opt)) { + ret[opt] = defaultOptions[opt].defaultValue; + } + } + return ret; +} + +function allOptionsOn () { + 'use strict'; + var options = getDefaultOpts(true), + ret = {}; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + ret[opt] = true; + } + } + return ret; +} + +/** + * Created by Tivie on 06-01-2015. + */ +// Private properties +var showdown = {}, + parsers = {}, + extensions = {}, + globalOptions = getDefaultOpts(true), + setFlavor = 'vanilla', + flavor = { + github: { + omitExtraWLInCodeBlocks: true, + simplifiedAutoLink: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true, + disableForced4SpacesIndentedSublists: true, + simpleLineBreaks: true, + requireSpaceBeforeHeadingText: true, + ghCompatibleHeaderId: true, + ghMentions: true, + backslashEscapesHTMLTags: true, + emoji: true, + splitAdjacentBlockquotes: true + }, + original: { + noHeaderId: true, + ghCodeBlocks: false + }, + ghost: { + omitExtraWLInCodeBlocks: true, + parseImgDimensions: true, + simplifiedAutoLink: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true, + smoothLivePreview: true, + simpleLineBreaks: true, + requireSpaceBeforeHeadingText: true, + ghMentions: false, + encodeEmails: true + }, + vanilla: getDefaultOpts(true), + allOn: allOptionsOn() + }; + +/** + * helper namespace + * @type {{}} + */ +showdown.helper = {}; + +/** + * TODO LEGACY SUPPORT CODE + * @type {{}} + */ +showdown.extensions = {}; + +/** + * Set a global option + * @static + * @param {string} key + * @param {*} value + * @returns {showdown} + */ +showdown.setOption = function (key, value) { + 'use strict'; + globalOptions[key] = value; + return this; +}; + +/** + * Get a global option + * @static + * @param {string} key + * @returns {*} + */ +showdown.getOption = function (key) { + 'use strict'; + return globalOptions[key]; +}; + +/** + * Get the global options + * @static + * @returns {{}} + */ +showdown.getOptions = function () { + 'use strict'; + return globalOptions; +}; + +/** + * Reset global options to the default values + * @static + */ +showdown.resetOptions = function () { + 'use strict'; + globalOptions = getDefaultOpts(true); +}; + +/** + * Set the flavor showdown should use as default + * @param {string} name + */ +showdown.setFlavor = function (name) { + 'use strict'; + if (!flavor.hasOwnProperty(name)) { + throw Error(name + ' flavor was not found'); + } + showdown.resetOptions(); + var preset = flavor[name]; + setFlavor = name; + for (var option in preset) { + if (preset.hasOwnProperty(option)) { + globalOptions[option] = preset[option]; + } + } +}; + +/** + * Get the currently set flavor + * @returns {string} + */ +showdown.getFlavor = function () { + 'use strict'; + return setFlavor; +}; + +/** + * Get the options of a specified flavor. Returns undefined if the flavor was not found + * @param {string} name Name of the flavor + * @returns {{}|undefined} + */ +showdown.getFlavorOptions = function (name) { + 'use strict'; + if (flavor.hasOwnProperty(name)) { + return flavor[name]; + } +}; + +/** + * Get the default options + * @static + * @param {boolean} [simple=true] + * @returns {{}} + */ +showdown.getDefaultOptions = function (simple) { + 'use strict'; + return getDefaultOpts(simple); +}; + +/** + * Get or set a subParser + * + * subParser(name) - Get a registered subParser + * subParser(name, func) - Register a subParser + * @static + * @param {string} name + * @param {function} [func] + * @returns {*} + */ +showdown.subParser = function (name, func) { + 'use strict'; + if (showdown.helper.isString(name)) { + if (typeof func !== 'undefined') { + parsers[name] = func; + } else { + if (parsers.hasOwnProperty(name)) { + return parsers[name]; + } else { + throw Error('SubParser named ' + name + ' not registered!'); + } + } + } else { + throw Error('showdown.subParser function first argument must be a string (the name of the subparser)'); + } +}; + +/** + * Gets or registers an extension + * @static + * @param {string} name + * @param {object|function=} ext + * @returns {*} + */ +showdown.extension = function (name, ext) { + 'use strict'; + + if (!showdown.helper.isString(name)) { + throw Error('Extension \'name\' must be a string'); + } + + name = showdown.helper.stdExtName(name); + + // Getter + if (showdown.helper.isUndefined(ext)) { + if (!extensions.hasOwnProperty(name)) { + throw Error('Extension named ' + name + ' is not registered!'); + } + return extensions[name]; + + // Setter + } else { + // Expand extension if it's wrapped in a function + if (typeof ext === 'function') { + ext = ext(); + } + + // Ensure extension is an array + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + + var validExtension = validate(ext, name); + + if (validExtension.valid) { + extensions[name] = ext; + } else { + throw Error(validExtension.error); + } + } +}; + +/** + * Gets all extensions registered + * @returns {{}} + */ +showdown.getAllExtensions = function () { + 'use strict'; + return extensions; +}; + +/** + * Remove an extension + * @param {string} name + */ +showdown.removeExtension = function (name) { + 'use strict'; + delete extensions[name]; +}; + +/** + * Removes all extensions + */ +showdown.resetExtensions = function () { + 'use strict'; + extensions = {}; +}; + +/** + * Validate extension + * @param {array} extension + * @param {string} name + * @returns {{valid: boolean, error: string}} + */ +function validate (extension, name) { + 'use strict'; + + var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension', + ret = { + valid: true, + error: '' + }; + + if (!showdown.helper.isArray(extension)) { + extension = [extension]; + } + + for (var i = 0; i < extension.length; ++i) { + var baseMsg = errMsg + ' sub-extension ' + i + ': ', + ext = extension[i]; + if (typeof ext !== 'object') { + ret.valid = false; + ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given'; + return ret; + } + + if (!showdown.helper.isString(ext.type)) { + ret.valid = false; + ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given'; + return ret; + } + + var type = ext.type = ext.type.toLowerCase(); + + // normalize extension type + if (type === 'language') { + type = ext.type = 'lang'; + } + + if (type === 'html') { + type = ext.type = 'output'; + } + + if (type !== 'lang' && type !== 'output' && type !== 'listener') { + ret.valid = false; + ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"'; + return ret; + } + + if (type === 'listener') { + if (showdown.helper.isUndefined(ext.listeners)) { + ret.valid = false; + ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"'; + return ret; + } + } else { + if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) { + ret.valid = false; + ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method'; + return ret; + } + } + + if (ext.listeners) { + if (typeof ext.listeners !== 'object') { + ret.valid = false; + ret.error = baseMsg + '"listeners" property must be an object but ' + typeof ext.listeners + ' given'; + return ret; + } + for (var ln in ext.listeners) { + if (ext.listeners.hasOwnProperty(ln)) { + if (typeof ext.listeners[ln] !== 'function') { + ret.valid = false; + ret.error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln + + ' must be a function but ' + typeof ext.listeners[ln] + ' given'; + return ret; + } + } + } + } + + if (ext.filter) { + if (typeof ext.filter !== 'function') { + ret.valid = false; + ret.error = baseMsg + '"filter" must be a function, but ' + typeof ext.filter + ' given'; + return ret; + } + } else if (ext.regex) { + if (showdown.helper.isString(ext.regex)) { + ext.regex = new RegExp(ext.regex, 'g'); + } + if (!(ext.regex instanceof RegExp)) { + ret.valid = false; + ret.error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given'; + return ret; + } + if (showdown.helper.isUndefined(ext.replace)) { + ret.valid = false; + ret.error = baseMsg + '"regex" extensions must implement a replace string or function'; + return ret; + } + } + } + return ret; +} + +/** + * Validate extension + * @param {object} ext + * @returns {boolean} + */ +showdown.validateExtension = function (ext) { + 'use strict'; + + var validateExtension = validate(ext, null); + if (!validateExtension.valid) { + console.warn(validateExtension.error); + return false; + } + return true; +}; + +/** + * showdownjs helper functions + */ + +if (!showdown.hasOwnProperty('helper')) { + showdown.helper = {}; +} + +if (typeof this.document === 'undefined' && typeof this.window === 'undefined') { + var jsdom = require('jsdom'); + this.window = new jsdom.JSDOM('', {}).window; // jshint ignore:line +} +showdown.helper.document = this.window.document; + +/** + * Check if var is string + * @static + * @param {string} a + * @returns {boolean} + */ +showdown.helper.isString = function (a) { + 'use strict'; + return (typeof a === 'string' || a instanceof String); +}; + +/** + * Check if var is a function + * @static + * @param {*} a + * @returns {boolean} + */ +showdown.helper.isFunction = function (a) { + 'use strict'; + var getType = {}; + return a && getType.toString.call(a) === '[object Function]'; +}; + +/** + * isArray helper function + * @static + * @param {*} a + * @returns {boolean} + */ +showdown.helper.isArray = function (a) { + 'use strict'; + return Array.isArray(a); +}; + +/** + * Check if value is undefined + * @static + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + */ +showdown.helper.isUndefined = function (value) { + 'use strict'; + return typeof value === 'undefined'; +}; + +/** + * ForEach helper function + * Iterates over Arrays and Objects (own properties only) + * @static + * @param {*} obj + * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object + */ +showdown.helper.forEach = function (obj, callback) { + 'use strict'; + // check if obj is defined + if (showdown.helper.isUndefined(obj)) { + throw new Error('obj param is required'); + } + + if (showdown.helper.isUndefined(callback)) { + throw new Error('callback param is required'); + } + + if (!showdown.helper.isFunction(callback)) { + throw new Error('callback param must be a function/closure'); + } + + if (typeof obj.forEach === 'function') { + obj.forEach(callback); + } else if (showdown.helper.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + callback(obj[i], i, obj); + } + } else if (typeof (obj) === 'object') { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + callback(obj[prop], prop, obj); + } + } + } else { + throw new Error('obj does not seem to be an array or an iterable object'); + } +}; + +/** + * Standardidize extension name + * @static + * @param {string} s extension name + * @returns {string} + */ +showdown.helper.stdExtName = function (s) { + 'use strict'; + return s.replace(/[_?*+\/\\.^-]/g, '').replace(/\s/g, '').toLowerCase(); +}; + +function escapeCharactersCallback (wholeMatch, m1) { + 'use strict'; + var charCodeToEscape = m1.charCodeAt(0); + return '¨E' + charCodeToEscape + 'E'; +} + +/** + * Callback used to escape characters when passing through String.replace + * @static + * @param {string} wholeMatch + * @param {string} m1 + * @returns {string} + */ +showdown.helper.escapeCharactersCallback = escapeCharactersCallback; + +/** + * Escape characters in a string + * @static + * @param {string} text + * @param {string} charsToEscape + * @param {boolean} afterBackslash + * @returns {XML|string|void|*} + */ +showdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) { + 'use strict'; + // First we have to escape the escape characters so that + // we can build a character class out of them + var regexString = '([' + charsToEscape.replace(/([\[\]\\])/g, '\\$1') + '])'; + + if (afterBackslash) { + regexString = '\\\\' + regexString; + } + + var regex = new RegExp(regexString, 'g'); + text = text.replace(regex, escapeCharactersCallback); + + return text; +}; + +var rgxFindMatchPos = function (str, left, right, flags) { + 'use strict'; + var f = flags || '', + g = f.indexOf('g') > -1, + x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')), + l = new RegExp(left, f.replace(/g/g, '')), + pos = [], + t, s, m, start, end; + + do { + t = 0; + while ((m = x.exec(str))) { + if (l.test(m[0])) { + if (!(t++)) { + s = x.lastIndex; + start = s - m[0].length; + } + } else if (t) { + if (!--t) { + end = m.index + m[0].length; + var obj = { + left: {start: start, end: s}, + match: {start: s, end: m.index}, + right: {start: m.index, end: end}, + wholeMatch: {start: start, end: end} + }; + pos.push(obj); + if (!g) { + return pos; + } + } + } + } + } while (t && (x.lastIndex = s)); + + return pos; +}; + +/** + * matchRecursiveRegExp + * + * (c) 2007 Steven Levithan + * MIT License + * + * Accepts a string to search, a left and right format delimiter + * as regex patterns, and optional regex flags. Returns an array + * of matches, allowing nested instances of left/right delimiters. + * Use the "g" flag to return all matches, otherwise only the + * first is returned. Be careful to ensure that the left and + * right format delimiters produce mutually exclusive matches. + * Backreferences are not supported within the right delimiter + * due to how it is internally combined with the left delimiter. + * When matching strings whose format delimiters are unbalanced + * to the left or right, the output is intentionally as a + * conventional regex library with recursion support would + * produce, e.g. "<" and ">" both produce ["x"] when using + * "<" and ">" as the delimiters (both strings contain a single, + * balanced instance of ""). + * + * examples: + * matchRecursiveRegExp("test", "\\(", "\\)") + * returns: [] + * matchRecursiveRegExp(">>t<>", "<", ">", "g") + * returns: ["t<>", ""] + * matchRecursiveRegExp("
test
", "]*>", "", "gi") + * returns: ["test"] + */ +showdown.helper.matchRecursiveRegExp = function (str, left, right, flags) { + 'use strict'; + + var matchPos = rgxFindMatchPos (str, left, right, flags), + results = []; + + for (var i = 0; i < matchPos.length; ++i) { + results.push([ + str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), + str.slice(matchPos[i].match.start, matchPos[i].match.end), + str.slice(matchPos[i].left.start, matchPos[i].left.end), + str.slice(matchPos[i].right.start, matchPos[i].right.end) + ]); + } + return results; +}; + +/** + * + * @param {string} str + * @param {string|function} replacement + * @param {string} left + * @param {string} right + * @param {string} flags + * @returns {string} + */ +showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) { + 'use strict'; + + if (!showdown.helper.isFunction(replacement)) { + var repStr = replacement; + replacement = function () { + return repStr; + }; + } + + var matchPos = rgxFindMatchPos(str, left, right, flags), + finalStr = str, + lng = matchPos.length; + + if (lng > 0) { + var bits = []; + if (matchPos[0].wholeMatch.start !== 0) { + bits.push(str.slice(0, matchPos[0].wholeMatch.start)); + } + for (var i = 0; i < lng; ++i) { + bits.push( + replacement( + str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), + str.slice(matchPos[i].match.start, matchPos[i].match.end), + str.slice(matchPos[i].left.start, matchPos[i].left.end), + str.slice(matchPos[i].right.start, matchPos[i].right.end) + ) + ); + if (i < lng - 1) { + bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start)); + } + } + if (matchPos[lng - 1].wholeMatch.end < str.length) { + bits.push(str.slice(matchPos[lng - 1].wholeMatch.end)); + } + finalStr = bits.join(''); + } + return finalStr; +}; + +/** + * Returns the index within the passed String object of the first occurrence of the specified regex, + * starting the search at fromIndex. Returns -1 if the value is not found. + * + * @param {string} str string to search + * @param {RegExp} regex Regular expression to search + * @param {int} [fromIndex = 0] Index to start the search + * @returns {Number} + * @throws InvalidArgumentError + */ +showdown.helper.regexIndexOf = function (str, regex, fromIndex) { + 'use strict'; + if (!showdown.helper.isString(str)) { + throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; + } + if (regex instanceof RegExp === false) { + throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp'; + } + var indexOf = str.substring(fromIndex || 0).search(regex); + return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf; +}; + +/** + * Splits the passed string object at the defined index, and returns an array composed of the two substrings + * @param {string} str string to split + * @param {int} index index to split string at + * @returns {[string,string]} + * @throws InvalidArgumentError + */ +showdown.helper.splitAtIndex = function (str, index) { + 'use strict'; + if (!showdown.helper.isString(str)) { + throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; + } + return [str.substring(0, index), str.substring(index)]; +}; + +/** + * Obfuscate an e-mail address through the use of Character Entities, + * transforming ASCII characters into their equivalent decimal or hex entities. + * + * Since it has a random component, subsequent calls to this function produce different results + * + * @param {string} mail + * @returns {string} + */ +showdown.helper.encodeEmailAddress = function (mail) { + 'use strict'; + var encode = [ + function (ch) { + return '&#' + ch.charCodeAt(0) + ';'; + }, + function (ch) { + return '&#x' + ch.charCodeAt(0).toString(16) + ';'; + }, + function (ch) { + return ch; + } + ]; + + mail = mail.replace(/./g, function (ch) { + if (ch === '@') { + // this *must* be encoded. I insist. + ch = encode[Math.floor(Math.random() * 2)](ch); + } else { + var r = Math.random(); + // roughly 10% raw, 45% hex, 45% dec + ch = ( + r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch) + ); + } + return ch; + }); + + return mail; +}; + +/** + * + * @param str + * @param targetLength + * @param padString + * @returns {string} + */ +showdown.helper.padEnd = function padEnd (str, targetLength, padString) { + 'use strict'; + /*jshint bitwise: false*/ + // eslint-disable-next-line space-infix-ops + targetLength = targetLength>>0; //floor if number or convert non-number to 0; + /*jshint bitwise: true*/ + padString = String(padString || ' '); + if (str.length > targetLength) { + return String(str); + } else { + targetLength = targetLength - str.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed + } + return String(str) + padString.slice(0,targetLength); + } +}; + +/** + * Unescape HTML entities + * @param txt + * @returns {string} + */ +showdown.helper.unescapeHTMLEntities = function (txt) { + 'use strict'; + + return txt + .replace(/"/g, '"') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&'); +}; + +showdown.helper._hashHTMLSpan = function (html, globals) { + return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C'; +}; + +/** + * Showdown's Event Object + * @param {string} name Name of the event + * @param {string} text Text + * @param {{}} params optional. params of the event + * @constructor + */ +showdown.helper.Event = function (name, text, params) { + 'use strict'; + + var regexp = params.regexp || null; + var matches = params.matches || {}; + var options = params.options || {}; + var converter = params.converter || null; + var globals = params.globals || {}; + + /** + * Get the name of the event + * @returns {string} + */ + this.getName = function () { + return name; + }; + + this.getEventName = function () { + return name; + }; + + this._stopExecution = false; + + this.parsedText = params.parsedText || null; + + this.getRegexp = function () { + return regexp; + }; + + this.getOptions = function () { + return options; + }; + + this.getConverter = function () { + return converter; + }; + + this.getGlobals = function () { + return globals; + }; + + this.getCapturedText = function () { + return text; + }; + + this.getText = function () { + return text; + }; + + this.setText = function (newText) { + text = newText; + }; + + this.getMatches = function () { + return matches; + }; + + this.setMatches = function (newMatches) { + matches = newMatches; + }; + + this.preventDefault = function (bool) { + this._stopExecution = !bool; + }; +}; + +/** + * POLYFILLS + */ +// use this instead of builtin is undefined for IE8 compatibility +if (typeof(console) === 'undefined') { + console = { + warn: function (msg) { + 'use strict'; + alert(msg); + }, + log: function (msg) { + 'use strict'; + alert(msg); + }, + error: function (msg) { + 'use strict'; + throw msg; + } + }; +} + +/** + * Common regexes. + * We declare some common regexes to improve performance + */ +showdown.helper.regexes = { + asteriskDashTildeAndColon: /([*_:~])/g, + asteriskDashAndTilde: /([*_~])/g +}; + +/** + * EMOJIS LIST + */ +showdown.helper.emojis = { + '+1':'\ud83d\udc4d', + '-1':'\ud83d\udc4e', + '100':'\ud83d\udcaf', + '1234':'\ud83d\udd22', + '1st_place_medal':'\ud83e\udd47', + '2nd_place_medal':'\ud83e\udd48', + '3rd_place_medal':'\ud83e\udd49', + '8ball':'\ud83c\udfb1', + 'a':'\ud83c\udd70\ufe0f', + 'ab':'\ud83c\udd8e', + 'abc':'\ud83d\udd24', + 'abcd':'\ud83d\udd21', + 'accept':'\ud83c\ude51', + 'aerial_tramway':'\ud83d\udea1', + 'airplane':'\u2708\ufe0f', + 'alarm_clock':'\u23f0', + 'alembic':'\u2697\ufe0f', + 'alien':'\ud83d\udc7d', + 'ambulance':'\ud83d\ude91', + 'amphora':'\ud83c\udffa', + 'anchor':'\u2693\ufe0f', + 'angel':'\ud83d\udc7c', + 'anger':'\ud83d\udca2', + 'angry':'\ud83d\ude20', + 'anguished':'\ud83d\ude27', + 'ant':'\ud83d\udc1c', + 'apple':'\ud83c\udf4e', + 'aquarius':'\u2652\ufe0f', + 'aries':'\u2648\ufe0f', + 'arrow_backward':'\u25c0\ufe0f', + 'arrow_double_down':'\u23ec', + 'arrow_double_up':'\u23eb', + 'arrow_down':'\u2b07\ufe0f', + 'arrow_down_small':'\ud83d\udd3d', + 'arrow_forward':'\u25b6\ufe0f', + 'arrow_heading_down':'\u2935\ufe0f', + 'arrow_heading_up':'\u2934\ufe0f', + 'arrow_left':'\u2b05\ufe0f', + 'arrow_lower_left':'\u2199\ufe0f', + 'arrow_lower_right':'\u2198\ufe0f', + 'arrow_right':'\u27a1\ufe0f', + 'arrow_right_hook':'\u21aa\ufe0f', + 'arrow_up':'\u2b06\ufe0f', + 'arrow_up_down':'\u2195\ufe0f', + 'arrow_up_small':'\ud83d\udd3c', + 'arrow_upper_left':'\u2196\ufe0f', + 'arrow_upper_right':'\u2197\ufe0f', + 'arrows_clockwise':'\ud83d\udd03', + 'arrows_counterclockwise':'\ud83d\udd04', + 'art':'\ud83c\udfa8', + 'articulated_lorry':'\ud83d\ude9b', + 'artificial_satellite':'\ud83d\udef0', + 'astonished':'\ud83d\ude32', + 'athletic_shoe':'\ud83d\udc5f', + 'atm':'\ud83c\udfe7', + 'atom_symbol':'\u269b\ufe0f', + 'avocado':'\ud83e\udd51', + 'b':'\ud83c\udd71\ufe0f', + 'baby':'\ud83d\udc76', + 'baby_bottle':'\ud83c\udf7c', + 'baby_chick':'\ud83d\udc24', + 'baby_symbol':'\ud83d\udebc', + 'back':'\ud83d\udd19', + 'bacon':'\ud83e\udd53', + 'badminton':'\ud83c\udff8', + 'baggage_claim':'\ud83d\udec4', + 'baguette_bread':'\ud83e\udd56', + 'balance_scale':'\u2696\ufe0f', + 'balloon':'\ud83c\udf88', + 'ballot_box':'\ud83d\uddf3', + 'ballot_box_with_check':'\u2611\ufe0f', + 'bamboo':'\ud83c\udf8d', + 'banana':'\ud83c\udf4c', + 'bangbang':'\u203c\ufe0f', + 'bank':'\ud83c\udfe6', + 'bar_chart':'\ud83d\udcca', + 'barber':'\ud83d\udc88', + 'baseball':'\u26be\ufe0f', + 'basketball':'\ud83c\udfc0', + 'basketball_man':'\u26f9\ufe0f', + 'basketball_woman':'\u26f9\ufe0f‍\u2640\ufe0f', + 'bat':'\ud83e\udd87', + 'bath':'\ud83d\udec0', + 'bathtub':'\ud83d\udec1', + 'battery':'\ud83d\udd0b', + 'beach_umbrella':'\ud83c\udfd6', + 'bear':'\ud83d\udc3b', + 'bed':'\ud83d\udecf', + 'bee':'\ud83d\udc1d', + 'beer':'\ud83c\udf7a', + 'beers':'\ud83c\udf7b', + 'beetle':'\ud83d\udc1e', + 'beginner':'\ud83d\udd30', + 'bell':'\ud83d\udd14', + 'bellhop_bell':'\ud83d\udece', + 'bento':'\ud83c\udf71', + 'biking_man':'\ud83d\udeb4', + 'bike':'\ud83d\udeb2', + 'biking_woman':'\ud83d\udeb4‍\u2640\ufe0f', + 'bikini':'\ud83d\udc59', + 'biohazard':'\u2623\ufe0f', + 'bird':'\ud83d\udc26', + 'birthday':'\ud83c\udf82', + 'black_circle':'\u26ab\ufe0f', + 'black_flag':'\ud83c\udff4', + 'black_heart':'\ud83d\udda4', + 'black_joker':'\ud83c\udccf', + 'black_large_square':'\u2b1b\ufe0f', + 'black_medium_small_square':'\u25fe\ufe0f', + 'black_medium_square':'\u25fc\ufe0f', + 'black_nib':'\u2712\ufe0f', + 'black_small_square':'\u25aa\ufe0f', + 'black_square_button':'\ud83d\udd32', + 'blonde_man':'\ud83d\udc71', + 'blonde_woman':'\ud83d\udc71‍\u2640\ufe0f', + 'blossom':'\ud83c\udf3c', + 'blowfish':'\ud83d\udc21', + 'blue_book':'\ud83d\udcd8', + 'blue_car':'\ud83d\ude99', + 'blue_heart':'\ud83d\udc99', + 'blush':'\ud83d\ude0a', + 'boar':'\ud83d\udc17', + 'boat':'\u26f5\ufe0f', + 'bomb':'\ud83d\udca3', + 'book':'\ud83d\udcd6', + 'bookmark':'\ud83d\udd16', + 'bookmark_tabs':'\ud83d\udcd1', + 'books':'\ud83d\udcda', + 'boom':'\ud83d\udca5', + 'boot':'\ud83d\udc62', + 'bouquet':'\ud83d\udc90', + 'bowing_man':'\ud83d\ude47', + 'bow_and_arrow':'\ud83c\udff9', + 'bowing_woman':'\ud83d\ude47‍\u2640\ufe0f', + 'bowling':'\ud83c\udfb3', + 'boxing_glove':'\ud83e\udd4a', + 'boy':'\ud83d\udc66', + 'bread':'\ud83c\udf5e', + 'bride_with_veil':'\ud83d\udc70', + 'bridge_at_night':'\ud83c\udf09', + 'briefcase':'\ud83d\udcbc', + 'broken_heart':'\ud83d\udc94', + 'bug':'\ud83d\udc1b', + 'building_construction':'\ud83c\udfd7', + 'bulb':'\ud83d\udca1', + 'bullettrain_front':'\ud83d\ude85', + 'bullettrain_side':'\ud83d\ude84', + 'burrito':'\ud83c\udf2f', + 'bus':'\ud83d\ude8c', + 'business_suit_levitating':'\ud83d\udd74', + 'busstop':'\ud83d\ude8f', + 'bust_in_silhouette':'\ud83d\udc64', + 'busts_in_silhouette':'\ud83d\udc65', + 'butterfly':'\ud83e\udd8b', + 'cactus':'\ud83c\udf35', + 'cake':'\ud83c\udf70', + 'calendar':'\ud83d\udcc6', + 'call_me_hand':'\ud83e\udd19', + 'calling':'\ud83d\udcf2', + 'camel':'\ud83d\udc2b', + 'camera':'\ud83d\udcf7', + 'camera_flash':'\ud83d\udcf8', + 'camping':'\ud83c\udfd5', + 'cancer':'\u264b\ufe0f', + 'candle':'\ud83d\udd6f', + 'candy':'\ud83c\udf6c', + 'canoe':'\ud83d\udef6', + 'capital_abcd':'\ud83d\udd20', + 'capricorn':'\u2651\ufe0f', + 'car':'\ud83d\ude97', + 'card_file_box':'\ud83d\uddc3', + 'card_index':'\ud83d\udcc7', + 'card_index_dividers':'\ud83d\uddc2', + 'carousel_horse':'\ud83c\udfa0', + 'carrot':'\ud83e\udd55', + 'cat':'\ud83d\udc31', + 'cat2':'\ud83d\udc08', + 'cd':'\ud83d\udcbf', + 'chains':'\u26d3', + 'champagne':'\ud83c\udf7e', + 'chart':'\ud83d\udcb9', + 'chart_with_downwards_trend':'\ud83d\udcc9', + 'chart_with_upwards_trend':'\ud83d\udcc8', + 'checkered_flag':'\ud83c\udfc1', + 'cheese':'\ud83e\uddc0', + 'cherries':'\ud83c\udf52', + 'cherry_blossom':'\ud83c\udf38', + 'chestnut':'\ud83c\udf30', + 'chicken':'\ud83d\udc14', + 'children_crossing':'\ud83d\udeb8', + 'chipmunk':'\ud83d\udc3f', + 'chocolate_bar':'\ud83c\udf6b', + 'christmas_tree':'\ud83c\udf84', + 'church':'\u26ea\ufe0f', + 'cinema':'\ud83c\udfa6', + 'circus_tent':'\ud83c\udfaa', + 'city_sunrise':'\ud83c\udf07', + 'city_sunset':'\ud83c\udf06', + 'cityscape':'\ud83c\udfd9', + 'cl':'\ud83c\udd91', + 'clamp':'\ud83d\udddc', + 'clap':'\ud83d\udc4f', + 'clapper':'\ud83c\udfac', + 'classical_building':'\ud83c\udfdb', + 'clinking_glasses':'\ud83e\udd42', + 'clipboard':'\ud83d\udccb', + 'clock1':'\ud83d\udd50', + 'clock10':'\ud83d\udd59', + 'clock1030':'\ud83d\udd65', + 'clock11':'\ud83d\udd5a', + 'clock1130':'\ud83d\udd66', + 'clock12':'\ud83d\udd5b', + 'clock1230':'\ud83d\udd67', + 'clock130':'\ud83d\udd5c', + 'clock2':'\ud83d\udd51', + 'clock230':'\ud83d\udd5d', + 'clock3':'\ud83d\udd52', + 'clock330':'\ud83d\udd5e', + 'clock4':'\ud83d\udd53', + 'clock430':'\ud83d\udd5f', + 'clock5':'\ud83d\udd54', + 'clock530':'\ud83d\udd60', + 'clock6':'\ud83d\udd55', + 'clock630':'\ud83d\udd61', + 'clock7':'\ud83d\udd56', + 'clock730':'\ud83d\udd62', + 'clock8':'\ud83d\udd57', + 'clock830':'\ud83d\udd63', + 'clock9':'\ud83d\udd58', + 'clock930':'\ud83d\udd64', + 'closed_book':'\ud83d\udcd5', + 'closed_lock_with_key':'\ud83d\udd10', + 'closed_umbrella':'\ud83c\udf02', + 'cloud':'\u2601\ufe0f', + 'cloud_with_lightning':'\ud83c\udf29', + 'cloud_with_lightning_and_rain':'\u26c8', + 'cloud_with_rain':'\ud83c\udf27', + 'cloud_with_snow':'\ud83c\udf28', + 'clown_face':'\ud83e\udd21', + 'clubs':'\u2663\ufe0f', + 'cocktail':'\ud83c\udf78', + 'coffee':'\u2615\ufe0f', + 'coffin':'\u26b0\ufe0f', + 'cold_sweat':'\ud83d\ude30', + 'comet':'\u2604\ufe0f', + 'computer':'\ud83d\udcbb', + 'computer_mouse':'\ud83d\uddb1', + 'confetti_ball':'\ud83c\udf8a', + 'confounded':'\ud83d\ude16', + 'confused':'\ud83d\ude15', + 'congratulations':'\u3297\ufe0f', + 'construction':'\ud83d\udea7', + 'construction_worker_man':'\ud83d\udc77', + 'construction_worker_woman':'\ud83d\udc77‍\u2640\ufe0f', + 'control_knobs':'\ud83c\udf9b', + 'convenience_store':'\ud83c\udfea', + 'cookie':'\ud83c\udf6a', + 'cool':'\ud83c\udd92', + 'policeman':'\ud83d\udc6e', + 'copyright':'\u00a9\ufe0f', + 'corn':'\ud83c\udf3d', + 'couch_and_lamp':'\ud83d\udecb', + 'couple':'\ud83d\udc6b', + 'couple_with_heart_woman_man':'\ud83d\udc91', + 'couple_with_heart_man_man':'\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc68', + 'couple_with_heart_woman_woman':'\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc69', + 'couplekiss_man_man':'\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc68', + 'couplekiss_man_woman':'\ud83d\udc8f', + 'couplekiss_woman_woman':'\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc69', + 'cow':'\ud83d\udc2e', + 'cow2':'\ud83d\udc04', + 'cowboy_hat_face':'\ud83e\udd20', + 'crab':'\ud83e\udd80', + 'crayon':'\ud83d\udd8d', + 'credit_card':'\ud83d\udcb3', + 'crescent_moon':'\ud83c\udf19', + 'cricket':'\ud83c\udfcf', + 'crocodile':'\ud83d\udc0a', + 'croissant':'\ud83e\udd50', + 'crossed_fingers':'\ud83e\udd1e', + 'crossed_flags':'\ud83c\udf8c', + 'crossed_swords':'\u2694\ufe0f', + 'crown':'\ud83d\udc51', + 'cry':'\ud83d\ude22', + 'crying_cat_face':'\ud83d\ude3f', + 'crystal_ball':'\ud83d\udd2e', + 'cucumber':'\ud83e\udd52', + 'cupid':'\ud83d\udc98', + 'curly_loop':'\u27b0', + 'currency_exchange':'\ud83d\udcb1', + 'curry':'\ud83c\udf5b', + 'custard':'\ud83c\udf6e', + 'customs':'\ud83d\udec3', + 'cyclone':'\ud83c\udf00', + 'dagger':'\ud83d\udde1', + 'dancer':'\ud83d\udc83', + 'dancing_women':'\ud83d\udc6f', + 'dancing_men':'\ud83d\udc6f‍\u2642\ufe0f', + 'dango':'\ud83c\udf61', + 'dark_sunglasses':'\ud83d\udd76', + 'dart':'\ud83c\udfaf', + 'dash':'\ud83d\udca8', + 'date':'\ud83d\udcc5', + 'deciduous_tree':'\ud83c\udf33', + 'deer':'\ud83e\udd8c', + 'department_store':'\ud83c\udfec', + 'derelict_house':'\ud83c\udfda', + 'desert':'\ud83c\udfdc', + 'desert_island':'\ud83c\udfdd', + 'desktop_computer':'\ud83d\udda5', + 'male_detective':'\ud83d\udd75\ufe0f', + 'diamond_shape_with_a_dot_inside':'\ud83d\udca0', + 'diamonds':'\u2666\ufe0f', + 'disappointed':'\ud83d\ude1e', + 'disappointed_relieved':'\ud83d\ude25', + 'dizzy':'\ud83d\udcab', + 'dizzy_face':'\ud83d\ude35', + 'do_not_litter':'\ud83d\udeaf', + 'dog':'\ud83d\udc36', + 'dog2':'\ud83d\udc15', + 'dollar':'\ud83d\udcb5', + 'dolls':'\ud83c\udf8e', + 'dolphin':'\ud83d\udc2c', + 'door':'\ud83d\udeaa', + 'doughnut':'\ud83c\udf69', + 'dove':'\ud83d\udd4a', + 'dragon':'\ud83d\udc09', + 'dragon_face':'\ud83d\udc32', + 'dress':'\ud83d\udc57', + 'dromedary_camel':'\ud83d\udc2a', + 'drooling_face':'\ud83e\udd24', + 'droplet':'\ud83d\udca7', + 'drum':'\ud83e\udd41', + 'duck':'\ud83e\udd86', + 'dvd':'\ud83d\udcc0', + 'e-mail':'\ud83d\udce7', + 'eagle':'\ud83e\udd85', + 'ear':'\ud83d\udc42', + 'ear_of_rice':'\ud83c\udf3e', + 'earth_africa':'\ud83c\udf0d', + 'earth_americas':'\ud83c\udf0e', + 'earth_asia':'\ud83c\udf0f', + 'egg':'\ud83e\udd5a', + 'eggplant':'\ud83c\udf46', + 'eight_pointed_black_star':'\u2734\ufe0f', + 'eight_spoked_asterisk':'\u2733\ufe0f', + 'electric_plug':'\ud83d\udd0c', + 'elephant':'\ud83d\udc18', + 'email':'\u2709\ufe0f', + 'end':'\ud83d\udd1a', + 'envelope_with_arrow':'\ud83d\udce9', + 'euro':'\ud83d\udcb6', + 'european_castle':'\ud83c\udff0', + 'european_post_office':'\ud83c\udfe4', + 'evergreen_tree':'\ud83c\udf32', + 'exclamation':'\u2757\ufe0f', + 'expressionless':'\ud83d\ude11', + 'eye':'\ud83d\udc41', + 'eye_speech_bubble':'\ud83d\udc41‍\ud83d\udde8', + 'eyeglasses':'\ud83d\udc53', + 'eyes':'\ud83d\udc40', + 'face_with_head_bandage':'\ud83e\udd15', + 'face_with_thermometer':'\ud83e\udd12', + 'fist_oncoming':'\ud83d\udc4a', + 'factory':'\ud83c\udfed', + 'fallen_leaf':'\ud83c\udf42', + 'family_man_woman_boy':'\ud83d\udc6a', + 'family_man_boy':'\ud83d\udc68‍\ud83d\udc66', + 'family_man_boy_boy':'\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66', + 'family_man_girl':'\ud83d\udc68‍\ud83d\udc67', + 'family_man_girl_boy':'\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66', + 'family_man_girl_girl':'\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67', + 'family_man_man_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66', + 'family_man_man_boy_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66', + 'family_man_man_girl':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67', + 'family_man_man_girl_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66', + 'family_man_man_girl_girl':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67', + 'family_man_woman_boy_boy':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', + 'family_man_woman_girl':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67', + 'family_man_woman_girl_boy':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', + 'family_man_woman_girl_girl':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', + 'family_woman_boy':'\ud83d\udc69‍\ud83d\udc66', + 'family_woman_boy_boy':'\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', + 'family_woman_girl':'\ud83d\udc69‍\ud83d\udc67', + 'family_woman_girl_boy':'\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', + 'family_woman_girl_girl':'\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', + 'family_woman_woman_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66', + 'family_woman_woman_boy_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', + 'family_woman_woman_girl':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67', + 'family_woman_woman_girl_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', + 'family_woman_woman_girl_girl':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', + 'fast_forward':'\u23e9', + 'fax':'\ud83d\udce0', + 'fearful':'\ud83d\ude28', + 'feet':'\ud83d\udc3e', + 'female_detective':'\ud83d\udd75\ufe0f‍\u2640\ufe0f', + 'ferris_wheel':'\ud83c\udfa1', + 'ferry':'\u26f4', + 'field_hockey':'\ud83c\udfd1', + 'file_cabinet':'\ud83d\uddc4', + 'file_folder':'\ud83d\udcc1', + 'film_projector':'\ud83d\udcfd', + 'film_strip':'\ud83c\udf9e', + 'fire':'\ud83d\udd25', + 'fire_engine':'\ud83d\ude92', + 'fireworks':'\ud83c\udf86', + 'first_quarter_moon':'\ud83c\udf13', + 'first_quarter_moon_with_face':'\ud83c\udf1b', + 'fish':'\ud83d\udc1f', + 'fish_cake':'\ud83c\udf65', + 'fishing_pole_and_fish':'\ud83c\udfa3', + 'fist_raised':'\u270a', + 'fist_left':'\ud83e\udd1b', + 'fist_right':'\ud83e\udd1c', + 'flags':'\ud83c\udf8f', + 'flashlight':'\ud83d\udd26', + 'fleur_de_lis':'\u269c\ufe0f', + 'flight_arrival':'\ud83d\udeec', + 'flight_departure':'\ud83d\udeeb', + 'floppy_disk':'\ud83d\udcbe', + 'flower_playing_cards':'\ud83c\udfb4', + 'flushed':'\ud83d\ude33', + 'fog':'\ud83c\udf2b', + 'foggy':'\ud83c\udf01', + 'football':'\ud83c\udfc8', + 'footprints':'\ud83d\udc63', + 'fork_and_knife':'\ud83c\udf74', + 'fountain':'\u26f2\ufe0f', + 'fountain_pen':'\ud83d\udd8b', + 'four_leaf_clover':'\ud83c\udf40', + 'fox_face':'\ud83e\udd8a', + 'framed_picture':'\ud83d\uddbc', + 'free':'\ud83c\udd93', + 'fried_egg':'\ud83c\udf73', + 'fried_shrimp':'\ud83c\udf64', + 'fries':'\ud83c\udf5f', + 'frog':'\ud83d\udc38', + 'frowning':'\ud83d\ude26', + 'frowning_face':'\u2639\ufe0f', + 'frowning_man':'\ud83d\ude4d‍\u2642\ufe0f', + 'frowning_woman':'\ud83d\ude4d', + 'middle_finger':'\ud83d\udd95', + 'fuelpump':'\u26fd\ufe0f', + 'full_moon':'\ud83c\udf15', + 'full_moon_with_face':'\ud83c\udf1d', + 'funeral_urn':'\u26b1\ufe0f', + 'game_die':'\ud83c\udfb2', + 'gear':'\u2699\ufe0f', + 'gem':'\ud83d\udc8e', + 'gemini':'\u264a\ufe0f', + 'ghost':'\ud83d\udc7b', + 'gift':'\ud83c\udf81', + 'gift_heart':'\ud83d\udc9d', + 'girl':'\ud83d\udc67', + 'globe_with_meridians':'\ud83c\udf10', + 'goal_net':'\ud83e\udd45', + 'goat':'\ud83d\udc10', + 'golf':'\u26f3\ufe0f', + 'golfing_man':'\ud83c\udfcc\ufe0f', + 'golfing_woman':'\ud83c\udfcc\ufe0f‍\u2640\ufe0f', + 'gorilla':'\ud83e\udd8d', + 'grapes':'\ud83c\udf47', + 'green_apple':'\ud83c\udf4f', + 'green_book':'\ud83d\udcd7', + 'green_heart':'\ud83d\udc9a', + 'green_salad':'\ud83e\udd57', + 'grey_exclamation':'\u2755', + 'grey_question':'\u2754', + 'grimacing':'\ud83d\ude2c', + 'grin':'\ud83d\ude01', + 'grinning':'\ud83d\ude00', + 'guardsman':'\ud83d\udc82', + 'guardswoman':'\ud83d\udc82‍\u2640\ufe0f', + 'guitar':'\ud83c\udfb8', + 'gun':'\ud83d\udd2b', + 'haircut_woman':'\ud83d\udc87', + 'haircut_man':'\ud83d\udc87‍\u2642\ufe0f', + 'hamburger':'\ud83c\udf54', + 'hammer':'\ud83d\udd28', + 'hammer_and_pick':'\u2692', + 'hammer_and_wrench':'\ud83d\udee0', + 'hamster':'\ud83d\udc39', + 'hand':'\u270b', + 'handbag':'\ud83d\udc5c', + 'handshake':'\ud83e\udd1d', + 'hankey':'\ud83d\udca9', + 'hatched_chick':'\ud83d\udc25', + 'hatching_chick':'\ud83d\udc23', + 'headphones':'\ud83c\udfa7', + 'hear_no_evil':'\ud83d\ude49', + 'heart':'\u2764\ufe0f', + 'heart_decoration':'\ud83d\udc9f', + 'heart_eyes':'\ud83d\ude0d', + 'heart_eyes_cat':'\ud83d\ude3b', + 'heartbeat':'\ud83d\udc93', + 'heartpulse':'\ud83d\udc97', + 'hearts':'\u2665\ufe0f', + 'heavy_check_mark':'\u2714\ufe0f', + 'heavy_division_sign':'\u2797', + 'heavy_dollar_sign':'\ud83d\udcb2', + 'heavy_heart_exclamation':'\u2763\ufe0f', + 'heavy_minus_sign':'\u2796', + 'heavy_multiplication_x':'\u2716\ufe0f', + 'heavy_plus_sign':'\u2795', + 'helicopter':'\ud83d\ude81', + 'herb':'\ud83c\udf3f', + 'hibiscus':'\ud83c\udf3a', + 'high_brightness':'\ud83d\udd06', + 'high_heel':'\ud83d\udc60', + 'hocho':'\ud83d\udd2a', + 'hole':'\ud83d\udd73', + 'honey_pot':'\ud83c\udf6f', + 'horse':'\ud83d\udc34', + 'horse_racing':'\ud83c\udfc7', + 'hospital':'\ud83c\udfe5', + 'hot_pepper':'\ud83c\udf36', + 'hotdog':'\ud83c\udf2d', + 'hotel':'\ud83c\udfe8', + 'hotsprings':'\u2668\ufe0f', + 'hourglass':'\u231b\ufe0f', + 'hourglass_flowing_sand':'\u23f3', + 'house':'\ud83c\udfe0', + 'house_with_garden':'\ud83c\udfe1', + 'houses':'\ud83c\udfd8', + 'hugs':'\ud83e\udd17', + 'hushed':'\ud83d\ude2f', + 'ice_cream':'\ud83c\udf68', + 'ice_hockey':'\ud83c\udfd2', + 'ice_skate':'\u26f8', + 'icecream':'\ud83c\udf66', + 'id':'\ud83c\udd94', + 'ideograph_advantage':'\ud83c\ude50', + 'imp':'\ud83d\udc7f', + 'inbox_tray':'\ud83d\udce5', + 'incoming_envelope':'\ud83d\udce8', + 'tipping_hand_woman':'\ud83d\udc81', + 'information_source':'\u2139\ufe0f', + 'innocent':'\ud83d\ude07', + 'interrobang':'\u2049\ufe0f', + 'iphone':'\ud83d\udcf1', + 'izakaya_lantern':'\ud83c\udfee', + 'jack_o_lantern':'\ud83c\udf83', + 'japan':'\ud83d\uddfe', + 'japanese_castle':'\ud83c\udfef', + 'japanese_goblin':'\ud83d\udc7a', + 'japanese_ogre':'\ud83d\udc79', + 'jeans':'\ud83d\udc56', + 'joy':'\ud83d\ude02', + 'joy_cat':'\ud83d\ude39', + 'joystick':'\ud83d\udd79', + 'kaaba':'\ud83d\udd4b', + 'key':'\ud83d\udd11', + 'keyboard':'\u2328\ufe0f', + 'keycap_ten':'\ud83d\udd1f', + 'kick_scooter':'\ud83d\udef4', + 'kimono':'\ud83d\udc58', + 'kiss':'\ud83d\udc8b', + 'kissing':'\ud83d\ude17', + 'kissing_cat':'\ud83d\ude3d', + 'kissing_closed_eyes':'\ud83d\ude1a', + 'kissing_heart':'\ud83d\ude18', + 'kissing_smiling_eyes':'\ud83d\ude19', + 'kiwi_fruit':'\ud83e\udd5d', + 'koala':'\ud83d\udc28', + 'koko':'\ud83c\ude01', + 'label':'\ud83c\udff7', + 'large_blue_circle':'\ud83d\udd35', + 'large_blue_diamond':'\ud83d\udd37', + 'large_orange_diamond':'\ud83d\udd36', + 'last_quarter_moon':'\ud83c\udf17', + 'last_quarter_moon_with_face':'\ud83c\udf1c', + 'latin_cross':'\u271d\ufe0f', + 'laughing':'\ud83d\ude06', + 'leaves':'\ud83c\udf43', + 'ledger':'\ud83d\udcd2', + 'left_luggage':'\ud83d\udec5', + 'left_right_arrow':'\u2194\ufe0f', + 'leftwards_arrow_with_hook':'\u21a9\ufe0f', + 'lemon':'\ud83c\udf4b', + 'leo':'\u264c\ufe0f', + 'leopard':'\ud83d\udc06', + 'level_slider':'\ud83c\udf9a', + 'libra':'\u264e\ufe0f', + 'light_rail':'\ud83d\ude88', + 'link':'\ud83d\udd17', + 'lion':'\ud83e\udd81', + 'lips':'\ud83d\udc44', + 'lipstick':'\ud83d\udc84', + 'lizard':'\ud83e\udd8e', + 'lock':'\ud83d\udd12', + 'lock_with_ink_pen':'\ud83d\udd0f', + 'lollipop':'\ud83c\udf6d', + 'loop':'\u27bf', + 'loud_sound':'\ud83d\udd0a', + 'loudspeaker':'\ud83d\udce2', + 'love_hotel':'\ud83c\udfe9', + 'love_letter':'\ud83d\udc8c', + 'low_brightness':'\ud83d\udd05', + 'lying_face':'\ud83e\udd25', + 'm':'\u24c2\ufe0f', + 'mag':'\ud83d\udd0d', + 'mag_right':'\ud83d\udd0e', + 'mahjong':'\ud83c\udc04\ufe0f', + 'mailbox':'\ud83d\udceb', + 'mailbox_closed':'\ud83d\udcea', + 'mailbox_with_mail':'\ud83d\udcec', + 'mailbox_with_no_mail':'\ud83d\udced', + 'man':'\ud83d\udc68', + 'man_artist':'\ud83d\udc68‍\ud83c\udfa8', + 'man_astronaut':'\ud83d\udc68‍\ud83d\ude80', + 'man_cartwheeling':'\ud83e\udd38‍\u2642\ufe0f', + 'man_cook':'\ud83d\udc68‍\ud83c\udf73', + 'man_dancing':'\ud83d\udd7a', + 'man_facepalming':'\ud83e\udd26‍\u2642\ufe0f', + 'man_factory_worker':'\ud83d\udc68‍\ud83c\udfed', + 'man_farmer':'\ud83d\udc68‍\ud83c\udf3e', + 'man_firefighter':'\ud83d\udc68‍\ud83d\ude92', + 'man_health_worker':'\ud83d\udc68‍\u2695\ufe0f', + 'man_in_tuxedo':'\ud83e\udd35', + 'man_judge':'\ud83d\udc68‍\u2696\ufe0f', + 'man_juggling':'\ud83e\udd39‍\u2642\ufe0f', + 'man_mechanic':'\ud83d\udc68‍\ud83d\udd27', + 'man_office_worker':'\ud83d\udc68‍\ud83d\udcbc', + 'man_pilot':'\ud83d\udc68‍\u2708\ufe0f', + 'man_playing_handball':'\ud83e\udd3e‍\u2642\ufe0f', + 'man_playing_water_polo':'\ud83e\udd3d‍\u2642\ufe0f', + 'man_scientist':'\ud83d\udc68‍\ud83d\udd2c', + 'man_shrugging':'\ud83e\udd37‍\u2642\ufe0f', + 'man_singer':'\ud83d\udc68‍\ud83c\udfa4', + 'man_student':'\ud83d\udc68‍\ud83c\udf93', + 'man_teacher':'\ud83d\udc68‍\ud83c\udfeb', + 'man_technologist':'\ud83d\udc68‍\ud83d\udcbb', + 'man_with_gua_pi_mao':'\ud83d\udc72', + 'man_with_turban':'\ud83d\udc73', + 'tangerine':'\ud83c\udf4a', + 'mans_shoe':'\ud83d\udc5e', + 'mantelpiece_clock':'\ud83d\udd70', + 'maple_leaf':'\ud83c\udf41', + 'martial_arts_uniform':'\ud83e\udd4b', + 'mask':'\ud83d\ude37', + 'massage_woman':'\ud83d\udc86', + 'massage_man':'\ud83d\udc86‍\u2642\ufe0f', + 'meat_on_bone':'\ud83c\udf56', + 'medal_military':'\ud83c\udf96', + 'medal_sports':'\ud83c\udfc5', + 'mega':'\ud83d\udce3', + 'melon':'\ud83c\udf48', + 'memo':'\ud83d\udcdd', + 'men_wrestling':'\ud83e\udd3c‍\u2642\ufe0f', + 'menorah':'\ud83d\udd4e', + 'mens':'\ud83d\udeb9', + 'metal':'\ud83e\udd18', + 'metro':'\ud83d\ude87', + 'microphone':'\ud83c\udfa4', + 'microscope':'\ud83d\udd2c', + 'milk_glass':'\ud83e\udd5b', + 'milky_way':'\ud83c\udf0c', + 'minibus':'\ud83d\ude90', + 'minidisc':'\ud83d\udcbd', + 'mobile_phone_off':'\ud83d\udcf4', + 'money_mouth_face':'\ud83e\udd11', + 'money_with_wings':'\ud83d\udcb8', + 'moneybag':'\ud83d\udcb0', + 'monkey':'\ud83d\udc12', + 'monkey_face':'\ud83d\udc35', + 'monorail':'\ud83d\ude9d', + 'moon':'\ud83c\udf14', + 'mortar_board':'\ud83c\udf93', + 'mosque':'\ud83d\udd4c', + 'motor_boat':'\ud83d\udee5', + 'motor_scooter':'\ud83d\udef5', + 'motorcycle':'\ud83c\udfcd', + 'motorway':'\ud83d\udee3', + 'mount_fuji':'\ud83d\uddfb', + 'mountain':'\u26f0', + 'mountain_biking_man':'\ud83d\udeb5', + 'mountain_biking_woman':'\ud83d\udeb5‍\u2640\ufe0f', + 'mountain_cableway':'\ud83d\udea0', + 'mountain_railway':'\ud83d\ude9e', + 'mountain_snow':'\ud83c\udfd4', + 'mouse':'\ud83d\udc2d', + 'mouse2':'\ud83d\udc01', + 'movie_camera':'\ud83c\udfa5', + 'moyai':'\ud83d\uddff', + 'mrs_claus':'\ud83e\udd36', + 'muscle':'\ud83d\udcaa', + 'mushroom':'\ud83c\udf44', + 'musical_keyboard':'\ud83c\udfb9', + 'musical_note':'\ud83c\udfb5', + 'musical_score':'\ud83c\udfbc', + 'mute':'\ud83d\udd07', + 'nail_care':'\ud83d\udc85', + 'name_badge':'\ud83d\udcdb', + 'national_park':'\ud83c\udfde', + 'nauseated_face':'\ud83e\udd22', + 'necktie':'\ud83d\udc54', + 'negative_squared_cross_mark':'\u274e', + 'nerd_face':'\ud83e\udd13', + 'neutral_face':'\ud83d\ude10', + 'new':'\ud83c\udd95', + 'new_moon':'\ud83c\udf11', + 'new_moon_with_face':'\ud83c\udf1a', + 'newspaper':'\ud83d\udcf0', + 'newspaper_roll':'\ud83d\uddde', + 'next_track_button':'\u23ed', + 'ng':'\ud83c\udd96', + 'no_good_man':'\ud83d\ude45‍\u2642\ufe0f', + 'no_good_woman':'\ud83d\ude45', + 'night_with_stars':'\ud83c\udf03', + 'no_bell':'\ud83d\udd15', + 'no_bicycles':'\ud83d\udeb3', + 'no_entry':'\u26d4\ufe0f', + 'no_entry_sign':'\ud83d\udeab', + 'no_mobile_phones':'\ud83d\udcf5', + 'no_mouth':'\ud83d\ude36', + 'no_pedestrians':'\ud83d\udeb7', + 'no_smoking':'\ud83d\udead', + 'non-potable_water':'\ud83d\udeb1', + 'nose':'\ud83d\udc43', + 'notebook':'\ud83d\udcd3', + 'notebook_with_decorative_cover':'\ud83d\udcd4', + 'notes':'\ud83c\udfb6', + 'nut_and_bolt':'\ud83d\udd29', + 'o':'\u2b55\ufe0f', + 'o2':'\ud83c\udd7e\ufe0f', + 'ocean':'\ud83c\udf0a', + 'octopus':'\ud83d\udc19', + 'oden':'\ud83c\udf62', + 'office':'\ud83c\udfe2', + 'oil_drum':'\ud83d\udee2', + 'ok':'\ud83c\udd97', + 'ok_hand':'\ud83d\udc4c', + 'ok_man':'\ud83d\ude46‍\u2642\ufe0f', + 'ok_woman':'\ud83d\ude46', + 'old_key':'\ud83d\udddd', + 'older_man':'\ud83d\udc74', + 'older_woman':'\ud83d\udc75', + 'om':'\ud83d\udd49', + 'on':'\ud83d\udd1b', + 'oncoming_automobile':'\ud83d\ude98', + 'oncoming_bus':'\ud83d\ude8d', + 'oncoming_police_car':'\ud83d\ude94', + 'oncoming_taxi':'\ud83d\ude96', + 'open_file_folder':'\ud83d\udcc2', + 'open_hands':'\ud83d\udc50', + 'open_mouth':'\ud83d\ude2e', + 'open_umbrella':'\u2602\ufe0f', + 'ophiuchus':'\u26ce', + 'orange_book':'\ud83d\udcd9', + 'orthodox_cross':'\u2626\ufe0f', + 'outbox_tray':'\ud83d\udce4', + 'owl':'\ud83e\udd89', + 'ox':'\ud83d\udc02', + 'package':'\ud83d\udce6', + 'page_facing_up':'\ud83d\udcc4', + 'page_with_curl':'\ud83d\udcc3', + 'pager':'\ud83d\udcdf', + 'paintbrush':'\ud83d\udd8c', + 'palm_tree':'\ud83c\udf34', + 'pancakes':'\ud83e\udd5e', + 'panda_face':'\ud83d\udc3c', + 'paperclip':'\ud83d\udcce', + 'paperclips':'\ud83d\udd87', + 'parasol_on_ground':'\u26f1', + 'parking':'\ud83c\udd7f\ufe0f', + 'part_alternation_mark':'\u303d\ufe0f', + 'partly_sunny':'\u26c5\ufe0f', + 'passenger_ship':'\ud83d\udef3', + 'passport_control':'\ud83d\udec2', + 'pause_button':'\u23f8', + 'peace_symbol':'\u262e\ufe0f', + 'peach':'\ud83c\udf51', + 'peanuts':'\ud83e\udd5c', + 'pear':'\ud83c\udf50', + 'pen':'\ud83d\udd8a', + 'pencil2':'\u270f\ufe0f', + 'penguin':'\ud83d\udc27', + 'pensive':'\ud83d\ude14', + 'performing_arts':'\ud83c\udfad', + 'persevere':'\ud83d\ude23', + 'person_fencing':'\ud83e\udd3a', + 'pouting_woman':'\ud83d\ude4e', + 'phone':'\u260e\ufe0f', + 'pick':'\u26cf', + 'pig':'\ud83d\udc37', + 'pig2':'\ud83d\udc16', + 'pig_nose':'\ud83d\udc3d', + 'pill':'\ud83d\udc8a', + 'pineapple':'\ud83c\udf4d', + 'ping_pong':'\ud83c\udfd3', + 'pisces':'\u2653\ufe0f', + 'pizza':'\ud83c\udf55', + 'place_of_worship':'\ud83d\uded0', + 'plate_with_cutlery':'\ud83c\udf7d', + 'play_or_pause_button':'\u23ef', + 'point_down':'\ud83d\udc47', + 'point_left':'\ud83d\udc48', + 'point_right':'\ud83d\udc49', + 'point_up':'\u261d\ufe0f', + 'point_up_2':'\ud83d\udc46', + 'police_car':'\ud83d\ude93', + 'policewoman':'\ud83d\udc6e‍\u2640\ufe0f', + 'poodle':'\ud83d\udc29', + 'popcorn':'\ud83c\udf7f', + 'post_office':'\ud83c\udfe3', + 'postal_horn':'\ud83d\udcef', + 'postbox':'\ud83d\udcee', + 'potable_water':'\ud83d\udeb0', + 'potato':'\ud83e\udd54', + 'pouch':'\ud83d\udc5d', + 'poultry_leg':'\ud83c\udf57', + 'pound':'\ud83d\udcb7', + 'rage':'\ud83d\ude21', + 'pouting_cat':'\ud83d\ude3e', + 'pouting_man':'\ud83d\ude4e‍\u2642\ufe0f', + 'pray':'\ud83d\ude4f', + 'prayer_beads':'\ud83d\udcff', + 'pregnant_woman':'\ud83e\udd30', + 'previous_track_button':'\u23ee', + 'prince':'\ud83e\udd34', + 'princess':'\ud83d\udc78', + 'printer':'\ud83d\udda8', + 'purple_heart':'\ud83d\udc9c', + 'purse':'\ud83d\udc5b', + 'pushpin':'\ud83d\udccc', + 'put_litter_in_its_place':'\ud83d\udeae', + 'question':'\u2753', + 'rabbit':'\ud83d\udc30', + 'rabbit2':'\ud83d\udc07', + 'racehorse':'\ud83d\udc0e', + 'racing_car':'\ud83c\udfce', + 'radio':'\ud83d\udcfb', + 'radio_button':'\ud83d\udd18', + 'radioactive':'\u2622\ufe0f', + 'railway_car':'\ud83d\ude83', + 'railway_track':'\ud83d\udee4', + 'rainbow':'\ud83c\udf08', + 'rainbow_flag':'\ud83c\udff3\ufe0f‍\ud83c\udf08', + 'raised_back_of_hand':'\ud83e\udd1a', + 'raised_hand_with_fingers_splayed':'\ud83d\udd90', + 'raised_hands':'\ud83d\ude4c', + 'raising_hand_woman':'\ud83d\ude4b', + 'raising_hand_man':'\ud83d\ude4b‍\u2642\ufe0f', + 'ram':'\ud83d\udc0f', + 'ramen':'\ud83c\udf5c', + 'rat':'\ud83d\udc00', + 'record_button':'\u23fa', + 'recycle':'\u267b\ufe0f', + 'red_circle':'\ud83d\udd34', + 'registered':'\u00ae\ufe0f', + 'relaxed':'\u263a\ufe0f', + 'relieved':'\ud83d\ude0c', + 'reminder_ribbon':'\ud83c\udf97', + 'repeat':'\ud83d\udd01', + 'repeat_one':'\ud83d\udd02', + 'rescue_worker_helmet':'\u26d1', + 'restroom':'\ud83d\udebb', + 'revolving_hearts':'\ud83d\udc9e', + 'rewind':'\u23ea', + 'rhinoceros':'\ud83e\udd8f', + 'ribbon':'\ud83c\udf80', + 'rice':'\ud83c\udf5a', + 'rice_ball':'\ud83c\udf59', + 'rice_cracker':'\ud83c\udf58', + 'rice_scene':'\ud83c\udf91', + 'right_anger_bubble':'\ud83d\uddef', + 'ring':'\ud83d\udc8d', + 'robot':'\ud83e\udd16', + 'rocket':'\ud83d\ude80', + 'rofl':'\ud83e\udd23', + 'roll_eyes':'\ud83d\ude44', + 'roller_coaster':'\ud83c\udfa2', + 'rooster':'\ud83d\udc13', + 'rose':'\ud83c\udf39', + 'rosette':'\ud83c\udff5', + 'rotating_light':'\ud83d\udea8', + 'round_pushpin':'\ud83d\udccd', + 'rowing_man':'\ud83d\udea3', + 'rowing_woman':'\ud83d\udea3‍\u2640\ufe0f', + 'rugby_football':'\ud83c\udfc9', + 'running_man':'\ud83c\udfc3', + 'running_shirt_with_sash':'\ud83c\udfbd', + 'running_woman':'\ud83c\udfc3‍\u2640\ufe0f', + 'sa':'\ud83c\ude02\ufe0f', + 'sagittarius':'\u2650\ufe0f', + 'sake':'\ud83c\udf76', + 'sandal':'\ud83d\udc61', + 'santa':'\ud83c\udf85', + 'satellite':'\ud83d\udce1', + 'saxophone':'\ud83c\udfb7', + 'school':'\ud83c\udfeb', + 'school_satchel':'\ud83c\udf92', + 'scissors':'\u2702\ufe0f', + 'scorpion':'\ud83e\udd82', + 'scorpius':'\u264f\ufe0f', + 'scream':'\ud83d\ude31', + 'scream_cat':'\ud83d\ude40', + 'scroll':'\ud83d\udcdc', + 'seat':'\ud83d\udcba', + 'secret':'\u3299\ufe0f', + 'see_no_evil':'\ud83d\ude48', + 'seedling':'\ud83c\udf31', + 'selfie':'\ud83e\udd33', + 'shallow_pan_of_food':'\ud83e\udd58', + 'shamrock':'\u2618\ufe0f', + 'shark':'\ud83e\udd88', + 'shaved_ice':'\ud83c\udf67', + 'sheep':'\ud83d\udc11', + 'shell':'\ud83d\udc1a', + 'shield':'\ud83d\udee1', + 'shinto_shrine':'\u26e9', + 'ship':'\ud83d\udea2', + 'shirt':'\ud83d\udc55', + 'shopping':'\ud83d\udecd', + 'shopping_cart':'\ud83d\uded2', + 'shower':'\ud83d\udebf', + 'shrimp':'\ud83e\udd90', + 'signal_strength':'\ud83d\udcf6', + 'six_pointed_star':'\ud83d\udd2f', + 'ski':'\ud83c\udfbf', + 'skier':'\u26f7', + 'skull':'\ud83d\udc80', + 'skull_and_crossbones':'\u2620\ufe0f', + 'sleeping':'\ud83d\ude34', + 'sleeping_bed':'\ud83d\udecc', + 'sleepy':'\ud83d\ude2a', + 'slightly_frowning_face':'\ud83d\ude41', + 'slightly_smiling_face':'\ud83d\ude42', + 'slot_machine':'\ud83c\udfb0', + 'small_airplane':'\ud83d\udee9', + 'small_blue_diamond':'\ud83d\udd39', + 'small_orange_diamond':'\ud83d\udd38', + 'small_red_triangle':'\ud83d\udd3a', + 'small_red_triangle_down':'\ud83d\udd3b', + 'smile':'\ud83d\ude04', + 'smile_cat':'\ud83d\ude38', + 'smiley':'\ud83d\ude03', + 'smiley_cat':'\ud83d\ude3a', + 'smiling_imp':'\ud83d\ude08', + 'smirk':'\ud83d\ude0f', + 'smirk_cat':'\ud83d\ude3c', + 'smoking':'\ud83d\udeac', + 'snail':'\ud83d\udc0c', + 'snake':'\ud83d\udc0d', + 'sneezing_face':'\ud83e\udd27', + 'snowboarder':'\ud83c\udfc2', + 'snowflake':'\u2744\ufe0f', + 'snowman':'\u26c4\ufe0f', + 'snowman_with_snow':'\u2603\ufe0f', + 'sob':'\ud83d\ude2d', + 'soccer':'\u26bd\ufe0f', + 'soon':'\ud83d\udd1c', + 'sos':'\ud83c\udd98', + 'sound':'\ud83d\udd09', + 'space_invader':'\ud83d\udc7e', + 'spades':'\u2660\ufe0f', + 'spaghetti':'\ud83c\udf5d', + 'sparkle':'\u2747\ufe0f', + 'sparkler':'\ud83c\udf87', + 'sparkles':'\u2728', + 'sparkling_heart':'\ud83d\udc96', + 'speak_no_evil':'\ud83d\ude4a', + 'speaker':'\ud83d\udd08', + 'speaking_head':'\ud83d\udde3', + 'speech_balloon':'\ud83d\udcac', + 'speedboat':'\ud83d\udea4', + 'spider':'\ud83d\udd77', + 'spider_web':'\ud83d\udd78', + 'spiral_calendar':'\ud83d\uddd3', + 'spiral_notepad':'\ud83d\uddd2', + 'spoon':'\ud83e\udd44', + 'squid':'\ud83e\udd91', + 'stadium':'\ud83c\udfdf', + 'star':'\u2b50\ufe0f', + 'star2':'\ud83c\udf1f', + 'star_and_crescent':'\u262a\ufe0f', + 'star_of_david':'\u2721\ufe0f', + 'stars':'\ud83c\udf20', + 'station':'\ud83d\ude89', + 'statue_of_liberty':'\ud83d\uddfd', + 'steam_locomotive':'\ud83d\ude82', + 'stew':'\ud83c\udf72', + 'stop_button':'\u23f9', + 'stop_sign':'\ud83d\uded1', + 'stopwatch':'\u23f1', + 'straight_ruler':'\ud83d\udccf', + 'strawberry':'\ud83c\udf53', + 'stuck_out_tongue':'\ud83d\ude1b', + 'stuck_out_tongue_closed_eyes':'\ud83d\ude1d', + 'stuck_out_tongue_winking_eye':'\ud83d\ude1c', + 'studio_microphone':'\ud83c\udf99', + 'stuffed_flatbread':'\ud83e\udd59', + 'sun_behind_large_cloud':'\ud83c\udf25', + 'sun_behind_rain_cloud':'\ud83c\udf26', + 'sun_behind_small_cloud':'\ud83c\udf24', + 'sun_with_face':'\ud83c\udf1e', + 'sunflower':'\ud83c\udf3b', + 'sunglasses':'\ud83d\ude0e', + 'sunny':'\u2600\ufe0f', + 'sunrise':'\ud83c\udf05', + 'sunrise_over_mountains':'\ud83c\udf04', + 'surfing_man':'\ud83c\udfc4', + 'surfing_woman':'\ud83c\udfc4‍\u2640\ufe0f', + 'sushi':'\ud83c\udf63', + 'suspension_railway':'\ud83d\ude9f', + 'sweat':'\ud83d\ude13', + 'sweat_drops':'\ud83d\udca6', + 'sweat_smile':'\ud83d\ude05', + 'sweet_potato':'\ud83c\udf60', + 'swimming_man':'\ud83c\udfca', + 'swimming_woman':'\ud83c\udfca‍\u2640\ufe0f', + 'symbols':'\ud83d\udd23', + 'synagogue':'\ud83d\udd4d', + 'syringe':'\ud83d\udc89', + 'taco':'\ud83c\udf2e', + 'tada':'\ud83c\udf89', + 'tanabata_tree':'\ud83c\udf8b', + 'taurus':'\u2649\ufe0f', + 'taxi':'\ud83d\ude95', + 'tea':'\ud83c\udf75', + 'telephone_receiver':'\ud83d\udcde', + 'telescope':'\ud83d\udd2d', + 'tennis':'\ud83c\udfbe', + 'tent':'\u26fa\ufe0f', + 'thermometer':'\ud83c\udf21', + 'thinking':'\ud83e\udd14', + 'thought_balloon':'\ud83d\udcad', + 'ticket':'\ud83c\udfab', + 'tickets':'\ud83c\udf9f', + 'tiger':'\ud83d\udc2f', + 'tiger2':'\ud83d\udc05', + 'timer_clock':'\u23f2', + 'tipping_hand_man':'\ud83d\udc81‍\u2642\ufe0f', + 'tired_face':'\ud83d\ude2b', + 'tm':'\u2122\ufe0f', + 'toilet':'\ud83d\udebd', + 'tokyo_tower':'\ud83d\uddfc', + 'tomato':'\ud83c\udf45', + 'tongue':'\ud83d\udc45', + 'top':'\ud83d\udd1d', + 'tophat':'\ud83c\udfa9', + 'tornado':'\ud83c\udf2a', + 'trackball':'\ud83d\uddb2', + 'tractor':'\ud83d\ude9c', + 'traffic_light':'\ud83d\udea5', + 'train':'\ud83d\ude8b', + 'train2':'\ud83d\ude86', + 'tram':'\ud83d\ude8a', + 'triangular_flag_on_post':'\ud83d\udea9', + 'triangular_ruler':'\ud83d\udcd0', + 'trident':'\ud83d\udd31', + 'triumph':'\ud83d\ude24', + 'trolleybus':'\ud83d\ude8e', + 'trophy':'\ud83c\udfc6', + 'tropical_drink':'\ud83c\udf79', + 'tropical_fish':'\ud83d\udc20', + 'truck':'\ud83d\ude9a', + 'trumpet':'\ud83c\udfba', + 'tulip':'\ud83c\udf37', + 'tumbler_glass':'\ud83e\udd43', + 'turkey':'\ud83e\udd83', + 'turtle':'\ud83d\udc22', + 'tv':'\ud83d\udcfa', + 'twisted_rightwards_arrows':'\ud83d\udd00', + 'two_hearts':'\ud83d\udc95', + 'two_men_holding_hands':'\ud83d\udc6c', + 'two_women_holding_hands':'\ud83d\udc6d', + 'u5272':'\ud83c\ude39', + 'u5408':'\ud83c\ude34', + 'u55b6':'\ud83c\ude3a', + 'u6307':'\ud83c\ude2f\ufe0f', + 'u6708':'\ud83c\ude37\ufe0f', + 'u6709':'\ud83c\ude36', + 'u6e80':'\ud83c\ude35', + 'u7121':'\ud83c\ude1a\ufe0f', + 'u7533':'\ud83c\ude38', + 'u7981':'\ud83c\ude32', + 'u7a7a':'\ud83c\ude33', + 'umbrella':'\u2614\ufe0f', + 'unamused':'\ud83d\ude12', + 'underage':'\ud83d\udd1e', + 'unicorn':'\ud83e\udd84', + 'unlock':'\ud83d\udd13', + 'up':'\ud83c\udd99', + 'upside_down_face':'\ud83d\ude43', + 'v':'\u270c\ufe0f', + 'vertical_traffic_light':'\ud83d\udea6', + 'vhs':'\ud83d\udcfc', + 'vibration_mode':'\ud83d\udcf3', + 'video_camera':'\ud83d\udcf9', + 'video_game':'\ud83c\udfae', + 'violin':'\ud83c\udfbb', + 'virgo':'\u264d\ufe0f', + 'volcano':'\ud83c\udf0b', + 'volleyball':'\ud83c\udfd0', + 'vs':'\ud83c\udd9a', + 'vulcan_salute':'\ud83d\udd96', + 'walking_man':'\ud83d\udeb6', + 'walking_woman':'\ud83d\udeb6‍\u2640\ufe0f', + 'waning_crescent_moon':'\ud83c\udf18', + 'waning_gibbous_moon':'\ud83c\udf16', + 'warning':'\u26a0\ufe0f', + 'wastebasket':'\ud83d\uddd1', + 'watch':'\u231a\ufe0f', + 'water_buffalo':'\ud83d\udc03', + 'watermelon':'\ud83c\udf49', + 'wave':'\ud83d\udc4b', + 'wavy_dash':'\u3030\ufe0f', + 'waxing_crescent_moon':'\ud83c\udf12', + 'wc':'\ud83d\udebe', + 'weary':'\ud83d\ude29', + 'wedding':'\ud83d\udc92', + 'weight_lifting_man':'\ud83c\udfcb\ufe0f', + 'weight_lifting_woman':'\ud83c\udfcb\ufe0f‍\u2640\ufe0f', + 'whale':'\ud83d\udc33', + 'whale2':'\ud83d\udc0b', + 'wheel_of_dharma':'\u2638\ufe0f', + 'wheelchair':'\u267f\ufe0f', + 'white_check_mark':'\u2705', + 'white_circle':'\u26aa\ufe0f', + 'white_flag':'\ud83c\udff3\ufe0f', + 'white_flower':'\ud83d\udcae', + 'white_large_square':'\u2b1c\ufe0f', + 'white_medium_small_square':'\u25fd\ufe0f', + 'white_medium_square':'\u25fb\ufe0f', + 'white_small_square':'\u25ab\ufe0f', + 'white_square_button':'\ud83d\udd33', + 'wilted_flower':'\ud83e\udd40', + 'wind_chime':'\ud83c\udf90', + 'wind_face':'\ud83c\udf2c', + 'wine_glass':'\ud83c\udf77', + 'wink':'\ud83d\ude09', + 'wolf':'\ud83d\udc3a', + 'woman':'\ud83d\udc69', + 'woman_artist':'\ud83d\udc69‍\ud83c\udfa8', + 'woman_astronaut':'\ud83d\udc69‍\ud83d\ude80', + 'woman_cartwheeling':'\ud83e\udd38‍\u2640\ufe0f', + 'woman_cook':'\ud83d\udc69‍\ud83c\udf73', + 'woman_facepalming':'\ud83e\udd26‍\u2640\ufe0f', + 'woman_factory_worker':'\ud83d\udc69‍\ud83c\udfed', + 'woman_farmer':'\ud83d\udc69‍\ud83c\udf3e', + 'woman_firefighter':'\ud83d\udc69‍\ud83d\ude92', + 'woman_health_worker':'\ud83d\udc69‍\u2695\ufe0f', + 'woman_judge':'\ud83d\udc69‍\u2696\ufe0f', + 'woman_juggling':'\ud83e\udd39‍\u2640\ufe0f', + 'woman_mechanic':'\ud83d\udc69‍\ud83d\udd27', + 'woman_office_worker':'\ud83d\udc69‍\ud83d\udcbc', + 'woman_pilot':'\ud83d\udc69‍\u2708\ufe0f', + 'woman_playing_handball':'\ud83e\udd3e‍\u2640\ufe0f', + 'woman_playing_water_polo':'\ud83e\udd3d‍\u2640\ufe0f', + 'woman_scientist':'\ud83d\udc69‍\ud83d\udd2c', + 'woman_shrugging':'\ud83e\udd37‍\u2640\ufe0f', + 'woman_singer':'\ud83d\udc69‍\ud83c\udfa4', + 'woman_student':'\ud83d\udc69‍\ud83c\udf93', + 'woman_teacher':'\ud83d\udc69‍\ud83c\udfeb', + 'woman_technologist':'\ud83d\udc69‍\ud83d\udcbb', + 'woman_with_turban':'\ud83d\udc73‍\u2640\ufe0f', + 'womans_clothes':'\ud83d\udc5a', + 'womans_hat':'\ud83d\udc52', + 'women_wrestling':'\ud83e\udd3c‍\u2640\ufe0f', + 'womens':'\ud83d\udeba', + 'world_map':'\ud83d\uddfa', + 'worried':'\ud83d\ude1f', + 'wrench':'\ud83d\udd27', + 'writing_hand':'\u270d\ufe0f', + 'x':'\u274c', + 'yellow_heart':'\ud83d\udc9b', + 'yen':'\ud83d\udcb4', + 'yin_yang':'\u262f\ufe0f', + 'yum':'\ud83d\ude0b', + 'zap':'\u26a1\ufe0f', + 'zipper_mouth_face':'\ud83e\udd10', + 'zzz':'\ud83d\udca4', + + /* special emojis :P */ + 'octocat': '', + 'showdown': '' +}; + +/** + * These are all the transformations that form block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('makehtml.blockGamut', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.blockGamut.before', text, options, globals).getText(); + + // we parse blockquotes first so that we can have headings and hrs + // inside blockquotes + text = showdown.subParser('makehtml.blockQuotes')(text, options, globals); + text = showdown.subParser('makehtml.headers')(text, options, globals); + + // Do Horizontal Rules: + text = showdown.subParser('makehtml.horizontalRule')(text, options, globals); + + text = showdown.subParser('makehtml.lists')(text, options, globals); + text = showdown.subParser('makehtml.codeBlocks')(text, options, globals); + text = showdown.subParser('makehtml.tables')(text, options, globals); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

tags around block-level tags. + text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('makehtml.paragraphs')(text, options, globals); + + text = globals.converter._dispatch('makehtml.blockGamut.after', text, options, globals).getText(); + + return text; +}); + +showdown.subParser('makehtml.blockQuotes', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.blockQuotes.before', text, options, globals).getText(); + + // add a couple extra lines after the text and endtext mark + text = text + '\n\n'; + + var rgx = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm; + + if (options.splitAdjacentBlockquotes) { + rgx = /^ {0,3}>[\s\S]*?(?:\n\n)/gm; + } + + text = text.replace(rgx, function (bq) { + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + bq = bq.replace(/^[ \t]*>[ \t]?/gm, ''); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/¨0/g, ''); + + bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines + bq = showdown.subParser('makehtml.githubCodeBlocks')(bq, options, globals); + bq = showdown.subParser('makehtml.blockGamut')(bq, options, globals); // recurse + + bq = bq.replace(/(^|\n)/g, '$1 '); + // These leading spaces screw with

 content, so we need to fix that:
+    bq = bq.replace(/(\s*
[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
+      var pre = m1;
+      // attacklab: hack around Konqueror 3.5.4 bug:
+      pre = pre.replace(/^  /mg, '¨0');
+      pre = pre.replace(/¨0/g, '');
+      return pre;
+    });
+
+    return showdown.subParser('makehtml.hashBlock')('
\n' + bq + '\n
', options, globals); + }); + + text = globals.converter._dispatch('makehtml.blockQuotes.after', text, options, globals).getText(); + return text; +}); + +/** + * Process Markdown `
` blocks.
+ */
+showdown.subParser('makehtml.codeBlocks', function (text, options, globals) {
+  'use strict';
+
+  text = globals.converter._dispatch('makehtml.codeBlocks.before', text, options, globals).getText();
+
+  // sentinel workarounds for lack of \A and \Z, safari\khtml bug
+  text += '¨0';
+
+  var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g;
+  text = text.replace(pattern, function (wholeMatch, m1, m2) {
+    var codeblock = m1,
+        nextChar = m2,
+        end = '\n';
+
+    codeblock = showdown.subParser('makehtml.outdent')(codeblock, options, globals);
+    codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);
+    codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);
+    codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+    codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines
+
+    if (options.omitExtraWLInCodeBlocks) {
+      end = '';
+    }
+
+    codeblock = '
' + codeblock + end + '
'; + + return showdown.subParser('makehtml.hashBlock')(codeblock, options, globals) + nextChar; + }); + + // strip sentinel + text = text.replace(/¨0/, ''); + + text = globals.converter._dispatch('makehtml.codeBlocks.after', text, options, globals).getText(); + return text; +}); + +/** + * + * * Backtick quotes are used for spans. + * + * * You can use multiple backticks as the delimiters if you want to + * include literal backticks in the code span. So, this input: + * + * Just type ``foo `bar` baz`` at the prompt. + * + * Will translate to: + * + *

Just type foo `bar` baz at the prompt.

+ * + * There's no arbitrary limit to the number of backticks you + * can use as delimters. If you need three consecutive backticks + * in your code, use four for delimiters, etc. + * + * * You can use spaces to get literal backticks at the edges: + * + * ... type `` `bar` `` ... + * + * Turns to: + * + * ... type `bar` ... + */ +showdown.subParser('makehtml.codeSpans', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.codeSpans.before', text, options, globals).getText(); + + if (typeof(text) === 'undefined') { + text = ''; + } + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function (wholeMatch, m1, m2, m3) { + var c = m3; + c = c.replace(/^([ \t]*)/g, ''); // leading whitespace + c = c.replace(/[ \t]*$/g, ''); // trailing whitespace + c = showdown.subParser('makehtml.encodeCode')(c, options, globals); + c = m1 + '' + c + ''; + c = showdown.subParser('makehtml.hashHTMLSpans')(c, options, globals); + return c; + } + ); + + text = globals.converter._dispatch('makehtml.codeSpans.after', text, options, globals).getText(); + return text; +}); + +/** + * Create a full HTML document from the processed markdown + */ +showdown.subParser('makehtml.completeHTMLDocument', function (text, options, globals) { + 'use strict'; + + if (!options.completeHTMLDocument) { + return text; + } + + text = globals.converter._dispatch('makehtml.completeHTMLDocument.before', text, options, globals).getText(); + + var doctype = 'html', + doctypeParsed = '\n', + title = '', + charset = '\n', + lang = '', + metadata = ''; + + if (typeof globals.metadata.parsed.doctype !== 'undefined') { + doctypeParsed = '\n'; + doctype = globals.metadata.parsed.doctype.toString().toLowerCase(); + if (doctype === 'html' || doctype === 'html5') { + charset = ''; + } + } + + for (var meta in globals.metadata.parsed) { + if (globals.metadata.parsed.hasOwnProperty(meta)) { + switch (meta.toLowerCase()) { + case 'doctype': + break; + + case 'title': + title = '' + globals.metadata.parsed.title + '\n'; + break; + + case 'charset': + if (doctype === 'html' || doctype === 'html5') { + charset = '\n'; + } else { + charset = '\n'; + } + break; + + case 'language': + case 'lang': + lang = ' lang="' + globals.metadata.parsed[meta] + '"'; + metadata += '\n'; + break; + + default: + metadata += '\n'; + } + } + } + + text = doctypeParsed + '\n\n' + title + charset + metadata + '\n\n' + text.trim() + '\n\n'; + + text = globals.converter._dispatch('makehtml.completeHTMLDocument.after', text, options, globals).getText(); + return text; +}); + +/** + * Convert all tabs to spaces + */ +showdown.subParser('makehtml.detab', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.detab.before', text, options, globals).getText(); + + // expand first n-1 tabs + text = text.replace(/\t(?=\t)/g, ' '); // g_tab_width + + // replace the nth with two sentinels + text = text.replace(/\t/g, '¨A¨B'); + + // use the sentinel to anchor our regex so it doesn't explode + text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) { + var leadingText = m1, + numSpaces = 4 - leadingText.length % 4; // g_tab_width + + // there *must* be a better way to do this: + for (var i = 0; i < numSpaces; i++) { + leadingText += ' '; + } + + return leadingText; + }); + + // clean up sentinels + text = text.replace(/¨A/g, ' '); // g_tab_width + text = text.replace(/¨B/g, ''); + + text = globals.converter._dispatch('makehtml.detab.after', text, options, globals).getText(); + return text; +}); + +showdown.subParser('makehtml.ellipsis', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.ellipsis.before', text, options, globals).getText(); + + text = text.replace(/\.\.\./g, '…'); + + text = globals.converter._dispatch('makehtml.ellipsis.after', text, options, globals).getText(); + + return text; +}); + +/** + * These are all the transformations that occur *within* block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('makehtml.emoji', function (text, options, globals) { + 'use strict'; + + if (!options.emoji) { + return text; + } + + text = globals.converter._dispatch('makehtml.emoji.before', text, options, globals).getText(); + + var emojiRgx = /:([\S]+?):/g; + + text = text.replace(emojiRgx, function (wm, emojiCode) { + if (showdown.helper.emojis.hasOwnProperty(emojiCode)) { + return showdown.helper.emojis[emojiCode]; + } + return wm; + }); + + text = globals.converter._dispatch('makehtml.emoji.after', text, options, globals).getText(); + + return text; +}); + +/** + * Smart processing for ampersands and angle brackets that need to be encoded. + */ +showdown.subParser('makehtml.encodeAmpsAndAngles', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.before', text, options, globals).getText(); + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&'); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?$!])/gi, '<'); + + // Encode < + text = text.replace(/ + text = text.replace(/>/g, '>'); + + text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.after', text, options, globals).getText(); + return text; +}); + +/** + * Returns the string, with after processing the following backslash escape sequences. + * + * attacklab: The polite way to do this is with the new escapeCharacters() function: + * + * text = escapeCharacters(text,"\\",true); + * text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + * + * ...but we're sidestepping its use of the (slow) RegExp constructor + * as an optimization for Firefox. This function gets called a LOT. + */ +showdown.subParser('makehtml.encodeBackslashEscapes', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.before', text, options, globals).getText(); + + text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback); + text = text.replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback); + + text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.after', text, options, globals).getText(); + return text; +}); + +/** + * Encode/escape certain characters inside Markdown code runs. + * The point is that in code, these characters are literals, + * and lose their special Markdown meanings. + */ +showdown.subParser('makehtml.encodeCode', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.encodeCode.before', text, options, globals).getText(); + + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text + .replace(/&/g, '&') + // Do the angle bracket song and dance: + .replace(//g, '>') + // Now, escape characters that are magic in Markdown: + .replace(/([*_{}\[\]\\=~-])/g, showdown.helper.escapeCharactersCallback); + + text = globals.converter._dispatch('makehtml.encodeCode.after', text, options, globals).getText(); + return text; +}); + +/** + * Within tags -- meaning between < and > -- encode [\ ` * _ ~ =] so they + * don't conflict with their use in Markdown for code, italics and strong. + */ +showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.before', text, options, globals).getText(); + + // Build a regex to find HTML tags. + var tags = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi, + comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi; + + text = text.replace(tags, function (wholeMatch) { + return wholeMatch + .replace(/(.)<\/?code>(?=.)/g, '$1`') + .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback); + }); + + text = text.replace(comments, function (wholeMatch) { + return wholeMatch + .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback); + }); + + text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.after', text, options, globals).getText(); + return text; +}); + +/** + * Handle github codeblocks prior to running HashHTML so that + * HTML contained within the codeblock gets escaped properly + * Example: + * ```ruby + * def hello_world(x) + * puts "Hello, #{x}" + * end + * ``` + */ +showdown.subParser('makehtml.githubCodeBlocks', function (text, options, globals) { + 'use strict'; + + // early exit if option is not enabled + if (!options.ghCodeBlocks) { + return text; + } + + text = globals.converter._dispatch('makehtml.githubCodeBlocks.before', text, options, globals).getText(); + + text += '¨0'; + + text = text.replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g, function (wholeMatch, delim, language, codeblock) { + var end = (options.omitExtraWLInCodeBlocks) ? '' : '\n'; + + // First parse the github code block + codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals); + codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals); + codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines + codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace + + codeblock = '
' + codeblock + end + '
'; + + codeblock = showdown.subParser('makehtml.hashBlock')(codeblock, options, globals); + + // Since GHCodeblocks can be false positives, we need to + // store the primitive text and the parsed text in a global var, + // and then return a token + return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n'; + }); + + // attacklab: strip sentinel + text = text.replace(/¨0/, ''); + + return globals.converter._dispatch('makehtml.githubCodeBlocks.after', text, options, globals).getText(); +}); + +showdown.subParser('makehtml.hashBlock', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.hashBlock.before', text, options, globals).getText(); + text = text.replace(/(^\n+|\n+$)/g, ''); + text = '\n\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n'; + text = globals.converter._dispatch('makehtml.hashBlock.after', text, options, globals).getText(); + return text; +}); + +/** + * Hash and escape elements that should not be parsed as markdown + */ +showdown.subParser('makehtml.hashCodeTags', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.hashCodeTags.before', text, options, globals).getText(); + + var repFunc = function (wholeMatch, match, left, right) { + var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right; + return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C'; + }; + + // Hash naked + text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '', 'gim'); + + text = globals.converter._dispatch('makehtml.hashCodeTags.after', text, options, globals).getText(); + return text; +}); + +showdown.subParser('makehtml.hashElement', function (text, options, globals) { + 'use strict'; + + return function (wholeMatch, m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/\n\n/g, '\n'); + blockText = blockText.replace(/^\n/, ''); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g, ''); + + // Replace the element text with a marker ("¨KxK" where x is its key) + blockText = '\n\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n'; + + return blockText; + }; +}); + +showdown.subParser('makehtml.hashHTMLBlocks', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.hashHTMLBlocks.before', text, options, globals).getText(); + + var blockTags = [ + 'pre', + 'div', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'table', + 'dl', + 'ol', + 'ul', + 'script', + 'noscript', + 'form', + 'fieldset', + 'iframe', + 'math', + 'style', + 'section', + 'header', + 'footer', + 'nav', + 'article', + 'aside', + 'address', + 'audio', + 'canvas', + 'figure', + 'hgroup', + 'output', + 'video', + 'p' + ], + repFunc = function (wholeMatch, match, left, right) { + var txt = wholeMatch; + // check if this html element is marked as markdown + // if so, it's contents should be parsed as markdown + if (left.search(/\bmarkdown\b/) !== -1) { + txt = left + globals.converter.makeHtml(match) + right; + } + return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; + }; + + if (options.backslashEscapesHTMLTags) { + // encode backslash escaped HTML tags + text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) { + return '<' + inside + '>'; + }); + } + + // hash HTML Blocks + for (var i = 0; i < blockTags.length; ++i) { + + var opTagPos, + rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'), + patLeft = '<' + blockTags[i] + '\\b[^>]*>', + patRight = ''; + // 1. Look for the first position of the first opening HTML tag in the text + while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) { + + // if the HTML tag is \ escaped, we need to escape it and break + + + //2. Split the text in that position + var subTexts = showdown.helper.splitAtIndex(text, opTagPos), + //3. Match recursively + newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im'); + + // prevent an infinite loop + if (newSubText1 === subTexts[1]) { + break; + } + text = subTexts[0].concat(newSubText1); + } + } + // HR SPECIAL CASE + text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, + showdown.subParser('makehtml.hashElement')(text, options, globals)); + + // Special case for standalone HTML comments + text = showdown.helper.replaceRecursiveRegExp(text, function (txt) { + return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; + }, '^ {0,3}', 'gm'); + + // PHP and ASP-style processor instructions ( and <%...%>) + text = text.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, + showdown.subParser('makehtml.hashElement')(text, options, globals)); + + text = globals.converter._dispatch('makehtml.hashHTMLBlocks.after', text, options, globals).getText(); + return text; +}); + +/** + * Hash span elements that should not be parsed as markdown + */ +showdown.subParser('makehtml.hashHTMLSpans', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.hashHTMLSpans.before', text, options, globals).getText(); + + // Hash Self Closing tags + text = text.replace(/<[^>]+?\/>/gi, function (wm) { + return showdown.helper._hashHTMLSpan(wm, globals); + }); + + // Hash tags without properties + text = text.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g, function (wm) { + return showdown.helper._hashHTMLSpan(wm, globals); + }); + + // Hash tags with properties + text = text.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g, function (wm) { + return showdown.helper._hashHTMLSpan(wm, globals); + }); + + // Hash self closing tags without /> + text = text.replace(/<[^>]+?>/gi, function (wm) { + return showdown.helper._hashHTMLSpan(wm, globals); + }); + + text = globals.converter._dispatch('makehtml.hashHTMLSpans.after', text, options, globals).getText(); + return text; +}); + +/** + * Unhash HTML spans + */ +showdown.subParser('makehtml.unhashHTMLSpans', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.unhashHTMLSpans.before', text, options, globals).getText(); + + for (var i = 0; i < globals.gHtmlSpans.length; ++i) { + var repText = globals.gHtmlSpans[i], + // limiter to prevent infinite loop (assume 10 as limit for recurse) + limit = 0; + + while (/¨C(\d+)C/.test(repText)) { + var num = RegExp.$1; + repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]); + if (limit === 10) { + console.error('maximum nesting of 10 spans reached!!!'); + break; + } + ++limit; + } + text = text.replace('¨C' + i + 'C', repText); + } + + text = globals.converter._dispatch('makehtml.unhashHTMLSpans.after', text, options, globals).getText(); + return text; +}); + +/** + * Hash and escape
 elements that should not be parsed as markdown
+ */
+showdown.subParser('makehtml.hashPreCodeTags', function (text, options, globals) {
+  'use strict';
+  text = globals.converter._dispatch('makehtml.hashPreCodeTags.before', text, options, globals).getText();
+
+  var repFunc = function (wholeMatch, match, left, right) {
+    // encode html entities
+    var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;
+    return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
+  };
+
+  // Hash 

+  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\s*]*>', '^ {0,3}\\s*
', 'gim'); + + text = globals.converter._dispatch('makehtml.hashPreCodeTags.after', text, options, globals).getText(); + return text; +}); + +showdown.subParser('makehtml.headers', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.headers.before', text, options, globals).getText(); + + var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart), + + // Set text-style headers: + // Header 1 + // ======== + // + // Header 2 + // -------- + // + setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm, + setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm; + + text = text.replace(setextRegexH1, function (wholeMatch, m1) { + + var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', + hLevel = headerLevelStart, + hashBlock = '' + spanGamut + ''; + return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals); + }); + + text = text.replace(setextRegexH2, function (matchFound, m1) { + var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', + hLevel = headerLevelStart + 1, + hashBlock = '' + spanGamut + ''; + return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals); + }); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm; + + text = text.replace(atxStyle, function (wholeMatch, m1, m2) { + var hText = m2; + if (options.customizedHeaderId) { + hText = m2.replace(/\s?\{([^{]+?)}\s*$/, ''); + } + + var span = showdown.subParser('makehtml.spanGamut')(hText, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"', + hLevel = headerLevelStart - 1 + m1.length, + header = '' + span + ''; + + return showdown.subParser('makehtml.hashBlock')(header, options, globals); + }); + + function headerId (m) { + var title, + prefix; + + // It is separate from other options to allow combining prefix and customized + if (options.customizedHeaderId) { + var match = m.match(/\{([^{]+?)}\s*$/); + if (match && match[1]) { + m = match[1]; + } + } + + title = m; + + // Prefix id to prevent causing inadvertent pre-existing style matches. + if (showdown.helper.isString(options.prefixHeaderId)) { + prefix = options.prefixHeaderId; + } else if (options.prefixHeaderId === true) { + prefix = 'section-'; + } else { + prefix = ''; + } + + if (!options.rawPrefixHeaderId) { + title = prefix + title; + } + + if (options.ghCompatibleHeaderId) { + title = title + .replace(/ /g, '-') + // replace previously escaped chars (&, ¨ and $) + .replace(/&/g, '') + .replace(/¨T/g, '') + .replace(/¨D/g, '') + // replace rest of the chars (&~$ are repeated as they might have been escaped) + // borrowed from github's redcarpet (some they should produce similar results) + .replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, '') + .toLowerCase(); + } else if (options.rawHeaderId) { + title = title + .replace(/ /g, '-') + // replace previously escaped chars (&, ¨ and $) + .replace(/&/g, '&') + .replace(/¨T/g, '¨') + .replace(/¨D/g, '$') + // replace " and ' + .replace(/["']/g, '-') + .toLowerCase(); + } else { + title = title + .replace(/[^\w]/g, '') + .toLowerCase(); + } + + if (options.rawPrefixHeaderId) { + title = prefix + title; + } + + if (globals.hashLinkCounts[title]) { + title = title + '-' + (globals.hashLinkCounts[title]++); + } else { + globals.hashLinkCounts[title] = 1; + } + return title; + } + + text = globals.converter._dispatch('makehtml.headers.after', text, options, globals).getText(); + return text; +}); + +/** + * Turn Markdown horizontal rule shortcuts into
tags. + * + * Any 3 or more unindented consecutive hyphens, asterisks or underscores with or without a space beetween them + * in a single line is considered a horizontal rule + */ +showdown.subParser('makehtml.horizontalRule', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.horizontalRule.before', text, options, globals).getText(); + + var key = showdown.subParser('makehtml.hashBlock')('
', options, globals); + text = text.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm, key); + text = text.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm, key); + text = text.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm, key); + + text = globals.converter._dispatch('makehtml.horizontalRule.after', text, options, globals).getText(); + return text; +}); + +/** + * Turn Markdown image shortcuts into tags. + */ +showdown.subParser('makehtml.images', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.images.before', text, options, globals).getText(); + + var inlineRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, + crazyRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g, + base64RegExp = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, + referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g, + refShortcutRegExp = /!\[([^\[\]]+)]()()()()()/g; + + function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) { + url = url.replace(/\s/g, ''); + return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title); + } + + function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) { + + var gUrls = globals.gUrls, + gTitles = globals.gTitles, + gDims = globals.gDimensions; + + linkId = linkId.toLowerCase(); + + if (!title) { + title = ''; + } + // Special case for explicit empty url + if (wholeMatch.search(/\(? ?(['"].*['"])?\)$/m) > -1) { + url = ''; + + } else if (url === '' || url === null) { + if (linkId === '' || linkId === null) { + // lower-case and turn embedded newlines into spaces + linkId = altText.toLowerCase().replace(/ ?\n/g, ' '); + } + url = '#' + linkId; + + if (!showdown.helper.isUndefined(gUrls[linkId])) { + url = gUrls[linkId]; + if (!showdown.helper.isUndefined(gTitles[linkId])) { + title = gTitles[linkId]; + } + if (!showdown.helper.isUndefined(gDims[linkId])) { + width = gDims[linkId].width; + height = gDims[linkId].height; + } + } else { + return wholeMatch; + } + } + + altText = altText + .replace(/"/g, '"') + //altText = showdown.helper.escapeCharacters(altText, '*_', false); + .replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback); + //url = showdown.helper.escapeCharacters(url, '*_', false); + url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback); + var result = '' + altText + 'x "optional title") + + // base64 encoded images + text = text.replace(base64RegExp, writeImageTagBase64); + + // cases with crazy urls like ./image/cat1).png + text = text.replace(crazyRegExp, writeImageTag); + + // normal cases + text = text.replace(inlineRegExp, writeImageTag); + + // handle reference-style shortcuts: ![img text] + text = text.replace(refShortcutRegExp, writeImageTag); + + text = globals.converter._dispatch('makehtml.images.after', text, options, globals).getText(); + return text; +}); + +showdown.subParser('makehtml.italicsAndBold', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.italicsAndBold.before', text, options, globals).getText(); + + // it's faster to have 3 separate regexes for each case than have just one + // because of backtracing, in some cases, it could lead to an exponential effect + // called "catastrophic backtrace". Ominous! + + function parseInside (txt, left, right) { + return left + txt + right; + } + + // Parse underscores + if (options.literalMidWordUnderscores) { + text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) { + return parseInside (txt, '', ''); + }); + text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) { + return parseInside (txt, '', ''); + }); + text = text.replace(/\b_(\S[\s\S]*?)_\b/g, function (wm, txt) { + return parseInside (txt, '', ''); + }); + } else { + text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) { + // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it) + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + } + + // Now parse asterisks + /* + if (options.literalMidWordAsterisks) { + text = text.replace(/([^*]|^)\B\*\*\*(\S[\s\S]+?)\*\*\*\B(?!\*)/g, function (wm, lead, txt) { + return parseInside (txt, lead + '', ''); + }); + text = text.replace(/([^*]|^)\B\*\*(\S[\s\S]+?)\*\*\B(?!\*)/g, function (wm, lead, txt) { + return parseInside (txt, lead + '', ''); + }); + text = text.replace(/([^*]|^)\B\*(\S[\s\S]+?)\*\B(?!\*)/g, function (wm, lead, txt) { + return parseInside (txt, lead + '', ''); + }); + } else { + */ + text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) { + // !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it) + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + //} + + text = globals.converter._dispatch('makehtml.italicsAndBold.after', text, options, globals).getText(); + return text; +}); + +//// +// makehtml/links.js +// Copyright (c) 2018 ShowdownJS +// +// Transforms MD links into `` html anchors +// +// A link contains link text (the visible text), a link destination (the URI that is the link destination), and +// optionally a link title. There are two basic kinds of links in Markdown. +// In inline links the destination and title are given immediately after the link text. +// In reference links the destination and title are defined elsewhere in the document. +// +// ***Author:*** +// - Estevão Soares dos Santos (Tivie) +//// + +(function () { + /** + * Helper function: Wrapper function to pass as second replace parameter + * + * @param {RegExp} rgx + * @param {string} evtRootName + * @param {{}} options + * @param {{}} globals + * @returns {Function} + */ + function replaceAnchorTag (rgx, evtRootName, options, globals, emptyCase) { + emptyCase = !!emptyCase; + return function (wholeMatch, text, id, url, m5, m6, title) { + // bail we we find 2 newlines somewhere + if (/\n\n/.test(wholeMatch)) { + return wholeMatch; + } + + var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals); + return writeAnchorTag(evt, options, globals, emptyCase); + }; + } + + /** + * TODO Normalize this + * Helper function: Create a capture event + * @param {RegExp} rgx + * @param {String} evtName Event name + * @param {String} wholeMatch + * @param {String} text + * @param {String} id + * @param {String} url + * @param {String} title + * @param {{}} options + * @param {{}} globals + * @returns {showdown.helper.Event|*} + */ + function createEvent (rgx, evtName, wholeMatch, text, id, url, title, options, globals) { + return globals.converter._dispatch(evtName, wholeMatch, options, globals, { + regexp: rgx, + matches: { + wholeMatch: wholeMatch, + text: text, + id: id, + url: url, + title: title + } + }); + } + + /** + * Helper Function: Normalize and write an anchor tag based on passed parameters + * @param evt + * @param options + * @param globals + * @param {boolean} emptyCase + * @returns {string} + */ + function writeAnchorTag (evt, options, globals, emptyCase) { + + var wholeMatch = evt.getMatches().wholeMatch; + var text = evt.getMatches().text; + var id = evt.getMatches().id; + var url = evt.getMatches().url; + var title = evt.getMatches().title; + var target = ''; + + if (!title) { + title = ''; + } + id = (id) ? id.toLowerCase() : ''; + + if (emptyCase) { + url = ''; + } else if (!url) { + if (!id) { + // lower-case and turn embedded newlines into spaces + id = text.toLowerCase().replace(/ ?\n/g, ' '); + } + url = '#' + id; + + if (!showdown.helper.isUndefined(globals.gUrls[id])) { + url = globals.gUrls[id]; + if (!showdown.helper.isUndefined(globals.gTitles[id])) { + title = globals.gTitles[id]; + } + } else { + return wholeMatch; + } + } + //url = showdown.helper.escapeCharacters(url, '*_:~', false); // replaced line to improve performance + url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback); + + if (title !== '' && title !== null) { + title = title.replace(/"/g, '"'); + //title = showdown.helper.escapeCharacters(title, '*_', false); // replaced line to improve performance + title = title.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback); + title = ' title="' + title + '"'; + } + + // optionLinksInNewWindow only applies + // to external links. Hash links (#) open in same page + if (options.openLinksInNewWindow && !/^#/.test(url)) { + // escaped _ + target = ' target="¨E95Eblank"'; + } + + // Text can be a markdown element, so we run through the appropriate parsers + text = showdown.subParser('makehtml.codeSpans')(text, options, globals); + text = showdown.subParser('makehtml.emoji')(text, options, globals); + text = showdown.subParser('makehtml.underline')(text, options, globals); + text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals); + text = showdown.subParser('makehtml.strikethrough')(text, options, globals); + text = showdown.subParser('makehtml.ellipsis')(text, options, globals); + text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals); + + //evt = createEvent(rgx, evtRootName + '.captureEnd', wholeMatch, text, id, url, title, options, globals); + + var result = '' + text + ''; + + //evt = createEvent(rgx, evtRootName + '.beforeHash', wholeMatch, text, id, url, title, options, globals); + + result = showdown.subParser('makehtml.hashHTMLSpans')(result, options, globals); + + return result; + } + + var evtRootName = 'makehtml.links'; + + /** + * Turn Markdown link shortcuts into XHTML tags. + */ + showdown.subParser('makehtml.links', function (text, options, globals) { + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + // 1. Handle reference-style links: [link text] [id] + text = showdown.subParser('makehtml.links.reference')(text, options, globals); + + // 2. Handle inline-style links: [link text](url "optional title") + text = showdown.subParser('makehtml.links.inline')(text, options, globals); + + // 3. Handle reference-style shortcuts: [link text] + // These must come last in case there's a [link text][1] or [link text](/foo) + text = showdown.subParser('makehtml.links.referenceShortcut')(text, options, globals); + + // 4. Handle angle brackets links -> `` + // Must come after links, because you can use < and > delimiters in inline links like [this](). + text = showdown.subParser('makehtml.links.angleBrackets')(text, options, globals); + + // 5. Handle GithubMentions (if option is enabled) + text = showdown.subParser('makehtml.links.ghMentions')(text, options, globals); + + // 6. Handle tags and img tags + text = text.replace(/]*>[\s\S]*<\/a>/g, function (wholeMatch) { + return showdown.helper._hashHTMLSpan(wholeMatch, globals); + }); + + text = text.replace(/]*\/?>/g, function (wholeMatch) { + return showdown.helper._hashHTMLSpan(wholeMatch, globals); + }); + + // 7. Handle naked links (if option is enabled) + text = showdown.subParser('makehtml.links.naked')(text, options, globals); + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + return text; + }); + + /** + * TODO WRITE THIS DOCUMENTATION + */ + showdown.subParser('makehtml.links.inline', function (text, options, globals) { + var evtRootName = evtRootName + '.inline'; + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + // 1. Look for empty cases: []() and [empty]() and []("title") + var rgxEmpty = /\[(.*?)]()()()()\(? ?(?:["'](.*)["'])?\)/g; + text = text.replace(rgxEmpty, replaceAnchorTag(rgxEmpty, evtRootName, options, globals, true)); + + // 2. Look for cases with crazy urls like ./image/cat1).png + var rgxCrazy = /\[((?:\[[^\]]*]|[^\[\]])*)]()\s?\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g; + text = text.replace(rgxCrazy, replaceAnchorTag(rgxCrazy, evtRootName, options, globals)); + + // 3. inline links with no title or titles wrapped in ' or ": + // [text](url.com) || [text]() || [text](url.com "title") || [text]( "title") + //var rgx2 = /\[[ ]*[\s]?[ ]*([^\n\[\]]*?)[ ]*[\s]?[ ]*] ?()\(?(?:[ ]*[\n]?[ ]*()(['"])(.*?)\5)?[ ]*[\s]?[ ]*\)/; // this regex is too slow!!! + var rgx2 = /\[([\S ]*?)]\s?()\( *?\s*(?:()(['"])(.*?)\5)? *\)/g; + text = text.replace(rgx2, replaceAnchorTag(rgx2, evtRootName, options, globals)); + + // 4. inline links with titles wrapped in (): [foo](bar.com (title)) + var rgx3 = /\[([\S ]*?)]\s?()\( *?\s+()()\((.*?)\) *\)/g; + text = text.replace(rgx3, replaceAnchorTag(rgx3, evtRootName, options, globals)); + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + + return text; + }); + + /** + * TODO WRITE THIS DOCUMENTATION + */ + showdown.subParser('makehtml.links.reference', function (text, options, globals) { + var evtRootName = evtRootName + '.reference'; + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + var rgx = /\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g; + text = text.replace(rgx, replaceAnchorTag(rgx, evtRootName, options, globals)); + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + + return text; + }); + + /** + * TODO WRITE THIS DOCUMENTATION + */ + showdown.subParser('makehtml.links.referenceShortcut', function (text, options, globals) { + var evtRootName = evtRootName + '.referenceShortcut'; + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + var rgx = /\[([^\[\]]+)]()()()()()/g; + text = text.replace(rgx, replaceAnchorTag(rgx, evtRootName, options, globals)); + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + + return text; + }); + + /** + * TODO WRITE THIS DOCUMENTATION + */ + showdown.subParser('makehtml.links.ghMentions', function (text, options, globals) { + var evtRootName = evtRootName + 'ghMentions'; + + if (!options.ghMentions) { + return text; + } + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + var rgx = /(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d._-]+?[a-z\d]+)*))/gi; + + text = text.replace(rgx, function (wholeMatch, st, escape, mentions, username) { + // bail if the mentions was escaped + if (escape === '\\') { + return st + mentions; + } + + // check if options.ghMentionsLink is a string + // TODO Validation should be done at initialization not at runtime + if (!showdown.helper.isString(options.ghMentionsLink)) { + throw new Error('ghMentionsLink option must be a string'); + } + var url = options.ghMentionsLink.replace(/{u}/g, username); + var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, mentions, null, url, null, options, globals); + // captureEnd Event is triggered inside writeAnchorTag function + return st + writeAnchorTag(evt, options, globals); + }); + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + + return text; + }); + + /** + * TODO WRITE THIS DOCUMENTATION + */ + showdown.subParser('makehtml.links.angleBrackets', function (text, options, globals) { + var evtRootName = 'makehtml.links.angleBrackets'; + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + // 1. Parse links first + var urlRgx = /<(((?:https?|ftp):\/\/|www\.)[^'">\s]+)>/gi; + text = text.replace(urlRgx, function (wholeMatch, url, urlStart) { + var text = url; + url = (urlStart === 'www.') ? 'http://' + url : url; + var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals); + return writeAnchorTag(evt, options, globals); + }); + + // 2. Then Mail Addresses + var mailRgx = /<(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi; + text = text.replace(mailRgx, function (wholeMatch, mail) { + var url = 'mailto:'; + mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals); + if (options.encodeEmails) { + url = showdown.helper.encodeEmailAddress(url + mail); + mail = showdown.helper.encodeEmailAddress(mail); + } else { + url = url + mail; + } + var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals); + return writeAnchorTag(evt, options, globals); + }); + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + return text; + }); + + /** + * TODO MAKE THIS WORK (IT'S NOT ACTIVATED) + * TODO WRITE THIS DOCUMENTATION + */ + showdown.subParser('makehtml.links.naked', function (text, options, globals) { + if (!options.simplifiedAutoLink) { + return text; + } + + var evtRootName = 'makehtml.links.naked'; + + text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText(); + + // 2. Now we check for + // we also include leading markdown magic chars [_*~] for cases like __https://www.google.com/foobar__ + var urlRgx = /([_*~]*?)(((?:https?|ftp):\/\/|www\.)[^\s<>"'`´.-][^\s<>"'`´]*?\.[a-z\d.]+[^\s<>"']*)\1/gi; + text = text.replace(urlRgx, function (wholeMatch, leadingMDChars, url, urlPrefix) { + + // we now will start traversing the url from the front to back, looking for punctuation chars [_*~,;:.!?\)\]] + var len = url.length; + var suffix = ''; + for (var i = len - 1; i >= 0; --i) { + var char = url.charAt(i); + + if (/[_*~,;:.!?]/.test(char)) { + // it's a punctuation char + // we remove it from the url + url = url.slice(0, -1); + // and prepend it to the suffix + suffix = char + suffix; + } else if (/\)/.test(char)) { + var opPar = url.match(/\(/g) || []; + var clPar = url.match(/\)/g); + + // it's a curved parenthesis so we need to check for "balance" (kinda) + if (opPar.length < clPar.length) { + // there are more closing Parenthesis than opening so chop it!!!!! + url = url.slice(0, -1); + // and prepend it to the suffix + suffix = char + suffix; + } else { + // it's (kinda) balanced so our work is done + break; + } + } else if (/]/.test(char)) { + var opPar2 = url.match(/\[/g) || []; + var clPar2 = url.match(/\]/g); + // it's a squared parenthesis so we need to check for "balance" (kinda) + if (opPar2.length < clPar2.length) { + // there are more closing Parenthesis than opening so chop it!!!!! + url = url.slice(0, -1); + // and prepend it to the suffix + suffix = char + suffix; + } else { + // it's (kinda) balanced so our work is done + break; + } + } else { + // it's not a punctuation or a parenthesis so our work is done + break; + } + } + + // we copy the treated url to the text variable + var text = url; + // finally, if it's a www shortcut, we prepend http + url = (urlPrefix === 'www.') ? 'http://' + url : url; + + // url part is done so let's take care of text now + // we need to escape the text (because of links such as www.example.com/foo__bar__baz) + text = text.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback); + + // finally we dispatch the event + var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals); + + // and return the link tag, with the leadingMDChars and suffix. The leadingMDChars are added at the end too because + // we consumed those characters in the regexp + return leadingMDChars + writeAnchorTag(evt, options, globals) + suffix + leadingMDChars; + }); + + // 2. Then mails + var mailRgx = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi; + text = text.replace(mailRgx, function (wholeMatch, leadingChar, mail) { + var url = 'mailto:'; + mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals); + if (options.encodeEmails) { + url = showdown.helper.encodeEmailAddress(url + mail); + mail = showdown.helper.encodeEmailAddress(mail); + } else { + url = url + mail; + } + var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals); + return leadingChar + writeAnchorTag(evt, options, globals); + }); + + + text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText(); + return text; + }); +})(); + +/** + * Form HTML ordered (numbered) and unordered (bulleted) lists. + */ +showdown.subParser('makehtml.lists', function (text, options, globals) { + 'use strict'; + + /** + * Process the contents of a single ordered or unordered list, splitting it + * into individual list items. + * @param {string} listStr + * @param {boolean} trimTrailing + * @returns {string} + */ + function processListItems (listStr, trimTrailing) { + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + globals.gListLevel++; + + // trim trailing blank lines: + listStr = listStr.replace(/\n{2,}$/, '\n'); + + // attacklab: add sentinel to emulate \z + listStr += '¨0'; + + var rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm, + isParagraphed = (/\n[ \t]*\n(?!¨0)/.test(listStr)); + + // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation, + // which is a syntax breaking change + // activating this option reverts to old behavior + // This will be removed in version 2.0 + if (options.disableForced4SpacesIndentedSublists) { + rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm; + } + + listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) { + checked = (checked && checked.trim() !== ''); + + var item = showdown.subParser('makehtml.outdent')(m4, options, globals), + bulletStyle = ''; + + // Support for github tasklists + if (taskbtn && options.tasklists) { + bulletStyle = ' class="task-list-item" style="list-style-type: none;"'; + item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () { + var otp = '
  • a
  • + // instead of: + //
    • - - a
    + // So, to prevent it, we will put a marker (¨A)in the beginning of the line + // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser + item = item.replace(/^([-*+]|\d\.)[ \t]+[\S\n ]*/g, function (wm2) { + return '¨A' + wm2; + }); + + // SPECIAL CASE: an heading followed by a paragraph of text that is not separated by a double newline + // or/nor indented. ex: + // + // - # foo + // bar is great + // + // While this does now follow the spec per se, not allowing for this might cause confusion since + // header blocks don't need double newlines after + if (/^#+.+\n.+/.test(item)) { + item = item.replace(/^(#+.+)$/m, '$1\n'); + } + + // m1 - Leading line or + // Has a double return (multi paragraph) + if (m1 || (item.search(/\n{2,}/) > -1)) { + item = showdown.subParser('makehtml.githubCodeBlocks')(item, options, globals); + item = showdown.subParser('makehtml.blockGamut')(item, options, globals); + } else { + + // Recursion for sub-lists: + item = showdown.subParser('makehtml.lists')(item, options, globals); + item = item.replace(/\n$/, ''); // chomp(item) + item = showdown.subParser('makehtml.hashHTMLBlocks')(item, options, globals); + + // Colapse double linebreaks + item = item.replace(/\n\n+/g, '\n\n'); + + if (isParagraphed) { + item = showdown.subParser('makehtml.paragraphs')(item, options, globals); + } else { + item = showdown.subParser('makehtml.spanGamut')(item, options, globals); + } + } + + // now we need to remove the marker (¨A) + item = item.replace('¨A', ''); + // we can finally wrap the line in list item tags + item = '' + item + '\n'; + + return item; + }); + + // attacklab: strip sentinel + listStr = listStr.replace(/¨0/g, ''); + + globals.gListLevel--; + + if (trimTrailing) { + listStr = listStr.replace(/\s+$/, ''); + } + + return listStr; + } + + function styleStartNumber (list, listType) { + // check if ol and starts by a number different than 1 + if (listType === 'ol') { + var res = list.match(/^ *(\d+)\./); + if (res && res[1] !== '1') { + return ' start="' + res[1] + '"'; + } + } + return ''; + } + + /** + * Check and parse consecutive lists (better fix for issue #142) + * @param {string} list + * @param {string} listType + * @param {boolean} trimTrailing + * @returns {string} + */ + function parseConsecutiveLists (list, listType, trimTrailing) { + // check if we caught 2 or more consecutive lists by mistake + // we use the counterRgx, meaning if listType is UL we look for OL and vice versa + var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm, + ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm, + counterRxg = (listType === 'ul') ? olRgx : ulRgx, + result = ''; + + if (list.search(counterRxg) !== -1) { + (function parseCL (txt) { + var pos = txt.search(counterRxg), + style = styleStartNumber(list, listType); + if (pos !== -1) { + // slice + result += '\n\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\n'; + + // invert counterType and listType + listType = (listType === 'ul') ? 'ol' : 'ul'; + counterRxg = (listType === 'ul') ? olRgx : ulRgx; + + //recurse + parseCL(txt.slice(pos)); + } else { + result += '\n\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '\n'; + } + })(list); + } else { + var style = styleStartNumber(list, listType); + result = '\n\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '\n'; + } + + return result; + } + + // Start of list parsing + var subListRgx = /^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + var mainListRgx = /(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + + text = globals.converter._dispatch('lists.before', text, options, globals).getText(); + // add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += '¨0'; + + if (globals.gListLevel) { + text = text.replace(subListRgx, function (wholeMatch, list, m2) { + var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; + return parseConsecutiveLists(list, listType, true); + }); + } else { + text = text.replace(mainListRgx, function (wholeMatch, m1, list, m3) { + var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; + return parseConsecutiveLists(list, listType, false); + }); + } + + // strip sentinel + text = text.replace(/¨0/, ''); + text = globals.converter._dispatch('makehtml.lists.after', text, options, globals).getText(); + return text; +}); + +/** + * Parse metadata at the top of the document + */ +showdown.subParser('makehtml.metadata', function (text, options, globals) { + 'use strict'; + + if (!options.metadata) { + return text; + } + + text = globals.converter._dispatch('makehtml.metadata.before', text, options, globals).getText(); + + function parseMetadataContents (content) { + // raw is raw so it's not changed in any way + globals.metadata.raw = content; + + // escape chars forbidden in html attributes + // double quotes + content = content + // ampersand first + .replace(/&/g, '&') + // double quotes + .replace(/"/g, '"'); + + content = content.replace(/\n {4}/g, ' '); + content.replace(/^([\S ]+): +([\s\S]+?)$/gm, function (wm, key, value) { + globals.metadata.parsed[key] = value; + return ''; + }); + } + + text = text.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/, function (wholematch, format, content) { + parseMetadataContents(content); + return '¨M'; + }); + + text = text.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function (wholematch, format, content) { + if (format) { + globals.metadata.format = format; + } + parseMetadataContents(content); + return '¨M'; + }); + + text = text.replace(/¨M/g, ''); + + text = globals.converter._dispatch('makehtml.metadata.after', text, options, globals).getText(); + return text; +}); + +/** + * Remove one level of line-leading tabs or spaces + */ +showdown.subParser('makehtml.outdent', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.outdent.before', text, options, globals).getText(); + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + text = text.replace(/^(\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/¨0/g, ''); + + text = globals.converter._dispatch('makehtml.outdent.after', text, options, globals).getText(); + return text; +}); + +/** + * + */ +showdown.subParser('makehtml.paragraphs', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.paragraphs.before', text, options, globals).getText(); + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ''); + text = text.replace(/\n+$/g, ''); + + var grafs = text.split(/\n{2,}/g), + grafsOut = [], + end = grafs.length; // Wrap

    tags + + for (var i = 0; i < end; i++) { + var str = grafs[i]; + // if this is an HTML marker, copy it + if (str.search(/¨(K|G)(\d+)\1/g) >= 0) { + grafsOut.push(str); + + // test for presence of characters to prevent empty lines being parsed + // as paragraphs (resulting in undesired extra empty paragraphs) + } else if (str.search(/\S/) >= 0) { + str = showdown.subParser('makehtml.spanGamut')(str, options, globals); + str = str.replace(/^([ \t]*)/g, '

    '); + str += '

    '; + grafsOut.push(str); + } + } + + /** Unhashify HTML blocks */ + end = grafsOut.length; + for (i = 0; i < end; i++) { + var blockText = '', + grafsOutIt = grafsOut[i], + codeFlag = false; + // if this is a marker for an html block... + // use RegExp.test instead of string.search because of QML bug + while (/¨(K|G)(\d+)\1/.test(grafsOutIt)) { + var delim = RegExp.$1, + num = RegExp.$2; + + if (delim === 'K') { + blockText = globals.gHtmlBlocks[num]; + } else { + // we need to check if ghBlock is a false positive + if (codeFlag) { + // use encoded version of all text + blockText = showdown.subParser('makehtml.encodeCode')(globals.ghCodeBlocks[num].text, options, globals); + } else { + blockText = globals.ghCodeBlocks[num].codeblock; + } + } + blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs + + grafsOutIt = grafsOutIt.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, blockText); + // Check if grafsOutIt is a pre->code + if (/^]*>\s*]*>/.test(grafsOutIt)) { + codeFlag = true; + } + } + grafsOut[i] = grafsOutIt; + } + text = grafsOut.join('\n'); + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ''); + text = text.replace(/\n+$/g, ''); + return globals.converter._dispatch('makehtml.paragraphs.after', text, options, globals).getText(); +}); + +/** + * Run extension + */ +showdown.subParser('makehtml.runExtension', function (ext, text, options, globals) { + 'use strict'; + + if (ext.filter) { + text = ext.filter(text, globals.converter, options); + + } else if (ext.regex) { + // TODO remove this when old extension loading mechanism is deprecated + var re = ext.regex; + if (!(re instanceof RegExp)) { + re = new RegExp(re, 'g'); + } + text = text.replace(re, ext.replace); + } + + return text; +}); + +/** + * These are all the transformations that occur *within* block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('makehtml.spanGamut', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('makehtml.span.before', text, options, globals).getText(); + + text = showdown.subParser('makehtml.codeSpans')(text, options, globals); + text = showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes')(text, options, globals); + text = showdown.subParser('makehtml.encodeBackslashEscapes')(text, options, globals); + + // Process link and image tags. Images must come first, + // because ![foo][f] looks like a link. + text = showdown.subParser('makehtml.images')(text, options, globals); + + text = globals.converter._dispatch('smakehtml.links.before', text, options, globals).getText(); + text = showdown.subParser('makehtml.links')(text, options, globals); + text = globals.converter._dispatch('smakehtml.links.after', text, options, globals).getText(); + + //text = showdown.subParser('makehtml.autoLinks')(text, options, globals); + //text = showdown.subParser('makehtml.simplifiedAutoLinks')(text, options, globals); + text = showdown.subParser('makehtml.emoji')(text, options, globals); + text = showdown.subParser('makehtml.underline')(text, options, globals); + text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals); + text = showdown.subParser('makehtml.strikethrough')(text, options, globals); + text = showdown.subParser('makehtml.ellipsis')(text, options, globals); + + // we need to hash HTML tags inside spans + text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals); + + // now we encode amps and angles + text = showdown.subParser('makehtml.encodeAmpsAndAngles')(text, options, globals); + + // Do hard breaks + if (options.simpleLineBreaks) { + // GFM style hard breaks + // only add line breaks if the text does not contain a block (special case for lists) + if (!/\n\n¨K/.test(text)) { + text = text.replace(/\n+/g, '
    \n'); + } + } else { + // Vanilla hard breaks + text = text.replace(/ +\n/g, '
    \n'); + } + + text = globals.converter._dispatch('makehtml.spanGamut.after', text, options, globals).getText(); + return text; +}); + +showdown.subParser('makehtml.strikethrough', function (text, options, globals) { + 'use strict'; + + if (options.strikethrough) { + text = globals.converter._dispatch('makehtml.strikethrough.before', text, options, globals).getText(); + text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function (wm, txt) { return '' + txt + ''; }); + text = globals.converter._dispatch('makehtml.strikethrough.after', text, options, globals).getText(); + } + + return text; +}); + +/** + * Strips link definitions from text, stores the URLs and titles in + * hash references. + * Link defs are in the form: ^[id]: url "optional title" + */ +showdown.subParser('makehtml.stripLinkDefinitions', function (text, options, globals) { + 'use strict'; + + var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm, + base64Regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm; + + // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug + text += '¨0'; + + var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) { + linkId = linkId.toLowerCase(); + if (url.match(/^data:.+?\/.+?;base64,/)) { + // remove newlines + globals.gUrls[linkId] = url.replace(/\s/g, ''); + } else { + globals.gUrls[linkId] = showdown.subParser('makehtml.encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive + } + + if (blankLines) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return blankLines + title; + + } else { + if (title) { + globals.gTitles[linkId] = title.replace(/"|'/g, '"'); + } + if (options.parseImgDimensions && width && height) { + globals.gDimensions[linkId] = { + width: width, + height: height + }; + } + } + // Completely remove the definition from the text + return ''; + }; + + // first we try to find base64 link references + text = text.replace(base64Regex, replaceFunc); + + text = text.replace(regex, replaceFunc); + + // attacklab: strip sentinel + text = text.replace(/¨0/, ''); + + return text; +}); + +showdown.subParser('makehtml.tables', function (text, options, globals) { + 'use strict'; + + if (!options.tables) { + return text; + } + + var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm, + //singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm; + singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm; + + function parseStyles (sLine) { + if (/^:[ \t]*--*$/.test(sLine)) { + return ' style="text-align:left;"'; + } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) { + return ' style="text-align:right;"'; + } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) { + return ' style="text-align:center;"'; + } else { + return ''; + } + } + + function parseHeaders (header, style) { + var id = ''; + header = header.trim(); + // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility + if (options.tablesHeaderId || options.tableHeaderId) { + id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"'; + } + header = showdown.subParser('makehtml.spanGamut')(header, options, globals); + + return '' + header + '\n'; + } + + function parseCells (cell, style) { + var subText = showdown.subParser('makehtml.spanGamut')(cell, options, globals); + return '' + subText + '\n'; + } + + function buildTable (headers, cells) { + var tb = '\n\n\n', + tblLgn = headers.length; + + for (var i = 0; i < tblLgn; ++i) { + tb += headers[i]; + } + tb += '\n\n\n'; + + for (i = 0; i < cells.length; ++i) { + tb += '\n'; + for (var ii = 0; ii < tblLgn; ++ii) { + tb += cells[i][ii]; + } + tb += '\n'; + } + tb += '\n
    \n'; + return tb; + } + + function parseTable (rawTable) { + var i, tableLines = rawTable.split('\n'); + + for (i = 0; i < tableLines.length; ++i) { + // strip wrong first and last column if wrapped tables are used + if (/^ {0,3}\|/.test(tableLines[i])) { + tableLines[i] = tableLines[i].replace(/^ {0,3}\|/, ''); + } + if (/\|[ \t]*$/.test(tableLines[i])) { + tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, ''); + } + // parse code spans first, but we only support one line code spans + + tableLines[i] = showdown.subParser('makehtml.codeSpans')(tableLines[i], options, globals); + } + + var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}), + rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}), + rawCells = [], + headers = [], + styles = [], + cells = []; + + tableLines.shift(); + tableLines.shift(); + + for (i = 0; i < tableLines.length; ++i) { + if (tableLines[i].trim() === '') { + continue; + } + rawCells.push( + tableLines[i] + .split('|') + .map(function (s) { + return s.trim(); + }) + ); + } + + if (rawHeaders.length < rawStyles.length) { + return rawTable; + } + + for (i = 0; i < rawStyles.length; ++i) { + styles.push(parseStyles(rawStyles[i])); + } + + for (i = 0; i < rawHeaders.length; ++i) { + if (showdown.helper.isUndefined(styles[i])) { + styles[i] = ''; + } + headers.push(parseHeaders(rawHeaders[i], styles[i])); + } + + for (i = 0; i < rawCells.length; ++i) { + var row = []; + for (var ii = 0; ii < headers.length; ++ii) { + if (showdown.helper.isUndefined(rawCells[i][ii])) { + + } + row.push(parseCells(rawCells[i][ii], styles[ii])); + } + cells.push(row); + } + + return buildTable(headers, cells); + } + + text = globals.converter._dispatch('makehtml.tables.before', text, options, globals).getText(); + + // find escaped pipe characters + text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback); + + // parse multi column tables + text = text.replace(tableRgx, parseTable); + + // parse one column tables + text = text.replace(singeColTblRgx, parseTable); + + text = globals.converter._dispatch('makehtml.tables.after', text, options, globals).getText(); + + return text; +}); + +showdown.subParser('makehtml.underline', function (text, options, globals) { + 'use strict'; + + if (!options.underline) { + return text; + } + + text = globals.converter._dispatch('makehtml.underline.before', text, options, globals).getText(); + + if (options.literalMidWordUnderscores) { + text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) { + return '' + txt + ''; + }); + text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) { + return '' + txt + ''; + }); + } else { + text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) { + return (/\S$/.test(m)) ? '' + m + '' : wm; + }); + text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) { + return (/\S$/.test(m)) ? '' + m + '' : wm; + }); + } + + // escape remaining underscores to prevent them being parsed by italic and bold + text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback); + + text = globals.converter._dispatch('makehtml.underline.after', text, options, globals).getText(); + + return text; +}); + +/** + * Swap back in all the special characters we've hidden. + */ +showdown.subParser('makehtml.unescapeSpecialChars', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('makehtml.unescapeSpecialChars.before', text, options, globals).getText(); + + text = text.replace(/¨E(\d+)E/g, function (wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + }); + + text = globals.converter._dispatch('makehtml.unescapeSpecialChars.after', text, options, globals).getText(); + return text; +}); + +showdown.subParser('makeMarkdown.blockquote', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + var children = node.childNodes, + childrenLength = children.length; + + for (var i = 0; i < childrenLength; ++i) { + var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals); + + if (innerTxt === '') { + continue; + } + txt += innerTxt; + } + } + // cleanup + txt = txt.trim(); + txt = '> ' + txt.split('\n').join('\n> '); + return txt; +}); + +showdown.subParser('makeMarkdown.codeBlock', function (node, globals) { + 'use strict'; + + var lang = node.getAttribute('language'), + num = node.getAttribute('precodenum'); + return '```' + lang + '\n' + globals.preList[num] + '\n```'; +}); + +showdown.subParser('makeMarkdown.codeSpan', function (node) { + 'use strict'; + + return '`' + node.innerHTML + '`'; +}); + +showdown.subParser('makeMarkdown.emphasis', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + txt += '*'; + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += '*'; + } + return txt; +}); + +showdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) { + 'use strict'; + + var headerMark = new Array(headerLevel + 1).join('#'), + txt = ''; + + if (node.hasChildNodes()) { + txt = headerMark + ' '; + var children = node.childNodes, + childrenLength = children.length; + + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + } + return txt; +}); + +showdown.subParser('makeMarkdown.hr', function () { + 'use strict'; + + return '---'; +}); + +showdown.subParser('makeMarkdown.image', function (node) { + 'use strict'; + + var txt = ''; + if (node.hasAttribute('src')) { + txt += '![' + node.getAttribute('alt') + ']('; + txt += '<' + node.getAttribute('src') + '>'; + if (node.hasAttribute('width') && node.hasAttribute('height')) { + txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height'); + } + + if (node.hasAttribute('title')) { + txt += ' "' + node.getAttribute('title') + '"'; + } + txt += ')'; + } + return txt; +}); + +showdown.subParser('makeMarkdown.links', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes() && node.hasAttribute('href')) { + var children = node.childNodes, + childrenLength = children.length; + txt = '['; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += ']('; + txt += '<' + node.getAttribute('href') + '>'; + if (node.hasAttribute('title')) { + txt += ' "' + node.getAttribute('title') + '"'; + } + txt += ')'; + } + return txt; +}); + +showdown.subParser('makeMarkdown.list', function (node, globals, type) { + 'use strict'; + + var txt = ''; + if (!node.hasChildNodes()) { + return ''; + } + var listItems = node.childNodes, + listItemsLenght = listItems.length, + listNum = node.getAttribute('start') || 1; + + for (var i = 0; i < listItemsLenght; ++i) { + if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') { + continue; + } + + // define the bullet to use in list + var bullet = ''; + if (type === 'ol') { + bullet = listNum.toString() + '. '; + } else { + bullet = '- '; + } + + // parse list item + txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals); + ++listNum; + } + + return txt.trim(); +}); + +showdown.subParser('makeMarkdown.listItem', function (node, globals) { + 'use strict'; + + var listItemTxt = ''; + + var children = node.childNodes, + childrenLenght = children.length; + + for (var i = 0; i < childrenLenght; ++i) { + listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + // if it's only one liner, we need to add a newline at the end + if (!/\n$/.test(listItemTxt)) { + listItemTxt += '\n'; + } else { + // it's multiparagraph, so we need to indent + listItemTxt = listItemTxt + .split('\n') + .join('\n ') + .replace(/^ {4}$/gm, '') + .replace(/\n\n+/g, '\n\n'); + } + + return listItemTxt; +}); + + + +showdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) { + 'use strict'; + + spansOnly = spansOnly || false; + + var txt = ''; + + // edge case of text without wrapper paragraph + if (node.nodeType === 3) { + return showdown.subParser('makeMarkdown.txt')(node, globals); + } + + // HTML comment + if (node.nodeType === 8) { + return '\n\n'; + } + + // process only node elements + if (node.nodeType !== 1) { + return ''; + } + + var tagName = node.tagName.toLowerCase(); + + switch (tagName) { + + // + // BLOCKS + // + case 'h1': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\n\n'; } + break; + case 'h2': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\n\n'; } + break; + case 'h3': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\n\n'; } + break; + case 'h4': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\n\n'; } + break; + case 'h5': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\n\n'; } + break; + case 'h6': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\n\n'; } + break; + + case 'p': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\n\n'; } + break; + + case 'blockquote': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\n\n'; } + break; + + case 'hr': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\n\n'; } + break; + + case 'ol': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\n\n'; } + break; + + case 'ul': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\n\n'; } + break; + + case 'precode': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\n\n'; } + break; + + case 'pre': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\n\n'; } + break; + + case 'table': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\n\n'; } + break; + + // + // SPANS + // + case 'code': + txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals); + break; + + case 'em': + case 'i': + txt = showdown.subParser('makeMarkdown.emphasis')(node, globals); + break; + + case 'strong': + case 'b': + txt = showdown.subParser('makeMarkdown.strong')(node, globals); + break; + + case 'del': + txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals); + break; + + case 'a': + txt = showdown.subParser('makeMarkdown.links')(node, globals); + break; + + case 'img': + txt = showdown.subParser('makeMarkdown.image')(node, globals); + break; + + default: + txt = node.outerHTML + '\n\n'; + } + + // common normalization + // TODO eventually + + return txt; +}); + +showdown.subParser('makeMarkdown.paragraph', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + } + + // some text normalization + txt = txt.trim(); + + return txt; +}); + +showdown.subParser('makeMarkdown.pre', function (node, globals) { + 'use strict'; + + var num = node.getAttribute('prenum'); + return '
    ' + globals.preList[num] + '
    '; +}); + +showdown.subParser('makeMarkdown.strikethrough', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + txt += '~~'; + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += '~~'; + } + return txt; +}); + +showdown.subParser('makeMarkdown.strong', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + txt += '**'; + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += '**'; + } + return txt; +}); + +showdown.subParser('makeMarkdown.table', function (node, globals) { + 'use strict'; + + var txt = '', + tableArray = [[], []], + headings = node.querySelectorAll('thead>tr>th'), + rows = node.querySelectorAll('tbody>tr'), + i, ii; + for (i = 0; i < headings.length; ++i) { + var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals), + allign = '---'; + + if (headings[i].hasAttribute('style')) { + var style = headings[i].getAttribute('style').toLowerCase().replace(/\s/g, ''); + switch (style) { + case 'text-align:left;': + allign = ':---'; + break; + case 'text-align:right;': + allign = '---:'; + break; + case 'text-align:center;': + allign = ':---:'; + break; + } + } + tableArray[0][i] = headContent.trim(); + tableArray[1][i] = allign; + } + + for (i = 0; i < rows.length; ++i) { + var r = tableArray.push([]) - 1, + cols = rows[i].getElementsByTagName('td'); + + for (ii = 0; ii < headings.length; ++ii) { + var cellContent = ' '; + if (typeof cols[ii] !== 'undefined') { + cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals); + } + tableArray[r].push(cellContent); + } + } + + var cellSpacesCount = 3; + for (i = 0; i < tableArray.length; ++i) { + for (ii = 0; ii < tableArray[i].length; ++ii) { + var strLen = tableArray[i][ii].length; + if (strLen > cellSpacesCount) { + cellSpacesCount = strLen; + } + } + } + + for (i = 0; i < tableArray.length; ++i) { + for (ii = 0; ii < tableArray[i].length; ++ii) { + if (i === 1) { + if (tableArray[i][ii].slice(-1) === ':') { + tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':'; + } else { + tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-'); + } + } else { + tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount); + } + } + txt += '| ' + tableArray[i].join(' | ') + ' |\n'; + } + + return txt.trim(); +}); + +showdown.subParser('makeMarkdown.tableCell', function (node, globals) { + 'use strict'; + + var txt = ''; + if (!node.hasChildNodes()) { + return ''; + } + var children = node.childNodes, + childrenLength = children.length; + + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true); + } + return txt.trim(); +}); + +showdown.subParser('makeMarkdown.txt', function (node) { + 'use strict'; + + var txt = node.nodeValue; + + // multiple spaces are collapsed + txt = txt.replace(/ +/g, ' '); + + // replace the custom ¨NBSP; with a space + txt = txt.replace(/¨NBSP;/g, ' '); + + // ", <, > and & should replace escaped html entities + txt = showdown.helper.unescapeHTMLEntities(txt); + + // escape markdown magic characters + // emphasis, strong and strikethrough - can appear everywhere + // we also escape pipe (|) because of tables + // and escape ` because of code blocks and spans + txt = txt.replace(/([*_~|`])/g, '\\$1'); + + // escape > because of blockquotes + txt = txt.replace(/^(\s*)>/g, '\\$1>'); + + // hash character, only troublesome at the beginning of a line because of headers + txt = txt.replace(/^#/gm, '\\#'); + + // horizontal rules + txt = txt.replace(/^(\s*)([-=]{3,})(\s*)$/, '$1\\$2$3'); + + // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer + txt = txt.replace(/^( {0,3}\d+)\./gm, '$1\\.'); + + // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped) + txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\$2'); + + // images and links, ] followed by ( is problematic, so we escape it + txt = txt.replace(/]([\s]*)\(/g, '\\]$1\\('); + + // reference URIs must also be escaped + txt = txt.replace(/^ {0,3}\[([\S \t]*?)]:/gm, '\\[$1]:'); + + return txt; +}); + +/** + * Created by Estevao on 31-05-2015. + */ + +/** + * Showdown Converter class + * @class + * @param {object} [converterOptions] + * @returns {Converter} + */ +showdown.Converter = function (converterOptions) { + 'use strict'; + + var + /** + * Options used by this converter + * @private + * @type {{}} + */ + options = {}, + + /** + * Language extensions used by this converter + * @private + * @type {Array} + */ + langExtensions = [], + + /** + * Output modifiers extensions used by this converter + * @private + * @type {Array} + */ + outputModifiers = [], + + /** + * Event listeners + * @private + * @type {{}} + */ + listeners = {}, + + /** + * The flavor set in this converter + */ + setConvFlavor = setFlavor, + + /** + * Metadata of the document + * @type {{parsed: {}, raw: string, format: string}} + */ + metadata = { + parsed: {}, + raw: '', + format: '' + }; + + _constructor(); + + /** + * Converter constructor + * @private + */ + function _constructor () { + converterOptions = converterOptions || {}; + + for (var gOpt in globalOptions) { + if (globalOptions.hasOwnProperty(gOpt)) { + options[gOpt] = globalOptions[gOpt]; + } + } + + // Merge options + if (typeof converterOptions === 'object') { + for (var opt in converterOptions) { + if (converterOptions.hasOwnProperty(opt)) { + options[opt] = converterOptions[opt]; + } + } + } else { + throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions + + ' was passed instead.'); + } + + if (options.extensions) { + showdown.helper.forEach(options.extensions, _parseExtension); + } + } + + /** + * Parse extension + * @param {*} ext + * @param {string} [name=''] + * @private + */ + function _parseExtension (ext, name) { + + name = name || null; + // If it's a string, the extension was previously loaded + if (showdown.helper.isString(ext)) { + ext = showdown.helper.stdExtName(ext); + name = ext; + + // LEGACY_SUPPORT CODE + if (showdown.extensions[ext]) { + console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' + + 'Please inform the developer that the extension should be updated!'); + legacyExtensionLoading(showdown.extensions[ext], ext); + return; + // END LEGACY SUPPORT CODE + + } else if (!showdown.helper.isUndefined(extensions[ext])) { + ext = extensions[ext]; + + } else { + throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.'); + } + } + + if (typeof ext === 'function') { + ext = ext(); + } + + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + + var validExt = validate(ext, name); + if (!validExt.valid) { + throw Error(validExt.error); + } + + for (var i = 0; i < ext.length; ++i) { + switch (ext[i].type) { + + case 'lang': + langExtensions.push(ext[i]); + break; + + case 'output': + outputModifiers.push(ext[i]); + break; + } + if (ext[i].hasOwnProperty('listeners')) { + for (var ln in ext[i].listeners) { + if (ext[i].listeners.hasOwnProperty(ln)) { + listen(ln, ext[i].listeners[ln]); + } + } + } + } + + } + + /** + * LEGACY_SUPPORT + * @param {*} ext + * @param {string} name + */ + function legacyExtensionLoading (ext, name) { + if (typeof ext === 'function') { + ext = ext(new showdown.Converter()); + } + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + var valid = validate(ext, name); + + if (!valid.valid) { + throw Error(valid.error); + } + + for (var i = 0; i < ext.length; ++i) { + switch (ext[i].type) { + case 'lang': + langExtensions.push(ext[i]); + break; + case 'output': + outputModifiers.push(ext[i]); + break; + default:// should never reach here + throw Error('Extension loader error: Type unrecognized!!!'); + } + } + } + + /** + * Listen to an event + * @param {string} name + * @param {function} callback + */ + function listen (name, callback) { + if (!showdown.helper.isString(name)) { + throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given'); + } + + if (typeof callback !== 'function') { + throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given'); + } + name = name.toLowerCase(); + if (!listeners.hasOwnProperty(name)) { + listeners[name] = []; + } + listeners[name].push(callback); + } + + function rTrimInputText (text) { + var rsp = text.match(/^\s*/)[0].length, + rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm'); + return text.replace(rgx, ''); + } + + /** + * + * @param {string} evtName Event name + * @param {string} text Text + * @param {{}} options Converter Options + * @param {{}} globals Converter globals + * @param {{}} pParams extra params for event + * @returns showdown.helper.Event + * @private + */ + this._dispatch = function dispatch (evtName, text, options, globals, pParams) { + evtName = evtName.toLowerCase(); + var params = pParams || {}; + params.converter = this; + params.text = text; + params.options = options; + params.globals = globals; + var event = new showdown.helper.Event(evtName, text, params); + + if (listeners.hasOwnProperty(evtName)) { + for (var ei = 0; ei < listeners[evtName].length; ++ei) { + var nText = listeners[evtName][ei](event); + if (nText && typeof nText !== 'undefined') { + event.setText(nText); + } + } + } + return event; + }; + + /** + * Listen to an event + * @param {string} name + * @param {function} callback + * @returns {showdown.Converter} + */ + this.listen = function (name, callback) { + listen(name, callback); + return this; + }; + + /** + * Converts a markdown string into HTML string + * @param {string} text + * @returns {*} + */ + this.makeHtml = function (text) { + //check if text is not falsy + if (!text) { + return text; + } + + var globals = { + gHtmlBlocks: [], + gHtmlMdBlocks: [], + gHtmlSpans: [], + gUrls: {}, + gTitles: {}, + gDimensions: {}, + gListLevel: 0, + hashLinkCounts: {}, + langExtensions: langExtensions, + outputModifiers: outputModifiers, + converter: this, + ghCodeBlocks: [], + metadata: { + parsed: {}, + raw: '', + format: '' + } + }; + + // This lets us use ¨ trema as an escape char to avoid md5 hashes + // The choice of character is arbitrary; anything that isn't + // magic in Markdown will work. + text = text.replace(/¨/g, '¨T'); + + // Replace $ with ¨D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g, '¨D'); + + // Standardize line endings + text = text.replace(/\r\n/g, '\n'); // DOS to Unix + text = text.replace(/\r/g, '\n'); // Mac to Unix + + // Stardardize line spaces + text = text.replace(/\u00A0/g, ' '); + + if (options.smartIndentationFix) { + text = rTrimInputText(text); + } + + // Make sure text begins and ends with a couple of newlines: + text = '\n\n' + text + '\n\n'; + + // detab + text = showdown.subParser('makehtml.detab')(text, options, globals); + + /** + * Strip any lines consisting only of spaces and tabs. + * This makes subsequent regexs easier to write, because we can + * match consecutive blank lines with /\n+/ instead of something + * contorted like /[ \t]*\n+/ + */ + text = text.replace(/^[ \t]+$/mg, ''); + + //run languageExtensions + showdown.helper.forEach(langExtensions, function (ext) { + text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals); + }); + + // run the sub parsers + text = showdown.subParser('makehtml.metadata')(text, options, globals); + text = showdown.subParser('makehtml.hashPreCodeTags')(text, options, globals); + text = showdown.subParser('makehtml.githubCodeBlocks')(text, options, globals); + text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('makehtml.hashCodeTags')(text, options, globals); + text = showdown.subParser('makehtml.stripLinkDefinitions')(text, options, globals); + text = showdown.subParser('makehtml.blockGamut')(text, options, globals); + text = showdown.subParser('makehtml.unhashHTMLSpans')(text, options, globals); + text = showdown.subParser('makehtml.unescapeSpecialChars')(text, options, globals); + + // attacklab: Restore dollar signs + text = text.replace(/¨D/g, '$$'); + + // attacklab: Restore tremas + text = text.replace(/¨T/g, '¨'); + + // render a complete html document instead of a partial if the option is enabled + text = showdown.subParser('makehtml.completeHTMLDocument')(text, options, globals); + + // Run output modifiers + showdown.helper.forEach(outputModifiers, function (ext) { + text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals); + }); + + // update metadata + metadata = globals.metadata; + return text; + }; + + /** + * Converts an HTML string into a markdown string + * @param src + * @returns {string} + */ + this.makeMarkdown = function (src) { + + // replace \r\n with \n + src = src.replace(/\r\n/g, '\n'); + src = src.replace(/\r/g, '\n'); // old macs + + // due to an edge case, we need to find this: > < + // to prevent removing of non silent white spaces + // ex: this is sparta + src = src.replace(/>[ \t]+¨NBSP;<'); + + var doc = showdown.helper.document.createElement('div'); + doc.innerHTML = src; + + var globals = { + preList: substitutePreCodeTags(doc) + }; + + // remove all newlines and collapse spaces + clean(doc); + + // some stuff, like accidental reference links must now be escaped + // TODO + // doc.innerHTML = doc.innerHTML.replace(/\[[\S\t ]]/); + + var nodes = doc.childNodes, + mdDoc = ''; + + for (var i = 0; i < nodes.length; i++) { + mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals); + } + + function clean (node) { + for (var n = 0; n < node.childNodes.length; ++n) { + var child = node.childNodes[n]; + if (child.nodeType === 3) { + if (!/\S/.test(child.nodeValue)) { + node.removeChild(child); + --n; + } else { + child.nodeValue = child.nodeValue.split('\n').join(' '); + child.nodeValue = child.nodeValue.replace(/(\s)+/g, '$1'); + } + } else if (child.nodeType === 1) { + clean(child); + } + } + } + + // find all pre tags and replace contents with placeholder + // we need this so that we can remove all indentation from html + // to ease up parsing + function substitutePreCodeTags (doc) { + + var pres = doc.querySelectorAll('pre'), + presPH = []; + + for (var i = 0; i < pres.length; ++i) { + + if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') { + var content = pres[i].firstChild.innerHTML.trim(), + language = pres[i].firstChild.getAttribute('data-language') || ''; + + // if data-language attribute is not defined, then we look for class language-* + if (language === '') { + var classes = pres[i].firstChild.className.split(' '); + for (var c = 0; c < classes.length; ++c) { + var matches = classes[c].match(/^language-(.+)$/); + if (matches !== null) { + language = matches[1]; + break; + } + } + } + + // unescape html entities in content + content = showdown.helper.unescapeHTMLEntities(content); + + presPH.push(content); + pres[i].outerHTML = ''; + } else { + presPH.push(pres[i].innerHTML); + pres[i].innerHTML = ''; + pres[i].setAttribute('prenum', i.toString()); + } + } + return presPH; + } + + return mdDoc; + }; + + /** + * Set an option of this Converter instance + * @param {string} key + * @param {*} value + */ + this.setOption = function (key, value) { + options[key] = value; + }; + + /** + * Get the option of this Converter instance + * @param {string} key + * @returns {*} + */ + this.getOption = function (key) { + return options[key]; + }; + + /** + * Get the options of this Converter instance + * @returns {{}} + */ + this.getOptions = function () { + return options; + }; + + /** + * Add extension to THIS converter + * @param {{}} extension + * @param {string} [name=null] + */ + this.addExtension = function (extension, name) { + name = name || null; + _parseExtension(extension, name); + }; + + /** + * Use a global registered extension with THIS converter + * @param {string} extensionName Name of the previously registered extension + */ + this.useExtension = function (extensionName) { + _parseExtension(extensionName); + }; + + /** + * Set the flavor THIS converter should use + * @param {string} name + */ + this.setFlavor = function (name) { + if (!flavor.hasOwnProperty(name)) { + throw Error(name + ' flavor was not found'); + } + var preset = flavor[name]; + setConvFlavor = name; + for (var option in preset) { + if (preset.hasOwnProperty(option)) { + options[option] = preset[option]; + } + } + }; + + /** + * Get the currently set flavor of this converter + * @returns {string} + */ + this.getFlavor = function () { + return setConvFlavor; + }; + + /** + * Remove an extension from THIS converter. + * Note: This is a costly operation. It's better to initialize a new converter + * and specify the extensions you wish to use + * @param {Array} extension + */ + this.removeExtension = function (extension) { + if (!showdown.helper.isArray(extension)) { + extension = [extension]; + } + for (var a = 0; a < extension.length; ++a) { + var ext = extension[a]; + for (var i = 0; i < langExtensions.length; ++i) { + if (langExtensions[i] === ext) { + langExtensions[i].splice(i, 1); + } + } + for (var ii = 0; ii < outputModifiers.length; ++i) { + if (outputModifiers[ii] === ext) { + outputModifiers[ii].splice(i, 1); + } + } + } + }; + + /** + * Get all extension of THIS converter + * @returns {{language: Array, output: Array}} + */ + this.getAllExtensions = function () { + return { + language: langExtensions, + output: outputModifiers + }; + }; + + /** + * Get the metadata of the previously parsed document + * @param raw + * @returns {string|{}} + */ + this.getMetadata = function (raw) { + if (raw) { + return metadata.raw; + } else { + return metadata.parsed; + } + }; + + /** + * Get the metadata format of the previously parsed document + * @returns {string} + */ + this.getMetadataFormat = function () { + return metadata.format; + }; + + /** + * Private: set a single key, value metadata pair + * @param {string} key + * @param {string} value + */ + this._setMetadataPair = function (key, value) { + metadata.parsed[key] = value; + }; + + /** + * Private: set metadata format + * @param {string} format + */ + this._setMetadataFormat = function (format) { + metadata.format = format; + }; + + /** + * Private: set metadata raw text + * @param {string} raw + */ + this._setMetadataRaw = function (raw) { + metadata.raw = raw; + }; +}; + +var root = this; + +// AMD Loader +if (typeof define === 'function' && define.amd) { + define(function () { + 'use strict'; + return showdown; + }); + +// CommonJS/nodeJS Loader +} else if (typeof module !== 'undefined' && module.exports) { + module.exports = showdown; + +// Regular Browser loader +} else { + root.showdown = showdown; +} +}).call(this); + +//# sourceMappingURL=showdown.js.map \ No newline at end of file diff --git a/muk_web_preview_markdown/static/src/js/markdown.js b/muk_web_preview_markdown/static/src/js/markdown.js new file mode 100644 index 0000000..1ca6df4 --- /dev/null +++ b/muk_web_preview_markdown/static/src/js/markdown.js @@ -0,0 +1,68 @@ +/********************************************************************************** +* +* Copyright (C) 2017 MuK IT GmbH +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see . +* +**********************************************************************************/ + +odoo.define('muk_preview_markdown.PreviewContentMarkdown', function (require) { +"use strict"; + +var core = require('web.core'); +var ajax = require('web.ajax'); +var utils = require('web.utils'); +var session = require('web.session'); + +var registry = require('muk_preview.registry'); + +var AbstractPreviewContent = require('muk_preview.AbstractPreviewContent'); + +var QWeb = core.qweb; +var _t = core._t; + +var PreviewContentMarkdown = AbstractPreviewContent.extend({ + template: "muk_preview.PreviewContentMarkdown", + jsLibs: [ + '/muk_web_preview_markdown/static/lib/showdown/showdown.js', + ], + willStart: function() { + var def = $.ajax({ + url: this.url, + dataType: "text", + }).fail(function(jqXHR, textStatus) { + console.error(textStatus); + }).done(function(text) { + this.markdown = text; + }.bind(this)); + return $.when(this._super.apply(this, arguments), def); + }, + renderPreviewContent: function() { + var converter = new showdown.Converter(); + this.$('.mk_preview_markdown').html( + converter.makeHtml(this.markdown) + ); + return this._super.apply(this, arguments); + }, + downloadable: true, + printable: true, +}); + +registry.add('md', PreviewContentMarkdown); +registry.add('.md', PreviewContentMarkdown); +registry.add('text/markdown', PreviewContentMarkdown); + +return PreviewContentMarkdown; + +}); diff --git a/muk_web_preview_markdown/static/src/scss/markdown.scss b/muk_web_preview_markdown/static/src/scss/markdown.scss new file mode 100644 index 0000000..2abd392 --- /dev/null +++ b/muk_web_preview_markdown/static/src/scss/markdown.scss @@ -0,0 +1,23 @@ +/********************************************************************************** +* +* Copyright (C) 2017 MuK IT GmbH +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see . +* +**********************************************************************************/ + +.mk_preview_markdown { + padding: 1rem; +} + diff --git a/muk_web_preview_markdown/static/src/xml/content.xml b/muk_web_preview_markdown/static/src/xml/content.xml new file mode 100644 index 0000000..65d6874 --- /dev/null +++ b/muk_web_preview_markdown/static/src/xml/content.xml @@ -0,0 +1,29 @@ + + + + + + + + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/muk_web_preview_markdown/template/assets.xml b/muk_web_preview_markdown/template/assets.xml new file mode 100644 index 0000000..102cfee --- /dev/null +++ b/muk_web_preview_markdown/template/assets.xml @@ -0,0 +1,29 @@ + + + + + +